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 データベース
サンプル :
サブファイルを初期化し、データベースファイルからサブファイルに出力する
注:SB-READ-EQは該当注文番号のレコードのみ読み取りする内部ルーチンです。
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.
サブファイル内のフィールドに対する標識制御
明細の項目にエラーがあったような場合、「反転」、「カーソル位置付け」などの属性をオン
にしなければなりません。これらは、該当標識をセットしたあと、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
を使用します。以下に内部ルーチンの形式にした例を示します。
サンプル:
ここで、IND27は標識27番です。サブファイルにそれ以上のレコードが、なくなったとき
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.
オンにセットしています。
サブファイルデータの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