COBOLのREWRITE文を8つのステップでマスターする

COBOLのREWRITE文を徹底解説するイメージCOBOL
この記事は約13分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

COBOL(Common Business Oriented Language)は、ビジネスアプリケーションの開発に特化したプログラミング言語です。

この記事を読むことで、COBOLの核となる概念であるREWRITE文の使用方法を理解し、プログラミングの技術を向上させることができます。

COBOLは長年にわたり金融機関や保険会社などで広く使用されており、その堅牢性と信頼性は高く評価されています。

REWRITE文は、データベースやファイルシステム内のレコードを更新する際に頻繁に用いられる重要な機能です。

本記事では、REWRITE文の基本的な使い方から応用テクニック、注意点に至るまで、詳細にわたって解説します。

●COBOLとは

COBOLは、1950年代後半に開発された歴史あるプログラミング言語です。

その設計は、ビジネスアプリケーションの開発に必要な処理を効率良く記述できるように特化されています。

COBOLの特徴は、英語に近い文法を持ち、読みやすく、書きやすいことです。

この言語は、特に金融機関や政府機関での大規模なデータ処理において広く採用されており、現代でも多くのシステムで使用されています。

○COBOLの基本的な特徴と歴史

COBOLの最大の特徴は、その自然言語に近い文法構造です。

これにより、プログラミング初心者でも比較的容易に理解し、使用することが可能になります。

また、COBOLは堅牢性と信頼性に優れ、大量のデータを扱うビジネスアプリケーションに適しています。

1959年に米国防総省の支援のもと、統一されたビジネス指向のプログラミング言語として開発されました。

その後、多くのバージョンアップを経て、現在に至るまで広く使用され続けています。

特に金融機関や保険会社、政府機関などで重宝され、これらの分野では現在もなお、多くの既存システムがCOBOLで構築されています。

●REWRITE文の基本構造

COBOLにおけるREWRITE文は、ファイル内の既存のレコードを更新するために使用されます。

この構造は主に、ファイル処理に関連する業務アプリケーションで頻繁に用いられるものです。

REWRITE文の基本的な構造は、対象となるレコードを特定し、そのレコードに新しいデータを上書きするというプロセスから成り立っています。

この文を使用する際には、対象のファイルが適切なモードでオープンされている必要があり、更新対象のレコードは事前にREAD文を使用して読み込まれている必要があります。

REWRITE文は、データの整合性を保ちつつ効率的に情報を更新するための重要なツールとして機能します。

○REWRITE文の役割と基本的な構文

REWRITE文の主な役割は、既存のレコードに新たなデータを上書きすることです。

これにより、データベースやファイルシステム内の情報を最新の状態に保つことが可能となります。

基本的な構文は次の通りです。

REWRITE レコード名

ここで「レコード名」は、更新するレコードの名前を指します。

REWRITE文を使用する前には、対象のレコードがREAD文を用いて読み込まれ、その後に更新が必要なフィールドに新しい値が設定されている必要があります。

また、REWRITE文は、対象となるファイルが「I-Oモード」でオープンされている場合にのみ使用することができます。

この文は、既存のデータを変更する際にデータの整合性を維持する上で非常に重要な役割を果たします。

MOVE "新しいデータ" TO 対象レコードのフィールド.
REWRITE 対象レコード.

この例では、まず「新しいデータ」という値を対象レコードの特定のフィールドに代入しています。

その後、REWRITE文を用いて、そのレコードに新しいデータを上書きしています。

このプロセスを通じて、ファイル内のデータが最新の状態に更新されます。

●REWRITE文の基本的な使い方

REWRITE文の使い方を理解するためには、まず基本的なファイル操作の流れを把握することが重要です。

COBOLにおけるファイル操作は、ファイルのオープン、レコードの読み込み、内容の更新、そしてファイルのクローズというステップを踏みます。

REWRITE文を使用する際は、特定のレコードをREAD文で読み込んだ後、そのレコードに対して変更を加え、REWRITE文でその変更をファイルに反映させます。

重要なのは、REWRITE文は既にファイルに存在するレコードにのみ使用できるという点です。

新しいレコードを追加する場合はWRITE文を使用する必要があります。

○サンプルコード1:単純なレコードの更新

まずは、単純なレコードの更新の例を見てみましょう。

下記のサンプルコードでは、特定のレコードを読み込んで内容を変更し、REWRITE文でその変更をファイルに反映させています。

IDENTIFICATION DIVISION.
PROGRAM-ID. SampleProgram.
DATA DIVISION.
FILE SECTION.
FD  SAMPLEFILE.
01  SAMPLERECORD.
    05 FIELD1 PIC X(10).
    05 FIELD2 PIC 9(4).

PROCEDURE DIVISION.
OPEN I-O SAMPLEFILE.
READ SAMPLEFILE INTO SAMPLERECORD.
MOVE "NEWVALUE" TO FIELD1.
MOVE 1234 TO FIELD2.
REWRITE SAMPLERECORD.
CLOSE SAMPLEFILE.

このコードでは、まずSAMPLEFILEというファイルを開き、READ文でレコードを読み込んでいます。

その後、FIELD1FIELD2に新しい値を代入し、REWRITE文でこれらの変更をファイルに反映しています。

最後にファイルをクローズします。

このプロセスを通じて、ファイル内のレコードが更新されます。

○サンプルコード2:条件付きのレコード更新

次に、条件に基づいてレコードを更新する例を考えてみましょう。

下記のサンプルコードでは、特定の条件を満たす場合にのみレコードを更新しています。

IDENTIFICATION DIVISION.
PROGRAM-ID. ConditionalUpdate.
DATA DIVISION.
FILE SECTION.
FD  CONDITIONALFILE.
01  CONDITIONALRECORD.
    05 FIELD1 PIC X(10).
    05 FIELD2 PIC 9(4).

PROCEDURE DIVISION.
OPEN I-O CONDITIONALFILE.
READ CONDITIONALFILE INTO CONDITIONALRECORD.
IF FIELD2 > 1000
    MOVE "UPDATED" TO FIELD1
    REWRITE CONDITIONALRECORD.
END-IF.
CLOSE CONDITIONALFILE.

このコードでは、CONDITIONALFILEというファイルを開いてCONDITIONALRECORDを読み込み、FIELD2の値が1000より大きい場合にのみFIELD1を更新しています。

その後、変更をREWRITE文でファイルに反映させています。

このように条件付きでレコードを更新することにより、より柔軟なデータ操作が可能となります。

●REWRITE文の応用例

REWRITE文は単にデータの更新にとどまらず、より複雑な処理にも応用できます。

例えば、ループ処理内での使用や、複数の条件を組み合わせたデータ更新などが挙げられます。

これらの応用例を理解することで、COBOLプログラミングの柔軟性と効率性を高めることができます。

○サンプルコード3:ループ内での使用

ループ処理を使用することで、複数のレコードを効率的に更新することが可能です。

下記のサンプルコードは、ファイル内のすべてのレコードを読み込み、特定の条件に従って更新する一連のプロセスを表しています。

IDENTIFICATION DIVISION.
PROGRAM-ID. LoopUpdate.
DATA DIVISION.
FILE SECTION.
FD  LOOPFILE.
01  LOOPRECORD.
    05 FIELD1 PIC X(10).
    05 FIELD2 PIC 9(4).

PROCEDURE DIVISION.
OPEN I-O LOOPFILE.
PERFORM UNTIL END-OF-FILE
    READ LOOPFILE INTO LOOPRECORD
    AT END
        EXIT PERFORM
    END-READ
    IF FIELD2 < 5000
        MOVE "UPDATE" TO FIELD1
        REWRITE LOOPRECORD
    END-IF
END-PERFORM.
CLOSE LOOPFILE.

このコードでは、PERFORM文を使ってループ処理を行い、FIELD2の値が5000未満の場合に限りFIELD1を更新しています。

このようにループを利用することで、大量のデータを効率的に処理できます。

○サンプルコード4:複合条件を用いたレコード更新

複合条件を用いることで、より複雑なデータ更新の処理を行うことができます。

下記のサンプルコードは、複数の条件を組み合わせて特定のレコードを更新する例を表しています。

IDENTIFICATION DIVISION.
PROGRAM-ID. ComplexCondition.
DATA DIVISION.
FILE SECTION.
FD  COMPLEXFILE.
01  COMPLEXRECORD.
    05 FIELD1 PIC X(10).
    05 FIELD2 PIC 9(4).
    05 FIELD3 PIC X(5).

PROCEDURE DIVISION.
OPEN I-O COMPLEXFILE.
READ COMPLEXFILE INTO COMPLEXRECORD.
IF FIELD2 > 1000 AND FIELD3 = "CHECK"
    MOVE "NEW DATA" TO FIELD1
    REWRITE COMPLEXRECORD
END-IF.
CLOSE COMPLEXFILE.

このコードでは、FIELD2の値が1000を超え、かつFIELD3が特定の文字列”CHECK”と一致する場合にのみFIELD1を更新しています。

このように複合条件を用いることで、特定の条件を満たすデータのみを対象にした精緻な更新が可能となります。

●REWRITE文の注意点と対処法

COBOLのREWRITE文を使用する際には、いくつかの注意点が存在します。

これらを理解し、適切な対処法を講じることで、プログラムの信頼性と安定性を高めることができます。

まず、REWRITE文は、READ文によって読み込まれたレコードのみを更新することができます。

これは、REWRITE文がレコードの物理的な位置に依存しているためです。

したがって、READ文でレコードを読み込む際は、それが更新対象のレコードであることを確認する必要があります。

また、REWRITE文を使用する際には、対象ファイルが適切なモード(通常はI-Oモード)でオープンされていることを確認する必要があります。

これは、REWRITE文がファイルの更新を伴うため、ファイルが更新可能な状態であることが必要だからです。

○ロックの問題

REWRITE文の使用中に他のプログラムが同じレコードにアクセスしようとすると、ロックが発生する可能性があります。

これはデータの整合性を保つために必要ですが、時にはデッドロックの原因となることがあります。

この問題を避けるためには、REWRITE文を使用する前に、他のプログラムがレコードにアクセスしていないことを確認するか、適切なタイミングでREWRITE文を実行する必要があります。

○ファイルアクセスのエラー処理

REWRITE文を使用する際には、ファイルアクセスエラーが発生する可能性があります。

たとえば、ファイルが存在しない、アクセス権限がない、ファイルが破損しているなどの理由からエラーが発生することがあります。

これらのエラーを適切に処理するためには、エラー処理のルーチンを実装することが推奨されます。

たとえば、ファイルオープン時やREWRITE文実行時にエラーが発生した場合に、エラーメッセージを表示してプログラムを安全に終了させるなどの対応が考えられます。

●REWRITE文のカスタマイズ方法

COBOLのREWRITE文をより効果的に活用するためには、カスタマイズが鍵となります。

これにより、特定のビジネスルールや処理要件に合わせてREWRITE文の動作を調整することができます。

たとえば、ユーザー定義の関数を使用してREWRITE文の処理を拡張したり、外部ファイルとの連携を図ることで、より複雑なデータ操作を実現することが可能です。

○サンプルコード5:ユーザー定義の関数を使用

ユーザー定義の関数を使用してREWRITE文の処理を拡張することで、より柔軟なデータ操作を行うことができます。

下記のサンプルコードは、ユーザー定義の関数を使用して特定の条件に基づいたデータ更新を行う例を表しています。

IDENTIFICATION DIVISION.
PROGRAM-ID. CustomFunctionUsage.
DATA DIVISION.
FILE SECTION.
FD  CUSTOMFILE.
01  CUSTOMRECORD.
    05 FIELD1 PIC X(10).
    05 FIELD2 PIC 9(4).

PROCEDURE DIVISION.
OPEN I-O CUSTOMFILE.
READ CUSTOMFILE INTO CUSTOMRECORD.
PERFORM UPDATE-RECORD USING CUSTOMRECORD
REWRITE CUSTOMRECORD.
CLOSE CUSTOMFILE.

UPDATE-RECORD SECTION.
UPDATE-RECORD USING RECORD.
    IF FIELD2 > 2000
        MOVE "CUSTOM" TO FIELD1
    END-IF.

このコードでは、UPDATE-RECORDというユーザー定義の関数を使用して、FIELD2の値が2000を超える場合にのみFIELD1を更新しています。

このようなカスタマイズにより、REWRITE文の使用範囲を拡大し、より複雑なビジネスロジックを実装することが可能になります。

○サンプルコード6:外部ファイルとの連携

COBOLプログラムでREWRITE文を使用する際には、外部ファイルとの連携も重要な要素です。

下記のサンプルコードは、外部ファイルから読み込んだデータを元にしてREWRITE文を使用してファイルを更新する方法を表しています。

IDENTIFICATION DIVISION.
PROGRAM-ID. ExternalFileIntegration.
DATA DIVISION.
FILE SECTION.
FD  MAINFILE.
01  MAINRECORD.
    05 FIELD1 PIC X(10).
    05 FIELD2 PIC 9(4).

FD  EXTERNALFILE.
01  EXTERNALRECORD.
    05 EXTERNALFIELD1 PIC X(10).

PROCEDURE DIVISION.
OPEN I-O MAINFILE.
OPEN INPUT EXTERNALFILE.
READ EXTERNALFILE INTO EXTERNALRECORD.
READ MAINFILE INTO MAINRECORD.
MOVE EXTERNALFIELD1 TO FIELD1 OF MAINRECORD.
REWRITE MAINRECORD.
CLOSE MAINFILE.
CLOSE EXTERNALFILE.

このコードでは、外部ファイルEXTERNALFILEからデータを読み込み、そのデータを使用してMAINFILEMAINRECORDを更新しています。

このように外部ファイルとの連携を行うことで、異なるデータソースからの情報を活用し、より効果的なデータ処理を実現することができます。

まとめ

本記事では、COBOLプログラミングにおけるREWRITE文の基本から応用、注意点、カスタマイズ方法に至るまでを詳細に解説しました。

REWRITE文は、ファイル内のデータを効率的に更新するための強力なツールであり、その正確な理解と使用はCOBOLプログラミングの効率と効果を大いに高めることができます。

この記事を通じて、COBOLのREWRITE文の機能とその応用範囲を深く理解し、より効率的で柔軟なデータ操作を実現するための知識と技術を身につけることができたでしょう。

COBOLプログラミングの世界は広く、REWRITE文はその中でも特に重要な要素の一つです。

この記事が、COBOLを学ぶ皆さんの助けとなり、より高度なプログラミングスキルの習得に役立てば幸いです。