こんにちは!😊 COBOL学習のStep 2へようこそ!前回はENVIRONMENT DIVISIONの基本について学びましたね。今回は、COBOLプログラムでデータを扱うための重要な領域、DATA DIVISIONとその中核となるデータ定義(PIC句)について詳しく見ていきましょう。
プログラムはデータを処理するために存在します。COBOLでは、どのようなデータを、どのような形式で、どれくらいの大きさで扱うかを事前にきっちり定義する必要があります。その役割を担うのがDATA DIVISIONです。
DATA DIVISIONの役割
DATA DIVISIONは、さらにいくつかのセクション(SECTION)に分かれています。主なセクションは以下の通りです。
- FILE SECTION: ファイル処理で使用するデータ構造(レコード)を定義します。ファイルの入出力に関連するデータを扱います。(Step 4で詳しく学びます)
- WORKING-STORAGE SECTION: プログラム内部で一時的に使用する変数や定数、作業領域などを定義します。今回の主役です!✨
- LINKAGE SECTION: 他のプログラム(サブルーチン)との間でデータをやり取りするための領域を定義します。(Step 5で詳しく学びます)
今回は、特にWORKING-STORAGE SECTIONに焦点を当てて、データ定義の方法を学んでいきましょう。
WORKING-STORAGE SECTIONとデータ定義
WORKING-STORAGE SECTIONでは、プログラムの処理に必要な様々なデータ項目を定義します。データ定義は、レベル番号、データ項目名、そしてPIC句(PICTURE句)などの句を組み合わせて行います。
レベル番号
データ項目は階層構造で定義できます。レベル番号はその階層を示す数字です。
- 01: 階層の最上位を示します。レコードや独立したデータ項目を定義する際に使用します。
- 02 から 49: 上位のデータ項目に従属する、より細かいデータ項目を定義する際に使用します。数字が大きいほど下位の階層になります。
- 77: (旧式の書き方) 階層構造を持たない独立した基本項目を定義します。現在は01レベルで定義することが一般的です。
- 88: 条件名を定義します。特定の花の値に名前を付けることができます。(少し応用的な内容です)
データ項目名
定義するデータ項目(変数名など)の名前です。COBOLの命名規則に従って、分かりやすい名前を付けましょう。(例: `WK-NAME`, `WK-COUNT`, `CUSTOMER-RECORD` など)
PIC句 (PICTURE句) ★今回の最重要ポイント★
ピクチャ文字列には、特定の意味を持つ文字(ピクチャ文字)を使用します。よく使われるピクチャ文字をいくつか見てみましょう。📊
ピクチャ文字 | 意味 | データ型 | 例 | 説明 |
---|---|---|---|---|
9 | 数字 | 数字項目 | PIC 9(5) | 5桁の数字 (例: 12345) |
X | 英数字 | 英数字項目 | PIC X(10) | 10桁の英数字 (例: ABC123XYZ) |
A | 英字 | 英字項目 | PIC A(8) | 8桁の英字 (例: COBOLABC) ※ Xの方が汎用性が高くよく使われます |
S | 符号 | 数字項目 | PIC S9(5) | 符号付き (+/-) 5桁の数字 (例: +12345, -00010) ※ 必ず先頭に記述 |
V | 暗黙の小数点 | 数字項目 | PIC 9(3)V9(2) | 整数部3桁、小数部2桁の数字 (データ内部に小数点は持たない 例: 12345 は 123.45 として扱われる) |
P | 暗黙の10のべき乗 | 数字項目 | PIC 9(3)PP | 3桁の数字に100を掛けた値 (例: 123 は 12300 として扱われる) ※ 主に桁合わせに使用 |
Z | 先行ゼロ抑制 | 数字編集項目 | PIC ZZZZ9 | 先行するゼロをスペースに置き換える (例: 00123 は ” 123″ になる) |
. | 実小数点 | 数字編集項目 | PIC 9(3).9(2) | 小数点を表示 (例: 123.45) |
, | カンマ | 数字編集項目 | PIC 999,999 | カンマを挿入 (例: 123,456) |
+ , - | 符号表示 | 数字編集項目 | PIC +9(5) / PIC -9(5) | 正負の符号を表示 (例: +12345 / -00123 ) |
$ | 通貨記号 | 数字編集項目 | PIC $$,$$$,$$9.99 | 通貨記号を表示 (フローティング表示も可能 例: $1,234.56) |
注意: 数字編集項目は、主に表示や印刷用に使われ、計算には直接使用できません。計算は数字項目で行い、結果を数字編集項目に転記(MOVE)して表示します。
VALUE句
データ項目に初期値を設定したい場合は、VALUE句を使用します。
01 WK-COUNTER PIC 9(3) VALUE 0. *> 3桁の数字項目 WK-COUNTER に初期値 0 を設定
01 WK-MESSAGE PIC X(10) VALUE 'HELLO'. *> 10桁の英数字項目 WK-MESSAGE に初期値 'HELLO' を設定 (残りはスペース)
01 WK-FLAG PIC X(1) VALUE SPACE. *> 1桁の英数字項目 WK-FLAG に初期値 スペース を設定
例: WORKING-STORAGE SECTIONでの定義
それでは、実際にWORKING-STORAGE SECTIONでデータ項目を定義する例を見てみましょう。💻
IDENTIFICATION DIVISION.
PROGRAM-ID. DATA-SAMPLE.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
* ここでは環境系の設定は省略します
DATA DIVISION.
WORKING-STORAGE SECTION.
*-- 独立したデータ項目の定義 --*
01 WK-USER-NAME PIC X(20) VALUE SPACES. *> ユーザー名 (英数字20桁、初期値スペース)
01 WK-AGE PIC 9(3) VALUE ZEROS. *> 年齢 (数字3桁、初期値0)
01 WK-TOTAL-PRICE PIC S9(7)V9(2) VALUE +0. *> 合計金額 (符号付き、整数部7桁、小数部2桁、初期値0)
*-- 構造化されたデータ項目の定義 (集団項目と基本項目) --*
01 CUSTOMER-INFO.
05 CUSTOMER-ID PIC 9(8). *> 顧客ID (数字8桁)
05 CUSTOMER-NAME.
10 FAMILY-NAME PIC X(10). *> 姓 (英数字10桁)
10 FIRST-NAME PIC X(10). *> 名 (英数字10桁)
05 CUSTOMER-TEL PIC X(11). *> 電話番号 (英数字11桁 - ハイフン等含む)
05 REGISTER-DATE.
10 REG-YEAR PIC 9(4). *> 登録年 (数字4桁)
10 REG-MONTH PIC 9(2). *> 登録月 (数字2桁)
10 REG-DAY PIC 9(2). *> 登録日 (数字2桁)
*-- 表示用のデータ項目 (数字編集項目) --*
01 PRINT-AGE PIC ZZ9. *> 年齢表示用 (先行ゼロ抑制)
01 PRINT-TOTAL-PRICE PIC --,---,---.99. *> 金額表示用 (-, カンマ, 小数点)
PROCEDURE DIVISION.
* ここに処理を記述します (今回は省略)
STOP RUN.
この例では、独立した項目(WK-USER-NAME
など)と、階層構造を持つ項目(CUSTOMER-INFO
)を定義しています。CUSTOMER-INFO
は01レベルの集団項目で、その下に05レベルや10レベルの基本項目が定義されています。
また、計算結果を表示するために、数字編集項目(PRINT-AGE
, PRINT-TOTAL-PRICE
)も定義しています。
まとめ
- DATA DIVISIONは、プログラムで使うデータを定義する場所。
- WORKING-STORAGE SECTIONは、プログラム内部で使う変数などを定義する主要なセクション。
- レベル番号でデータの階層構造を示す。
- PIC句でデータの型と桁数を指定する。
9
(数字),X
(英数字),S
(符号),V
(暗黙の小数点) など、様々なピクチャ文字がある。 - 数字編集項目 (
Z
,.
,,
など) は表示用に使われる。 - VALUE句で初期値を設定できる。
次回は、いよいよプログラムの処理を記述するPROCEDURE DIVISIONの基本的な書き方と実行について学びます。お楽しみに!🚀
参考情報
より詳しく知りたい場合は、以下の情報源も参考にしてみてください。
- GnuCOBOL (旧OpenCOBOL): オープンソースのCOBOLコンパイラです。公式ドキュメント等で詳細な文法を確認できます。(具体的なURLは検索エンジンで「GnuCOBOL documentation」等と検索してください)
- COBOL入門サイトや書籍: 初学者向けの解説が豊富にあります。(オンライン検索や書店で探してみてください)
コメント