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

前回のつづきです。

3-2.勤怠データ作成用データプロバイダー

前回はカレンダーデータ作成用データプロバイダーを作成しました。そのデータを受けて勤怠データをマージするデータプロバイダーです。



出力結果のイメージとしては個人ごとの勤怠状況を表示させますので、パラメータに社員IDを含めます。







DP_TimeRecorder
{
//(1)カレンダーデータ作成用データプロバイダーを呼び出し
&SDT_TimeRecorderCollection = DP_TimeRecorder_Calender(&Year, &Month)
//(2)INPUTオプションでコレクションループ
SDT_TimeRecorder INPUT &SDT_TimeRecorder in &SDT_TimeRecorderCollection
{
//(3)勤怠データの検索(for eachに相当)
DUMMY [NOOUTPUT]
where TimeRecorderDate = &SDT_TimeRecorder.TimeRecorderDate
where EmployeeId = &EmployeeId
{
TimeRecorderId
EmployeeId
EmployeeName
TimeRecorderDate
//(4)SDTでは文字列型なので型変換
TimeRecorderStartTime = TimeRecorderStartTime.ToString()
TimeRecorderEndTime = TimeRecorderEndTime.ToString()
TimeRecorderDescription
}
//(5)該当なしの場合(when noneに相当)
DUMMY [NOOUTPUT] [DEFAULT]
{
//(6)値が必要なメンバーのみセット
TimeRecorderDate = &SDT_TimeRecorder.TimeRecorderDate
}
}
}

(1)前回作成したカレンダーデータ作成用データプロバイダーを呼び出し、SDTコレクションデータを取得します。この様にデータプロバイダーソースでは他のデータプロバイダーやプロシージャを呼び出す事が可能です。

(2)INPUTオプションを使用する事でコレクションループを使う事ができます。これはプロシージャにおける以下の書き方と同等です。

For &SDT_TimeRecorder in &SDT_TimeRecorderCollection
    ....
Endfor


(3)勤怠データを検索します。(for eachに相当) コレクションループで取り出した変数も利用可能です。

(4)開始時刻、終了時刻はSDTでは文字列型として定義しているので、Time型から型変換してセットします。

(5)[DEFAULT]オプションを指定する事で、検索した結果該当なしの場合の処理になります。(when noneに相当)

(6)値が必要なメンバーのみセットしています。必要ない場合は記述は省略可能です。


4.Webパネル

Webパネルは前回とほぼ同様です。個人を特定するためのダイナミックコンボボックスを追加しています。



5.実行結果

実行結果です。先に作成したカレンダーデータに対して、該当する日付の勤怠データがマージされています。



いかがでしたでしょうか? 目的の違うデータプロバイダーを組み合わせることで、簡潔な記述のまま、より複雑な実装が可能になります。



コメント

このブログの人気の投稿

データプロバイダーを使いこなそう - 応用編その4 スケジューラー 補足編

HTMLヘッダーにあれこれ直接追加したいとき

GeneXusにおけるWebアプリケーションセキュリティ対策 - OWASP 2010 Top10 Security Risks in GeneXus Applications