2014年4月7日月曜日

データプロバイダーを使いこなそう - 応用編その3 DB以外のインプット その1

今まで基礎編・応用編とデータプロバイダーに関するエントリーを書いてきましたが、データプロバイダーはデータベースのみがインプットではありません。ハードコーディングやロジック、他のオブジェクト(データプロバイダー/プロシージャ)のアウトプットをインプットにする事もできます。

今回の応用編はデータベース以外のインプットを扱うデータプロバイダーです。

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)
}
}

(1)1日から月末までの日付を組み立てますので、月末日付を取得します。データプロバイダーでは通常のGeneXus関数も使用できます。

(2)INPUTオプションを使用する事で、データベースアクセスではなくループカウンターが使えます。これはプロシージャにおける以下の記述と同等です。
For &Day = 1 To &TargetEndDate.Day()
.....
Endfor

(3)SDTのメンバーにセットするのは日付のみです。値をセットしないメンバーの記述は省略可能です。


Webパネルを作成し、カレンダーデータプロバイダーのテストを行います。
SDTコレクションをGridとしてWeb Formに貼り付け

Refreshイベントでデータプロバイダー呼び出し


画面上からパラメータ(年、月)を指定する事により
該当する月の1日から末日までのデータが表示される




次回は勤怠データを組み立てるデータプロバイダーを作成します。




0 件のコメント:

コメントを投稿