12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

1人COBOL再研修〜データ項目のあれこれ編〜

Last updated at Posted at 2019-06-29

これの続き。更新頻度が遅すぎてCOBOL研修が終わってしまったが、変わらずマイペースで進めていこう。

今回はデータ項目周りをやるとのことで、COBOL構文というより、データの型とかそっちの話になる。

おさらい「データ項目の定義方法」

ここでやった。

構文
レベル番号  項目名            PIC 型(文字数).

WORKING-STORAGE SECTION.に書くのだった。例えば、5文字入る文字列をレベル1で定義するときは

01  DT-NAME            PIC X(05).

で良い。今回はこの構文周りについて細かく見ていく。

レベル番号

レベル番号を指定することで、複数のデータ項目を1つのグループにして扱えるようになったりする。例えば、

サンプル
      *---1---------2---------3---------4---------5-----
       IDENTIFICATION         DIVISION.
       PROGRAM-ID.            SAMPLE.
      *
       ENVIRONMENT            DIVISION.
      *
       DATA                   DIVISION.
       WORKING-STORAGE        SECTION.
       01  DT-PARENT.
         03  DT-CHILD1        PIC X(05).
         03  DT-CHILD2        PIC X(05).
      *
       PROCEDURE              DIVISION.
       MAIN                   SECTION.
           MOVE               'HELLO'  TO  DT-CHILD1.
           MOVE               'WORLD'  TO  DT-CHILD2.
           DISPLAY            DT-PARENT.
           STOP RUN.

とすると

実行結果
HELLOWORLD

となる。つまり、DT-PARENTは、実質X(10)であって、中身がDT-CHILD1DT-CHILD2を合わせたものになる。もちろんDISPLAYDT-CHILD1とすれば、いつもどおりDT-CHILD1のデータだけ出てくる。

逆にACCEPTとかでDT-PARENTHELLOWORLDと入れると、DT-CHILD1HELLODT-CHILD2WORLDと、分けられて入る。

FIG1.png

また、上の例から、更に05、07と続けさせることもできる。

注意点として、グループの親にPICTURE句をつけてはならないこと。グループのレベル番号が一番高い要素にだけつける。

無名項目:FILLER

FILLER句は固定の値や文字を持ちたいときに使う。なので定義時に初期値を入れると、後から変更ができなくなる。また、FILLER句は予約語なのだが、データ項目名として使う。で、定義方法と初期値の入れ方なのだが、

レベル番号  FILLER  PIC 型(文字数) VALUE '初期値'.

とする。

ここで気づいた方がいると思うが、「データ項目名に予約語のFILLERを入れるということは、複数個FILLER作ったら、同じデータ項目名がいくつもできて、DISPLAYとかするときに指定できないじゃん」ってなるが、そもそもFILLER句を使って定義したものは他の構文で直接使えない。

じゃあどうするんだってなるが、FILLERは前項のレベル番号の子の一部として使う。そうすることで、データのフォーマットを自分で作ることができるようになる。例えば、帳票出力するとき、定形文字があったりすると、使えたりする。

サンプル
      *---1---------2---------3---------4---------5-----
       IDENTIFICATION         DIVISION.
       PROGRAM-ID.            SAMPLE.
      *
       ENVIRONMENT            DIVISION.
      *
       DATA                   DIVISION.
       WORKING-STORAGE        SECTION.
       01  PRINT-NAME.
         03  FILLER           PIC X(06) VALUE 'NAME: '.
         03  IN-NAME          PIC X(10).
      *
       PROCEDURE              DIVISION.
       MAIN                   SECTION.
           ACCEPT             IN-NAME FROM CONSOLE.
           DISPLAY            PRINT-NAME.
           STOP RUN.
実行結果
TAROH <-自分で入れたもの
NAME: TAROH

こうしておけば、間違って書き換えられることもないし安心。

数値型の種類

今まで、PICTURE句の後ろにXとか9とか使ってきた。文字型はXでこれといってそれ以上の特徴はないけど、数値型の定義方法が色々あってちょっと複雑。ここではその中の一例を挙げる。

ゾーン10進数の整数桁数指定:9

一番良く使う整数の型。入れることのできる桁数を任意で決める。もし数値5桁のデータ項目に9999を代入すると、09999というように0埋めされる。また、計算したデータを入れるとき、小数点以下は切り捨て。

ゼロサプレス(Z編集):Z

ゼロサプレスについて書いておくと

ゼロサプレスとは、数値を文字として表現・表示する際に、先頭あるいは末尾の余分な「0」を削除したり空白で置き換えたりする処理のこと。

ゼロサプレスとは - IT用語辞典

つまり、5桁データ項目に9999と入れても9999と0埋めされない。

が、ここには罠がある。例えばこのプログラム。

サンプル
      *---1---------2---------3---------4---------5-----
       IDENTIFICATION         DIVISION.
       PROGRAM-ID.            SAMPLE.
      *
       ENVIRONMENT            DIVISION.
      *
       DATA                   DIVISION.
       WORKING-STORAGE        SECTION.
       01  Z-EDIT             PIC Z(02).
       PROCEDURE              DIVISION.
       MAIN                   SECTION.
           MOVE               0 TO Z-EDIT.
           DISPLAY            Z-EDIT.
           STOP RUN.

出力は0だと思うかもしれないが、実は何も出ない。Zは1の位が0のときもお構いなしに消してくるので、対策としては、Z(02)Z9としてやる必要がある。

小数点以下の桁数指定: V

そう、整数を入れるデータの桁数の指定と、小数点以下の桁数の指定は違う。例えば、999.99という数字を入れたいときは、

構文
01  DT-NAME  PIC 9(03)V9(02).

としてやらねばならない。

符号付きの値: S

Sをつけると、符号付きの値として扱われる。例えば、符号付き整数ならS9とする。今までのようにSがついていないものは、正の値として扱われる。

パック10進数: COMP-3

まぁ上でゾーン10進数と書いたから勘付いていたとは思うが…。

一応簡単に説明しておくと、8ビット(1バイト)を使って、どう数値を表現するかの違い。ゾーン10進数は1バイトで1桁(前4バイトをゾーン部、後ろ4バイトにその桁の数字)、パック10進数は4ビットで1桁なので、1バイトで2桁の数値を表現できるということになる。

FIG2.png

さて話を戻し、パック10進数の定義方法を見ていく。

構文
01  DT-NAME  PIC S9(03) COMP-3.

いつもの構文にプラスCOMP-3を付ける必要がある。

形象定数

要はCOBOL側で予め決められている文字リテラル。研修教材には以下のものがあった。

形象定数 中身 有効型
SPACE 文字のスペース。必要数は自動で判断 Xのみ
ZERO 文字または数値の0 すべて
HIGH-VALUE コンピュータが表現できる文字の最大値 Xのみ
LOW-VALUE コンピュータが表現できる文字の最小値 Xのみ

調べながらやってると他にも出てきたりしたが、とりあえず今回はこれだけ。

HIGH-VALUELOW-VALUEって何が入っているんだろう

研修で教えてくれなくて、興味があってググってみた

HIGH-VALUEは、16進数FFがセットされる。印字や画面出力はできないが、比較には使えて、Xのときは最大を保証する。

逆にLOW-VALUEは、全体に16進数の0埋めされる。

今回はここまで

本当はS9からXのデータ移行で直接MOVEできないぞってことも書きたかったのだけれど、なんかできてしまってよく分からないので、今回の投稿は保留。これは勉強し直してから。

今回は画像も付けたので、すごい長かった。でも研修で教わらないことも知ることができたので楽しかった。

続き(2019/07/14作成)

12
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?