2014年4月21日月曜日

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

データプロバイダー応用編の最後はスケジューラーを作ってみたいと思います。
カレンダーソフトやグループウェアの様に月のカレンダー上で予定を登録していくイメージです。

1.トランザクション

まずは予定を登録するためにイベントトランザクションを作成します。スケジューラー上で表示する為に、予定の日付と時刻を持っています。今回は説明をシンプルにする為にマルチユーザーに対応するための仕組みは入れていません。





2.スケジューラーSDT

スケジューラーをWebパネルに表示するためのSDTです。1日あたり複数の予定が登録出来るように2階層のコレクションにしています。1階層目がカレンダー上の日付、2回目層目が予定(=イベントトランザクション)です。




3.スケジューラーデータプロバイダー

イベントトランザクションからデータを取得し、SDTにセットするデータプロバイダーです。ポイントとしては、前回の勤怠表のように、1日から末日のカレンダーデータを作成しつつ、その日に該当するイベントデータをFor eachによって抽出・セットします。前回は部品化を主眼にカレンダーデータと勤怠データをセットするデータプロバイダーに分割しましたが、今回は1つのデータプロバイダーで構成しています。

もう一つのポイントとしては、Webパネルでのカレンダー表示を一般的な月単位の表示で曜日を固定する形式にするために、1日目のデータの前に空白のレコードを追加している点です。(最初のSDT_ScheduleItemグループの記述)
ここでは、表示上の最初の曜日(日曜日)から1日-1の曜日までをループカウンターで回して空のレコードを作成しています。

このようなデータの作成により、Webパネル上のフリースタイルグリッドでは、カレンダー表示のロジックを意識することなく、カラム指定(Colmuns=7)のみでSDTコレクションのデータを表示するだけでカレンダーのようなレイアウトになります。

SDT_Schedule
{
&TargetDate = YMDtoD(&Year,&Month,1)
&TargetEndDate = EoM(&TargetDate)
&WeekNo = &TargetDate.DayOfWeek() - 1
SDT_ScheduleItem INPUT &Day = 1 to &WeekNo
{
ScheduleDate = NullValue(&TargetDate)
ScheduleDay  = ''
ScheduleDayOfWeek = ''
}
SDT_ScheduleItem INPUT &Day = 1 to &TargetEndDate.Day()
{
&TargetDate = YMDtoD(&Year,&Month,&Day)
ScheduleDate = &TargetDate
ScheduleDay = &TargetDate.Day().ToString().Trim()+'日'
ScheduleDayOfWeek = '('+&TargetDate.DayOfWeekName().Substring(1,1)+')'
Event
{
EventItem order EventTime
where EventDate = &TargetDate
{
EventId
EventDate
EventTime
EventTitle
}
}
}
}



4.Webパネル

最後にWebパネルです。ここはほぼ今までと同じ作りです。SDTコレクション変数を定義し、リフレッシュイベントでデータプロバイダーを呼び出しています。



Webパネルでのポイントはグリッドの定義の仕方です。スケジューラーとしては1日の中に複数の予定を表示させますので、グリッドを2つ使用します。

外側のフリースタイルグリッドはカレンダーデータで、SDTの第一レベルのコレクションを指定します。内側のフリースタイルグリッドはイベントデータでSDTの第二レベルのコレクションを指定します。



表示させるためのデータを準備します。イベントトランザクションにWorkWithパターンを適用・ビルドし、あらかじめイベントデータを登録しておきます。



スケジューラーWebパネルを実行したところ。週が日曜日始まりのカレンダーになっています。




次回はこのWebパネルのグリッドの実装方法についてもう少し補足します。



0 件のコメント:

コメントを投稿