データベース
まず第一に、これを最初から作成している場合は、DDS を使用してファイルを定義しないでください。長期的には、次のように SQL で定義したほうがよいでしょう。
CREATE TABLE USERMAST
(UserID char(7),
UserName char(25)
);
LABEL ON TABLE USERMAST is 'User Master Table';
CREATE TABLE WORKPERIOD
(UserID char(7),
WorkDay date,
StartTime time,
EndTime time
);
LABEL ON TABLE WORKPERIOD is 'User Work Periods';
これは、数値フィールドではなく、実際の日付と時刻のフィールドを使用していることに注意してください。これにより、必要に応じて簡単に操作できます。SQL を実行するときに、*ISO、*DMY、または *EUR などの日付と時刻の形式の設定を指定できます。*ISO 形式で保存されていると考えることができますが、任意の形式で提供されます。
ファイル (テーブル) が DDS で定義されているか SQL で定義されているかに関係なく、組み込み SQL を使用してプログラム内のデータを読み取る必要があります。最初は、ネイティブ I/O よりも複雑に見えるかもしれません。しかし、それについて学ぶにつれて、それがより強力で、より簡単で、より速く、より柔軟であることがわかるでしょう。
処理
SQL を埋め込むための基本的な概念は、実際にはそれほど複雑ではありません。あなたのプログラムは、自由形式の ILE RPG で次のようになります (それを使用していると仮定します)。
EXEC SQL DECLARE CURSOR c1 FOR your-select-statement;
EXEC SQL OPEN c1;
do while SQLSTATUS is ok;
EXEC SQL FETCH FROM c1 INTO :var1, :var2, ... ;
if SQLSTATUS is ok;
// process data
endif;
enddo;
EXEC SQL CLOSE c1;
の最初の 2 文字をチェックして、データの終わりやその他の問題をチェックしSQLSTATE
ます。'00' はすべて正常であることを意味し、'01' は警告 (おそらく正常ではない)、それ以外はすべてエラーです。(これは を使用するよりも簡単ですSQLCODE
。)
DECLARE CURSOR ステートメントに SELECT ステートメント (具体的には全選択) を入れます。これにより、カーソルから FETCH するときにシステムが何を提供するかが決まります。SELECT は、多くの強力な機能を実行できます。ここでは、両方のテーブルから情報を取得し、行を要約します。要約するだけなら、次のようになります。
SELECT userid, workday, min(starttime) as firsttime, max(endtime) as lasttime
FROM workperiod
GROUP BY userid, workday
両方のテーブルのデータを結合するだけの場合は、次のようになります。
SELECT u.userid, u.username, p.workday, p.starttime, p.endtime
FROM UserMast as u
JOIN WorkPeriod as p on u.userid = p.userid
これらをまとめる好ましい方法は次のとおりです。
WITH s as
( SELECT userid, workday, min(starttime) as firsttime, max(endtime) as lasttime
FROM workperiod
GROUP BY userid, workday
)
SELECT u.userid, u.username, s.workday, s.firsttime, p.lasttime
FROM UserMast as u
JOIN WorkPeriod as p on u.userid = s.userid
ORDER BY workday descending, username
FOR INPUT ONLY
SQL を使用してデータベースにアクセスする方法について詳しくは、IBM i Information Centerを参照してください。データベース/参照の下を見てください。ディスプレイ・ファイルについては、インフォメーション・センターのプログラミング/DDS/ディスプレイ・ファイルの DDS を参照してください。
表示ファイル
表示装置ファイルに関する限り、サブファイル画面ごとに少なくとも 2 つのレコード様式 (サブファイル・レコード様式とサブファイル制御レコード様式) を定義する必要があります。
サブファイル レコードは、リスト内の行用です。SFL
キーワードが含まれている必要があります。
サブファイル制御レコードは画面を管理します。通常、サブファイルの画面見出しと列見出しが含まれています。SFLCTL(yoursubfilename)
, SFLSIZ(subfile-rows)
, SFLPAG(rows-per-page)
, nn SFLDSP
, nn SFLDSPCTL
, nn SFLCLR
, nn が含まれている必要がありますSFLEND(*MORE)
。ここで、 nn は条件付けインジケータを表します。一般に、サブファイル行がページあたりの行数よりも 1 多いように指定します。ファンクション キーの仕様もここに含めます。
どのファンクション・キーを使用できるかをユーザーに知らせるために、おそらく画面の下部にもレコード様式が必要です。OVERLAY
その場合は、サブファイル制御レコードでキーワードを使用してください。
処理
1.) と をオフSFLDSP
にSFLDSPCTL
して、それらが画面に表示されないようにします。オンSFLCLR
にすると、空のサブファイルの作成が有効になります。ここで、サブファイル制御レコードを書き込みます。
2.) データベースからの行を処理するループ内で、サブファイル レコード番号をインクリメントし、サブファイル レコードを書き込みます。
3.) サブファイル レコードの入力が完了したら: と をオンにSFLDSP
しSFLDSPCTL
て、両方が表示されるようにします。SFLCLR
サブファイル レコードが消去されないようにオフにします。オンにSFLEND
すると、最後のページを除く各ページの下部に「More...」が表示されます。足場記録を書いてください。サブファイル制御レコードを EXFMT します。必要に応じてファンクション キーを処理します。