COBOL
次ページ 目 次


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


全般

AS/400のCOBOLは一般のCOBOLとほとんど同じ仕様です。大きく異なるのは、
外部記述を利用する部分だけといってよいでしょう。
AS/400はデータベース・ファイル、画面ファイル、印刷ファイルにそれぞれ多くの情報を持っており、
COBOLでは、これらの情報を取り込み、コンパイルすることができるようになっています。
この部分が他のCOBOLと大きく異なる点です。これは同時にAS/400COBOLの特長でもあります。


4つのDIVISION

一般のCOBOLと同じく、
IDENTIFICATION、 ENVIRONMENNTO、 DATA、 PROCEDURE
です。


引用符(シングルクォーテーション)

AS/400に限らず、IBM系では、引用符はシングルクォーテーションが、主流ですが
COBOLの世界ではダブル・クォーテーションのようです。シングルクォーテーション
を使用してすると、コンパイル時に次のような重大度10の注意を受けます。

「リテラルの区切り文字が正しくない。リテラルは受け入れられます。」

これはエラーではありません。 コンパイル時のオプションでシングル・クォーテーションを
パラメータで指定するか、COBOLソースのの先頭行に、PROCESS ステートメントを
おくことによって、引用符の変更指示ができます。
コンパイルのときは、次のようにOPTIONパラメータで*APOSTを与えます。
    CRTBNDCBL  PGM(WRKLIB/LM420B)  −
                       SRCFILE(WRKLIB/QCBLLESRC) −
                       OPTION(*APOST)
注:行の最後の−(ハイフン)は行の継続を表わします。実際には継続なしで入力できます。

PROCESSステートメントのときは、COBOLソースの先頭行に8桁目から、

PROCESS  APOST

と入力します。


プログラムID

ほとんど意味をもちません。ソースファイルのメンバー名が実質のプログラムIDになります。
メンバー名とプログラムIDが異なるとき、重大度10のエラーメッセージがでますが、
コンパイルは通ります。 (コンパイラーは重大度20まではオブジェクトを作成します。)


SOUCE−COMPUTER./OBJECT−COMPUTER.

どんな型式でもOKのようです。(補足、無しでもOKでした)


SPECIAL  NAMES.

外部の環境名とプログラム内部の簡略名を関連づけます。
環境名には、次のようなものがあります。(すべてではありません。)

環境名 取得方法、セット方法 内容
I−O−FEEDBACK ACCEPT 入出力の結果の情報
OPEN−FEED−BACK ACCEPT OPEN直後のファイル情報
CONSOLE,SYSTEM−CONSOLE ACCEPT,DISPLAY システム捜査員とのメッセージのやりとり
LOCAL−DATA、DATA−AREA ACCEPT,DISPLAY プログラム間をわたるデータのやりとり

ローカル・データ・エリアとユーザー・データ・エリア

ファイルのほかにプログラム間で情報の授受をするためのエリア(オブジェクト)として、データ・エリアがあります。
データ・エリアはレコード1件だけからなるファイルをイメージしてください。
ファイルはREAD/WRITEで入出力を行いますが、データ・エリアはACCEPT/DISPLAYで入出力を行います。
データ・エリアはAS/400のシステムでサポートしているもので、COBOLに特有なものではありません。


ローカル・データ・エリア

ローカル・データ・エリアはジョブ毎に自動的に1個作成される1024バイトのエリアです。
ジョブが終わると自動的に削除されます。
ローカル・データをCOBOLで使用するにはプログラムではSPECIAL NAMES段落で定義をして使用します。


ユーザー・データ・エリア

ユーザー・データ・エリアはCRTDTAARAコマンドで作成されるデータ・エリアで、DLTDTAARAコマンドで
削除するまで存続します。エリア名はファイル名と同様に命名でき、同一ライブラリー中では重複できません。
重複しなければいくつでも作成できます。
ユーザー・データ・エリアはCOBOL/400ではサポートされていません。
ユーザー・データ・エリアをCOBOLで使用するにはプログラムではSPECIAL NAMES段落で定義をして使用します。

以下にローカル・データ・エリアとユーザー・データ・エリアの例を示します。
ここではユーザー・データ・エリアは「USRUDA」の名前で以下のように定義されているものとします。

CRTDTAARA DTAARA(WRKLIB/USRUDA) TYPE(*CHAR) LEN(30)

       PROCESS APOST GRAPHIC                                           
       IDENTIFICATION      DIVISION.                                   
       PROGRAM-ID.         T1ARA.                                      
       ENVIRONMENT         DIVISION.                                   
       CONFIGURATION       SECTION.                                    
       SOURCE-COMPUTER.    IBM-AS400.                                  
       OBJECT-COMPUTER.    IBM-AS400.                                  
       SPECIAL-NAMES.      LOCAL-DATA      IS  L-ARA                   
                           DATA-AREA       IS  U-ARA.                  
       DATA                DIVISION.                                   
      *--------------------------------------------------------------- 
       WORKING-STORAGE     SECTION.                                    
      * ローカル・データ・エリア                                            
       01  L-ARA-W.                                                    
           03  L-FLD01     PIC X(10)  VALUE  SPACE.                    
           03  L-FLD02     PIC X(05)  VALUE  SPACE.                    
      * ユーザー・データ・エリア
       01  U-ARA-W.                                                    
           03  U-FLD01     PIC X(10)  VALUE  SPACE.                    
           03  U-FLD02     PIC X(05)  VALUE  SPACE.                    
           03  U-FLD03     PIC X(15)  VALUE  SPACE.                    
      *---------------------------------------------------------------
       PROCEDURE           DIVISION.                                  
       TTT-MAIN.                                                      
           ACCEPT   L-ARA-W  FROM  L-ARA.                             
           ACCEPT   U-ARA-W  FROM  U-ARA  FOR  'USRUDA'.              
      * ローカル・データ・エリア                                            
           MOVE     '1111122222'        TO   L-FLD01.                 
           MOVE     '33333'             TO   L-FLD02.                 
      * ユーザー・データ・エリア                                             
           MOVE     '4444455555'        TO   U-FLD01.                 
           MOVE     '66666'             TO   U-FLD02.                 
           MOVE     '777778888899999'   TO   U-FLD03.                 
           DISPLAY  L-ARA-W  UPON  L-ARA.                             
           DISPLAY  U-ARA-W  UPON  U-ARA  FOR  'USRUDA'               
           GOBACK.                                  


SELECT文

SELECT文では外部ファイル名は、原則として外部の実体名と一致させます。
実体としては、データベースファイル、 印刷ファイル、画面ファイルなどがあります。

SELECT   FILE1  ASSIGN  TO  装置−外部ファイル名

例えば、FILE1が外部の物理ファイルのM420であるときは、次のようになります

SELECT FILE1 EB10 ASSIGN TO DATABASE−M420

外部ファイル名と実体名が異なるときは、CLのOVRDBF、OVRDSPF、
OVRPRTFなどのコマンドで以下のように、一時変更できます。

OVRDBF FILE(ファイル名) TOFILE(ライブラリー/実体名)

例:
OVRDBF FILE(M420) TOFILE(WRKLIB/M420A)

関連づけられる外部のファイルの種類と装置の関係は下図のとおりです。
関連づけられるファイル 装置
物理、論理ファイル DATABASE
外部記述の印刷ファイル FORMATFILE(注−1)
プログラム記述の印刷ファイル PRINTER(注−2)
画面ファイル WORKSTATION
注−1:外部記述の印刷ファイルを使用するときは、下図のようになります。
           SELECT  FILE1 ASSIGN  FORMATFILE-LM420P
                         ORGANIZATION SEQUENTIAL.

注−2:プログラム記述の場合は、通常のCOBOLの様式でFD項目を記述します。


外部記述のキー

外部記述のデータベースファイルのキーをレコードキーに使用するときは、予約語の
EXTERNALLY−DESCRIBED−KEYを使用します。

      RECORD  KEY  EXTERNALLY−DESCRIBED−KEY

データベースファイルのSELECT文のサンプルを下図に示します。
      *印刷対象ファイル  得意先マスター
           SELECT  FILE2  ASSIGN          DATABASE-M420L02
                          ACCESS  MODE    SEQUENTIAL
                          RECORD  KEY     EXTERNALLY-DESCRIBED-KEY
                          WITH            DUPLICATES
                          ORGANIZATION    INDEXED.


印刷ファイルの場合

印刷ファイルの外部記述を使用する場合は、FORMATFILEが必要です。(下図参照)
このとき、WRITEにADVANCING句は使用できません。
      * 印刷ファイル                       ↓外部記述のとき     
           SELECT  FILE1  ASSIGN          FORMATFILE-LM420P     
                          ORGANIZATION    SEQUENTIAL.      


重複キー


論理ファイルの場合は、重複キーありのケースが多いですが、このような場合は、SELECTに、
WITH   DUPLICATESが必要です。
これを忘れると、コンパイルはとおりますが、OPENのときにファイル状況「95」のエラーになります。
(注:WITH DUPLICATESはAS/400に特有のものという訳ではありません。)


ファイルステータス

ファイル・ステータスは一般のCOBOLと同様に使用できます。
WORKING−STORAGE SECTIONに、ステータス用の2桁の文字列変数を
用意して使用します。
ただし、ここでは、RPGプログラマーに馴染みの深い、(あるいはAS/400らしい)
標識を使った方法をとりあげることにします。


FD項目におけるLABEL RECORD,BLOCK CONTAINS

FD項目におけるLABEL RECORD,BLOCK CONTAINSは、AS/400では
意味を持ちません。AS/400では、主記憶装置と外部記憶装置との間のデータ
転送は、全てシステムがページングの一環としてコントロールを持っているからです。

       FD  LPFL                                         
           LABEL      RECORD       IS        STANDARD   
           BLOCK      CONTAINS     0         RECORDS    

BLOCK CONTAINS 0 RECORDSは、重大度20のメッセージが表示されます。
コンパイルは行われます。


FD項目での外部ファイル情報のCOPY

一般のCOBOLと同様に、COPYが使用できます。
特に指定しなければ、COPYのソース・ファイル名はQLBLSRCが想定されます。
DDSで記述された外部情報を、COPYして利用するためには、以下のように予約語の、
DDS−ALL−FORMATSを使用します。

   COPY  DDS−ALL−FORMATS   OF  外部ファイル名

例:FD項目でファイルM420の外部記述を利用する場合は、下図のようになります。
       FD  FILE1.
       01  FILE1R.
           COPY  DDS-ALL-FORMATS OF M420. 
これによって、コンパイルのときファイルM420の様式が、PICTURE定義として展開されます。
01レベルのレコード名(上の例ではFILE2R)は自由につけられます。
外部記述の印刷ファイルの情報をCOPYする場合も同様で、下図のようになります。
    FD  FILE2.
    01  FILE2R.
          COPY  DDS−ALL−FORMATS  OF  LM420P.

注意すべきは、印刷ファイルLM420Pが見出しと明細のように、様式を複数もつ場合で、
このとき、それらの様式は同じ場所(アドレス)に、REDEFINEされて定義されます。
即ち、明細にデータをセットすると、見出しの内容がこわされるなどの現象がでてくるので、
そのための対策が必要になります。画面ファイルの場合も同様です。

従来のCOPY

これは一般のCOBOLと同じです。コピーメンバーの省略時のソースファイルはQLBLSRCです。
もし、そこでメンバーがみつからないときは、COBOLプログラムの入っているソースファイルを探しにいきます。

COPY命令は、PROCEDURE DIVISIONでも使用できます。


WORKING−STORAGE SECTION.

通常のCOBOLと同様です。ここでも従来型のCOPY句のほかに、外部記述のCOPYが使用できます。


標識

COBOLでの標識は、長さ1のビット列として定義します。(下図参照)
RPGでの標識*INnn(nnは01〜99)は、COBOLではINnnのようになります。
      * プログラムで使用する標識(及び定数)を定義します。       
       01  CONST.                                                
           03  Z-ON           PIC  1   VALUE  B'1'.              
           03  Z-OFF          PIC  1   VALUE  B'0'.              
           03  IN99           PIC  1   VALUE  B'0'.       
ビット列の定数、B’1’,B’0’はコーディングのとき、キーストロークが面倒なので、
上例のように変数(例:Z−ON,Z−OFF)の形で定義しておくのが便利です。
先のCOPY句で取得した場合の標識も INnnの形で定義されます。(下図参照)
    20     002600 FD  FILE1.                                                 
    21     002700 01  FILE1R.                                                
           002800     COPY  DDS-ALL-FORMATS OF LM420P.                       
    22    +000001       05  LM420P-RECORD PIC X(95).                         
          +000002*    I-O FORMAT:HDR01      FROM FILE LM420P     OF LIBRARY  
          +000003*                           見出部様式                      
          +000004*      05  HDR01         REDEFINES LM420P-RECORD.           
          +000005*  INPUT FORMAT:DTL01      FROM FILE LM420P     OF LIBRARY  
          +000006*                           明細部様式                      
          +000007*      05  DTL01-I       REDEFINES LM420P-RECORD.           
          +000008* OUTPUT FORMAT:DTL01      FROM FILE LM420P     OF LIBRARY  
          +000009*                           明細部様式                      
    23    +000010       05  DTL01-O       REDEFINES LM420P-RECORD.           
    24    +000011           06 DTL01-O-INDIC.                                
    25    +000012                07 IN11             PIC 1  INDIC 11.        
    26    +000013           06 P1TKNO                PIC X(5).   

漢字データ

漢字データは2バイトで1文字を表わし、IBM系では、16進数の0E,0Fのシフト
コードで区切られた文字列です。
国産系ではこのシフトコード(0E,0F)がそれぞれ2バイトになっている場合がある
ので、互換性において注意が必要です。また、パソコン系では、2バイトの先頭の1ビットが
オンかオフで漢字であるかどうかを区別しています。
従って、パソコンから変換するようなときは、データベースや画面、印刷帳票などのレイ
アウトの桁ずれなどに注意が必要です。

国産機にみられる2バイト文字の記述「NC」は、AS/400では「N」となります。

       01  AAA.                                                
           03  AAAA      PIC  NC(05)    VALUE  NC' あいうえお '.  

                                              

       01  AAA.                                                
           03  AAAA      PIC  N(05)     VALUE   N' あいうえお '.  

同様に「NA」も「N」となります。
                   MOVE    NA"2"       TO      HD-12  
                          
                   MOVE     N" 2 "    TO      HD-12  


算術数値の有効桁数

ILE−COBOLでは18桁が最大です。つまり、

01  PIC  S9(n)V9(d) COMP−3.

のとき、n+dの最大が18桁です。

S9(19)とすると、SEUの段階で文法チェックのエラーに
なります。(RPGでも最大31桁です)
注:同じILE−COBOLであっても、OSのバージョンによっては最大有効桁数が31の場合もあります。


倍精度浮動小数点数

FORTRANでのREAL*4相当のCOMP−1,REAL*8相当のCOMP−2が使用できます。


SCREEN SECTION

AS/400のCOBOLではSCREEN SECTIONは使用できません。
特にパソコン系からのCOBOLプログラムを変換するときは、大幅なワークロードの見積ちがいが
発生する可能性があります。要注意です。


LINKAGE SECTION

一般COBOLと同じです。


二次ENTRY

AS/400のCOBOLでは、二次ENTRYは使用できません。解決策として、二次ENTRY用として、
プログラムを呼び出すだけの小さなプログラムを、CL、または、COBOLで作成しておけばよいでしょう。
下図はCLの例です。このCLを二次ENTRY名で作成します。

PGM
    CALL   PGM(プログラム名) 
ENDPGM
呼出のパラメータがある場合は、そのためのPARMパラメータや、変数名定義のDCLの
記述も必要です。


段落

SECTIONとして定義していなくても、段落から次の段落の前までを、ひとつの内部
サブルーチンのように、使用できます。これはAS/400−COBOLに特有なものと
いうわけではありません。(これはRPGプログラマー向けの説明です。)


繰返し処理

PERFORM   XXX  UNTIL   A = B.の形のとき、UNTILの語句があっても、
実際はWHILEの場合と同様にチェックされます。すなわち、UNTILの場合は繰返し
が最低1回は実行されますが、COBOLの場合は条件が合わないと1度も実行される
ことはありません。なまじ、UNTILとあるだけに紛らわしいわけです。
明示的にコーディングすれば、勘違いをさけられます。

明示的にUNTIL型の繰返しにするためには、

PERFORM SUB-MAIN WITH TEST AFTER UNTIL IN99 = Z-ON.

のように、WITH TEST AFTERを使用します。

参考:
PERFORM SUB-MAIN WITH TEST BEFORE UNTIL IN99 = Z-ON.


読取の位置づけ

データベース読取の位置づけはSTART命令で行います。
RPGでのSETLL,SETGTに相当します。


START命令でファイルが0件データの場合、状況コード23のエラーになります。
INVALID KEYをつければこのエラー発生はさけられます。(下図参照)
           START  FILE2    KEY  NOT  LESS  THAN                        
                                   EXTERNALLY-DESCRIBED-KEY            
                                   INVALID  KEY  MOVE  Z-ON  TO  IN99. 
      *                              ↑0件のときは INVALID KEY        


READ−EQUAL

指定されたキーと同じ値のキーを持つレコードを読みとりする、RPGのREADEもどきの処
理を実現するためには、内部ルーチンの形にしておくのが便利です。(下図参照)
このとき、標識はシステムでなく、プログラムでON/OFFする必要があります。
      * 指定キーと同一キーを持つレコードを読取りする。 (READ-EQ)     
       SB-READ-EQ.                                                   
           IF  IN99 = Z-OFF                                          
               READ  FILE2  NEXT  RECORD    AT  END                  
                     MOVE   Z-ON  TO  IN99                           
               END-READ                                              
               IF    TKSLNO  NOT =   W-SLNO                          
                     MOVE   Z-ON  TO  IN99                           
               END-IF                                                
           END-IF.                                                


外部記述の印刷ファイルに出力

外部記述の印刷ファイルに出力するときは、FORMAT句でどの様式による出力を行う
かを指定します。
このとき、その様式の記述がたとえ何行分であっても、1回の出力(WRITE)で印刷
されます。

明細部の出力の例
WRITE   FILE1R   FORMAT   'DTL01'.
見出し部の出力の例
WRITE   FILE1R   FORMAT   'HDR01'.


フィールド印刷の標識制御

条件に応じてのとき、**のようなマークの印刷するようなとき、それを標識で制御して
いるような場合に、注意しないとその定数項目をオフしたとき、それに付属のSPACEA(1)の
ような改行制御も、同時にオフとしてしまうことになります。

     A            P1URGK        11S 0     +8TEXT(' 売上実績額 ')   
     A                                       EDTCDE(K)             
     A  11                                +2 '**'                  
     A                                       SPACEA(1)        

           IF    TKURJS  >   10000                       
              MOVE  Z-ON   TO  IN11                      
           ELSE                                          
              MOVE  Z-OFF  TO  IN11                      
           END-IF.                                      
この例では、実績額が10,000円を超えた場合に、標識11をオンにして’**’を
印刷させています(下図参照)。10,000円を超えない場合は標識11はオフになり、
’**’の印刷はしません。が、同時に、付属のSPACEA(1)も有効でなくなるので、
改行がおかしくなります。
このようなときは、’**’またはブランクを変数に入れて印刷するようにするか、ブラ
ンクを印刷するような、ダミーのフィールドにSPACEA(1)を付属させるなどの工夫が必要です。

 ..8....+....9....+....0....+....1....+....2....+....3.. 
                         0/04/24  15:11:51               
                                 PAGE. 0001              


    TEL        担当営業          売上実績    MK         

   03-3333-1122  3333               212,000   **         

   03-3333-1166  3333                16,000   **         
                                              ↑
      **にSPACEA(1)が付属しています。
      **が標識で無効になるとSPACEA(1)も無効になります。
      この結果、改行が意図どおりに行われなくなります。

印刷制御の考慮事項

プログラムの中で、「タイトルを1行印刷したなら、何行改行して、項目を見出しを2行にわたって印刷して、
さらに仕切りの線をひいてとか、明細は3行で1明細にして
」、のようなレイアウトに関する処理は、プログラムの
本質的な部分からはずれるだけでなく、このための制御によってプログラムが複雑になりがちです。
印刷ファイルはレイアウトの情報をできるだけ、プログラムから印刷ファイルに移すものです。
印刷ファイルを使用すると、多少印刷出力のレイアウトに変更があっても、プログラムロジックの修正が殆ど
必要なく、プログラムのリコンパイルだけですむことが多いので、プログラム作成の効率がアップします。
プログラムの移植の場合は別として、新規にプログラムを作成する場合は、印刷ファイルをできるだけ使用する
のが得策です。
また、RLUというユーティリティを使用すると、印刷設計レイアウトも簡単に作成できるので、設計文書の作成も
楽になります。RLUはPDMのメンバーの処理で、19番のオプションを使用すると呼び出しできます。



ファイルの編成とアクセス

ファイルの編成とSELECT文での指定の方法は次のとおりです。
    順次ファイル 相対ファイル 索引付ファイル
印刷ファイル
TAPE
キーの無いPF キーのあるPF、LF
DDSでのキー指定 なし ない あり
ORGANAIZATION SEQUENTIAL RELATIVE INEXED
ACCESS MODE SEQUENTIAL RANDOM
DYNAMIC
RANDOM
DYNAMIC
RECORD KEY −− −− キー名

注:索引付ファイルのORGANIZATION, ACCESS MODEを共に
SEQUENTIALとするとRRN順に読めてきます。

索引付ファイルの更新の例:
得意先マスター(M420)を更新しています。
           SELECT  FILE1  ASSIGN          DATABASE-M420
                          ACCESS  MODE    RANDOM
                          RECORD  KEY     TKTKNO
                          ORGANIZATION    INDEXED.

        中略

      * ファイル更新処理
       SB-0000.
      * キーに値をセットして読み込みします。
           MOVE  S1TKNO  OF  FMT01-I  TO  TKTKNO.
           MOVE  X-OFF   TO  IN99.
           READ  FILE1  RECORD  INVALID  KEY
                                MOVE  X-ON  TO  IN99.
      * 削除処理でなければ、編集処理をします。
           IF    W-MOD   NOT = 04
               MOVE  S1NMKJ  OF  FMT02-I  TO  TKTKNO
               MOVE  S1NMKN  OF  FMT02-I  TO  TKNMKJ
               MOVE  S1TEL   OF  FMT02-I  TO  TKTEL
               MOVE  S1SLNO  OF  FMT02-I  TO  TKSLNO
           END-IF.
      * 読めていれば、置換え、そうでなければレコード追加、
      * 更新モードでなければ削除を行います。
           IF    IN99  =  X-OFF
               IF  W-MOD  = 02
                   REWRITE  FILE1R
               ELSE
                   DELETE   FILE1
               END-IF
           ELSE
               WRITE  FILE1R
           END-IF.


プロシージャー呼出し

ILEの特長であるバインドのための呼出がプロシージャー呼出として機能が追加されています。
バインド予定のプロシージャーを次のように呼出します。

CALL LINKAGE TYPE IS PROCEDURE 'TESTCB1' USING A B C D.


数学関数

ILE−COBOLでは、SIN,COS,TANなど簡単な数学関数が使用できます。


可変長レコードの操作

AS/400では基本的にはレコードは固定長ですが、可変長レコードを扱うときは、
FDのところで、VARYINGの記述をし、可変長レコードと定義します。


                          
      FD  ファイル名                                          
RECORD IS VARYING IN SIZE FROM 最小サイズ TO 最大サイズ
DEPENDING ON レコード長の識別名.

レコード長の識別名は、WORKING-STORAGE SECTIONで定義しておきます。

レコード出力プログラムのサンプルを紹介します。

                          
       IDENTIFICATION         DIVISION.                            
       PROGRAM-ID.            CBL401.                              
       ENVIRONMENT            DIVISION.                            
       CONFIGURATION          SECTION.                             
       SOURCE-COMPUTER.       IBM-I5.                              
       OBJECT-COMPUTER.       IBM-I5.                              
       INPUT-OUTPUT           SECTION.                             
       FILE-CONTROL.                                               
           SELECT   SYS010    ASSIGN        TO  DISK-FILE1         
                    ACCESS MODE    SEQUENTIAL                      
                    FILE STATUS    FILE-STS.                       
       DATA                   DIVISION.                            
       FILE                   SECTION.                             
       FD  SYS010                                                  
           RECORD IS VARYING IN SIZE  FROM 10 TO  80               
            DEPENDING ON  REC-LEN.                                 
       01  REC1.                                                   
           03  FILLER           PIC  X(10).                        
       01  REC9.                                                   
           03  FILLER           PIC  X(80).                        
       WORKING-STORAGE          SECTION.                            
       01  FILE-STS             PIC  X(2).                          
       77  REC-LEN              PIC  9(5).                          
       01  WRK.                                                     
           03  WRK10            PIC  X(10).                         
           03  WRK20            PIC  X(20).                         
           03  WRK30            PIC  X(30).                         
       PROCEDURE                DIVISION.                           
       AA.                                                          
           OPEN  OUTPUT  SYS010.                                    
           MOVE  'AAAAAAAAAA'  TO  REC9.                            
           MOVE   10      TO  REC-LEN.                              
           WRITE  REC9.                                             
           MOVE  'BBBBBBBBBBBBBBBBBBBB'  TO  REC9.                  
           MOVE   20      TO  REC-LEN.                              
           WRITE  REC9.                                             
           MOVE  'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC'  TO  REC9.        
           MOVE   30      TO  REC-LEN.                              
           WRITE  REC9.                                             
           CLOSE  SYS010.                                    
           GOBACK.                         
           



可変長の読み取り

出力の場合と同様に定義し、読み取りします。
FDで記述したフィールドに長さ情報がセットされます。

                          
       IDENTIFICATION         DIVISION.                      
       PROGRAM-ID.            CBL402.                        
       ENVIRONMENT            DIVISION.                      
       CONFIGURATION          SECTION.                       
       SOURCE-COMPUTER.       IBM-I5.                        
       OBJECT-COMPUTER.       IBM-I5.                        
       INPUT-OUTPUT           SECTION.                       
       FILE-CONTROL.                                         
           SELECT   SYS010    ASSIGN        TO  DISK-FILE1   
                    ACCESS MODE    SEQUENTIAL                
                    FILE STATUS    FILE-STS.                 
       DATA                   DIVISION.                      
       FILE                   SECTION.                       
       FD  SYS010                                            
           RECORD IS VARYING IN SIZE  FROM 10 TO  80         
            DEPENDING ON  REC-LEN.                           
       01  REC1.                                             
           03  FILLER           PIC  X(10).                  
       01  REC9.                                             
           03  FILLER           PIC  X(80).                  
       WORKING-STORAGE          SECTION.                
       01  FILE-STS             PIC  X(2).              
       77  REC-LEN              PIC  9(5).              
       01  WRK.                                         
           03  WRK-LEN          PIC  9(5).              
           03  WRK40            PIC  X(40).             
       PROCEDURE                DIVISION.               
       AA.                                              
           OPEN     INPUT   SYS010.                     
           READ     SYS010.                             
           MOVE     REC-LEN   TO   WRK-LEN.             
           MOVE     REC9      TO   WRK40.               
           DISPLAY  WRK.                                
           READ     SYS010.                             
           MOVE     REC-LEN   TO   WRK-LEN.             
           MOVE     REC9      TO   WRK40.               
           DISPLAY  WRK.                                
           READ     SYS010.                             
           MOVE     REC-LEN   TO   WRK-LEN.             
           MOVE     REC9      TO   WRK40.               
           DISPLAY  WRK.                                
           CLOSE  SYS010.                               
           GOBACK.                                                  
           






次ページ 目 次


(C)COPYRIGHT ISHIOKA KATSUHIDE 2000−2008