0

たとえば、次のテーブルがあるとします。

USRMF(メイン物理ファイル)

User ID   User Name  
A00001    SAMUEL
A00002    ADAM

USRTS

user id   date   time in    time out
A000001   080812 084555     104545 
A000001   080812 120800     150000
A000001   080812 170000     180000
A000001   090812 084555     104545
A000001   090812 170000     180000
A000002   080812 084555     104545 
A000002   080812 120800     150000
A000002   080812 170000     190000
A000002   090812 084555     104545
A000002   090812 170000     190000

私のサブファイルは次のようになります。

Option:  5-display

OPT   User ID   User Name  Date   TimeIn  TimeOut
 _    A000001   SAMUEL     090812 084555  180000
 _    A000002   ADAM       090812 084555  190000
 _    A000001   SAMUEL     080812 084555  180000
 _    A000002   ADAM       080812 084555  190000

*このサブファイルには、ユーザーおよび日ごとの要約データが表示されます。最初の入力と最後のタイムアウトです。名前は他のデータベーステーブル(USRMF)から読み取る必要があり、タイムカードの日付で並べ替える必要があります。

ユーザーがオプション5を3番目のサブファイル行(ユーザーID:A000001ユーザー名:samuelおよび日付090812)に置くと、次のサブファイル画面が表示されます。

OPT   User ID   User Name  Date   TimeIn  TimeOut
 _    A000001   SAMUEL     080812 084555  104545 
 _    A000001   SAMUEL     080812 120800  150000
 _    A000001   SAMUEL     080812 170000  180000

このサブファイルには、選択した日と人のすべての時間とタイムアウトがリストされている必要があります。

このプログラムはどのようにすればよいですか????????? 特に最初のサブファイルの場合。?????

4

2 に答える 2

5

データベース

まず第一に、これを最初から作成している場合は、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.) と をオフSFLDSPSFLDSPCTLして、それらが画面に表示されないようにします。オンSFLCLRにすると、空のサブファイルの作成が有効になります。ここで、サブファイル制御レコードを書き込みます。

2.) データベースからの行を処理するループ内で、サブファイル レコード番号をインクリメントし、サブファイル レコードを書き込みます。

3.) サブファイル レコードの入力が完了したら: と をオンにSFLDSPSFLDSPCTLて、両方が表示されるようにします。SFLCLRサブファイル レコードが消去されないようにオフにします。オンにSFLENDすると、最後のページを除く各ページの下部に「More...」が表示されます。足場記録を書いてください。サブファイル制御レコードを EXFMT します。必要に応じてファンクション キーを処理します。

于 2012-08-12T16:03:05.173 に答える
0

@WarrenT は優れた回答を提供しました。SQL を好まない場合でも、一般的な概念を使用してサブファイルを読み込んで表示できます。私たちのほとんどは、 Application Display Programming Guideという非常に古い本から学習しました。それは15年間変わっていません。これとは別に、あなたのグループの他のメンバーがサブファイル プログラミングをどのように行っているかを同僚に見せてもらうことを強くお勧めします。ほとんどの場合、準拠したいスタイルの問題があります。

于 2012-08-13T14:00:49.657 に答える