COBOLでJOINING指定をマスターするたった8つのステップ

COBOLプログラミングのJOINING指定を表すイメージCOBOL
この記事は約23分で読めます。

 

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

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

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

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

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

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

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

はじめに

COBOL(Common Business Oriented Language)は、ビジネスデータ処理のために設計されたプログラミング言語です。

その名の通り、主にビジネスでのデータ処理に適した特徴を持ち、金融機関や政府機関などの大規模システムで広く使用されています。

COBOLは読みやすく、理解しやすい構造を持っており、初心者にも扱いやすい言語とされています。

しかし、その古典的な文法や構造は現代のプログラミング言語とは異なるため、学習には特有のアプローチが必要です。

●COBOLとは

COBOLは1959年に開発され、ビジネスアプリケーションの開発を目的として設計された言語です。

基本的には手続き型プログラミング言語であり、データ処理のための機能が豊富に用意されています。

COBOLのコードは、英語に近い構造をしているため、プログラムの意図が読み取りやすいという特徴があります。

この読みやすさが、COBOLが長年にわたり利用され続ける理由の一つです。

○COBOLの歴史と現代での重要性

COBOLの歴史は長く、多くのアップデートを経て現在に至っています。

初期のバージョンから多くの改良が加えられ、互換性を保ちながら現代のコンピューティング環境に対応しています。

特に金融業界や政府機関では、古いシステムが今でも稼働していることが多く、COBOLのスキルは重要なものとなっています。

また、Y2K問題の際には、COBOLのコードを持つシステムの更新が注目を集めました。

○COBOLの基本的な構造

COBOLプログラムは、IDENTIFICATION DIVISION, ENVIRONMENT DIVISION, DATA DIVISION, PROCEDURE DIVISIONの4つの主要な部分から構成されます。

これらの部分は、プログラムの識別情報、コンピュータの環境設定、データ構造の定義、実際の処理手順の記述をそれぞれ担います。

COBOLのコードは、これらのセクションに沿って記述され、各セクションはさらに細かい部分に分かれています。

たとえば、DATA DIVISIONでは、使用されるデータ項目の型やサイズを定義し、PROCEDURE DIVISIONでは具体的な処理の手順を記述します。

この構造的なアプローチが、COBOLの特徴的な読みやすさと整理されたコード構造を生み出しています。

●JOINING指定とは

COBOLプログラミングにおいてJOINING指定は、異なるデータソースからのレコードを結合して処理するための重要な機能です。

これは、データベースのJOIN操作に似ており、複数のファイルやテーブルから関連するデータを抽出し、一つの結果セットとして提供します。

JOINING指定を用いることで、データの整合性を保ちながら効率的に情報を処理することが可能になります。

これは、特に大量のデータを扱うビジネスアプリケーションにおいて、極めて重要な技術です。

○JOINING指定の基本概念

JOINING指定を行う際には、主に二つのファイルまたはテーブルが関与します。

一つは主ファイル(Primary File)、もう一つは結合ファイル(Joining File)です。

主ファイルは処理の基準となるデータを含み、結合ファイルはこの基準に基づいて結合されるデータを含みます。

JOINING指定では、これら二つのファイル間で共通するキー(例えば、顧客IDや注文番号など)を使用してレコードを結合します。

結合されたデータは、新たなレコードとして処理され、分析やレポート作成に利用されます。

○JOINING指定が必要なシナリオ

JOINING指定は、複数のデータセット間で関連する情報を結合し、より完全なビューを作成する必要がある場合に特に有効です。

例えば、顧客情報が一つのファイルに、その顧客の注文履歴が別のファイルに保存されている場合、JOINING指定を使用して両方の情報を結合し、顧客ごとの全注文履歴を簡単に確認できます。

また、在庫管理システムで商品情報と在庫数を結合する場合や、従業員データと給与データを結合する場合など、多くのビジネスシナリオでJOINING指定が役立ちます。

この機能を使用することで、データの重複を避け、処理の効率化を図ることができます。

●JOINING指定の基本的な使い方

JOINING指定をCOBOLで効果的に使用するには、いくつかの基本的なステップを理解することが重要です。

まず、結合するファイルを定義し、それらの間で共有されるキーを特定します。

次に、JOINING指定を用いて、これらのファイルから必要なレコードを選択し、結合します。

このプロセスには、適切なファイルの宣言と、JOINING構文の正確な使用が含まれます。

JOINING指定は、データを効率的に処理し、関連する情報を統合する際に非常に強力なツールとなります。

○サンプルコード1:単純なJOINING指定の例

下記のサンプルコードは、二つのファイル間で単純なJOINING指定を行う基本的な例を表しています。

この例では、ファイルAとファイルBがあり、それぞれ顧客IDに基づいて結合されます。

下記のコードでは、ファイルAとファイルBから顧客IDが一致するレコードを選択し、それらを結合して出力します。

IDENTIFICATION DIVISION.
PROGRAM-ID. JoiningExample.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT FileA ASSIGN TO 'A.DAT'.
    SELECT FileB ASSIGN TO 'B.DAT'.

DATA DIVISION.
FILE SECTION.
FD FileA.
01 FileARecord.
   05 CustomerID PIC 9(4).
   05 CustomerName PIC A(20).
FD FileB.
01 FileBRecord.
   05 CustomerID PIC 9(4).
   05 PurchaseAmount PIC 9(5).

WORKING-STORAGE SECTION.
01 WS-JoinedRecord.
   05 WS-CustomerName PIC A(20).
   05 WS-PurchaseAmount PIC 9(5).

PROCEDURE DIVISION.
BEGIN.
    OPEN INPUT FileA, FileB
    READ FileA INTO FileARecord
    READ FileB INTO FileBRecord
    PERFORM UNTIL EOF OF FileA OR EOF OF FileB
        IF FileARecord::CustomerID = FileBRecord::CustomerID
            MOVE FileARecord::CustomerName TO WS-JoinedRecord::WS-CustomerName
            MOVE FileBRecord::PurchaseAmount TO WS-JoinedRecord::WS-PurchaseAmount
            DISPLAY WS-JoinedRecord
        END-IF
        READ FileA INTO FileARecord
        READ FileB INTO FileBRecord
    END-PERFORM
    CLOSE FileA, FileB.
STOP RUN.

このコードは、二つのファイルを開き、それぞれからレコードを読み込み、顧客IDが一致する場合にそれらを結合して出力します。

実行結果として、顧客の名前と購入金額が結合されたレコードが表示されます。

○サンプルコード2:複数のファイルをJOININGする例

複数のファイルをJOININGする場合、処理はより複雑になりますが、基本的な原理は同じです。

このサンプルコードでは、三つの異なるファイル(FileA, FileB, FileC)を結合し、関連する情報を一つのレコードとして出力する方法を表します。

この例では、顧客ID、製品ID、購入金額など、異なるファイルからの情報が結合されます。

IDENTIFICATION DIVISION.
PROGRAM-ID. MultipleJoining.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT FileA ASSIGN TO 'A.DAT'.
    SELECT FileB ASSIGN TO 'B.DAT'.
    SELECT FileC ASSIGN TO 'C.DAT'.

DATA DIVISION.
FILE SECTION.
FD FileA.
01 FileARecord.
   05 CustomerID PIC 9(4).
FD FileB.
01 FileBRecord.
   05 CustomerID PIC 9(4).
   05 ProductID PIC 9(4).
FD FileC.
01 FileCRecord.
   05 ProductID PIC 9(4).
   05 PurchaseAmount PIC 9(5).

WORKING-STORAGE SECTION.
01 WS-JoinedRecord.
   05 WS-CustomerID PIC 9(4).
   05 WS-ProductID PIC 9(4).
   05 WS-PurchaseAmount PIC 9(5).

PROCEDURE DIVISION.
BEGIN.
    OPEN INPUT FileA, FileB, FileC
    READ FileA INTO FileARecord
    READ FileB INTO FileBRecord
    READ FileC INTO FileCRecord
    PERFORM UNTIL EOF OF FileA OR EOF OF FileB OR EOF OF FileC
        IF FileARecord::CustomerID = FileBRecord::CustomerID AND
           FileBRecord::ProductID = FileCRecord::ProductID
            MOVE FileARecord::CustomerID TO WS-JoinedRecord::WS-CustomerID
            MOVE FileBRecord::ProductID TO WS-JoinedRecord::WS-ProductID
            MOVE FileCRecord::PurchaseAmount TO WS-JoinedRecord::WS-PurchaseAmount
            DISPLAY WS-JoinedRecord
        END-IF
        READ FileA INTO FileARecord
        READ FileB INTO FileBRecord
        READ FileC INTO FileCRecord
    END-PERFORM
    CLOSE FileA, FileB, FileC.
STOP RUN.

このサンプルコードでは、三つのファイルからレコードを読み込み、顧客IDと製品IDが一致する場合にそれらを結合して出力します。

このようにJOINING指定を使うことで、複数のデータソースからの情報を結合し、包括的なデータ分析を行うことが可能になります。

●JOINING指定の応用例

COBOLのJOINING指定は、単純なデータ結合を超えた多様な応用が可能です。

複雑なビジネスロジックやデータ処理のシナリオでは、JOINING指定を用いることで、データの整合性を保ちつつ、効率的な処理が実現できます。

例えば、異なるデータベースやファイルシステム間でのデータ同期、複数のデータソースからの情報集約、条件に基づくデータの結合など、多岐にわたる用途で活用することが可能です。

○サンプルコード3:効率的なデータ処理のためのJOINING

効率的なデータ処理を目的としたJOINING指定の一例を紹介します。

このサンプルコードでは、顧客データと注文データが別々のファイルに格納されていると仮定し、顧客IDを基にこれらのデータを結合し、顧客ごとの注文履歴を生成します。

IDENTIFICATION DIVISION.
PROGRAM-ID. EfficientDataProcessing.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT CustomerFile ASSIGN TO 'CUSTOMER.DAT'.
    SELECT OrderFile ASSIGN TO 'ORDER.DAT'.

DATA DIVISION.
FILE SECTION.
FD CustomerFile.
01 CustomerRecord.
   05 CustomerID PIC 9(4).
   05 CustomerName PIC A(20).
FD OrderFile.
01 OrderRecord.
   05 CustomerID PIC 9(4).
   05 OrderDate PIC 9(8).
   05 OrderAmount PIC 9(5).

WORKING-STORAGE SECTION.
01 WS-CombinedRecord.
   05 WS-CustomerName PIC A(20).
   05 WS-OrderDate PIC 9(8).
   05 WS-OrderAmount PIC 9(5).

PROCEDURE DIVISION.
BEGIN.
    OPEN INPUT CustomerFile, OrderFile
    READ CustomerFile INTO CustomerRecord
    READ OrderFile INTO OrderRecord
    PERFORM UNTIL EOF OF CustomerFile
        IF CustomerRecord::CustomerID = OrderRecord::CustomerID
            MOVE CustomerRecord::CustomerName TO WS-CombinedRecord::WS-CustomerName
            MOVE OrderRecord::OrderDate TO WS-CombinedRecord::WS-OrderDate
            MOVE OrderRecord::OrderAmount TO WS-CombinedRecord::WS-OrderAmount
            DISPLAY WS-CombinedRecord
        END-IF
        READ CustomerFile INTO CustomerRecord
        READ OrderFile INTO OrderRecord
    END-PERFORM
    CLOSE CustomerFile, OrderFile.
STOP RUN.

このコードでは、顧客ファイルと注文ファイルを開き、顧客IDが一致するレコードを見つけた際に、顧客名、注文日、注文額を結合して表示します。

このようにJOINING指定を使うことで、別々のデータソースからの情報を統合し、意味のある洞察を得ることができます。

○サンプルコード4:複雑なビジネスロジックにおけるJOINING

次に、より複雑なビジネスロジックに対応するJOINING指定の例を紹介します。

この例では、複数のファイルから関連するデータを抽出し、特定のビジネスルールに基づいてデータを結合するプロセスを実装します。

IDENTIFICATION DIVISION.
PROGRAM-ID. ComplexBusinessLogic.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT FileX ASSIGN TO 'X.DAT'.
    SELECT FileY ASSIGN TO 'Y.DAT'.
    SELECT FileZ ASSIGN TO 'Z.DAT'.

DATA DIVISION.
FILE SECTION.
FD FileX.
01 FileXRecord.
   05 XKey PIC 9(4).
   05 XData PIC

 A(20).
FD FileY.
01 FileYRecord.
   05 YKey PIC 9(4).
   05 YData PIC 9(5).
FD FileZ.
01 FileZRecord.
   05 ZKey PIC 9(4).
   05 ZData PIC X(10).

WORKING-STORAGE SECTION.
01 WS-CombinedRecord.
   05 WS-XData PIC A(20).
   05 WS-YData PIC 9(5).
   05 WS-ZData PIC X(10).

PROCEDURE DIVISION.
BEGIN.
    OPEN INPUT FileX, FileY, FileZ
    READ FileX INTO FileXRecord
    READ FileY INTO FileYRecord
    READ FileZ INTO FileZRecord
    PERFORM UNTIL EOF OF FileX OR EOF OF FileY OR EOF OF FileZ
        IF FileXRecord::XKey = FileYRecord::YKey AND FileYRecord::YKey = FileZRecord::ZKey
            MOVE FileXRecord::XData TO WS-CombinedRecord::WS-XData
            MOVE FileYRecord::YData TO WS-CombinedRecord::WS-YData
            MOVE FileZRecord::ZData TO WS-CombinedRecord::WS-ZData
            DISPLAY WS-CombinedRecord
        END-IF
        READ FileX INTO FileXRecord
        READ FileY INTO FileYRecord
        READ FileZ INTO FileZRecord
    END-PERFORM
    CLOSE FileX, FileY, FileZ.
STOP RUN.

このコードでは、三つの異なるファイル(X, Y, Z)からデータを読み込み、特定のキーで一致するレコードを結合して出力します。

このような複雑なJOINING指定を利用することで、複雑な条件に基づくデータの結合や分析を行うことができます。

●JOINING指定の注意点と対処法

COBOLでJOINING指定を使用する際には、いくつかの重要な注意点があります。

JOINING指定は非常に強力な機能ですが、正しく使わないと予期せぬ結果やパフォーマンスの問題を引き起こす可能性があります。

主な注意点としては、データの整合性、効率的なコードの記述、適切なエラーハンドリングの方法が挙げられます。

これらの要素を適切に管理することで、JOINING指定を最大限に活用し、信頼性の高いプログラムを作成することができます。

○コードの効率化

JOINING指定を使用する際の効率化のポイントには、データの前処理、JOINING処理の最適化、そしてリソースの効率的な利用が含まれます。

データの前処理には、不要なデータの除去や必要なデータの選択が含まれます。

JOINING処理の最適化では、結合するデータ量を最小限に抑えることが重要です。

これにより、処理時間の短縮とシステムリソースの節約が可能になります。

また、COBOLプログラムでは、メモリやCPUリソースを効率的に使用することが不可欠です。

○エラー処理とデバッグ

JOINING指定を行う際には、エラー処理とデバッグが欠かせません。

データが不整合を起こした場合や予期せぬエラーが発生した場合に備え、適切なエラーハンドリングを行う必要があります。

例えば、JOINING指定においてキーの不一致が発生した場合、プログラムはエラーメッセージを表示し、適切な処理を行うべきです。

また、デバッグ時にはJOINING処理の各ステップを慎重に検証し、データの整合性を確保することが重要です。

これにより、予期せぬ挙動やエラーを未然に防ぐことができます。

●JOINING指定のカスタマイズ方法

COBOLにおけるJOINING指定のカスタマイズは、特定のニーズや要件に合わせて行われます。

このプロセスでは、標準的なJOINING構文をベースにしながら、特定のビジネスロジックやデータ処理ニーズに応じた変更を加えることが可能です。

例えば、特定の条件に基づいてデータをフィルタリングする、異なるデータソース間で独自の結合キーを使用する、複雑なデータ変換を行うなど、多様なカスタマイズが考えられます。

これにより、標準的なJOINING操作では対応できない複雑な要件にも柔軟に対応することができます。

○サンプルコード5:ユーザー特定のニーズに応じたJOINING

ユーザーの特定のニーズに応じたJOINING指定の例を紹介します。

このサンプルコードでは、顧客データと注文データを結合する際に、特定の日付範囲の注文のみを対象とするカスタマイズを行っています。

このようなカスタマイズは、特定の期間に注文された商品の分析など、特定のビジネスニーズに合わせたデータ処理を可能にします。

IDENTIFICATION DIVISION.
PROGRAM-ID. CustomJoining.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT CustomerFile ASSIGN TO 'CUSTOMER.DAT'.
    SELECT OrderFile ASSIGN TO 'ORDER.DAT'.

DATA DIVISION.
FILE SECTION.
FD CustomerFile.
01 CustomerRecord.
   05 CustomerID PIC 9(4).
   05 CustomerName PIC A(20).
FD OrderFile.
01 OrderRecord.
   05 CustomerID PIC 9(4).
   05 OrderDate PIC 9(8).
   05 OrderAmount PIC 9(5).

WORKING-STORAGE SECTION.
01 WS-CombinedRecord.
   05 WS-CustomerName PIC A(20).
   05 WS-OrderDate PIC 9(8).
   05 WS-OrderAmount PIC 9(5).
01 DateRange.
   05 StartDate PIC 9(8) VALUE '20210101'.
   05 EndDate PIC 9(8) VALUE '20211231'.

PROCEDURE DIVISION.
BEGIN.
    OPEN INPUT CustomerFile, OrderFile
    READ CustomerFile INTO CustomerRecord
    READ OrderFile INTO OrderRecord
    PERFORM UNTIL EOF OF CustomerFile
        IF CustomerRecord::CustomerID = OrderRecord::CustomerID AND
           OrderRecord::OrderDate >= StartDate AND
           OrderRecord::OrderDate <= EndDate
            MOVE CustomerRecord::CustomerName TO WS-CombinedRecord::WS-CustomerName
            MOVE OrderRecord::OrderDate TO WS-CombinedRecord::WS-OrderDate
            MOVE OrderRecord::OrderAmount TO WS-CombinedRecord::WS-OrderAmount
            DISPLAY WS-CombinedRecord
        END-IF
        READ CustomerFile INTO CustomerRecord
        READ OrderFile INTO OrderRecord
    END-PERFORM
    CLOSE CustomerFile, OrderFile.
STOP RUN.

このコードは、指定された日付範囲内の注文に関連する顧客データと注文データを結合して表示します。

カスタマイズされたJOINING指定を使用することで、特定の分析ニーズに合わせたデータ処理が可能になります。

○サンプルコード6:高度なカスタマイズ例

さらに高度なカスタマイズ例として、複数の結合条件を持つJOINING指定のサンプルコードを紹介します。

この例では、複数のデータソースからのデータを結合する際に、複数のキーを用いて条件を絞り込み、特定のビジネスロジックに基づいたデータセットを生成します。

このような高度なカスタマイズは、特に複雑なデータ処理や分析が必要な場合に有効です。

IDENTIFICATION DIVISION.
PROGRAM-ID. AdvancedCustomJoining.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT FileA ASSIGN TO 'A.DAT'.
    SELECT FileB ASSIGN TO 'B.DAT'.
    SELECT FileC ASSIGN TO 'C.DAT'.

DATA DIVISION.
FILE SECTION.
FD FileA.
01 FileARecord.
   05 AKey PIC 9(4).
   05 AData PIC A(20).
FD FileB.
01 FileBRecord.
   05 BKey PIC 9(4).
   05 BData PIC 9(5).
FD FileC.
01 FileCRecord.
   05 CKey PIC 9(4).
   05 CData PIC X(10).

WORKING-STORAGE SECTION.
01 WS-CombinedRecord.
   05 WS-AData PIC A(20).
   05 WS-BData PIC 9(5).
   05 WS-CData PIC X(10).

PROCEDURE DIVISION.
BEGIN.
    OPEN INPUT FileA, FileB, FileC
    READ FileA INTO FileARecord
    READ FileB INTO FileBRecord
    READ FileC INTO FileCRecord
    PERFORM UNTIL EOF OF FileA OR EOF OF FileB OR EOF OF FileC
        IF FileARecord::AKey = FileBRecord::BKey AND
           FileBRecord::BKey = FileCRecord::CKey
            MOVE FileARecord::AData TO WS-CombinedRecord::WS-AData
            MOVE FileBRecord::BData TO WS-CombinedRecord::WS-BData
            MOVE FileCRecord::CData TO WS-CombinedRecord::WS-CData
            DISPLAY WS-CombinedRecord
        END-IF
        READ FileA INTO FileARecord
        READ FileB INTO FileBRecord
        READ FileC INTO FileCRecord
    END-PERFORM
    CLOSE FileA, FileB, FileC.
STOP RUN.

このサンプルコードでは、三つの異なるファイルからデータを読み込み、特定のキーで一致するレコードを結合して出力します。

このように複数の条件を組み合わせることで、特定のビジネスニーズに合わせた複雑なデータ結合が可能になります。

まとめ

この記事では、COBOLにおけるJOINING指定の基本から応用、カスタマイズ方法までを詳細に解説しました。

JOINING指定は、複数のデータソースからの情報を統合し、効率的なデータ処理を可能にする強力なツールです。

適切な使用とカスタマイズにより、ビジネスの多様な要求に応じたデータ処理が実現可能です。

エラー処理や効率化のテクニックを理解することで、COBOLプログラミングにおけるデータ操作のスキルをさらに高めることができます。

この記事があなたのコーディングに実際に活用していただければ幸いです。