COBOLを学び始めた人がまずつまずくのが、「データ項目の種類」と「PICTURE句」のカベじゃないでしょうか。
数字?文字?英数字?なんか似てるけど違う…そんなモヤモヤ、今日でスッキリさせましょう。
この記事では、COBOLでよく使うデータ項目の種類について、初心者向けにかみくだいて解説します。数字項目や文字項目の定義方法、使い分けのコツ、PICTURE句の意味と書き方まで、コード例を交えながら一歩ずつ整理していきます。
「今までモヤっとしてたのが、一気に晴れた!」と感じられるはずなので、コーヒー片手にゆるっと読み進めてくださいね。
COBOLのデータ項目とは?種類を理解する重要性
COBOLの「データ項目」は、プログラムの中でデータを入れる“箱”のようなものです。数字や文字を入れる箱、それぞれにぴったり合ったサイズと形があります。
たとえば、郵便番号を入れたいのに数字しか入らない箱を使ってしまうと、記号やスペースが弾かれてしまいます。逆に、お金の計算に文字用の箱を使うと、割り算ひとつできません。
データ項目の「種類」を正しく選ぶと、メモリのムダが減り、計算や表示がサクサク動くようになります。使い方次第でプログラムの動きも変わるんですね。
最初はややこしく感じるかもしれませんが、「箱のサイズや形をちゃんと選ぶ」と考えると、グッと理解しやすくなります。
【基本】COBOLの主要なデータ項目の種類
ここからは、本題に入っていきます。
COBOLでは、用途に応じていくつかのデータ項目が使い分けられています。
全体を見ておくと、読み進めるときに迷いにくくなりますよ。
- 数字項目 (Numeric Item)
- 英字項目 (Alphabetic Item)
- 英数字項目 (Alphanumeric Item)
- 編集項目 (Edited Item)
これから一つずつ、使い方やポイントを分かりやすく解説していきます。
1. 数字項目 (Numeric Item) - 計算はおまかせ!
数字項目は、計算や金額の処理にぴったりなデータ項目です。
数字だけを入れる箱で、整数や小数、マイナスの値も扱えます。
PICTURE句での基本的な書き方はこちらです。
01 KIN-GAKU PIC 9(5). *> 例: 12345 01 MIKIN-GAKU PIC S9(5)V99. *> 例: -123.45
「9」は数字、「S」は符号(+や-)、「V」は小数点を意味します。「P」は位置だけ調整して見えない小数点として使います。
ちなみに、COBOLには外部10進や内部10進、2進などの保存方式もありますが、最初のうちは「数字が正しく入って計算できればOK」と思っておけば大丈夫です。
2. 英字項目 (Alphabetic Item) - アルファベット専用
英字項目は、アルファベット(A-Z, a-z)とスペースだけが入る箱です。
数字や記号は入れられないので、名前の一部など、用途はかなり限定されます。
01 NAME-LAST PIC A(10). *> 例: YAMADA
「A」はアルファベット用です。例えば「12345」や「@」を入れようとするとエラーになります。
正直なところ、今はあまり使われなくなってきていますが、レガシーなコードではたまに見かけます。
3. 英数字項目 (Alphanumeric Item) - 最も万能な文字データ
英数字項目は、アルファベット、数字、記号など幅広い文字を扱える万能タイプです。
住所、名前、電話番号など、テキストっぽいデータはこれ一択といってもいいくらい使われます。
01 JUSHO PIC X(30). *> 例: TARO YAMADA 123-4567
「X」は文字全般を扱えます。数字項目と違い、123という数字も“文字列”として処理されるので、計算には使えません。
でも、データを見せるだけの場面なら最強クラスに便利な項目です。
4. 編集項目 (Edited Item) - データを分かりやすく表示
編集項目は、数字や文字を“人間が見やすい形”に整えるための項目です。
たとえば通貨の記号をつけたり、ゼロを消したり、マイナス記号を見せたりと、帳票や画面表示に大活躍します。
01 HYOJI-KIN PIC ZZZ,ZZ9. *> 例: " 1,234" 01 KINGAKU-A PIC +999.99. *> 例: "+123.45" 01 EDIT-MOJI PIC X(5)BXXBXXX. *> 例: "AB CD EFG"
「Z」は不要なゼロを消す、「,」はカンマ、「+」「-」は符号、「B」は空白、「.」は小数点などの意味があります。
見た目を整えることが目的なので、データそのものを計算する場面には向きません。
金額や日付を見やすく表示したいときに使ってみると効果バツグンです。
COBOLデータ項目の種類を定義する:PICTURE句とレベルナンバー
ここからは、データ項目を「どう定義するか」という話に入ります。
まずおさえておきたいのが、「PICTURE句(PIC句)」と「レベルナンバー」です。
PICTURE句は、データ項目の中身がどんな形なのかを決める設計図。たとえば「この箱は5ケタの数字用ね」というように使います。
レベルナンバーは、データの親子関係やまとまりを示すための「背番号」みたいなものです。データを階層的にグループ化して、わかりやすく整理できます。
それぞれの役割をしっかり理解しておくと、COBOLのデータ構造がグッと見通しよくなります。
PICTURE句(PIC句)の基本ルール
PICTURE句は、データ項目の「中身のルール」を決める指示文です。
桁数・記号の種類・小数点や符号の有無など、見た目も意味もすべてこの1行で定義できます。
基本の書き方は以下のどちらかです。
PIC 9(3) PICTURE IS X(10)
よく使う記号と意味を一覧にしておきます。
記号 | 意味 | 使い方例 |
---|---|---|
9 | 数字 | PIC 9(5) → 5桁の数字 |
X | 文字(数字もOK) | PIC X(10) → 10文字のテキスト |
A | アルファベット専用 | PIC A(3) → 3文字の英字 |
S | 符号(+−)あり | PIC S9(4) → 符号付き4桁 |
V | 小数点(位置だけ) | PIC 9(3)V99 → 999.99の形式 |
P | 想定小数点(表示しない) | PIC PPP9 → 小数点を前提とした位置調整 |
たった1行に多くの情報が詰め込まれるので、慣れるまでは「記号の意味」を意識しながらコードを書いてみましょう。
レベルナンバーの役割と使い方
レベルナンバーは、データ項目の「構造」を決める番号です。
親の箱が01、その中に入る子どもの箱が05や10…という入れ子構造を作るときに使います。
たとえば、社員の情報を1つのかたまりとして定義したいとき。
01 SHAIN-RECORD. 05 SHAIN-NO PIC 9(5). 05 SHAIN-NAME PIC X(20). 05 TANSYOKU-CODE PIC X(3).
この例では「SHAIN-RECORD」が集団項目(グループ項目)で、「SHAIN-NO」などが基本項目です。
数字が小さいほど上の階層になります。01 → 05 → 10…のように細かく分けられます。
レベルナンバーがあるおかげで、ひとまとめのデータを扱いやすく整理できるんですね。
構造をきれいに組めると、プログラム全体もスッキリしますよ。
適切なCOBOLデータ項目の種類の選び方
COBOLのデータ項目、いろいろ出てきましたね。
ここでは、どの場面でどの種類を使えばいいかを判断できるように整理しておきましょう。
最初は迷うかもしれませんが、いくつかのチェックポイントを押さえるだけでスムーズに選べるようになります。
まずはこちらをチェックしてみてください。
確認ポイント | おすすめのデータ項目 |
---|---|
数字を使って計算する? | 数字項目(PIC 9...) |
文字や記号も使う? | 英数字項目(PIC X...) |
表示を見やすく整える必要がある? | 編集項目(PIC Z..., +..., X...B) |
アルファベットだけでいい? | 英字項目(PIC A...) |
ここで、よくある失敗パターンをひとつ。
電話番号を数字項目にしてしまうと、先頭の0が消えてしまいます。
01 TEL-NUM PIC 9(10). *> 例: 入力「09012345678」 → 「9012345678」
この場合は計算することはないので、英数字項目を使うのが正解です。
01 TEL-NUM PIC X(11). *> 表示も保存もバッチリ
迷ったときは、「そのデータで計算するかどうか?」をまず考えてみると決めやすくなります。
使い分けの基本が身につけば、プログラムの見通しも処理の正確さもぐんと上がります。
【まとめ】COBOLデータ項目の種類をマスターして次のステップへ
データ項目は、COBOLの中でも毎回使う基本中の基本です。
種類や使い方をしっかり理解しておくと、書けるコードの幅が広がります。
今回学んだポイントをもとに、実際のプログラムで少しずつ使ってみると、自然と身についてきますよ。
次は、データに初期値を入れるVALUE句や、表のようなデータをまとめて扱うOCCURS句について学んでみましょう。
関連記事も用意していますので、気になったテーマからぜひチェックしてみてくださいね。
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。