COBOLヒント集

 

COBOL初心者のために、例題や役立つ情報を書いてみました。

終了は[×](閉じる)
 
ヒント集
謝辞 コーディング規約
COBOL文法1 COBOL文法2
構造化プログラミング COBOLコーディング
COBOL・NDBコーディング COBOL・RDBコーディング
COBOL基本サンプル  
 
ヒント ヒント内容
謝辞
謝辞とは
謝辞
 
コーディング規約
コーディング命名規約
データ項目名命名指針、ローマ字はヘボン式
カラムの位置
命令記述について
領域の初期化について
 
 
 
COBOL文法1
 
 
 
COBOL文法2
EVALUATE
IF
OCCURS
PERFORM
INSPECT
REDEFINES
  
  
  
 
構造化プログラミング
構造化プログラミングとは
順次構造(SEQUENCE)
選択構造1(IF-THEN-ELSE)
選択構造2(CASE)
繰り返し構造1(DO-WHILE)
繰り返し構造2(DO-UNTIL)
 
COBOLコーディング
入力チェック
処理日、処理時間
完了コードの設定
ISAMファイルの検索方法
PAC(COMP)指定と実桁数
 
 
 
 
COBOL・NDBコーディング
NDBとは、NDB定義
NDBシーケンス処理
NDB検索処理
NDB検索NEXT、OWNER処理
NDB追加処理
NDB更新処理
NDB削除処理
デッドロックルーチン処理
DBエラールーチン処理
TRANSACTION処理
 
COBOL・RDBコーディング
RDBとは
RDBシーケンス処理
RDB検索処理
RDB追加処理
RDB更新処理
RDB削除処理
 
COBOL基本サンプル
SAMPLE01 順次ファイルコンバート
SAMPLE02 順次ファイルのマッチング(1:N)
SAMPLE03 コントロールブレークリスト出力
 



 
■ 謝辞


 謝辞とは


COBOL普及のため、COBOL刊行物の最初のページにCODASYL「謝辞」を表示することにより著作を許可しました。 したがってCOBOL参考書の最初のページに必ずこの「謝辞」が表記されています。

 謝辞


以下の文章は、規約により、CODASYL COBOL 1965年版より抜粋掲載したものです。
「いかなる組織体も、自由な教育用説明書その他の目的でCOBOL 報告書とその仕様との一部または全部を複製し、また報告書の着想を利用してかまわない。 ただし、その文書の序文の一部にこの部分を掲載されたい。
書評などで短い文章を引用するときは出所についての謝辞にCOBOLの名称をあげれば全文をかかげる必要はない。
COBOLは産業界の言語であって、いかなる会社、会社団体、組織、組織団体の所有物ではない。各寄与者、COBOL委員会とも、 プログラミングシステムと言語の正確性や機能について、いかなる保証も与えない。またこれに関する事項についていかなる責任も負わない。
COBOL 保全の手続きははっきりしている。変更を提案する手続きについての照会はデータ組織言語会議の理事会にあてられたい。
ここで利用した以下の資料すなわち、

FLOW-MATIC(スペリーランド社の商標)
Programming for UNIVAC(R) T and U
Data Automation Systems
スペリーランド社、1958年,1959年版権;

IBM Commercial Translator
No.F28-8013
IBM社、1959年版権;

FACT
DSI27 A 5260-2760
ミネアポリス・ハネウエル社、1960年版権;

この著者、版権者はCOBOL 仕様書に一部または全部を利用することを許可した。このことはプログラミング説明書や類似の出版物にCOBOL 仕様書を複製、利用する場合にも適用される。」

ここで、本解説書およびCOBOL 処理プログラムの作成者とそれの使用者は、CODASYL COBOL委員会と各寄与者の努力と成果を高く評価するとともに感謝の意を表すものであります。



 
■コーディング規約


 コーディング命名規約

●入力ファイル名
 INnn-FILE
 IN(固定)、nn(連番01、02〜)、-FILE(固定)

●出力ファイル名
 OTnn-FILE
 IN(固定)、nn(連番01、02〜)、-FILE(固定)

●レコード名(01レベル)
 XXXXXXX-REC
 XXXXXXX(コピー句ID)、-REC(固定)

●データ項目名(03レベル以下)
 nnn-XXXXXXXX
 nnn(プレフィクス、略称標準化一元管理)、-(固定)、XXXXXXXX(任意文字列)

●セクション名
 nnn-XXXXXXXX
 nnn(セクションIDピリオドなし)、-(固定)、XXXXXXXX(任意文字列)



 データ項目名命名指針、ローマ字はヘボン式

●ハイフォンを含め10文字以内
●A001など連番はやめる
●原則として子音法を適用する。
●例外はあっても、一貫性を保つ。

●ローマ字はヘボン式を使用する。
 あ行  A I U E O
 か行  KA KI KU KE KO
 さ行  SA SHI SU SE SO
 た行  TA CHI TU TE TO
 な行  NA NI NU NE NO
 は行  HA HI HU HE HO
 ま行  MA MI MU ME MO
 や行  YA −− YU −− YO
 ら行  RA RI RU RE RO
 わ行  WA −− −− −− −−
 ん   N  −− −− −− −−

 が行  GA GI GU GE GO
 ざ行  ZA JI ZU ZE ZO
 だ行  DA JI ZU DE DO
 ば行  BA BI BU BE BO

 ぱ行  PA PI PU PE PO

 きゃ行 KYA −− KYU −− KYO
 しゃ行 SYA −− SYU −− SYO
 ちゃ行 CYA −− CYU −− CYO
 にゃ行 NYA −− NYU −− NYO
 ひゃ行 HYA −− HYU −− HYO
 みゃ行 MYA −− MYU −− MYO
 りゃ行 RYA −− RYU −− RYO

 ぎゃ行 GYA −− GYU −− GYO
 じゃ行 JYA −− JYU −− JYO
 びゃ行 BYA −− BYU −− BYO

 ぴゃ行 PYA −− PYU −− PYO

撥音(はねる音):Nで表現する。 品目→HINMOKU
促音(つまる音):次にくる最初の子音を重ねる 結果→KEKKA
長音(のびる音):前の母音を重ねる 融資→YUUSHI


 カラムの位置

[C8]:カラム位置8カラム目
[+2]:2カラム空ける

000100[C7]***************************************************[C70]
000300*[C10]サブシステム名 [C25]:[C26]資材所要量計画■■■■■■M[C70]*
001700 [C8]IDENTIFICATION     [C31]DIVISION.
001800 [C8]PROGRAM-ID.      [C31]SAMPLE03.

002300 FILE-CONTROL.
002300 [+4]SELECT  [+2]IN01-FILE  ASSIGN  IN01.

005100*----ワークエリア----------------------------------------------*
005200 01 WRK-AREA.
004100  03 CAN-AREA.
004200   05 CAN-PGMID    [C41]PIC X(08) VALUE "SAMPLE03".

013400****************************************************************
013500* [C12]SAMPLE03               [C50](0.0)     *
013600****************************************************************
016400  [C12]OPEN INPUT IN01-FILE.
016500  [C12]OPEN OUTPUT OT01-FILE.

025900  [C12]MOVE [C18]TOT-AAA001    [C36]TO [C40]TOT-BBB001.

026400  [C12]IF  [C16]AAAAA  [C28]NOT [C32]= [C35]BBBBB
   


 命令記述について

●GOTO命令
 原則使用不可
 ただし、同一セッションのEXIT、モジュール終了のEXIT PROGRAMへ飛ぶのは可

●PERFORM命令
 PERFORM SECTION名を使用してTHRUは使用しない

●IF命令
 IF命令のネスト5個を上限とする。ネストが深い場合EVALUATEを使用する

●CONTINUEの使用
 IF命令のELSEが無実行の場合、CONTINUEは省略できる。但し、END-IFは省略しない
 EVALUATE命令のELSEが無実行の場合、CONTINUEは省略できる。但し、END-EVALUATEは省略しない

●算術演算について
 COMPUTE命令に統一する
 剰余が必要な除算に限り、DIVIDE命令を使用

●比較演算子について
 NOTと不等記号の組合せは使用しない。
 100≦AAA≦300の場合
   不可 IF (X NOT < 100) AND (X NOT > 300)
    可 IF (X >= 100) AND (X <= 300)

 ( )を活用して、比較関係を分り易くする。

●帳票出力について
 改ページ、改行はAFTER句で統一する。
 ADVANCINGとLINES句は記述を省略する。


 領域の初期化について

●領域の初期化はMOVE命令を使用する。INITIALIZE命令は使用しない
●ワーク領域はVALUE句で初期化しない。

●頻繁に初期化する時は、ワーク0をMOVEして初期化する。回さない。
例1ではなく、例2を使用する。

例1-------------------------------------
 01 AAA.
   03 AAA1     OCCURS  50.
     05 AAA11   PIC 9(03).
     05 AAA12   PIC 9(03).

 PERFORM VALYING  IX  FROM 1  BY  1
       UNTIL  IX  >  50
   MOVE 0  TO   AAA11(IX)
   MOVE 0  TO   AAA12(IX)
 END-PERFORM.

例2-------------------------------------
 01 AAA.
   03 AAA1     OCCURS  50.
     05 AAA11   PIC 9(03).
     05 AAA12   PIC 9(03).

 01 ZZZ.
   03 FILLER    OCCURS  50.
     05 ZZZ11   PIC 9(03)  VALUE 0.
     05 ZZZ12   PIC 9(03)  VALUE 0.

 MOVE ZZZ    TO AAA.


 




 




 
■ COBOL文法1


 

 


 




 
■ COBOL文法2


 EVALUATE

条件式。同一の項目での比較分岐によく使用。ネストが深い時はIF文より使われる。
-------------------------------------------------
EVALUATE (データ名 または TRUE) [ALSO (データ名 または TRUE)]
{(WHEN
  (ANY または 条件 または TRUE または [NOT] (データ名 または 定数 または 算術式))
[ ALSO ( ANY または 条件 または TRUE または [NOT] (データ名 または 定数 または 算術式)] 
  実行文
}
 [WHEN OTHER 実行文]
[END-EVALUATE]
-------------------------------------------------
「例1」
XXXがaの時は1をWWWに加算する。
XXXがbの時は2をWWWに加算する。
XXXがcの時は3をWWWに加算する。
XXXがa,b,c以外は4をWWWに加算する。

   EVALUATE A
     WHEN  "a" ADD 1 TO WWW
     WHEN  "b" ADD 2 TO WWW
     WHEN  "c" ADD 3 TO WWW
     WHEN  OTHER
           ADD 4 TO WWW
   END-EVALUATE.
-------------------------------------------------
「例2」
A=3〜5ならBに1を加算、それ以外ならCに1を加算する
   EVALUATE A
     WHEN  3 THRU 5
         ADD 1 TO B
     WHEN  OTHER
         ADD 1 TO C
   END-EVALUATE.
同じ
   EVALUATE A
     WHEN  3
     WHEN  4
     WHEN  5
         ADD 1 TO B
     WHEN  OTHER
         ADD 1 TO C
   END-EVALUATE.
-------------------------------------------------
「例3」
   条    件
 ABCの値  XYZの値  UVWの値
 "A"    11〜20   >50   
 "A"    21〜30   >60   
 "B"    31〜41   >70   
 の時は、    ADD 1 TO B
 それ以外は   ADD 1 TO C

 EVALUATE ABC ALSO XYZ ALSO TRUE
   WHEN "A" ALSO 11 THRU 20 ALSO  UVW > 50
   WHEN "A" ALSO 21 THRU 30 ALSO  UVW > 60
   WHEN "B" ALSO 31 THRU 40 ALSO  UVW > 70
      ADD 1 TO B
   WHEN OTHER
      ADD 1 TO C
  END-EVALUATE.


 IF

条件分岐
ネストが5個以上はEVALUATEを使用する。
-------------------------------------------------
 IF 条件 THEN 文
  [ ELSE 文 ]
 END-IF

 IF 条件 THEN 文 または NEXT SENTENCE  
  [{ELSE 文 または ELSE NEXT SENTENCE }]
 END-IF
-------------------------------------------------
大きい[大きくない]   [NOT] >
小さい[小さくない]   [NOT] <
等しい[等しくない]   [NOT] =
以上             >=
以下             <=
-------------------------------------------------
 IF AAA = BBB 
   PERFORM SECTION-A
 ELSE
   PERFORM SECTION-B
 END-IF.


 OCCURS

ワークエリアの配列宣言
-------------------------------------------------
1次元テーブル
  01 AAA.
   03 DDD       OCCURS 31  *日1〜31
    05 EEE      PIC S9(7).
  EEE(1)〜EEE(31)
-------------------------------------------------
2次元テーブル
  01 AAA.
   03 CCC       OCCURS 12  *月1〜12
    05 DDD      OCCURS 31  *日1〜31
     07 EEE     PIC S9(7).
  EEE(1,1)〜EEE(1,31)
  EEE(2,1)〜EEE(2,31)
  〜
  EEE(12,1)〜EEE(12,31)
-------------------------------------------------
3次元テーブル
  01 AAA.
   03 BBB       OCCURS 2   *予定1、実績2
    05 CCC      OCCURS 12   *月1〜12
     07 DDD     OCCURS 31   *日1〜31
      09 EEE    PIC S9(7).
  EEE(1,1,1)〜EEE(1,1,31)
  EEE(1,2,1)〜EEE(1,2,31)
  〜
  EEE(2,12,1)〜EEE(2,12,31)


 PERFORM

繰り返しテーブル処理
-------------------------------------------------
例1は使用せず、例2を使用する。

例1---------------------------
 AAA.
  【処理A】
 BBB.
  【処理B】

  PERFORM AAA THRU BBB.
  BBBの範囲は次のパラグラフが現れるまで範囲となる。

例2---------------------------
 01-AAA SECTION.
 AAA.
  【処理A】
 BBB.
  【処理B】

  PERFORM 01-AAA.
  01-AAAの範囲は次のセクションが現れるまで範囲となる。
-------------------------------------------------
1.処理Aを1回だけ実行する。
 PERFORM 処理A END-PERFORM.

2.処理AをIX回実行する。
 PERFORM 処理A IX TIMES.

3.処理Aを条件を満足するまで繰り返す。
 PERFORM VALYING  IX  FROM 1  BY  1
       UNTIL  IX  >  10
         処理A
 END-PERFORM.

 PERFORM 処理A
     VARYING  IX1  FROM 1  BY  1
       UNTIL IX1  >  10.

 PERFORM 処理A
     VARYING  IX1  FROM 6  BY  -1
       UNTIL IX1  < 1.

 PERFORM 処理A
     VARYING  IX1  FROM 1  BY  1
       UNTIL IX1  >  10 OR XYZ = SPACE
         AFTER  IX2  FROM  1  BY  1
           UNTIL  IX2  >  9  OR  UVW = ZERO.

 PERFORM VARYING IX1 FROM 1 BY 1 UNTIL IX1 > 13
       PERFORM VARYING IX2 FROM 1 BY 1 UNTIL IX2 > 3
          MOVE XXAAAA (IX1 IX2) TO YYAAAA (IX1 IX2)
          ADD XXAAAA (IX1 IX2) TO WWAAAA
       END-PERFORM
    MOVE 0     TO ZZAAAA (IX1)
 END-PERFORM.
-------------------------------
 01 IXALL.
    03 IX1      PIC 9(2) VALUE ZERO.
    03 IX2      PIC 9(2) VALUE ZERO.
    03 IX3      PIC 9(2) VALUE ZERO.

1次元テーブル処理
 PERFORM 処理A
     VARYING  IX1  FROM 1  BY  1
       UNTIL IX1  >  31
 END-PERFORM.

2次元テーブル処理
 PERFORM 処理A
     VARYING  IX1  FROM 1  BY  1
       UNTIL IX1  >  12
         AFTER  IX2  FROM  1  BY  1
           UNTIL  IX2  >  31
 END-PERFORM.

3次元テーブル処理
 PERFORM 処理A
     VARYING  IX1  FROM 1  BY  1
       UNTIL IX1  >  2
         AFTER  IX2  FROM  1  BY  1
           UNTIL  IX2  >  12
             AFTER  IX3  FROM  1  BY  1
               UNTIL  IX3  >  31
 END-PERFORM.
-------------------------------
1次元テーブル処理
 PERFORM VARYING IX1 FROM 1 BY 1 UNTIL IX1 > 31
         処理A
 END-PERFORM.

2次元テーブル処理
 PERFORM VARYING IX1 FROM 1 BY 1 UNTIL IX1 > 12
  PERFORM VARYING IX2 FROM 1 BY 1 UNTIL IX2 > 31
         処理A
  END-PERFORM
 END-PERFORM.

3次元テーブル処理
 PERFORM VARYING IX1 FROM 1 BY 1 UNTIL IX1 > 2
  PERFORM VARYING IX2 FROM 1 BY 1 UNTIL IX2 > 12
    PERFORM VARYING IX3 FROM 1 BY 1 UNTIL IX3 > 31
         処理A
    END-PERFORM
  END-PERFORM
 END-PERFORM.


 INSPECT

データの置換、カウントを行う

●データの置換
 INSPECT データ名 REPLACING
   (ALL または LEADING または FIRST) データ名 BY データ名
     CHARACTERS BY データ名 (BEFORE または AFTER)  [INITIAL データ名]

例1 AAS項目のスペースを0に変換する。数値項目だがSPACEもある時使用する。
 01 AAX.
  03 AAS      PIC S9(10).

 INSPECT AAX REPLACING ALL " " BY "0".

●データのカウント
 INSPECT データ名 TALLYING データ名 FOR
   (ALL または LEADING または FIRST) データ名 CHARACTERS) 
    (BEFORE または AFTER) [INITIAL データ名]
 01 AAX.
  03 FILLER     PIC X(20) VALUE "YAMADA HANAKO".
  03 FILLER     PIC X(20) VALUE "ITOU TAROU".
  03 FILLER     PIC X(20) VALUE "YAMADA KAZU".
  03 FILLER     PIC X(20) VALUE "YAMAMOTO HAJIME".
 01 IX        PIC  9(5)  VALUE  ZERO.

 INSPECT AAX TALLYING IX FOR ALL "YAMADA".
 IXは2


 REDEFINES

ワーク項目の再定義

 01 AAA.
  03 FILLER     PIC X(6) VALUE "10 XXX".
  03 FILLER     PIC X(6) VALUE "31 YYY".
  03 FILLER     PIC X(6) VALUE "58 UUU".
  03 FILLER     PIC X(6) VALUE "05 WWW".
 01 BBB  REDEFINES  AAA.
  03  CCC       OCCURS  4  TIMES.
   05 AA1      PIC 9(2).
   05 AA2      PIC X(3).


 




 




 




 
■ 構造化プログラミング


 構造化プログラミングとは

 プログラミング作成の手法で、モジュール化する事により分り易いプログラムが出来る
 ただ1つの入口とただ1つの出口を持つセクションの集まりで論理的なモジュールを構成するようにコーディングする。

●構造化プログラミング3要素
  1.そこそこの大きさのモジュール化
  2.下位モジュールの戻りは必ず、上位モジュールに戻る。
  3.順次構造、選択構造、繰り返し構造の3つのモジュールで記述する。

  GO TO文を極力使用しないのは上記によっている。


 順次構造(SEQUENCE)

 モジュール内の命令や処理を配列の順に実行する。

   ↓
 【処理A】
   ↓
 【処理B】
   ↓
例1
 PERFORM SECTION-A.
 PERFORM SECTION-B.


 選択構造1(IF-THEN-ELSE)

 ある条件に従って、2つの異なった処理の中から1つを選択して実行する。
   ↓
 <条件X>≠→
   ↓=    ↓
 【処理A】 【処理B】
   ↓      ↓
   ↓←−−
   ↓
例1
 IF AAA = BBB 
   PERFORM SECTION-A
 ELSE
   PERFORM SECTION-B.
 END-IF.


 選択構造2(CASE)

 ある条件に従って、複数(3つ以上)の異なった処理の中から1つを選択して実行する。
■■■■■■■■
■■■←−−<条件X>−−→
■■↓10■■■■↓20■■■■↓以外
【処理A】■■■【処理B】■■【処理C】
■■■■■■■■■■■■
■■■−−−−→↓←−−−−
■■■■■■■■
例1
 EVALUATE AAA
  WHEN 10
   PERFORM SECTION-A
  WHEN 20
   PERFORM SECTION-B
  WHEN OTHER
   PERFORM SECTION-C
 END-EVALUATE.


 繰り返し構造1(DO-WHILE)

 ある条件を満たす限り一連の処理を繰り返し実行し、満たさなくなった時点で、次の処理に進む。
【処理A】は実行されない事がある。
■■■■
■■−→↓
<条件X>≠→
■M↓=■■■■
【処理A】■■■
■■■■■■M
■■←−■■■■■M
例1
 AAA = BBBになるまでという条件が真である間、、PERFORM SECTION-Aを実行する。
 PERFORM (TEST BEFORE 省略可)
  UNTIL AAA = BBB
  PERFORM SECTION-A
 END-PERFORM.


 繰り返し構造2(DO-UNTIL)

 ある条件を満たさない間は一連の処理を繰り返し実行し、満たした時点で、次の処理に進む。
【処理A】は必ず1回実行される。
■■■■■
■■■−→↓
■■■
■■【処理A】
■■■
■■←≠<条件X>
■■■■■↓=
例1
 AAA = BBBになるまでという条件が偽である間、PERFORM SECTION-Aを実行する。
 PERFORM TEST AFTER
  UNTIL AAA NOT = BBB
  PERFORM SECTION-A
 END-PERFORM.
 TEST BEFOREとTEST AFTERが混在すると間違いやすいのであまり使用しない。


 
■ COBOLコーディング


 入力チェック

●数値チェック
 IF AAA NOT NUMERIC 
   PERFORM エラー処理
 ELSE
   PERFORM 正常処理
 END-IF.
 AAAは数値項目、文字項目どちらも可


 処理日、処理時間

 01 WDDATE.
  03 WDYY       PIC 99.
  03 WDMM       PIC 99.
  03 WDDD       PIC 99.
 01 WTTIME.
  03 WTHH       PIC 99.
  03 WTMM       PIC 99.
  03 WTDD       PIC 99.
  03 FILLER      PIC 99.

  ACCEPT  WDDATE  FROM  DATE.
  ACCEPT  WTTIME  FROM  TIME.

 帳票の印刷位置
 DATE YY.MM.DD TIME HH:MM:SS PAGE ZZZZ

 [C97]DATE [C102]YY.MM.DD 
 [C112]TIME [C117]HH:MM:SS 
 [C127]PAGE [C132]ZZZZ


 完了コードの設定

●エラーがあった時は、完了コードを"20"に設定する。
 01 RTN-CD      PIC 99 SYNC COMP.

   IF CTRERR NOT = 0   *エラーあり
     MOVE 20 TO RTN-CD
     MOVE RTN-CD TO PROGRAM-STATUS.
   END-IF.


 ISAMファイルの検索方法

 01 WWKEY      PIC X(10).
 FILE-CONTROL.
   SELECT ABCD0001-F ASSIGN TO I-ABCD0001
             ACCESS MODE IS RANDOM
             RECORD KEY IS ABCDKEY
             NOMINAL KEY IS WWKEY.

 FILE          SECTION.
 FD ABCD0001-F
      BLOCK CONTAINS 13 RECORDS
      LABEL RECORD IS STANDARD
      RECORD CONTAINS 80 CHARACTERS.
      COPY ABCD0001.

   OPEN INPUT ABCD0001-F.
   MOVE INPUTKEY  TO WWKEY.   *キーのセット ABCDKEYではない
   READ ABCD0001-F
     NVALID KEY DISPLAY "CODE ERR" INPUTKEY UPON SYSOUT
            GO TO MAIN-XXX.
    MOVE ABCDAAAA TO  OUTAAAA.

   CLOSE ABCD0001-F.


 PAC(COMP)指定と実桁数

●PAC(COMP)指定
   03 W1ABCD      PIC S9(5) PACKED-DECIMAL.
●実桁数
桁が偶数の時は(桁数+2)/2
桁が奇数の時は(桁数+1)/2

8桁は(8+2)/2=5桁
7桁は(7+1)/2=4桁


 




 




 




 
■ COBOL・NDBコーディング


 NDBとは、NDB定義

 NDBとは、ネットワークデータベースのことで、データベースの初期からあり手堅く、頑丈なDBだが 最近はRDBにおされている。
 銀行システムなどはNDBを使用しているところが多く壊れにくいDBとして定評がある。

RDBと違ってキー項目はあまり設定できない
品番で品目を検索して、品目につながっている手配をNEXT(納期順)するとすべての手配が読める。

003000 SUBSCHEMA-NAME. "SDBDABCD". :スキーマを定義する

006600 READY. :DBの開始 OPENの事

007800 FINISH. :DBの終了 CLOSEの事


 NDBシーケンス処理

006800  GET FIRST "品目" WITHIN "品目RG" RANGE. *最初の検索
007300  GET NEXT "品目" WITHIN "品目RG" RANGE  *2回目以降
007400    AT END GO TO OWARI.


 NDB検索処理

031200   MOVE  INBANGO TO HMBANGO.
031400   GET  ANY  "品目".  *品目の検索
031500     IF  DB-EXCEPTION   IS  13  GO TO  品目無.


 NDB検索NEXT、OWNER処理

031200  MOVE  INBANGO TO HMBANGO.  *品目検索キーのセット
031400  GET  ANY  "品目".  *品目の検索
031500    IF  DB-EXCEPTION   IS  13  GO TO  品目無.
031600  MOVE 品目情報 TO WW品目情報.
031700*
032100  GET NEXT RECORD WITHIN "品目在庫ST"    *在庫の読込
032200    AT END GO TO 在庫終了.
032300  MOVE 在庫情報 TO WW在庫情報.
032400*
033100  GET NEXT RECORD WITHIN "品目手配ST"    *手配の読込
033200    AT END GO TO 手配終了.
033300  MOVE 手配情報 TO WW手配情報.
033400*
034100  GET OWNER WITHIN "手配業者ST"  *手配の親の業者を検索
034200    AT END GO TO 業者無.
034300  MOVE 業者情報 TO WW業者情報.
034400*


 NDB追加処理

031200  MOVE  INBANGO TO HMBANGO.
031400  GET  ANY  "品目".  *品目の検索
031500    IF  DB-EXCEPTION   IS  13  GO TO  品目無.
031600  MOVE 手配情報 TO 手配.
026400  STORE "手配" TO "品目手配ST". *手配のツイカ
026600    IF DB-EXCEPTION IS 14 GO TO 手配NOダブり.


 NDB更新処理

031200  MOVE  INBANGO TO HMBANGO.
031400  GET  ANY  "品目".  *品目の検索
031500    IF  DB-EXCEPTION   IS  13  GO TO  品目無.
034800  GET NEXT RECORD WITHIN "品目手配ST"    *手配の読込
034900    AT END GO TO 手配終了.
031600  MOVE 1000 TO 手配数.
064700  MODIFY "手配".          *手配の更新


 NDB削除処理

031200  MOVE  INBANGO TO HMBANGO.
031400  GET  ANY  "品目".  *品目の検索
031500    IF  DB-EXCEPTION   IS  13  GO TO  品目無.
034800  GET NEXT RECORD WITHIN "品目手配ST"    *手配の読込
034900    AT END GO TO 手配終了.
066200  ERASE "ODSG" ALL.     *手配の削除

(注) 「GET FIRST」で検索、削除した場合の、次の検索は「GET NEXT 」ではなく、 「GET FIRST」で行うこと。


 デッドロックルーチン処理

012100 PROCEDURE DIVISION.
012200 DECLARATIVES.
012300**************************************************************
012500*  DEAD-LOCK ROUTINE *
012700**************************************************************
012800 DEAD    SECTION. USE FOR DEAD-LOCK.
012900    DISPLAY "DEAD-LOCK RDNAME =" RDNAME UPON SYSOUT.
013000    DISPLAY "DEAD-LOCK RDNAME =" RDNAME UPON CONSOLE.
013100    MOVE 70 TO PROGRAM-STATUS.
013200    STOP RUN.
013300**************************************************************
014500 END DECLARATIVES.


 DBエラールーチン処理

012100 PROCEDURE   DIVISION.
013400******************************************************************
013500* *
013600*****   DB-EXCEPTION ROUTINE *****
013700* *
013800******************************************************************
013900 DBEXP    SECTION. USE FOR DB-EXCEPTION.
014000    DISPLAY "DB-ERR" UPON SYSOUT.
014100    DISPLAY " RDNAME = " RDNAME UPON SYSOUT.
014200    DISPLAY " MCRTYP = " MCRTYP UPON SYSOUT.
014300    DISPLAY " DBSCB = " DBSCB UPON SYSOUT.
014400    DISPLAY " DBECB = " DBECB UPON SYSOUT.
014500 END DECLARATIVES.
014600/
014700******************************************************************
015200***
015300    MOVE FAHINB TO AAHINB.
015400    GET ANY "AARD".
015500    IF DB-EXCEPTION IS 13 GO TO AANASI.
015600** 品目なし(13)以外はDB-EXCEPTION ROUTINE に行く


 TRANSACTION処理

 01 PGCSWW      PIC X(8) VALUE SPACE.
 MAIN-KAISI.
   READY.
   TRANSACTION START.
   GET FIRST "AARD" WITHIN "AARDRG" RANGE.
   MOVE PGCS TO PGCSWW.
 MAIN-YOMU.
   PERFORM メイン処理.
   TRANSACTION END.
   TRANSACTION START.
   MOVE PGCSWW TO PGCS.
   FIND CURRENT.
   GET NEXT "AARD" WITHIN "AARDRG" RANGE
      AT END GO TO MAIN-OWARI.
   MOVE PGCS TO PGCSWW.
   GO TO MAIN-YOMU.
 MAIN-OWARI.
   TRANSACTION END.
   FINISH.
   STOP RUN.


 




 




 




 
■ COBOL・RDBコーディング


 RDBとは

データベースの出始めはNDBに比べて壊れやすく、評判は悪かったが、今日ではそのようなこともなく
DBの主流として使われている。 キー項目をいろいろ設定できるので、切口がたくさんできる。
富士通のRDBはSymfoware(シンフォウェア)
オラクル、SQLServer、ACCESSなどは当然、RDBです。


 RDBシーケンス処理

001900  SELECT 在庫
002000    ASSIGN     TO 在庫
002100    ORGANIZATION  IS INDEXED
002200    ACCESS MODE   IS DYNAMIC
002300    RECORD KEY    IS 在庫年月
002400                  在庫区分
002600               WITH DUPLICATES.

003500*
003700 FD 在庫
003800  LABEL RECORD IS STANDARD.
003900  COPY 在庫R OF SYSDBDCT.

013100  OPEN INPUT 在庫.

015800  MOVE WW年月 TO 在庫年月.
015900   MOVE SPACE TO 在庫区分.
016000   START 在庫 KEY IS > 在庫年月 在庫区分
016100     INVALID KEY
016200       GO TO 在庫終了
016300   END-START.
016400**
016500 YOMU-010.
016600   READ 在庫 NEXT AT END
016700        GO TO 在庫終了
016800   END-READ.

021800   CLOSE 在庫.


 RDB検索処理

002000   SELECT 品目
002100     ASSIGN TO 品目
002200     ORGANIZATION IS INDEXED
002300     ACCESS MODE RANDOM
002400     RECORD KEY IS 品目キー.
002500**

007200  FD 品目
007300     LABEL RECORD IS STANDARD.
007400     COPY 品目R OF SYSDBDCT.
007500*
012700   OPEN INPUT 品目.

041000   MOVE WW品目キー TO 品目キー.
041300   READ FHINMP INVALID KEY
041400         GO  TO  品目無.

053600   CLOSE 品目.



 RDB追加処理

022800   OPEN OUTPUT 品目.  又は
022800   OPEN I-O 品目.

037200   MOVE WW品目キー TO 品目キー
011100   READ 品目
011200     INVALID KEY
031300       INITIALIZE 品目R
031700       MOVE WW品目情報 TO 品目R
031800       WRITE 品目R
011700     NOT INVALID KEY
037600       GO TO 品目有
012600   END-READ.


 RDB更新処理

022800   OPEN I-O 品目.
037200   MOVE WW品目キー TO 品目キー
011100   READ 品目
011200     INVALID KEY
037600       GO TO 品目無
011700     NOT INVALID KEY
037200       MOVE "ABC自動車" TO 品目名称
035100       REWRITE 品目R
012600   END-READ.


 RDB削除処理

022800   OPEN I-O 品目.

037200   MOVE WW品目キー TO 品目キー
011100   READ 品目
011200     INVALID KEY
037600        GO TO 品目無
011700     NOT INVALID KEY
011900        DELETE 品目
012600   END-READ.


 




 
■ COBOL基本サンプル


SAMPLE01 順次ファイルコンバート
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
順次ファイルコンバート
1つのファイルをある条件に従って3ファイルに出力する。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
----*----1----*----2----*----3----*----4----*----5----*----6----*----7
000000* SAMPLE01 LEVEL=1 DATE=95.10.01
000100****************************************************************
000200* *
000300* サブシステム名:資材所要量計画 *
000400* *
000500* モジュール名 :順次ファイルコンバート *
000600* *
000700* モジュールID:SAMPLE01 *
000800* *
000900* 機能概要 :1つのファイルをある条件に従って3ファイルに *
001000*        :出力する。 *
001100* *
001200* 作成者 :山田太郎 *
001300* 作成日 :1995.10.01 *
001400* 変更履歴 :1996.08.01 山田 XXXを追加 *
001500* *
001600****************************************************************
001700 IDENTIFICATION DIVISION.
001800 PROGRAM-ID. SAMPLE01.
001900*
002000 ENVIRONMENT DIVISION.
002100 INPUT-OUTPUT SECTION.
002200 FILE-CONTROL.
002300   SELECT IN01-FILE ASSIGN IN01.
002400   SELECT OT01-FILE ASSIGN OT01.
002400   SELECT OT02-FILE ASSIGN OT02
002400   SELECT OT03-FILE ASSIGN OT03.
002500/
002600 DATA DIVISION.
002700 FILE SECTION.
002800 FD IN01-FILE
002900     BLOCK CONTAINS 0 RECORDS.
003000 01 I1-REC.
003100   COPY AAA001 REPLACING ==()== BY ==I1-==.
003200*
003300 FD OT01-FILE.
003400 01 O1-REC.
003500    COPY BBB001 REPLACING ==()== BY ==O1-==.
003200*
003300 FD OT02-FILE.
003400 01 O2-REC.
003500    COPY BBB001 REPLACING ==()== BY ==O2-==.
003200*
003300 FD OT03-FILE.
003400 01 O3-REC.
003500    COPY BBB001 REPLACING ==()== BY ==O3-==.
003600/
002400 WORKING-STORAGE SECTION.
002500*
003900*----ワークエリア----------------------------------------------*
004000 01 WRK-AREA.
004100   03 CAN-AREA.
004200     05 CAN-PGMID PIC X(08) VALUE "SAMPLE01".
004300   03 CTR-AREA.
004400     05 CTR-I1 PIC S9(09) PACKED-DECIMAL.
004500     05 CTR-O1 PIC S9(09) PACKED-DECIMAL.
004500     05 CTR-O2 PIC S9(09) PACKED-DECIMAL.
004500     05 CTR-O3 PIC S9(09) PACKED-DECIMAL.
004100   03 KEY-AREA.
004200     05 KEY-NEW PIC X(01).
002700   03 MSG-AREA.
002800     COPY DISPMSG.
004600*
004700*----初期化領域------------------------------------------------*
004800 01 INI-O1-REC.
004900    COPY BBB001 REPLACING ==()== BY ==INI-O1-==.
004600*
004700*----共通領域--------------------------------------------------*
004800 01 W1-REC.
004900    COPY BBB001 REPLACING ==()== BY ==W1-==.
006900/
007000PROCEDURE DIVISION.
007100****************************************************************
007200* SAMPLE01 (0.0) *
007300****************************************************************
007400 00-SAMPLE01 SECTION.
007100*
007500   PERFORM 10-INIT.
007700   PERFORM 20-MAIN
008000     UNTIL KEY-NEW = HIGH-VALUE.
008100   PERFORM 30-END.
008200*
008300 00-SAMPLE01-EXIT.
008400   EXIT PROGRAM.
008500/***************************************************************
008600* <初期処理> (1.0) *
008700* 領域の初期クリア、入出力ファイルをオープンする。 *
008800* *
008900****************************************************************
009000 10-INIT SECTION.
009100*
007200*----出力ファイルの初期化--------------------------------------*
007300 MOVE SPACE TO INI-O1-REC.
007400 INITIALIZE INI-O1-REC.
007900*
008000*----ワークエリアの初期化--------------------------------------*
008100 MOVE LOW-VALUE TO KEY-NEW.
008200 MOVE ZERO TO CTR-AREA.
007500*
007600*----ファイルOPEN------------------------------------------*
007700 OPEN INPUT IN01-FILE.
007800 OPEN OUTPUT OT01-FILE
007800          OT02-FILE
007800          OT03-FILE.
007500*
008220*----入力ファイルのREAD------------------------------------*
008230 PERFORM 11-READ.

012100*
012200 10-INIT-EXIT.
012300 EXIT.
012400****************************************************************
012500* <READ処理> (1.1) *
012600* 入力ファイルをREADする。 *
012700* *
012800****************************************************************
012900 11-READ SECTION.
013000*
009400   READ IN01-FILE
009500    AT END
009600     MOVE HIGH-VALUE TO KEY-NEW
009700    NOT AT END
009800     COMPUTE CTR-I1 = CTR-I1 + 1
009900   END-READ.
014000*
014100 11-READ-EXIT.
014200 EXIT.
014300****************************************************************
014400* <主処理> (2.0) *
014500* レコードを編集してWRITEする。 *
014600* *
014700****************************************************************
014800 20-MAIN SECTION.
014900*
015000*----出力ファイルの初期化--------------------------------------*
015100 MOVE INI-O1-REC TO W1-REC.
015200*
015300*----出力ファイルの編集----------------------------------------*
015400 MOVE I1-AA0001 TO W1-BB0001.
015500 MOVE I1-AA0002 TO W1-BB0002.
015600 MOVE I1-AA0003 TO W1-BB0003.
015700 MOVE I1-AA0004 TO W1-BB0004.
015800 MOVE I1-AA0005 TO W1-BB0005.
015900*
016000*----振り分け&出力ファイルのWRITE------------------------*
016100   EVALUATE I1-AA0001
016200     WHEN 1
016300     WHEN 2
016400       MOVE W1-REC TO O2-REC *1,2の時
016500       PERFORM 22-WRITE
016700     WHEN 3
016400       MOVE W1-REC TO O3-REC *3の時
016500       PERFORM 23-WRITE
017100     WHEN OTHER
016400       MOVE W1-REC TO O1-REC *1,2,3以外の時
016500       PERFORM 21-WRITE
017500   END-EVALUATE.
017600*
017610*----入力ファイルのREAD------------------------------------*
017620 PERFORM 11-READ.
017630*
017700 20-MAIN-EXIT.
017800 EXIT.
017900****************************************************************
018000* <終了処理> (3.0) *
018100* 入出力ファイルをCLOSEする。 *
018200* *
018300****************************************************************
018400 30-END SECTION.
018500*
014400*----ファイルCLOSE----------------------------------------*
014500 CLOSE IN01-FILE
014600     OT01-FILE
014600     OT02-FILE
014600     OT03-FILE.
020100*
020200* 件数のコンソール表示
020300 MOVE SPACE TO MSG-REC.
020400 MOVE CAN-PGMID TO MSG-PROGRAM-ID.
020500 MOVE 3 TO MSG-TBL-NUM.
020600 MOVE "XXXXX" TO MSG-MESSAGE-B(1).
020700 MOVE CTR-I1 TO MSG-REC-CTR(1).
020800 MOVE "XXXXX" TO MSG-MESSAGE-B(2).
020900 MOVE CTR-O1 TO MSG-REC-CTR(2).
021000 MOVE "XXXXX" TO MSG-MESSAGE-B(3).
021100 MOVE CTR-O2 TO MSG-REC-CTR(3).
021200 CALL "AAAAMSG" USING MSG-AREA.
021300*
021400 30-END-EXIT.
021500 EXIT.
012500/***************************************************************
012600* <WRITE処理> (2.1) *
012700* 出力ファイル1へのWRITEする。 *
012800* *
012900****************************************************************
013000 21-WRITE SECTION.
013100*
013200 WRITE O1-REC.
017000 COMPUTE CTR-O1 = CTR-O1 + 1.
013400*
013500 21-WRITE-EXIT.
013600 EXIT.
012500****************************************************************
012600* <WRITE処理> (2.2) *
012700* 出力ファイル2へのWRITEする。 *
012800* *
012900****************************************************************
013000 22-WRITE SECTION.
013100*
013200 WRITE O2-REC.
017000 COMPUTE CTR-O2 = CTR-O2 + 1.
013400*
013500 22-WRITE-EXIT.
013600 EXIT. 012500****************************************************************
012600* <WRITE処理> (2.3) *
012700* 出力ファイル3へのWRITEする。 *
012800* *
012900****************************************************************
013000 23-WRITE SECTION.
013100*
013200 WRITE O3-REC.
017000 COMPUTE CTR-O3 = CTR-O3 + 1.
013400*
013500 23-WRITE-EXIT.
013600 EXIT.



SAMPLE02 順次ファイルのマッチング(1:N)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
順次ファイルのマッチング(1:N)
2つのファイルをキーに従って1ファイルにまとめる。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
----*----1----*----2----*----3----*----4----*----5----*----6----*----7
000000* SAMPLE02 LEVEL=1 DATE=95.10.01
000100****************************************************************
000200* *
000300* サブシステム名:資材所要量計画 *
000400* *
000500* モジュール名 :順次ファイルのマッチング *
000600* *
000700* モジュールID:SAMPLE02 *
000800* *
000900* 機能概要 :2つのファイルをキーに従って *
001000* :1ファイルにまとめる。 *
001100* *
001200* 作成者 :山田太郎 *
001300* 作成日 :1995.10.01 *
001400* 変更履歴 :1996.08.01 山田 XXXを追加 *
001500* *
001600****************************************************************
001700 IDENTIFICATION DIVISION.
001800 PROGRAM-ID. SAMPLE02.
001900/
002000 ENVIRONMENT DIVISION.
002100 INPUT-OUTPUT SECTION.
002200 FILE-CONTROL.
002300 SELECT IN01-FILE ASSIGN IN01.
002300 SELECT IN02-FILE ASSIGN IN02.
002400 SELECT OT01-FILE ASSIGN OT01.
002500/
002600 DATA DIVISION.
002700 FILE SECTION.
002800 FD IN01-FILE
002900    BLOCK CONTAINS 0 RECORDS.
003000 01 I1-REC.
003100     COPY AAA001 REPLACING ==()== BY ==I1-==.
003200*
002800 FD IN02-FILE
002900     BLOCK CONTAINS 0 RECORDS.
003000 01 I2-REC.
003100     COPY BBB001 REPLACING ==()== BY ==I2-==.
003200*
003300 FD OT01-FILE.
003400 01 O1-REC.
003500     COPY CCC001 REPLACING ==()== BY ==O1-==.
003600/
003700 WORKING-STORAGE SECTION.
003800*
003900*----ワークエリア----------------------------------------------*
005400 01 WRK-AREA.
004100   03 CAN-AREA.
004200     05 CAN-PGMID PIC X(08) VALUE "SAMPLE02".
005500   03 CTR-AREA.
005600     05 CTR-I1 PIC S9(09) PACKED-DECIMAL.
005700     05 CTR-I2 PIC S9(09) PACKED-DECIMAL.
005800     05 CTR-O1 PIC S9(09) PACKED-DECIMAL.
005900   03 KEY-AREA.
006000     05 KEY-I1.
006100       07 KEY-I1-XX0001 PIC X(01).
006200       07 KEY-I1-YY0001 PIC X(08).
006300     05 KEY-I2.
006400       07 KEY-I2-XX0001 PIC X(01).
006500       07 KEY-I2-YY0001 PIC X(08).
006600*
004700*----初期化領域------------------------------------------------*
004800 01 INI-O1-REC.
004900    COPY CCC001 REPLACING ==()== BY ==INI-O1-==.
007000/
007100 PROCEDURE DIVISION.
007200****************************************************************
007300* SAMPLE02 (0.0) *
007400****************************************************************
007500 00-SAMPLE02 SECTION.
006600*
007600   PERFORM 10-INIT.
007900   PERFORM 20-MAIN
007900        UNTIL ( KEY-I1 = HIGH-VALUE )
008000         AND ( KEY-I2 = HIGH-VALUE ).
009600   PERFORM 30-END.
009700*
009800 00-SAMPLE02-EXIT.
009900    EXIT PROGRAM.
010000****************************************************************
010100* <初期処理> (1.0) *
010200* 領域の初期クリア、入出力ファイルをオープンする。 *
010300* *
010400****************************************************************
010500 10-INIT SECTION.
010600*
010700*----出力ファイルの初期化--------------------------------------*
010800 MOVE SPACE TO INI-O1-REC.
010900 INITIALIZE INI-O1-REC.
011000*
008000*----ワークエリアの初期化--------------------------------------*
008100 MOVE LOW-VALUE TO KEY-AREA.
008200 MOVE ZERO TO CTR-AREA.
011500*
007600*----ファイルOPEN------------------------------------------*
007700 OPEN INPUT IN01-FILE
007710        IN02-FILE.
007800 OPEN OUTPUT OT01-FILE.
012110*
012120*----入力ファイル1のREAD----------------------------------*
012130 PERFORM 11-READ.
012130 PERFORM 12-READ.
013000*
013100 10-INIT-EXIT.
013200 EXIT.
013300****************************************************************
013400* <ファイルREAD処理> (1.1) *
013500* 標準入力ファイル1をREADする。 *
013600* *
013700****************************************************************
013800 11-READ SECTION.
013900*
009400   READ IN01-FILE
009500    AT END
014800     MOVE HIGH-VALUE TO KEY-I1
009700    NOT AT END
009800     COMPUTE CTR-I1 = CTR-I1 + 1
014500     MOVE I1-XX0001 TO KEY-I1-XX0001
014600     MOVE I1-YY0001 TO KEY-I1-YY0001
009900   END-READ.
015000*
015100 11-READ-EXIT.
015200 EXIT.
015300****************************************************************
015400* <ファイルREAD処理> (1.2) *
015500* 標準入力ファイル2 をREADする。 *
015600* *
015700****************************************************************
015800 12-READ SECTION.
015900*
009400   READ IN02-FILE
009500    AT END
014800     MOVE HIGH-VALUE TO KEY-I2
009700    NOT AT END
009800     COMPUTE CTR-I2 = CTR-I2 + 1
014500     MOVE I2-XX0001 TO KEY-I2-XX0001
014600     MOVE I2-YY0001 TO KEY-I2-YY0001
009900   END-READ.
017000*
017100 12-READ-EXIT.
017200 EXIT.
017300****************************************************************
017400* <マッチング> (2.0) *
017500* *
017600* *
017700****************************************************************
017800 20-MAIN SECTION.
017900*
008100   EVALUATE TRUE
008200     WHEN KEY-I1 < KEY-I2
008300        PERFORM 21-I1-ONLY
008400        PERFORM 11-READ
008500     WHEN KEY-I1 > KEY-I2
008600        PERFORM 22-I2-ONLY
008700        PERFORM 12-READ
008800     WHEN KEY-I1 = KEY-I2
008900        PERFORM UNTIL KEY-I1 NOT = KEY-I2
009000          PERFORM 23-MATCH
009100          PERFORM 12-READ
009200          END-PERFORM
009300        PERFORM 11-READ
009400   END-EVALUATE
018200*
018300 20-MAIN-EXIT.
018400   EXIT.
017300****************************************************************
017400* <出力ファイル編集1> (2.1) *
017500* *
017600* *
017700****************************************************************
017800 21-I1-ONLY SECTION.
017900*IN01-FILEのみの時
018000* ここでは何もしない
018100    CONTINUE.
018200*
018300 21-I1-ONLY-EXIT.
018400 EXIT.
018500****************************************************************
018600* <出力ファイル編集2> (2.2) *
018700* *
018800* *
018900****************************************************************
019000 22-I2-ONLY SECTION.
021500*IN02-FILEのみの時
021600*----出力ファイルの初期化--------------------------------------*
021700 MOVE INIT-O1-REC TO O1-REC.
021800*
021900*----出力ファイルの編集----------------------------------------*
022000 MOVE I2-AA0001 TO O1-BB0001.
022100 MOVE I2-AA0002 TO O1-BB0002.
022200 MOVE I2-AA0003 TO O1-BB0003.
022300 MOVE I2-AA0004 TO O1-BB0004.
022400 MOVE I2-AA0005 TO O1-BB0005.
022500*
022600*----出力ファイル1のWRITE--------------------------------*
012100 PERFORM 221-WRITE.
023000*
020700 22-I2-ONLY-EXIT.
020800 EXIT.
020900****************************************************************
021000* <出力ファイル編集3> (2.3) *
021100* *
021200* *
021300****************************************************************
021400 23-MATCH SECTION.
021500*
021600*----出力ファイルの初期化--------------------------------------*
021700 MOVE INIT-O1-REC TO O1-REC.
021800*
021900*----出力ファイルの編集----------------------------------------*
022000 MOVE I2-AA0001 TO O1-BB0001.
022100 MOVE I2-AA0002 TO O1-BB0002.
022200 MOVE I2-AA0003 TO O1-BB0003.
022300 MOVE I2-AA0004 TO O1-BB0004.
022400 MOVE I2-AA0005 TO O1-BB0005.
022500*
022600*----出力ファイル1のWRITE--------------------------------*
012100 PERFORM 221-WRITE.
023000*
023100 23-MATCH-EXIT.
023200 EXIT.
023300****************************************************************
023400* <終了処理> (3.0) *
023500* 入出力ファイルをCLOSEする。 *
023600* *
023700****************************************************************
023800 30-END SECTION.
023900*
014400*----ファイルCLOSE----------------------------------------*
014500 CLOSE IN01-FILE
014600      IN02-FILE
014600      OT01-FILE.
025100*
026400 30-END-EXIT.
026500 EXIT.
028600****************************************************************
028700* <書出処理> (2.2.1) *
028800* 順編成ファイル出力。 *
028900* *
029000****************************************************************
029100 221-WRITE SECTION.
029300*
029310 WRITE O1-REC.
013300 COMPUTE CTR-O1 = CTR-O1 + 1.
029300*
029400 221-WRITE-EXIT.
029500 EXIT.



SAMPLE03 コントロールブレークリスト出力

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
コントロールブレークリスト出力。
1入力で明細リスト出力して、ある条件で合計出力する。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
----*----1----*----2----*----3----*----4----*----5----*----6----*----7
000000* SAMPLE03 LEVEL=1 DATE=95.10.01
000100****************************************************************
000200* *
000300* サブシステム名:資材所要量計画 *
000400* *
000500* モジュール名 :コントロールブレークリスト出力 *
000600* *
000700* モジュールID:SAMPLE03 *
000800* *
000900* 機能概要 :明細と合計を印刷する。 *
001000* : *
001100* *
001200* 作成者 :山田太郎 *
001300* 作成日 :1995.10.01 *
001400* 変更履歴 :1996.08.01 山田 XXXを追加 *
001500* *
001600****************************************************************
001700 IDENTIFICATION DIVISION.
001800 PROGRAM-ID. SAMPLE03.
001900*
002000 ENVIRONMENT DIVISION.
002100*
002200 INPUT-OUTPUT SECTION.
002300 FILE-CONTROL.
002300 SELECT IN01-FILE ASSIGN IN01.
002400 SELECT OT01-FILE ASSIGN OT01.
002500*
002600 DATA DIVISION.
002700 FILE SECTION.
002800 FD IN01-FILE
002900 BLOCK CONTAINS 0 RECORDS.
003000 01 I1-REC.
003100 COPY AAA001 REPLACING ==()== BY ==I1-==.
003200*
003300 FD OT01-FILE.
003500 01 O1-REC PIC X(300).
003600/
003700 WORKING-STORAGE SECTION.
005100*----ワークエリア----------------------------------------------*
005200 01 WRK-AREA.
004100 03 CAN-AREA.
004200 05 CAN-PGMID PIC X(08) VALUE "SAMPLE03".
005500*
005300   03 CNM-AREA. 005400    05 CNM-O1-LINE-MAX PIC S9(04) BINARY VALUE 58.
005500*
005600 03 CTR-AREA.
005700 05 CTR-I1 PIC S9(09) PACKED-DECIMAL.
005800 05 CTR-O1 PIC S9(09) PACKED-DECIMAL.
005900   05 CTR-O1-PAGE   PIC S9(04) PACKED-DECIMAL.
006000   05 CTR-O1-LINE   PIC S9(04) PACKED-DECIMAL.
006100*
006200  03 KEY-AREA.
006300   05 KEY-NEW.
006400    07 KEY-NEW-XXX001 PIC X(04).
006500   05 KEY-OLD.
006600    07 KEY-OLD-XXX001 PIC X(04).
006700*
006800  03 MSG-AREA.
006900   COPY VDISPMSG.
007000*
007100  03 SUM-AREA.
007200    05 SUM-FIN-AAA001   PIC S9(09) BINARY SYNC.
007300    05 SUM-FIN-BBB001   PIC S9(09) BINARY SYNC.
007400    05 SUM-FIN-CCC001   PIC S9(09) BINARY SYNC.
007500    05 SUM-TOT-AAA001   PIC S9(09) BINARY SYNC.
007600    05 SUM-TOT-BBB001   PIC S9(09) BINARY SYNC.
007700    05 SUM-TOT-CCC001   PIC S9(09) BINARY SYNC.
007800*
007900*----ヘッダ1--------------------------------------------------*
008000 01 O1-HEAD1.
008100 03 FILLER   PIC X(10)
008200   VALUE "(SAMPLE03)"
008300   POSITION 3.
008400 03 FILLER   PIC N(21)
008500 VALUE NC"*** 金額集計表 ***"
008600   MODE-1 POSITION 46.
008700 03 O1-OP-DATE-YY   PIC ZZZ9 POSITION 114.
008800 03 FILLER   PIC N(01)
008900   VALUE NC"年" MODE-3.
009000 03 O1-OP-DATE-MM   PIC Z9.
009100 03 FILLER   PIC N(01)
009200   VALUE NC"月" MODE-3.
009300 03 O1-OP-DATE-DD   PIC Z9.
009400 03 FILLER   PIC N(01)
009500   VALUE NC"日" MODE-3.
009600 03 O1-PAGE   PIC ZZZ9 POSITION 130.
009700 03 FILLER   PIC N(01)
009800   VALUE NC"頁" MODE-3.
009900*
010000*----ヘッダ2--------------------------------------------------*
010100 01 O1-HEAD2.
010200    03 O1-CODE1   PIC ZZZ9 POSITION 5.
010300*
010400*----ヘッダ3--------------------------------------------------*
010500 01 O1-HEAD3.
010600    03 O1-CODE2   PIC X(NN) POSITION 5.
010700*
010800*----明細1----------------------------------------------------*
010900 01 O1-MEISAI1.
011000   03 O1-MEISAI11     PIC X(NN) POSITION 2.
011100    03 O1-MEISAI12     PIC N(NN) MODE-2 POSITION 12.
011200    03 O1-MEISAI13     PIC X(NN) POSITION 47.
011300*
011400*----明細2----------------------------------------------------*
011500 01 O1-MEISAI2.
011600    03 FILLER     PIC N(05)
011700         VALUE NC"*営業部計"
011800         MODE-2 POSITION 79.
011900    03 O1-SUM-TOT-AAA001     PIC ZZZ,ZZZ,ZZ9
011900 POSITION 94.
012000    03 O1-SUM-TOT-BBB001     PIC ZZZ,ZZZ,ZZ9
012010 POSITION 103.
012100  03 O1-SUM-TOT-CCC001     PIC ZZZ,ZZZ,ZZ9
012110 POSITION 113.
012200*
012300*----明細3----------------------------------------------------*
012400 01 O1-MEISAI3.
012500   03 FILLER            PIC N(05)
012600                     VALUE NC"**総合計"
012700                     MODE-2 POSITION 79.
012800   03 O1-SUM-FIN-AAA001      PIC ZZZ,ZZZ,ZZ9
012810                     POSITION 94.
012900   03 O1-SUM-FIN-BBB001      PIC ZZZ,ZZZ,ZZ9
012910                     POSITION 103.
013000   03 O1-SUM-FIN-CCC001      PIC ZZZ,ZZZ,ZZ9.
013010                     POSITION 113.
013100*
013200/
013300 PROCEDURE DIVISION.
013400****************************************************************
013500* SAMPLE03                 (0.0)        *
013600****************************************************************
013700 00-SAMPLE03 SECTION.
013800*
013900   PERFORM 10-INIT.
014000   PERFORM UNTIL ( KEY-NEW = HIGH-VALUE )
014100     PERFORM 20-INIT
014200     PERFORM UNTIL ( KEY-NEW = HIGH-VALUE )
014300       PERFORM 30-INIT
014400       PERFORM UNTIL ( KEY-NEW-XXX001
014500                NOT = KEY-OLD-XXX001 )
014600         PERFORM 40-MAIN
014700       END-PERFORM
014800       PERFORM 50-END
014900     END-PERFORM
015000     PERFORM 60-END
015100   END-PERFORM.
015200   PERFORM 70-END.
015300*
015400 00-SAMPLE03-EXIT.
015500  EXIT PROGRAM.
015600****************************************************************
015700* <初期処理>       (1.0)        *
015800*   領域の初期クリア、入出力ファイルをオープンする。     *
015900*           *
016000****************************************************************
016100 10-INIT SECTION.
016200*
016300*----ファイルOPEN------------------------------------------*
016400 OPEN INPUT IN01-FILE.
016500 OPEN OUTPUT OT01-FILE.
016600*
017300 10-INIT-EXIT.
017400 EXIT.
017500****************************************************************
017600* <ファイルREAD処理>         (1.1)        *
017700*   標準入力ファイル1をREADする。           *
017800*           *
017900****************************************************************
018000 11-READ SECTION.
018100*
018200   READ IN01-FILE
018300    AT END
018400     MOVE HIGH-VALUE TO KEY-NEW
018500    NOT AT END
018600     COMPUTE CTR-I1 = CTR-I1 + 1
018700   END-READ.
018800*
018900 11-READ-EXIT.
019000   EXIT.
019100****************************************************************
019200* <合計行の初期化>             (2.0)     *
019300*         *
019400* *
019500****************************************************************
019600 20-INIT SECTION.
019700*
019800*----ページ初期化----------------------------------------------*
019900 MOVE ZERO TO CTR-O1-PAGE.
020000*
020100*----合計行の初期化--------------------------------------------*
020200   MOVE ZERO TO SUM-FIN-AAA001
020300           SUM-FIN-BBB001
020400           SUM-FIN-CCC001.
020500*
020600 20-INIT-EXIT.
020700 EXIT.
020800****************************************************************
020900* <X計行の初期化>  (3.0) *
021000*      *
021100* *
021200****************************************************************
021300 30-INIT SECTION.
021400*
021500*----改ページ設定----------------------------------------------*
021600 MOVE CNM-O1-LINE-MAX TO CTR-O1-LINE.
021700*
021800*----X計行の初期化--------------------------------------------*
021900   MOVE       ZERO TO SUM-TOT-AAA001
022000                 SUM-TOT-BBB001
022100                 SUM-TOT-CCC001.
022200*
022300   MOVE      KEY-NEW TO KEY-OLD.
022400*
022500 30-INIT-EXIT.
022600 EXIT.
022700****************************************************************
022800* <主処理>  (4.0) *
022900*      *
023000* *
023100****************************************************************
023200 40-MAIN SECTION.
023300*
023400*----改ページ判定----------------------------------------------*
023500   IF CTR-O1-LINE + 1 > CNM-O1-LINE-MAX
023600     PERFORM 99-NEWPAGE
023700   END-IF.
023800   WRITE O1-REC FROM O1-MEISAI1 AFTER 1.
023900   COMPUTE CTR-O1-LINE = CTR-O1-LINE + 1.
024000*
024100*----ZZZZ計加算--------------------------------------------*
024200 COMPUTE SUM-TOT-AAA001 = SUM-TOT-AAA001 + I1-AAA001.
024400 COMPUTE SUM-TOT-BBB001 = SUM-TOT-BBB001 + I1-BBB001.
024600 COMPUTE SUM-TOT-CCC001 = SUM-TOT-CCC001 + I1-CCC001.
024800*
024900 40-MAIN-EXIT.
025000 EXIT.
025100****************************************************************
025200* <XXXX計行の印刷> (5.0) *
025300* *
025400* *
025500****************************************************************
025600 50-END SECTION.
025700*
025800*----編集------------------------------------------------------*
025900 MOVE SUM-TOT-AAA001 TO O1-SUM-TOT-AAA001.
026000 MOVE SUM-TOT-BBB001 TO O1-SUM-TOT-BBB001.
026100 MOVE SUM-TOT-CCC001 TO O1-SUM-TOT-CCC001.
026200*
026300*----改ページ判定/XXXX計行の印刷--------------------------*
026400 IF CTR-O1-LINE + 1 > CNM-O1-LINE-MAX
026500 PERFORM 99-NEWPAGE
026600 END-IF.
026700 WRITE O1-REC FROM O1-MEISAI2 AFTER 1.
026800 COMPUTE CTR-O1-LINE = CTR-O1-LINE + 1.
026900*
027000*----合計加算--------------------------------------------------*
027100 COMPUTE SUM-FIN-AAA001 = SUM-FIN-AAA001 + SUM-TOT-AAA001.
027300 COMPUTE SUM-FIN-BBB001 = SUM-FIN-BBB001 + SUM-TOT-BBB001.
027500 COMPUTE SUM-FIN-CCC001 = SUM-FIN-CCC001 + SUM-TOT-CCC001.
027700*
027800 50-END-EXIT.
027900 EXIT.
028000****************************************************************
028100* <合計行の印刷> (6.0) *
028200* *
028300* *
028400****************************************************************
028500 60-END SECTION.
028600*
028700*----編集------------------------------------------------------*
028800 MOVE SUM-FIN-AAA001 TO O1-SUM-FIN-AAA001.
028900 MOVE SUM-FIN-BBB001 TO O1-SUM-FIN-BBB001.
029000 MOVE SUM-FIN-CCC001 TO O1-SUM-FIN-CCC001.
029100*
029200*----改ページ判定/合計行の印刷--------------------------------*
029300 IF CTR-O1-LINE + 1 > CNM-O1-LINE-MAX
029400 PERFORM 99-NEWPAGE
029500 END-IF.
029600 WRITE O1-REC FROM O1-MEISAI3 AFTER 1.
029700*
029800 60-END-EXIT.
029900 EXIT.
030000****************************************************************
030100* <終了処理>                (7.0)        *
030200*   入出力ファイルをCLOSEする。             *
030300*           *
030400****************************************************************
030500 70-END SECTION.
030600*
030700*----ファイルのCLOSE--------------------------------------*
030800 CLOSE IN01-FILE
030900 OT01-FILE.
032000*
032100 70-END-EXIT.
032200 EXIT.
032300****************************************************************
032400* <改ページ>                (9.9)        *
032500*   改ページ処理を行う。              *
032600*           *
032700****************************************************************
032800 99-NEWPAGE SECTION.
032900*
033000*----行カウンタ初期化/ページカウンタ設定----------------------*
033100 MOVE ZERO TO CTR-O1-LINE.
033200 COMPUTE CTR-O1-PAGE = CTR-O1-PAGE + 1.
033300 MOVE CTR-O1-PAGE TO O1-PAGE.
033400*
033500*----改ページ処理----------------------------------------------*
033600 MOVE SPACE TO O1-REC.
033700 WRITE O1-REC AFTER PAGE.
033800 WRITE O1-REC FROM O1-HEAD1 AFTER 2.
033900 WRITE O1-REC FROM O1-HEAD2 AFTER 2.
034000 WRITE O1-REC FROM O1-HEAD31 AFTER 2.
034100 WRITE O1-REC FROM O1-HEAD32 AFTER 1.
034200 COMPUTE CTR-O1-LINE = CTR-O1-LINE + 8.
034300*
034400 99-NEWPAGE-EXIT.
034500 EXIT.




 
このページTOPへ
Mhome.gif

Copyright © 2006-2006 s-kitagawa