COBOLヒント集

 

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

終了は[×](閉じる)
 
ヒント集
謝辞 コーディング規約
COBOL文法1 COBOL文法2
構造化プログラミング COBOLコーディング
COBOL・NDBコーディング COBOL・RDBコーディング
     
 
ヒント ヒント内容
謝辞
謝辞とは
謝辞
 
コーディング規約
コーディング命名規約
データ項目名命名指針、ローマ字はヘボン式
カラムの位置
命令記述について
 
 
 
 
COBOL文法1
PIC
作業領域の書き方
領域の初期化について
算術計算
 
 
 
 
COBOL文法2
IF
EVALUATE
OCCURS
PERFORM
INSPECT
REDEFINES
STRING UNSTRING
  
  
 
構造化プログラミング
構造化プログラミングとは
順次構造(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普及のため、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句は記述を省略する。


 

 


 




 




 
■ COBOL文法1


PIC

○よく使う
・データ確保
PIC X(10)       英数字(英字、数字(計算できない))、空白 例:ABCDEFGHIJ
PIC XXXXXXXXXX     同上
PIC 9(10)       数字 符号なし(マイナスなし) 例:1234567890
PIC 99999999999     同上
PIC S9(10)       数字 符号あり(マイナスあり) 例:-1234567891
                                 内部構造123456789J
PIC 9(10)V9(3)     V 仮装した小数点の位置 小数点以下3桁    例:1234567891.123 
                                 内部構造1234567891123
PIC N(10)       日本語(全角)20バイト必要

・表示用
PIC X(10)BBXXX     10文字と空白2個と3文字   例:ABCDEFGHIJ  KLM
PIC 9,999,999      数字 コンマ表示 例:0,012,345
PIC Z,ZZZ,ZZZ      数字 コンマ表示 例:12,345
PIC --,---,---     数字 コンマ表示 マイナスがある時使用 ハイホン分1ケタ多くとる 
                                  例:-12,345
PIC \,\\\,\\\     数字 通貨用           例:\12,345
PIC \,\\\,\\\-     数字 通貨用マイナスあり   例:\12,345-



○あまり使わない
・データ確保
PIC A(10)       英字、空白 例:ABCDEFGHIJ
・表示用
PIC *,***,***     数字  例:*,*12,345



●編集例

(注) △はスペース
送り項目のPIC送り項目の値受け項目のPIC編集結果
999999001234ZZZZZ91234
999999001234ZZZ,ZZ91,234
999999000123ZZZ,ZZ9123
999999000123\ZZZ,ZZ9   \△△△△123
999999000000ZZZZZ90
999999000000ZZZZZZ
999999V9900123456ZZZZZ9.991234.56
9999V999123456ZZZZZ.ZZ123.45
9999V91234ZZZZZ9.999123.400
999V99901234\***.***\**1.234
9(6)000123*****9***123
9(6)000123\\\\\9\123
9(6)000000************
9(6)000000\\\\\\
9999V99000000\****.******.**
V9(6)123456\***,**9.99\******0.12
S9(6)000123-
厳密には00012L
------9-123
S9(6)000123+
厳密には00012C
------9123
S9(6)000123-
厳密には00012L
++++++9-123
S9(6)000123+
厳密には00012C
++++++9+123
9(6)123456-,---,---.--123,456.00
9(6)123456+,+++,+++.+++123,456.00
99999V9123456BBB999.00345.00
99999V9123456B9B999.992△345.60
S999V999123456-\,\\\,\\\.99CR\123.45CR
999V999123456\,\\\,\\\.99CR\123.45
S9(6)000123-
厳密には00012L
ZZZZZ9-123-
S9(6)000123+
厳密には00012C
ZZZZZ9-123
S9(6)000123-
厳密には00012L
ZZZZZ9+123-
S9(6)000123+
厳密には00012C
ZZZZZ9+123+
S9(6)000123-
厳密には00012L
-ZZZZZ9-△△△123
S999V999123456-\ZZ,ZZZ.99DB\△△△123.45DB
999V999123456\ZZ,ZZZ.99DB\△△△123.45


 


 作業領域の書き方 

 
 01 AAA.                  *集団項目
   03 AAA1.               *集団項目
     05 AAA11   PIC 9(03).    *基本項目
     05 AAA12   PIC 9(03).    *基本項目

 77 BBB1        PIC X(03). 独立項目
 01 BBB1        PIC X(03). 上と同じ意味  最近はこちらが多い

●レベル番号
01 03 05 07 と奇数を書く(追加できるように)




 領域の初期化について

●作業領域で指定
*ZEROで初期化
 01 IX.
   03 IX1         PIC 9(03) VALUE ZERO.
   03 IX2         PIC 9(03) VALUE ZERO.

*SPACEで初期化
 01 WKALL.
   03 WK1         PIC X(03) VALUE SPACE.
   03 WK2         PIC X(03) VALUE SPACE.

*その他いろいろ
 01 WKALL.
   03 WK1         PIC X(03) VALUE "ABC".   *ABCが入る
   03 WK2         PIC X(03) VALUE ALL "0".  *全て0が入る


●MOVEで転送
MOVE  ALL "0"     TO  WKALL.      
MOVE  ZERO       TO  IX1.      
MOVE  SPACE       TO  WK1.      

MOVE  HIGH-VALUE    TO  WK1.   *16進定数(FF)
MOVE  LOW-VALUE     TO  WK2.   *16進定数(00)


●INITIALIZEで初期化
項目の属性に従って初期化される。

INITIALIZE WKALL.

 01 WKALL.
   03 WK1         PIC X(03).   *SPACEが入る。
   03 WK2         PIC 9(03).   *ZEROが入る。


●効率の良い初期化
マシンの能力が低い時は以下の対策を取っていました。

・領域の初期化は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.




算術計算

ADD A B                     A+B→B
ADD A TO B                   同上
ADD A B C D                  A+B+C+D→D
ADD A B C TO D                同上
ADD 1 TO A                  1+A→A   *よく使う
ADD A B C GIVING D           A+B+C→D

SUBTRACT A FROM B            B-A→B
SUBTRACT A B FROM C GIVING D  C-(A+B)→D

MULTIPLY A BY B               A×B→B
MULTIPLY A BY B GIVING C       A×B→C

DIVIDE A INTO B                B÷A→B
DIVIDE A INTO B GIVING C        B÷A→C

*昔はスピードが遅かったので、ADDなど使用していたが、今日ではスピードも速いので、 あまり気にせずに、簡単なCOMPUTEの使用が多い

COMPUTE F = A + B            .     .  . A+B→F
COMPUTE F = ((A + B) / (C - D)) * 100  .  . ((A+B)÷(C-D)) × 100 →F
COMPUTE F ROUNDED = A + B          .  . A+B→F 四捨五入




 




 

 


 




 
■ COBOL文法2


 IF

IF文は、判断(もし〜ならば〜する)(IF〜THEN〜文1を実行する)
条件分岐
ネストが5個以上はEVALUATEを使用する。

-------------------------------------------------
 IF 条件1
  THEN
     文1
  ELSE
     文2
 END-IF


 IF 条件1
  THEN
     文1
  ELSE
     CONTINUE
 END-IF

*「NEXT SENTENCE」 は使用しなくて「CONTINUE」を使う事


-------------------------------------------------
大きい[大きくない]   [NOT] >
小さい[小さくない]   [NOT] <
等しい[等しくない]   [NOT] =
以上             >=
以下             <=
-------------------------------------------------
 IF AAA = BBB 
   PERFORM SECTION-A
 ELSE
   PERFORM SECTION-B
 END-IF.


 EVALUATE

条件式。同一の項目での比較分岐によく使用。ネストが深い時はIF文より使われる。
-------------------------------------------------
EVALUATE文 書式1
-------------------------------------------------
EVALUATE 評価対象
  WHEN 値1      .     *値1単一評価
    実行文1
  WHEN 値2
  WHEN 値3
  WHEN 値4      .     *値2or値3or値4
    実行文2
  WHEN 値5 THRU 値6   *値5〜値6
    実行文3
  WHEN OTHER      *どのWHENにも該当しなかったとき実行される。
    実行文4
END-EVALUATE.

*THRU:範囲指定 100 THRU 200 は 100〜200
*OTHER:その他 どのWHENにも該当しなかったとき実行される。

-------------------------------------------------
EVALUATE文 書式2
-------------------------------------------------

EVALUATE 評価対象1 ALSO 評価対象2 *ALSOで区切って評価対象を複数記入する。
  WHEN 評価1 ALSO 評価2
    実行文1
  WHEN 評価3 ALSO 評価4
    実行文2
  WHEN 評価5 ALSO ANY
    実行文3
  WHEN OTHER
    CONTINUE
END-EVALUATE.

*評価対象は、データ名、定数、式、 TRUE、FALSE
*「評価対象1 ALSO 評価対象2」と「WHEN 評価1 ALSO 評価2」ALSOの個数は一致する事。
*ANYは評価しない(すなわち全てOK)

-------------------------------------------------
WHEN (ORと考えて良い)
-------------------------------------------------
●単一で評価する。
AAA = 100 の時 WK1に1を加算

EVALUATE AAA
  WHEN 100
    ADD 1 TO WK1

●複数の値を「OR または」で評価する AAA = 100 OR 200 OR 300の時 WK1に1を加算

EVALUATE AAA
  WHEN 100
  WHEN 200
  WHEN 300
    ADD 1 TO WK1

●値1から値2の範囲内であれば条件は成立する。 AAA が 100〜200の時 WK1に1を加算

EVALUATE AAA
  WHEN 100 THRU 200
    ADD 1 TO WK1

●OTHER どのWHENにも該当しなかったとき実行される。
AAA が 100〜200以外の時 WK2に1を加算

EVALUATE AAA
  WHEN 100 THRU 200
    ADD 1 TO WK1
  WHEN OTHER
    ADD 1 TO WK2

-------------------------------------------------
ALSO (ANDと考えて良い)
-------------------------------------------------

AAA:性別
BBB:年齢
CCC:点数
男性で年齢が10歳で点数が100点の人は、WK1に加算する
男性で年齢が10歳で点数が99〜50点の人は、WK2に加算する
男性で年齢が9歳は、WK3に加算する
女性で年齢が10歳で点数が100点の人は、WK4に加算する
それ以外は何もしない

EVALUATE AAA ALSO BBB ALSO CCC  *ALSOで区切って評価対象を複数記入。
  WHEN "男" ALSO 10 ALSO 100
    ADD 1 TO WK1
  WHEN "男" ALSO 10 ALSO 99 THRU 50
    ADD 1 TO WK3
  WHEN "男" ALSO 9 ALSO ANY
    ADD 1 TO WK3
  WHEN "女" ALSO 10 ALSO 100
    ADD 1 TO WK4
  WHEN OTHER
    CONTINUE
END-EVALUATE.

-------------------------------------------------
「例1」
AAAがaの時は、1をWK1に加算する。
AAAがbの時は、1をWK2に加算する。
AAAがcの時は、1をWK3に加算する。
AAAがa,b,c以外は1をWK4に加算する。

   EVALUATE AAA
     WHEN  "a" ADD 1 TO WK1
     WHEN  "b" ADD 1 TO WK2
     WHEN  "c" ADD 1 TO WK3
     WHEN  OTHER
           ADD 1 TO WK4
   END-EVALUATE.
-------------------------------------------------
「例2」
AAA=3〜5ならWK1に1を加算、それ以外ならWK2に1を加算する
   EVALUATE AAA
     WHEN  3 THRU 5
         ADD 1 TO WK1
     WHEN  OTHER
         ADD 1 TO WK2
   END-EVALUATE.

同じ
   EVALUATE AAA
     WHEN  3
     WHEN  4
     WHEN  5
         ADD 1 TO WK1
     WHEN  OTHER
         ADD 1 TO WK2
   END-EVALUATE.
-------------------------------------------------
「例3」
  条件
 AAAの値  BBBBの値
 "男"      1〜19
 "男"      20
 "男"      以外
 "女"      1〜50
 "女"      以外

 EVALUATE AAA ALSO BBB
   WHEN "男" ALSO 1 THRU 19
      ADD 1 TO WK1
   WHEN "男" ALSO 20
      ADD 1 TO WK2
   WHEN "男" ALSO ANY
      ADD 1 TO WK3
   WHEN "女" ALSO 1 THRU 50
      ADD 1 TO WK4
   WHEN "女" ALSO ANY
      ADD 1 TO WK5
   WHEN  OTHER
      CONTINUE
 END-EVALUATE.


-------------------------------------------------
「例4」
  条件
 AAAの値  BBBBの値  CCCの値
 "A"      11〜20    >50   
 "A"      21〜30    >60   
 "B"      31〜41    >70   
 の時は、     ADD 1 TO WK1
 それ以外は   ADD 1 TO WK2

 EVALUATE AAA ALSO BBB ALSO TRUE
   WHEN "A" ALSO 11 THRU 20 ALSO  CCC > 50
   WHEN "A" ALSO 21 THRU 30 ALSO  CCC > 60
   WHEN "B" ALSO 31 THRU 40 ALSO  CCC > 70
      ADD 1 TO WK1
   WHEN OTHER
      ADD 1 TO WK2
  END-EVALUATE.


-------------------------------------------------
「例5」
  条件
AAA=0 かつ BBB≠0 かつ CCC=O の時、WK1に1を加算する

 EVALUATE AAA=O ALSO BBB=0 ALSO CCC=0
   WHEN TRUE ALSO FALSE ALSO TRUE
      ADD 1 TO WK1
   WHEN OTHER
      CONTINUE
   END-EVALUATE.


-------------------------------------------------
「例6」
  条件
AAA=1 または BBB=1 または CCC=1 ならば WK1に1を加算

 EVALUATE AAA ALSO BBB ALSO CCC
   WHEN   1   ALSO  ANY  ALSO   ANY
   WHEN  ANY  ALSO   1   ALSO   ANY
   WHEN  ANY  ALSO  ANY  ALSO   1
       ADD  1   TO   WK1
   END-EVALUATE.


-------------------------------------------------
「例7」
WK_OK="OK" または WK_NG="NG"  ならば WK1に1を加算

 EVALUATE TRUE
     WHEN   WK_OK = "OK"
     WHEN   WK_NG = "NG"
         ADD 1 TO WK1
 END-EVALUATE.





 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".   *これはよく使う。


例2
 01 AAX.
  03 FILLER     PIC X(20) VALUE "YAMADA*HANAKO".

全ての"A"を"#"に置換える
 INSPECT AAX REPLACING ALL "A" BY "#".
結果AAXは"Y#M#D#*H#N#KO"

最初の"A"を"#"に置換える
 INSPECT AAX REPLACING FIRST "A" BY "#".
結果AAXは"Y#MADA*HANAKO"

"*"から最初の"A"を"#"に置換える
 INSPECT AAX REPLACING FIRST "A" BY "#"  AFTER  INITIAL  "*".
結果AAXは"YAMADA*H#NAKO"

"*"から全ての"A"を"#"に置換える
 INSPECT AAX REPLACING ALL "A" BY "#"  AFTER  INITIAL  "*".
結果AAXは"YAMADA*H#N#KO"


例3 まとめて書くと
 01 AAX.
  03 FILLER     PIC X(20) VALUE "YAMADA*YAMADA".

全ての"A"を"#"に置換えて、
"*"から最初の"M"を"%"に置換える
 INSPECT AAX REPLACING
      ALL  "A" BY "#"
      FIRST "M" BY "%"  AFTER  INITIAL  "*".
結果AAXは
"Y#M#D#*Y#M#D#"から"Y#M#D#*Y#%#D#"になる。


●文字列の出現カウント
 INSPECT データ名 TALLYING データ名 FOR
   (ALL または LEADING または FIRST) データ名 CHARACTERS) 
    (BEFORE または AFTER) [INITIAL データ名]
例1
 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.

"YAMADA"は何回出現するか?
 INSPECT  AAX  TALLYING  IX  FOR  ALL  "YAMADA".
 IXは2

例2
 01 AAX.
  03 FILLER     PIC X(20) VALUE "YAMADA*HANAKO".
 01 IX        PIC  9(5)  VALUE  ZERO.

"A"は何回出現するか?
 INSPECT  AAX  TALLYING  IX  FOR  ALL  "A".
 IXは5

"*"までに"A"は何回出現するか?
 INSPECT  AAX  TALLYING  IX  FOR  ALL  "A"  BEFORE  INITIAL  "*".
 IXは3

"*"から"A"は何回出現するか?
 INSPECT  AAX  TALLYING  IX  FOR  ALL  "A"  AFTER  INITIAL  "*".
 IXは2

*例2を一度に書くと
 INSPECT  AAX  TALLYING
       IX1  FOR  ALL  "A"
       IX2  FOR  ALL  "A"  BEFORE  INITIAL  "*"
       IX3  FOR  ALL  "A"  AFTER  INITIAL  "*".



 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).


 STRING UNSTRING


文字列の連結(STRING)、文字列の分解(UNSTRING)

●文字列の連結(STRING)
複数の文字列を結合して、1つの文字列を作成できます。

STRING { { 一意名1 } [DELIMITED BY { 一意名2 }] }
     { 定数1 }       { 定数2 }
     [SIZE]
     INTO 一意名3 [WITH POINTER 一意名4]
     [ON OVERFLOW 無条件文1 ]
     [NOT ON OVERFLOW 無条件文2]
     [END-STRING]

(例)  01 AAA.
  03 AA1     PIC X(7) VALUE "ABCD EF".
  03 AA2     PIC X(7) VALUE "GHI JKL".
  03 AA3     PIC X(9) VALUE "MNOPQR ST".

 01 BBB     PIC X(25) VALUE ZERO.

*単純に結合する
   STRING AA1 AA2 AA3 DELIMITED BY SIZE
     INTO BBB.

*BBBの中身は
"ABCD EFGHI JKLMNOPQR ST00"

*各項目のSPACEの前まで結合する
   STRING AA1 AA2 AA3 DELIMITED BY SPACE
     INTO BBB.

*BBBの中身は
"ABCDGHIJKLMNOPQR000000000"



●文字列の分解(UNSTRING)
よく使う

UNSTRING 分解元データ名
     [DELIMITED BY [ALL] 区切り文字 [OR [ALL] 区切り文字]
     INTO {分解後データ保存 [DELIMITER IN データ名] [COUNT IN データ名]}
     [WITH POINTER データ名] [TALLING 分割数保存
     [ON OVERFLOW 文] [NOT ON OVERFLOW 文]
     [END-UNSTRING]

  ","で区切られたデータを分解する
  MOVE "AB,CDE,FGH,IJ,,KLM,NO"  TO  WK1.

   UNSTRING  WK1  DELIMITED  BY  ","
    INTO  分解文字列1  COUNT IN 分解文字列長1
        分解文字列2  COUNT IN 分解文字列長2
        分解文字列3  COUNT IN 分解文字列長3
        分解文字列4  COUNT IN 分解文字列長4
        分解文字列5  COUNT IN 分解文字列長5
        分解文字列6  COUNT IN 分解文字列長6
    TALLYING IN 分解文字列数 .

中に入るのは
   分解文字列1:AB   分解文字列長1:2
   分解文字列2:CDE   分解文字列長2:3
   分解文字列3:FGH   分解文字列長3:3
   分解文字列4:IJ    分解文字列長4:2
   分解文字列5:なし   分解文字列長5:0
   分解文字列6:KLM   分解文字列長6:3
   "NO"は破棄される
   分解文字列数:6

この書き方が多い
   UNSTRING  WK1  DELIMITED  BY  ","
    INTO  分解文字列1
        分解文字列2
        分解文字列3
        分解文字列4
        分解文字列5
        分解文字列6.



 




 




 
■ 構造化プログラミング


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

 プログラミング作成の手法で、モジュール化する事により分り易いプログラムが出来る
 ただ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コーディング


 入力チェック

●数値チェック

01 A PIC 9(10). 

 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.


 




 
■   


   
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
 



  

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
 



  

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
 




 
このページTOPへ
メインフレーム         COBOLエラー対処 

SEプログラマー・ヒント集メニューへ

Copyright © 2006-2013 s-kitagawa cobolhint