COBOLのREDEFINES句を完全理解!初心者でもわかる多様なデータ表現と編集の基本
生徒
「先生、COBOLのプログラムで同じメモリ領域を別の形で使うことはできますか?」
先生
「はい、それにはREDEFINES(リディファインズ)句を使います。ひとつのデータを、違う形式で見ることができる便利な機能です。」
生徒
「同じデータを違う形で見る?それってどういうことですか?」
先生
「たとえば、“1234”という数字を、文字列として見ることも、数値として扱うこともできる、という感じです。では、実際の使い方を見てみましょう。」
1. REDEFINES句とは?
REDEFINES句(リディファインズ句)とは、COBOLで「同じ領域(メモリ)」に別のデータ定義を重ねるための仕組みです。つまり、一つのデータを違う形で再定義して使えるようにします。
たとえば、ひとつの10文字のデータを、最初の5文字と後ろの5文字に分けて扱ったり、文字としても数値としても操作したりできます。
この機能は、昔の大型汎用機でメモリを節約するためによく使われていましたが、今でも「入力データを多様に解釈する」ときや「ファイルの形式を変換する」ときに便利です。
2. REDEFINES句の基本的な書き方
まずは基本の構文を見てみましょう。
01 ORIGINAL-DATA PIC X(10).
01 REDEFINED-DATA REDEFINES ORIGINAL-DATA PIC 9(10).
この例では、ORIGINAL-DATAという10文字の項目を定義し、それと同じメモリ領域にREDEFINED-DATAという数値項目を重ねています。
つまり、ORIGINAL-DATAに文字を入れても、それはREDEFINED-DATAから数値として参照できます。両者は同じ場所を使っているため、データの内容は共有されます。
3. 実際にREDEFINES句を使ってみよう
では、実際にサンプルプログラムで動作を確認してみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. REDEFINE-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 INPUT-DATA PIC X(10) VALUE "1234567890".
01 NUMERIC-DATA REDEFINES INPUT-DATA PIC 9(10).
PROCEDURE DIVISION.
DISPLAY "文字列としての値:" INPUT-DATA
DISPLAY "数値としての値 :" NUMERIC-DATA
STOP RUN.
このプログラムの実行結果は次のようになります。
文字列としての値:1234567890
数値としての値 :1234567890
このように、同じ領域のデータを文字としても数値としても扱えるようになります。
4. REDEFINESを使った部分分割の例
REDEFINESは、ひとつの大きなデータを複数の小さなデータに分けて扱うときにも便利です。たとえば、10文字の社員情報を「社員番号」と「部署コード」に分割したい場合です。
01 EMPLOYEE-INFO PIC X(10).
01 EMPLOYEE-DETAIL REDEFINES EMPLOYEE-INFO.
05 EMP-ID PIC X(5).
05 DEPT-CODE PIC X(5).
PROCEDURE DIVISION.
MOVE "A1234HR001" TO EMPLOYEE-INFO
DISPLAY "社員番号:" EMP-ID
DISPLAY "部署コード:" DEPT-CODE
STOP RUN.
出力結果は次の通りです。
社員番号:A1234
部署コード:HR001
このように、REDEFINESを使えば、大きなデータを小さな構造に分けてアクセスすることができます。ファイルの1行にいろいろな情報が詰め込まれている場合などに、非常に役立ちます。
5. REDEFINESと編集記号の組み合わせ
REDEFINES句は、編集記号(EDITED PICTURE)と組み合わせることで、見やすい形式に変換することもできます。
たとえば、内部的には「123456」という数字を保持していても、出力するときに「123,456」とカンマ区切りで見せたいときがあります。
01 SALES-AMOUNT PIC 9(6) VALUE 123456.
01 SALES-FORMAT REDEFINES SALES-AMOUNT PIC ZZ,ZZZ.
PROCEDURE DIVISION.
DISPLAY "編集前の数値:" SALES-AMOUNT
DISPLAY "編集後の出力:" SALES-FORMAT
STOP RUN.
出力結果は次のようになります。
編集前の数値:123456
編集後の出力:123,456
このように、REDEFINESを使うことで、内部データを再定義して見た目を整えることが簡単にできます。帳票出力や画面表示を整えるときにとても便利なテクニックです。
6. REDEFINESを使うときの注意点
REDEFINESは便利ですが、使い方を誤るとバグの原因になります。特に気をつけたいポイントを紹介します。
- データ長を一致させること:再定義する項目は、元の項目と同じバイト数にする必要があります。異なると予期せぬ結果になります。
- REDEFINESは同じレベルで使う:例えばどちらも
01レベルに書く必要があります。 - 変更が共有される:どちらかのデータを変更すると、もう一方にも影響します。別のメモリではない点に注意しましょう。
つまり、REDEFINESは「同じ箱に違うラベルを貼る」ようなものです。中身は一つだけなので、どちらかのラベルから中身を変えれば、もう一方にも反映されます。
7. 実務での活用例
実際の業務システムでは、ファイルの中に「レコードタイプ(種類)」があり、内容の形式が異なるケースがあります。このとき、REDEFINESを使うことで、1つの領域を複数のパターンで解釈できます。
01 FILE-RECORD.
05 RECORD-TYPE PIC X(1).
05 RECORD-BODY PIC X(19).
01 TYPE-A-RECORD REDEFINES FILE-RECORD.
05 RECORD-TYPE PIC X(1).
05 NAME PIC X(10).
05 AGE PIC 9(2).
05 CITY PIC X(7).
01 TYPE-B-RECORD REDEFINES FILE-RECORD.
05 RECORD-TYPE PIC X(1).
05 ITEM-NAME PIC X(10).
05 PRICE PIC 9(5).
05 UNIT PIC X(4).
このようにしておけば、RECORD-TYPEが"A"ならTYPE-A-RECORDとして、"B"ならTYPE-B-RECORDとして扱うことができます。複数形式のデータを1つの構造で管理できるのがREDEFINESの強みです。
8. REDEFINESでデータの見方を切り替えよう
REDEFINES句は、ひとつのデータを複数の形で扱うための強力なツールです。文字列を数値に変えたり、1つのデータを細かく分解したり、帳票用に整形したりと、幅広い使い道があります。COBOLのデータ構造を理解する上で、とても重要な概念ですので、ぜひ実際に動かして理解を深めてみましょう。
まとめ
COBOLのREDEFINES句について、ここまで学んできた内容をあらためて丁寧に振り返っていきます。ひとつの領域を複数の形で読み替えるという考え方は、初めて触れる人にとってはやや独特に感じられることがあります。しかし、実務で大量のデータを扱う場面や昔ながらの仕組みを維持しながら改修していく場面では、この柔軟な再定義の力がとても頼もしい武器になります。たとえば入力された十文字の情報を文字列として処理したり、数値として解釈したり、あるいは前半と後半に分割したりと、同じ領域から複数の意味を読み取れるのはREDEFINESならではの強みです。さらに規模の大きな業務ファイルでは種類の異なるレコードが一つにまとめられることが多く、そのような場合に複数の構造を重ねて柔軟に読み替える手法は、長い時間をかけて積み上げられたシステムの世界と向き合う上で欠かせない技術です。 また、内部で保持しているデータを編集記号と組み合わせて見やすい形式に整えるという使い方も、帳票や照会画面では非常に役立ちます。業務システムでは、数字をカンマ区切りにしたり、決められた桁数に揃えて出力したりと、読み手にとって理解しやすい形に調整する作業が日常的に発生します。こうした場面でREDEFINESと編集用ピクチャを併用すれば、内部の保持形式を変えずに出力だけ整形することができ、プログラムの修正範囲を必要最小限に抑えることができます。このような仕組みは一見地味に思えるかもしれませんが、大量のデータを扱う現場ではとても大切な工夫となります。 しかしながら便利な機能である一方、どちらのデータ定義も同じ領域を共有しているという点には最大限の注意が必要です。たとえば片方の項目に値を入れれば、もう片方にも影響が及びます。これはまさに「ひとつの箱に複数のラベルを貼っている」ような状態であり、常に中身はひとつしか存在しません。そのため、項目の長さが一致しているかどうか、レベル番号の整合性は取れているか、必要のないタイミングで値を書き換えていないかといった、細かい部分への気配りが非常に重要になります。こうしたポイントを押さえておくことで、意図せずデータが壊れてしまうといった誤りを防ぎ、安定したプログラムを作ることができます。 実際の業務では、レコードタイプごとに構造が変わる複雑なファイルを扱ったり、大きな文字列から決められた範囲だけを切り取って使ったりする場面が日常的に発生します。そうしたとき、複数のフォーマットを自然に切り替えられるREDEFINESは、作業をスムーズに進める上で欠かせない存在となります。特に古くから続く業務システムでは、ひとつのレコードにさまざまな情報が詰め込まれていることも多く、複数の形式を重ねて使える柔軟性は貴重です。一見複雑に見えますが、一度仕組みを理解すると非常に扱いやすく、データの扱い方を広げてくれる大切な概念であることが理解できるはずです。 では、最後に小さなサンプルをもう一度示しつつ、今回の学びをしっかりと締めくくっていきましょう。
サンプルプログラムの再確認
01 SAMPLE-DATA PIC X(8) VALUE "20240101".
01 SAMPLE-PART REDEFINES SAMPLE-DATA.
05 SAMPLE-YEAR PIC X(4).
05 SAMPLE-MONTH PIC X(2).
05 SAMPLE-DAY PIC X(2).
上記のような構造にしておけば、一つの文字列から年、月、日を自然に分割して扱うことができます。日付処理が必要なプログラムでは、このように元のデータを複数の見方で使える手法が役に立ちます。どの場所から何文字取り出すかがはっきりしている場合には、REDEFINESはとても読みやすく整理された記述となります。
生徒
「先生、REDEFINESって最初は難しそうに感じましたけど、ひとつのデータをいろいろな形で使えるってすごく便利ですね。」
先生
「そうですね。特に業務システムでは、多様な形式のデータを効率よく扱える仕組みが必要になります。REDEFINESはその代表的な方法です。」
生徒
「部分的に分けて使える例とか、レコードタイプで構造を切り替える例を見て、実務でもよく使われている理由がわかりました。」
先生
「実際のファイルでは一つの行にたくさんの情報が並んでいることも多いので、同じ領域に複数の構造を持てるのはとても便利です。ただし、影響し合うという点だけは忘れずにね。」
生徒
「はい。データ長を合わせたり、どの構造を使っているかを意識したり、注意すべきポイントもちゃんと覚えておきます!」