今回の応用編はデータベース以外のインプットを扱うデータプロバイダーです。
1.トランザクションの定義
出勤管理につかうタイムカードを画面表示する機能にデータプロバイダーを使用します。前提としては、1日の出勤・退勤を1レコードとするタイムレコーダートランザクションを作成します。但し、この勤怠データは1日から末日まで全ての日にちのレコードが存在するわけではなく、出勤した場合のみデータを登録します。
タイムレコーダートランザクションのストラクチャー定義 |
個人を識別する社員(Employee)トランザクションも定義していますが、ここでの説明は割愛します。
WorkWith一覧画面でのデータ表示 |
実際に登録されたデータはこの様に日付が歯抜けになりますが、画面としては1日から末日まで全ての日付を表示させる必要があります。
2.SDTの定義
データプロバイダーのOUTPUT型になるSDTを定義します。ここではタイムレコーダートランザクションのストラクチャーをそのままコピーしていますが、画面表示の関係で就業開始時刻/就業終了時刻はTime型ではなくChar型に変更しています。(出勤していない日の時刻は空白表示するため)
3.データプロバイダー
今回のポイントは2種類のデータプロバイダーを作成する点です。日付が歯抜けの勤怠データがベースで、且つ、月内の全ての日付を表示するために、それぞれの役割を持つデータプロバイダーを作成します。
前述で作成したSDTをバケツリレーの様に受け渡し、それぞれのデータプロバイダーで日付のセット、勤怠データのセットとデータを組み立てていきます。
3-1.カレンダーデータ作成用データプロバイダー
処理の順序としてはまず枠に相当するカレンダーデータ(月内の全ての日付)を作成します。DP_TimeRecorder_Calender
{
//(1)パラメータ(年、月)から指定月末の日付を取得
&TargetEndDate = EoM(YMDtoD(&Year,&Month,1))
//(2)INPUTオプションでループカウンター
SDT_TimeRecorder INPUT &Day = 1 To &TargetEndDate.Day()
{
//(3)SDTのメンバーにセットするのは日付のみ
TimeRecorderDate = YMDtoD(&Year,&Month,&Day)
}
}
(2)INPUTオプションを使用する事で、データベースアクセスではなくループカウンターが使えます。これはプロシージャにおける以下の記述と同等です。
For &Day = 1 To &TargetEndDate.Day()
.....
Endfor
(3)SDTのメンバーにセットするのは日付のみです。値をセットしないメンバーの記述は省略可能です。
Webパネルを作成し、カレンダーデータプロバイダーのテストを行います。
SDTコレクションをGridとしてWeb Formに貼り付け |
Refreshイベントでデータプロバイダー呼び出し |
画面上からパラメータ(年、月)を指定する事により 該当する月の1日から末日までのデータが表示される |
次回は勤怠データを組み立てるデータプロバイダーを作成します。
0 件のコメント:
コメントを投稿