COBOL その3
前ページ 次ページ 目 次


このページはCOBOLを知っている人あるいは、RPGプログラマーを対象として、
AS/400でのCOBOLを紹介しようとするものです。
COBOLを初歩から解説するものではありません。
ここで紹介するCOBOLはILE−COBOLです。



画面ファイル2(−サブファイル−)

SELECT

ORGANIZATIONは、TRANSACTIONとします。
SUBFILEの場合はACCESS MODEをDYNAMICとします。
また、SUBFILEを相対キーでアクセスするために、RELATIVE KEY として
WORKING−STORAGESECTIONで定義した変数名を指定します。
また独立標識域をとり、ファイル属性にSIをつけます。

SELECT文の例:
      *画面ファイル                                           ↓ INDARA使用の時
           SELECT  FILE1  ASSIGN          WORKSTATION-RF520S-SI
                          ORGANIZATION    TRANSACTION
                          ACCESS  MODE    DYNAMIC
                          RELATIVE KEY    RRN
                          CONTROL-AREA    CTL-AREA.

コントロールエリア

コントロールエリアを下記のようにWORKING−STRORAGE SECTION
に定義します。
コントロールエリアのFKEYに、端末で押されたFキーの種類が番号で入ります。

      * SELECT で指定したコントロールエリアを定義します。          
       01  CTL-AREA.                                               
           03  FKEY      PIC  X(2).                                
           03  DEV-NAME  PIC  X(10).                               
           03  REC-FMT   PIC  X(10).              

FD項目

FDで外部記述をCOPYすると、各様式がREDEFINEされて、同じ場所になって
しまいます。このためプログラムでの処理操作が非常に面倒になります。
WORKING−STORAGEに各様式毎にDDS−様式−I,DDS−様式−Oを
別々にCOPYして定義しておくと、この繁雑さをある程度防ぐことができます。

      *画面ファイルの様式ごとに入力、出力のエリアを定義します。
       01  FMT01A.
           COPY  DDS-FMT01-I     OF RF520S.
       01  FMT01B.
           COPY  DDS-FMT01-O     OF RF520S.
       01  FMT02A.
           COPY  DDS-FMT02-I     OF RF520S.
       01  FMT02B.
           COPY  DDS-FMT02-O     OF RF520S.
       01  SFL01A.
           COPY  DDS-SFL01-I     OF RF520S.
       01  SFL01B.
           COPY  DDS-SFL01-O     OF RF520S.
       01  CTL01A.
           COPY  DDS-CTL01-I     OF RF520S.
       01  CTL01B.
           COPY  DDS-CTL01-O     OF RF520S.
       01  FMT99B.
           COPY  DDS-FMT99-O     OF RF520S.

独立標識域

INDARAキーワードで、独立標識域をとった場合、WORKING−STRAGEに
標識域を定義します。
このエリアをINDICATORSで指定してREAD/WRITEを行います。

       * INDARA を定義したので、ワークに標識エリアを定義します。 
        01  FILE2-INDICS.                                        
            COPY  DDS-ALL-FORMATS-INDIC  OF RM420S.          

サブファイルアクセス用RRN

SELECTで記述したサブファイルをアクセスするためのRRNをWORKING−STRAGEに
定義します。

       01  RRN       PIC  9999.

プログラムの中で必要となる標識は、WORKING−STORAGE SECTIONで定義します。
      *プログラムで使用する標識(及び定数)を定義します。
       01  CONST.
           03  Z-ON           PIC  1   VALUE  B'1'.
           03  Z-OFF          PIC  1   VALUE  B'0'.
           03  IN27           PIC  1   VALUE  B'0'.
           03  IN29           PIC  1   VALUE  B'0'.
           03  IN30           PIC  1   VALUE  B'0'.
           03  IN98           PIC  1   VALUE  B'0'.
           03  IN99           PIC  1   VALUE  B'0'.
           03  F03            PIC  XX  VALUE  '03'.
           03  F06            PIC  XX  VALUE  '06'.
           03  F12            PIC  XX  VALUE  '12'.

画面表示と入力データ取得

サブファイル画面以外は、先の一般の画面の通りです。


サブファイルの操作

サブファイルへのデータの書き込み

サブファイルへデータを書き込みするには、次の2通りの方法があります。
1.サブファイルを「クリア」して、WRITEで書き込みする。
2.サブファイルを「初期化」して、READ&REWRITEで書き込みする。

サブファイルの「クリア」とは、サブファイルにレコードが1件もない状態にすることを
いいます。「クリア」はDDSのSFLCLRを標識でオンにして、サブファイル制御の
様式を画面出力するとクリアできます。
WRITEしてクリアとは解せない感じですが、2段式ロケットによる処理とでも考えて下さい。
サブファイルの「初期化」とは、ブランクまたは0を書き込みした状態にすることをいい
ます。「初期化」はDDSのSFLINZの標識でオンにしてサブファイル制御の様式を
画面出力を行うことでクリアできます。
ここでは、操作がいつも同じ手口(すなわち、いつでもCHAIN+UPDAT)にできるところ
から、2.の「初期化」の方法を採用しています。

サブファイルへのデータの書き込みのロジックは次のようになります。

1.サブファイルを初期化する。

2.データベースファイルをよみ、サブファイルに書き込みを繰り返す
2.1 READ データベース
2.2 以下の繰返し
・ RRNを+1する
・ RRNをキーとしてサブファイルをREAD
・ サブファイルのフィールドに編集
・ サブファイルにREWRITE
次のREAD データベース

サンプル :
サブファイルを初期化し、データベースファイルからサブファイルに出力する

           PERFORM  SB-INZ-SFL.
            ・・・
           MOVE  0000   TO  RRN     W-KEN.
           MOVE  0001   TO  RCDNO   OF  CTL01-O.
           MOVE  0000   TO  S4GYNO  OF  SFL01-O.

           MOVE   Z-OFF  TO   IN99.
           START  FILE2  KEY  NOT LESS  THAN EXTERNALLY-DESCRIBED-KEY
                                 INVALID  KEY  MOVE  Z-ON  TO  IN99.
           PERFORM  SB-READ-EQ.
           PERFORM  UNTIL  IN99  =  Z-ON
               ADD   01       TO  RRN     W-KEN
               READ  SUBFILE  FILE1   FORMAT  'SFL01'
               MOVE  RRN      TO  S4GYNO  OF  SFL01-O
               MOVE  JDHNNO   TO  S4HNNO  OF  SFL01-O
               MOVE  JDJUSU   TO  S4JUSU  OF  SFL01-O
               MOVE  JDJUTK   TO  S4JUTK  OF  SFL01-O
               COMPUTE            S4JUGK  OF  SFL01-O
                                  =   JDJUSU  *  JDJUTK
               MOVE  JDSEDT   TO  S4SEDT  OF  SFL01-O
               REWRITE  SUBFILE  FILE1R  FROM  SFL01-O  FORMAT 'SFL01'
                                 INDICATORS    SFL01-O-INDIC
               PERFORM  SB-READ-EQ
           END-PERFORM.
注:SB−READ−EQは該当注文番号のレコードのみ読み取りする内部ルーチンです。


サブファイル内のフィールドに対する標識制御

明細の項目にエラーがあったような場合、「反転」、「カーソル位置付け」などの属性をオン
にしなければなりません。これらは、該当標識をセットしたあと、INDICATORS句をつけ
たREWRITEすることによって、その行の属性をセットできます。例えば、3行の明細の
内、2行目だけにエラーのフィールドがあったとすると、その行についてのみ該当標識を
オンにして、(すなわち1、3行目はオフにして) REWRITE命令を行えば、2行目のその
フィールドが「反転」、「カーソル位置付け」の状態になります。


サブファイルの表示

サブファイルの表示は、サブファイルにデータをセット(WRITE/REWRITE)した
のち、SFLDSPを標識でオンにして、サブファイル制御様式を画面出力して行ないます。

サンプル:
               MOVE  Z-ON   TO  IN23  IN24
               WRITE   FILE1R  FROM  CTL01-O  FORMAT  'CTL01'
                               INDICATORS     CTL01-O-INDIC
               MOVE  Z-OFF  TO  IN23  IN24

画面で入力されたサブファイルのデータの読取り

サブファイル制御の様式をFORMATに与えてREADします。

サンプル:
READ FILE1 INTO CTL01-I FORMAT 'CTL01'


変更されたサブファイルデータの読取り。

変更があった(すなわち入力があった)サブファイルデータを読み取りするには、
READ SUBFILE 〜 NEXT MODIFIED
を使用します。以下に内部ルーチンの形式にした例を示します。
サンプル:
       SB-READ-CHG.
           MOVE  Z-OFF    TO     IN27.
           READ  SUBFILE  FILE1  NEXT  MODIFIED  RECORD  INTO SFL01-I
                                 FORMAT  'SFL01'
                          AT     END     MOVE  Z-ON  TO  IN27.
           IF  IN27   =  Z-OFF
               MOVE  CORR   SFL01-I  TO  SFL01-O
           END-IF.
ここで、IND27は標識27番です。サブファイルにそれ以上のレコードが、なくなったとき
オンにセットしています。


サブファイルデータのRRNによる全件読取り

サブファイルのデータをRRNで全件読取りするには、RRNを変えながら、そのRRNを
キーとして、FORMATにサブファイルの様式名を指定して、READします。

サンプル:サブルーチン化した例。
(このルーチンが呼ばれる前にRRNはセットされているものとします。)

      *サブファイルをRRNで読み取り
       SB-CHAIN-SFL.
           MOVE  Z-OFF    TO     IN27.
           READ  SUBFILE  FILE1  RECORD  INTO SFL01-I
                                 FORMAT  'SFL01'
                          INVALID  KEY   MOVE  Z-ON  TO  IN27.
           IF  IN27   =  Z-OFF
               MOVE  CORR   SFL01-I  TO  SFL01-O
           END-IF.

入力データ取得後の処理は、以下の処理を行います。

1.Fキーのとき、そのFキーの機能のための処理。
  (例:1画面分戻る、必要ならプロンプト画面表示など)
2.実行キーのとき、
  サブファイルについて変更されたサブファイルレコード取得
  必要あれば、名称などの属性取得、金額計算など
  入力データのチェック、エラーならエラー標識などのセット。
  チェックOKなら次の処理(または画面)の準備。


例:サブファイルからデータベースファイルの更新

この例では、変更の有無情報をサブファイル・レコードのRRNに対応させて、配列CHGに記録
しています。データベースファイルは変更(入力)があったデータのみ(即ちCHGが1のもの
のみ)サブファイルから読取り、データベースファイルを更新しています。
サブファイルのレコード件数は99件以下という想定です。

               PERFORM    VARYING  RRN  FROM  01  BY  01
                          UNTIL  RRN >99
                   IF    CHG (RRN)  = '1'
                       PERFORM  SB-CHAIN-SFL
                       MOVE  S1JUNO OF FMT01-I  TO  JDJUNO
                       MOVE  RRN                TO  JDMENO
                       MOVE  Z-OFF  TO  IN99
                       READ  FILE2  RECORD  INVALID  KEY
                                    MOVE  Z-ON  TO  IN99
                       END-READ
      * 編集
                       PERFORM  SB-0100
                       IF    IN99  =  Z-OFF
                           REWRITE  FILE2R
                       ELSE
                           WRITE    FILE2R
                       END-IF
                   END-IF
               END-PERFORM

      *サブファイルをRRNで読み取り
       SB-CHAIN-SFL.
           MOVE  Z-OFF    TO     IN27.
           READ  SUBFILE  FILE1  RECORD  INTO SFL01-I
                                 FORMAT  'SFL01'
                          INVALID  KEY   MOVE  Z-ON  TO  IN27.
           IF  IN27   =  Z-OFF
               MOVE  CORR   SFL01-I  TO  SFL01-O
           END-IF.

上の例で、SB−100は、ファイルのフィールドへ、データを編集するルーチンですが、
ソースは省略しています。


サンプル・プログラム

サンプル・プログラムはこちらを参照してください。



前ページ 次ページ 目 次


(C)COPYRIGHT ISHIOKA KATSUHIDE 2000−2008