PEXA Supportについて

PEXAプロパティ

トランスレータ

印刷フレームワーク

AETフレームワーク

ワークフロー

動的フォーム

変換フレームワーク

テンプレートエンジン

カレンダー

タスクスケジューラー

目次

  1. はじめに
  2. カレンダ機能の全体構成
    1. CommonCalendarFacade
    2. カレンダマスタ
    3. カレンダスキーマ
    4. Directive
  3. カレンダ機能の利用手順
    1. カレンダマスタモデルの作成
    2. カレンダ定義ファイルの作成
    3. カレンダデータの登録
    4. カレンダ機能の呼出


はじめに

このドキュメントは、カレンダ機能のアーキテクチャについて解説するものです。

カレンダ機能を利用するにはいくつか作業が発生します。
このドキュメントに一通り目を通して全体構成を把握した上で利用して下さい。


カレンダ機能の全体構成

CommonCalendarFacade

StatelessSessionBeanとして提供される、カレンダ機能の実体です。
営業日を求める等のカレンダマスタを参照して情報を返すロジックはこのモジュールに実装されます。

基本的な機能の呼出方法としては、サービス定義で記述したDirective経由でCommonCalendarFacadeのビジネスメソッドを呼び出す形になります。 必要に応じて、各種プラグインクラス等から直接このBeanをlookupしてビジネスメソッドを呼び出すこともできます。

現状では、このBeanには以下のビジネスメソッドが用意されています。
詳細はPEXAのjavadocを参照して下さい。

  • getAfterBusinessDay:未来日方向の営業日を取得する
  • getBeforeBusinessDay:過去日方向の営業日を取得する
  • getBusinessDayOfFromTo:指定された範囲内の営業日日数を取得する
  • isBusinessDay:引数で指定した日付が営業日であるかを判定する


カレンダマスタ

カレンダ情報を登録するマスタデータモデルです。
このマスタデータモデルは、任意の名前で任意の数だけ用意することが出来ます。
ただし、カレンダ機能で決められている共通項目を必ず持たせる必要があります。

カレンダ共通項目のセットは、PEXA標準提供のItemGroup定義(ITG_PEXA_000003)として提供されています。
このItemGroup定義に含まれている現象型を必ず可憐だマスタに持たせて下さい。

それ以外は任意の項目を自由に持たせることが出来ますので、例えば法人カレンダマスタを用意して、 各法人毎のカレンダデータを登録するために法人Noを持たせて、 カレンダ機能の呼出時に検索条件として使用するといったことができます。


カレンダスキーマ

カレンダ機能を呼び出すアプリケーション側が意識する、論理的なカレンダ名を登録する定義ファイルです。
アプリケーション側からカレンダ機能を呼び出す際には、ここに登録した論理カレンダ名を必ず指定します。

CommonCalendarFacadeでは呼出元から指定された論理カレンダ名のスキーマ情報を定義ファイルから探し出し、 対応する実際のカレンダマスタモデル名及び検索条件フィルタ式を取得して、カレンダマスタデータを検索します。

カレンダスキーマの詳細については、こちらを参照して下さい。


Directive

サービス定義からカレンダ機能を呼び出したい場合は、Directiveを使用します。
現在、以下のDirectiveが用意されています。

  • &GetAfterBusinessDay
  • &GetBeforeBusinessDay
  • &GetBusinessDayOfFromTo
これらのDirectiveについての詳細はServiceFrameworkのガイドを参照して下さい。



カレンダ機能の利用手順

ここからは、カレンダ機能を利用するために必要な作業内容について順を追って説明します。
以下のような作業が発生します。

それぞれについて、以降を参照して下さい。


カレンダマスタモデルの作成

まず、アプリケーション側で必要とされる分だけカレンダマスタデータモデルを定義します。
以下でポイントを説明します。

カレンダマスタモデルの粒度

アプリケーション側では実データモデルと検索条件を組合せた「論理カレンダ」の方を意識します。
そのため、必要とされるカレンダの種類とカレンダマスタモデルが必ずしも一対一で有る必要はありません。

これは例えば、アプリケーション側で「自社カレンダ」と「得意先カレンダ」の2種類を意識するとして、 実際にカレンダマスタモデルとしても「自社カレンダマスタ」及び「得意先カレンダマスタ」の2種類の データモデルを定義しても良いし、「法人カレンダマスタ」1つに統合して、検索条件で論理カレンダを 2つに分けて定義する形でも良いと言うことです。

ただ、カレンダがひも尽く対象があきらかに異なる場合(例えば得意先と銀行など)、 1つのカレンダマスタモデルに押し込めるとnull可項目が増える形になってくるので、 そのような場合は実際のデータモデルとしても2つに分割する方が良いと考えられます。


カレンダ共通項目

カレンダマスタデータモデルでは、カレンダ共通項目を必ず持たせる必要があります。
これは、PEXA標準提供のItemGroup定義である「ITG_PEXA_000003 - Calendar」で定義されています。

ここで指定されている項目はCommonCalendarFacadeが営業日を求める際に必要となる項目となります。
もしこれらの項目が含まれていないマスタがカレンダ定義で指定されていると実行時エラーが発生します。

現状、カレンダマスタ共通項目は以下の物があります。

現象型ID 現象型名 Null可 説明
PT_PEXA_100101 CalendarDescription null カレンダ説明コメント
PT_PEXA_100102 CalendarPatternCategory not null カレンダの指定パターン区分(曜日指定、日付指定)
PT_PEXA_100103 CalendarDateCategory not null カレンダ対象日付の日付区分(営業日、休日、祝日)
PT_PEXA_100104 CalendarFallOnSundayFlag not null カレンダ対象日付が日曜日だった場合に翌日を振替休日とするフラグ
PT_PEXA_100105 CalendarYear not null カレンダ対象日付の年(西暦)。 指定無しなら*。複数指定はカンマ区切り。
PT_PEXA_100106 CalendarMonth not null カレンダ対象日付の月(1~12)。 指定無しなら*。複数指定はカンマ区切り。
PT_PEXA_100107 CalendarDay not null カレンダ対象日付の日(1~31)。 指定無しなら*。複数指定はカンマ区切り。
PT_PEXA_100108 CalendarDayOfWeek not null カレンダ対象日付の曜日(1[Sunday]~7[Saturday])。 指定しない場合は*。複数指定はカンマ区切り。
PT_PEXA_100109 CalendarDayOfWeekInMonth not null カレンダ対象日付の当月内に何度目の曜日かの指定。 指定しない場合は*。複数指定はカンマ区切り。 CalendarDayOfWeekと組み合わせて「第三水曜日」といった指定が可能。

必須項目については現状提供しているカレンダ機能で必ず参照する項目となりますので、必ず持たせて下さい。
それ以外にはカレンダマスタモデルの設計に関しての制約はありません。 カレンダマスタモデルの数、そもそもマスタというモデルタイプにするしない、Proxy値など自由に決めて下さい。



カレンダ定義ファイルの作成

カレンダマスタを用意できたら、次にカレンダ定義ファイルを作成して論理カレンダを登録します。
このカレンダ定義ファイルは、以下の場所に以下のファイル名で作成して下さい。

  ${PRJHOME}/src/calendar/calendar.entry
中身はテキストファイルで、PEXAプロパティ形式となります。
スキーマ構造の詳細についてはこちらを参照して下さい。

このカレンダ定義ファイルの中で、「論理カレンダ名」を登録します。
この論理カレンダ名とは、アプリケーション側でカレンダ機能を呼び出す際に必ず指定してもらう物で、 実際のカレンダマスタデータモデル及びそれに対する検索条件をマッピングした物となります。

ここでは例として、アプリケーション側で「自社カレンダ」と「取引先カレンダ」の2つを必要とするケースで考えます。
この場合に、論理カレンダとしてはアプリケーションが必要としているこの2種類をカレンダ定義ファイルに登録します。
その上で、実際のカレンダマスタとのマッピングをどうするかに選択肢があります。それぞれについて以下で例を挙げます。

論理カレンダとカレンダマスタモデルを1対1とする場合

この場合、論理カレンダに対応する実際のカレンダマスタモデルを素直にマッピングする形になります。
カレンダ定義ファイルでは以下のような記述内容となります。

(calendar
    ;--------------------------------------------------
    ; カレンダ論理名:自社カレンダ
    ;--------------------------------------------------
    (自社カレンダ
        resource        自社カレンダマスタ
        required_keys   利用会社No
        [filter
            filter      "利用会社No = @利用会社No"
        ]
    )
    ;--------------------------------------------------
    ; カレンダ論理名:取引先カレンダ
    ;--------------------------------------------------
    (取引先カレンダ
        resource        取引先カレンダマスタ
        required_keys   取引先No
        [filter
            filter      "取引先No = @取引先No"
        ]
    )
)
論理カレンダ名とカレンダマスタモデル名が素直に対応し、 さらに検索条件として絞り込むための項目が指定される形になっています。

なお、エンジン側で"RemovedFlag = NOT_REMOVED"の検索条件がデフォルトで必ず追加されるようになっています。 そのため、論理カレンダにRemovedFlagの検索フィルタを追加する必要はありません。


論理カレンダとカレンダマスタモデルをN対1とする場合

この場合、2つの論理カレンダに対応する実際のカレンダマスタモデルを1つにして、検索条件により切り分ける形になります。
カレンダ定義ファイルでは以下のような記述内容となります。

(calendar
    ;--------------------------------------------------
    ; カレンダ論理名:自社カレンダ
    ;--------------------------------------------------
    (自社カレンダ
        resource        法人カレンダマスタ
        required_keys   LoginUserInfo
        [filter
            filter      "法人No = @LoginUserInfo/利用会社No/法人No"
        ]
    )
    ;--------------------------------------------------
    ; カレンダ論理名:取引先カレンダ
    ;--------------------------------------------------
    (取引先カレンダ
        resource        法人カレンダマスタ
        required_keys   取引先マスタ
        [filter
            filter      "法人No = @取引先マスタ/法人No"
        ]
    )
)
どちらも同じ法人カレンダマスタを検索しに行き、 検索条件で指定する「法人No」をどのように取得するかで切り分けられています。

なお、エンジン側で"RemovedFlag = NOT_REMOVED"の検索条件がデフォルトで必ず追加されるようになっています。 そのため、論理カレンダにRemovedFlagの検索フィルタを追加する必要はありません。



カレンダデータの登録

カレンダマスタにデータを登録します。
カレンダ機能では、「休日」のデータをカレンダマスタに登録して使用します。 そのため、カレンダ共通項目の「PT_PEXA_100103 - CalendarDateCategory」が"HOLIDAY"もしくは"PUBLIC_HOLIDAY"のデータを登録するのが基本となります。

なお、上書き設定としてCalendarDateCategory="BUSINESS_DAY"のデータを登録するという使い方が出来るようになっています。
これは、例えば「毎年毎月の土、日を休日とする」という設定データに対して、

「ただし毎年1月の第三日曜日のみ営業日とする」

という上書き設定を行うようなケースで使用します。BUSINESS_DAYはHOLIDAY/PUBLIC_HOLIDAYよりも常に優先されます。

日付の指定は、「曜日指定」「日付指定」の2パターンがあります。
この指定パターンはカレンダ共通項目の「PT_PEXA_100102 - CalendarPatternCategory」で指定します。

曜日指定パターン この場合、必ず「PT_PEXA_100108 - CalendarDayOfWeek」を指定します。
年と月に関しては明示的に指定する事も、指定しない(毎年、毎月扱い)とすることも可能です。

また、「第一、第三水曜日」と言った指定も可能です。
この場合の「第一」とは、その月における一回目の曜日という意味となります。
例えば、その月の一日が木曜日で有った場合、「第一水曜日」とはその月の第二週目の水曜日を指します。
日付指定パターン この場合、必ず「PT_PEXA_100107 - CalendarDay」を設定します。
年と月に関しては明示的に指定する事も、指定しない(毎年、毎月扱い)とすることも可能です。

なお、日付指定パターンでの休日設定として、例えば「毎年3月11日を休日とする」という設定を行うと、年によってはその日が日曜日になってしまう場合があります。 このようなケースの場合に翌日を振替休日扱いにしたい場合は「PT_PEXA_100104 - CalendarFallOnSundayFlag」を"SUBSTITUTE"に設定して下さい。 このように設定した場合、カレンダ機能は該当の年の3月12日も休日として判定するようになります。

なお、「年」、「月」、「日」、「曜日」、「何度目の曜日」の設定項目については、全て以下の3パターンの指定が可能です。

  • 直接指定
  • カンマ区切りによる複数指定
  • アスタリスク(*)によるワイルドカード指定
例えば、「年」にアスタリスクを指定すれば、それは「毎年」という意味になります。

上記の内容を踏まえて、以下で設定例をいくつか挙げておきます。

例:毎年毎月の土曜日と日曜日を休日とする

設定項目
CalendarPatternCategory DAY_OF_WEEK
CalendarDateCategory HOLIDAY
CalendarFallOnSundayFlag NOT_SUBSTITUTE
CalendarYear *
CalendarMonth *
CalendarDay *
CalendarDayOfWeek 1,7
CalendarDayOfWeekInMonth *

例:毎年3月11日を休日とする。ただし日曜日の場合は翌日を振替休日にする

設定項目
CalendarPatternCategory DATE
CalendarDateCategory HOLIDAY
CalendarFallOnSundayFlag SUBSTITUTE
CalendarYear *
CalendarMonth 3
CalendarDay 11
CalendarDayOfWeek *
CalendarDayOfWeekInMonth *

例:毎年6月と9月の第一、第三水曜日を休日とする

設定項目
CalendarPatternCategory DAY_OF_WEEK
CalendarDateCategory HOLIDAY
CalendarFallOnSundayFlag NOT_SUBSTITUTE
CalendarYear *
CalendarMonth 6,9
CalendarDay *
CalendarDayOfWeek 4
CalendarDayOfWeekInMonth 1,3

例:毎年1月の第三日曜日は営業日とする

設定項目
CalendarPatternCategory DAY_OF_WEEK
CalendarDateCategory BUSINESS_DAY
CalendarFallOnSundayFlag NOT_SUBSTITUTE
CalendarYear *
CalendarMonth 1
CalendarDay *
CalendarDayOfWeek 1
CalendarDayOfWeekInMonth 3


カレンダ機能の呼出

カレンダ機能の呼出は、実装上ではCommonCalendarFacadeというEJBのビジネスメソッドをコールすることを表します。
サービス定義から呼び出す場合と、Javaクラスから直接呼び出す場合の2ケースについてそれぞれ以下で説明します。

サービス定義から呼び出す場合

サービス定義から呼び出したい場合は、Directiveが用意されているのでそちらを使用して下さい。
現状では以下が提供されています。

  • &GetAfterBusinessDay
  • &GetBeforeBusinessDay
  • &GetBusinessDayOfFromTo
Directiveの詳細についてはServiceFrameworkのガイドを参照して下さい。
以下、サービス定義中での記述例です。
(自社の3営業日後を取得する
    format_type  session
    (session
        (session_keys
            利用会社No     @LoginUserInfo/部署No/利用会社No
            3営業日後日付  &GetAfterBusinessDay:{自社カレンダ}{&Today}{3}{利用会社No}
        )
    )
)


Javaクラスから直接呼び出す場合

各フレームワークで定義ファイル中に記述されたJavaプラグインクラスなどからカレンダ機能を利用したい場合もあると思います。
その場合は、PEXAのAPIを使用してCommonCalendarFacadeを呼び出して、ビジネスメソッドを直接コールします。

以下、Javaコード上でのカレンダ機能の呼出例です。

    //カレンダ機能インスタンス取得
    CommonCalendar calendar = EJBCommonCalendarUtils.createCommonCalendar(ResourceUtils.getResource());
    //今日を起点として3営業日後を取得
    Date businessDay = calendar.getAfterBusinessDay(new Key("自社カレンダ"), session, new Date(), 3);



更新情報

  • 最終更新者 : $Author: morishita $
  • 最終更新日時 : $Date:: 2012-03-04 20:11:33 #$
  • バージョン : $Revision: 6868 $



Copyright © 2006, Atrris Corporation