【COBOL】学習用教材

# 1. COBOLの基本構造
COBOLプログラムは以下の4つのディビジョンに分かれています：

①IDENTIFICATION DIVISION
プログラムの識別情報を記述します。プログラム名や作成者、作成日などが含まれます。
```cobol: コード
IDENTIFICATION DIVISION.
PROGRAM-ID. MyFirstProgram.
```
②ENVIRONMENT DIVISION
プログラムが実行される環境を記述します。主にファイルの割り当てや使用するデバイスについての情報が含まれます。
```cobol: コード
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT IN-FILE ASSIGN TO 'input.txt'
        ORGANIZATION IS LINE SEQUENTIAL.
```
③DATA DIVISION
プログラムで使用するデータを定義します。変数やファイルのレコードレイアウトなどが含まれます。
```cobol: コード
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-RECORD PIC X(80).

WORKING-STORAGE SECTION.
01 WS-VARIABLE PIC 9(4).
```
④PROCEDURE DIVISION
実際の処理手順を記述します。プログラムのロジックやデータの操作が含まれます。
```cobol: コード
PROCEDURE DIVISION.
OPEN INPUT IN-FILE
READ IN-FILE INTO IN-RECORD
    AT END
        DISPLAY 'End of file reached'
    NOT AT END
        DISPLAY 'Record: ' IN-RECORD
CLOSE IN-FILE
STOP RUN.
```

# 2.  "Hello, World!" プログラム
まずは基本的な「Hello, World!」プログラムを見てみましょう。
```cobol: HelloWorld
IDENTIFICATION DIVISION.
PROGRAM-ID. HelloWorld.
ENVIRONMENT DIVISION.
DATA DIVISION.
    PROCEDURE DIVISION.
        DISPLAY 'Hello, World!'.
        STOP RUN.
```
解説：
IDENTIFICATION DIVISION: プログラムの名前を指定します。
PROGRAM-ID. HelloWorld.: プログラムの識別子をHelloWorldに設定しています。
ENVIRONMENT DIVISION: 環境設定です（今回は特に設定なし）。
DATA DIVISION: データの定義ですが、今回はデータは使用しません。
PROCEDURE DIVISION: プログラムの処理内容です。「DISPLAY」で文字列を表示し、「STOP RUN」でプログラムを終了します。
実行結果：
Hello, World!

# 3. 基本的なデータ操作
次に、変数を使った簡単なプログラムを見てみましょう。
```cobol: SimpleCalculation
IDENTIFICATION DIVISION.
PROGRAM-ID. SimpleCalculation.
ENVIRONMENT DIVISION.
DATA DIVISION.
    WORKING-STORAGE SECTION.
       01 A PIC 9(2) VALUE 10.
       01 B PIC 9(2) VALUE 20.
       01 C PIC 9(3).
PROCEDURE DIVISION.
    ADD A TO B GIVING C.
    DISPLAY 'The result of adding ' A ' and ' B ' is ' C.
    STOP RUN.
```
解説：
WORKING-STORAGE SECTION: 変数を定義するセクションです。
01 A PIC 9(2) VALUE 10.: 2桁の整数変数Aを10で初期化。
01 B PIC 9(2) VALUE 20.: 2桁の整数変数Bを20で初期化。
01 C PIC 9(3).: 3桁の整数変数Cを定義。
ADD A TO B GIVING C: AとBを足してCに代入。
DISPLAY: 計算結果を表示。

実行結果：
The result of adding 10 and 20 is 030

# 4. 条件分岐
次に、条件分岐を使ったプログラムを見てみましょう。
```cobol: ConditionalExample
IDENTIFICATION DIVISION.
PROGRAM-ID. ConditionalExample.
ENVIRONMENT DIVISION.
DATA DIVISION.
    WORKING-STORAGE SECTION.
       01 SCORE PIC 9(3) VALUE 85.
    PROCEDURE DIVISION.
        IF SCORE >= 90 THEN
            DISPLAY 'Grade: A'
        ELSE IF SCORE >= 80 THEN
            DISPLAY 'Grade: B'
        ELSE IF SCORE >= 70 THEN
            DISPLAY 'Grade: C'
        ELSE
            DISPLAY 'Grade: D'.
        STOP RUN.
```
解説：
IF-ELSE: 条件分岐を行う構文です。
SCORE >= 90 THEN DISPLAY 'Grade: A': SCOREが90以上なら「Grade: A」を表示。
ELSE IF SCORE >= 80 THEN DISPLAY 'Grade: B': SCOREが80以上90未満なら「Grade: B」を表示。
ELSE IF SCORE >= 70 THEN DISPLAY 'Grade: C': SCOREが70以上80未満なら「Grade: C」を表示。
ELSE DISPLAY 'Grade: D': それ以外は「Grade: D」を表示。

実行結果：
Grade: B

# 5. ループ処理
次に、ループ処理を使った簡単なプログラムを見てみましょう。
```cobol: LoopExample
IDENTIFICATION DIVISION.
PROGRAM-ID. LoopExample.
ENVIRONMENT DIVISION.
DATA DIVISION.
    WORKING-STORAGE SECTION.
       01 I PIC 9(1) VALUE 1.
    PROCEDURE DIVISION.
        PERFORM UNTIL I > 5
            DISPLAY 'Iteration: ' I
            ADD 1 TO I
        END-PERFORM.
        STOP RUN.
```
解説：
PERFORM UNTIL: ループ処理を行う構文です。
UNTIL I > 5: Iが5を超えるまでループを繰り返します。
DISPLAY 'Iteration: ' I: 現在のIの値を表示。
ADD 1 TO I: Iに1を加算。

実行結果：
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4
Iteration: 5

# 6. ファイル操作
COBOLではファイルの読み書きも頻繁に行います。ここでは、簡単なファイル読み書きの例を示します。
```cobol: FileExample.
IDENTIFICATION DIVISION.
PROGRAM-ID. FileExample.
ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
        FILE-CONTROL.
            SELECT IN-FILE ASSIGN TO 'input.txt'
                ORGANIZATION IS LINE SEQUENTIAL.
            SELECT OUT-FILE ASSIGN TO 'output.txt'
                ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
    FILE SECTION.
       FD IN-FILE.
           01 IN-RECORD PIC X(80).
       FD OUT-FILE.
           01 OUT-RECORD PIC X(80).
       WORKING-STORAGE SECTION.
           01 WS-DATA PIC X(80).
PROCEDURE DIVISION.
    OPEN INPUT IN-FILE
    OPEN OUTPUT OUT-FILE
        PERFORM UNTIL EOF
            READ IN-FILE INTO WS-DATA
                AT END
            SET EOF TO TRUE
                NOT AT END
            MOVE WS-DATA TO OUT-RECORD
                WRITE OUT-RECORD
        END-PERFORM
    CLOSE IN-FILE
    CLOSE OUT-FILE
    STOP RUN.
```
解説：
FILE-CONTROL: ファイルの選択と属性を定義します。
SELECT IN-FILE ASSIGN TO 'input.txt': 入力ファイルを指定。
SELECT OUT-FILE ASSIGN TO 'output.txt': 出力ファイルを指定。
FILE SECTION: ファイルのレコードを定義します。
FD IN-FILE: 入力ファイルのファイル記述子。
01 IN-RECORD PIC X(80): 80文字の入力レコード。
FD OUT-FILE: 出力ファイルのファイル記述子。
01 OUT-RECORD PIC X(80): 80文字の出力レコード。
WORKING-STORAGE SECTION: 作業用の変数を定義します。
01 WS-DATA PIC X(80): 80文字の作業用データ。
PROCEDURE DIVISION: プログラムの処理内容。
OPEN INPUT IN-FILE: 入力ファイルを開く。
OPEN OUTPUT OUT-FILE: 出力ファイルを開く。
PERFORM UNTIL EOF: ファイルの終わりまで処理を繰り返す。
READ IN-FILE INTO WS-DATA: ファイルからデータを読み込む。
MOVE WS-DATA TO OUT-RECORD: 読み込んだデータを出力レコードに移動。
WRITE OUT-RECORD: 出力ファイルにデータを書き込む。
CLOSE IN-FILE: 入力ファイルを閉じる。
CLOSE OUT-FILE: 出力ファイルを閉じる。

# 7. サブルーチンの使用
COBOLではサブルーチン（他のプログラムや手続き）を呼び出すことができます。以下はサブルーチンの例です。
```cobol: MainProgram
       IDENTIFICATION DIVISION.
PROGRAM-ID. MainProgram.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 A PIC 9(2) VALUE 5.
    01 B PIC 9(2) VALUE 10.
    01 RESULT PIC 9(3).
PROCEDURE DIVISION.
    CALL 'SubProgram' USING A B RESULT
    DISPLAY 'The result is ' RESULT
    STOP RUN.
IDENTIFICATION DIVISION.
PROGRAM-ID. SubProgram.
ENVIRONMENT DIVISION.
DATA DIVISION.
LINKAGE SECTION.
    01 A PIC 9(2).
    01 B PIC 9(2).
    01 RESULT PIC 9(3).
PROCEDURE DIVISION USING A B RESULT.
    ADD A TO B GIVING RESULT
    EXIT PROGRAM.
```
解説：
CALL 'SubProgram' USING A B RESULT: サブルーチンを呼び出し、引数A、B、RESULTを渡す。
LINKAGE SECTION: サブルーチンで使用する引数を定義。
PROCEDURE DIVISION USING A B RESULT: サブルーチンの処理内容。引数AとBを足してRESULTに代入。

実行結果： The result is 015

# 8. 配列の使用
COBOLでは配列（テーブル）を使用して複数のデータを扱うことができます。以下は配列を使った簡単な例です。
```cobol: ArrayExample
       IDENTIFICATION DIVISION.
PROGRAM-ID. ArrayExample.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 ARRAY.
        05 ITEM PIC 9(2) OCCURS 5 TIMES.
    01 I PIC 9(1) VALUE 1.
PROCEDURE DIVISION.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
        MOVE I TO ITEM(I)
    END-PERFORM.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
        DISPLAY 'ITEM(' I '): ' ITEM(I)
    END-PERFORM.
    STOP RUN.
```
解説：
OCCURS 5 TIMES: 配列を定義する際に使用します。この場合、5つの要素を持つ配列を定義しています。
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5: ループ処理を行います。Iが1から5まで増加する間、ループを繰り返します。
MOVE I TO ITEM(I): 配列の各要素に値を設定します。
DISPLAY 'ITEM(' I '): ' ITEM(I): 配列の各要素を表示します。

実行結果：
ITEM(1): 1
ITEM(2): 2
ITEM(3): 3
ITEM(4): 4
ITEM(5): 5

# 9. ファイルの書き込みと読み込み
実際の業務では、ファイルの読み書きが重要な役割を果たします。以下はファイルの書き込みと読み込みの例です。
```cobol: FileWriteExample
       IDENTIFICATION DIVISION.
PROGRAM-ID. FileWriteExample.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT OUT-FILE ASSIGN TO 'output.txt'
        ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD OUT-FILE.
    01 OUT-RECORD PIC X(80).
WORKING-STORAGE SECTION.
    01 WS-RECORD PIC X(80) VALUE 'This is a test line.'.
PROCEDURE DIVISION.
    OPEN OUTPUT OUT-FILE
    MOVE WS-RECORD TO OUT-RECORD
    WRITE OUT-RECORD
    CLOSE OUT-FILE
    STOP RUN.
```
```cobol: FileReadExample
IDENTIFICATION DIVISION.
PROGRAM-ID. FileReadExample.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT IN-FILE ASSIGN TO 'output.txt'
        ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
    01 IN-RECORD PIC X(80).
WORKING-STORAGE SECTION.
    01 WS-RECORD PIC X(80).
PROCEDURE DIVISION.
    OPEN INPUT IN-FILE
    PERFORM UNTIL EOF
        READ IN-FILE INTO WS-RECORD
            AT END
                SET EOF TO TRUE
            NOT AT END
                DISPLAY WS-RECORD
    END-PERFORM
    CLOSE IN-FILE
    STOP RUN.
```
解説：
SELECT OUT-FILE ASSIGN TO 'output.txt': 出力ファイルを指定します。
OPEN OUTPUT OUT-FILE: 出力ファイルを開きます。
MOVE WS-RECORD TO OUT-RECORD: 作業用のデータを出力レコードに移動します。
WRITE OUT-RECORD: 出力ファイルにデータを書き込みます。
SELECT IN-FILE ASSIGN TO 'output.txt': 入力ファイルを指定します。
OPEN INPUT IN-FILE: 入力ファイルを開きます。
READ IN-FILE INTO WS-RECORD: ファイルからデータを読み込みます。
DISPLAY WS-RECORD: 読み込んだデータを表示します。

実行結果：
This is a test line.

# 10. エラーハンドリング
COBOLでは、エラーハンドリングも重要な機能です。以下はエラーハンドリングの例です。
```cobol: ErrorHandlingExample
IDENTIFICATION DIVISION.
PROGRAM-ID. ErrorHandlingExample.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 WS-NUM1 PIC 9(2) VALUE 10.
    01 WS-NUM2 PIC 9(2) VALUE 0.
    01 WS-RESULT PIC 9(2).
PROCEDURE DIVISION.
    ON SIZE ERROR
        DISPLAY 'Division by zero error'
    END-SIZE.
    COMPUTE WS-RESULT = WS-NUM1 / WS-NUM2 SIZE ERROR
        DISPLAY 'Calculation successful: ' WS-RESULT
    END-COMPUTE.
    STOP RUN.
```
解説：
SIZE ERROR: サイズエラーが発生した場合の処理を定義します。
COMPUTE WS-RESULT = WS-NUM1 / WS-NUM2 SIZE ERROR: 計算結果をWS-RESULTに代入しますが、サイズエラーが発生した場合はエラーメッセージを表示します。

実行結果：
Division by zero error

# 11. データベースアクセス
COBOLはデータベースと連携することができます。以下は、COBOLからSQLを利用してデータベースにアクセスする例です。
```cobol: DbAccessExample
IDENTIFICATION DIVISION.
PROGRAM-ID. DbAccessExample.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT DB-FILE ASSIGN TO DATABASE
           ORGANIZATION IS SEQUENTIAL.
DATA DIVISION.
WORKING-STORAGE SECTION.
    EXEC SQL
        INCLUDE SQLCA
    END-EXEC.
    EXEC SQL
        BEGIN DECLARE SECTION
    END-EXEC.
    01 EMP-ID   PIC X(5).
    01 EMP-NAME PIC X(20).
    EXEC SQL
        END DECLARE SECTION
    END-EXEC.
PROCEDURE DIVISION.
    EXEC SQL
        CONNECT TO 'DBNAME' USER 'username' USING 'password'
    END-EXEC.
    DISPLAY 'Connected to database successfully.'.
    EXEC SQL
        SELECT EMP_NAME INTO :EMP-NAME
        FROM EMPLOYEES
        WHERE EMP_ID = '12345'
    END-EXEC.
    DISPLAY 'Employee Name: ' EMP-NAME.
    EXEC SQL
        DISCONNECT
    END-EXEC.
    STOP RUN.
```
解説：
EXEC SQL: SQL文を埋め込むための構文です。
INCLUDE SQLCA: SQL Communications Area を含めます。これはSQLのエラーハンドリングに使用されます。
BEGIN DECLARE SECTION: COBOLプログラム内でSQL変数を宣言するセクションの開始。
CONNECT TO 'DBNAME' USER 'username' USING 'password': データベースに接続します。
SELECT EMP_NAME INTO :EMP-NAME FROM EMPLOYEES WHERE EMP_ID = '12345': SQLクエリを実行し、結果をCOBOL変数に格納します。
DISCONNECT: データベースから切断します。

実行結果：
Connected to database successfully.
Employee Name: John Doe

# 12. レポートの生成
COBOLはレポート生成にも適しています。以下は、データを読み込んでレポートを生成する例です。
```cobol: ReportExample
IDENTIFICATION DIVISION.
PROGRAM-ID. ReportExample.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT IN-FILE ASSIGN TO 'input.txt'
           ORGANIZATION IS LINE SEQUENTIAL.
    SELECT OUT-FILE ASSIGN TO 'report.txt'
           ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
    01 IN-RECORD PIC X(80).
FD OUT-FILE.
    01 OUT-RECORD PIC X(80).
WORKING-STORAGE SECTION.
    01 WS-TOTAL PIC 9(5) VALUE 0.
    01 WS-LINE  PIC X(80).
PROCEDURE DIVISION.
    OPEN INPUT IN-FILE
    OPEN OUTPUT OUT-FILE
    PERFORM UNTIL EOF
        READ IN-FILE INTO WS-LINE
            AT END
                SET EOF TO TRUE
            NOT AT END
                DISPLAY WS-LINE
                ADD 1 TO WS-TOTAL
                MOVE WS-LINE TO OUT-RECORD
                WRITE OUT-RECORD
    END-PERFORM
    MOVE 'Total Records: ' TO OUT-RECORD
    STRING WS-TOTAL DELIMITED BY SIZE INTO OUT-RECORD
    WRITE OUT-RECORD
    CLOSE IN-FILE
    CLOSE OUT-FILE
    STOP RUN.
```
解説：
FILE-CONTROL: 入力ファイルと出力ファイルを指定します。
OPEN INPUT IN-FILE: 入力ファイルを開きます。
OPEN OUTPUT OUT-FILE: 出力ファイルを開きます。
PERFORM UNTIL EOF: ファイルの終わりまで処理を繰り返します。
READ IN-FILE INTO WS-LINE: ファイルからデータを読み込みます。
ADD 1 TO WS-TOTAL: 読み込んだレコード数をカウントします。
WRITE OUT-RECORD: 出力ファイルにデータを書き込みます。
STRING WS-TOTAL DELIMITED BY SIZE INTO OUT-RECORD: トータルレコード数を文字列として出力レコードに格納します。

実行結果：
（ファイル input.txt の内容）
Record 1: Data
Record 2: More Data
Record 3: Even More Data

（生成されたファイル report.txt の内容）
Record 1: Data
Record 2: More Data
Record 3: Even More Data
Total Records: 3

# 13. 画面入出力
COBOLでは、画面への入出力も行うことができます。以下は、簡単な画面入出力の例です。
```cobol: ScreenIOExample
IDENTIFICATION DIVISION.
PROGRAM-ID. ScreenIOExample.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 USER-NAME PIC X(20).
PROCEDURE DIVISION.
    DISPLAY 'Enter your name: '
    ACCEPT USER-NAME
    DISPLAY 'Hello, ' USER-NAME
    STOP RUN.
```
解説：
DISPLAY 'Enter your name: ': 画面にメッセージを表示します。
ACCEPT USER-NAME: ユーザーからの入力を受け付けます。
DISPLAY 'Hello, ' USER-NAME: 入力された名前を含めてメッセージを表示します。

実行結果：
Enter your name: John Doe
Hello, John Doe

# 14. 分割ファイル処理
COBOLでは、大規模なデータセットを扱うことがよくあります。以下は、1つの大きなファイルを複数の小さなファイルに分割する例です。
```cobol: SplitFileExample
IDENTIFICATION DIVISION.
PROGRAM-ID. SplitFileExample.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT IN-FILE ASSIGN TO 'largefile.txt'
           ORGANIZATION IS LINE SEQUENTIAL.
    SELECT OUT-FILE1 ASSIGN TO 'split1.txt'
           ORGANIZATION IS LINE SEQUENTIAL.
    SELECT OUT-FILE2 ASSIGN TO 'split2.txt'
           ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
    01 IN-RECORD PIC X(80).
FD OUT-FILE1.
    01 OUT-RECORD1 PIC X(80).
FD OUT-FILE2.
    01 OUT-RECORD2 PIC X(80).
WORKING-STORAGE SECTION.
01 WS-RECORD-COUNT PIC 9(5) VALUE 0.
01 SPLIT-POINT    PIC 9(5) VALUE 50.
01 EOF            PIC X VALUE 'N'.
PROCEDURE DIVISION.
    OPEN INPUT IN-FILE
    OPEN OUTPUT OUT-FILE1
    OPEN OUTPUT OUT-FILE2
    PERFORM UNTIL EOF = 'Y'
        READ IN-FILE INTO IN-RECORD
            AT END
                MOVE 'Y' TO EOF
            NOT AT END
                ADD 1 TO WS-RECORD-COUNT
                IF WS-RECORD-COUNT <= SPLIT-POINT THEN
                    MOVE IN-RECORD TO OUT-RECORD1
                    WRITE OUT-RECORD1
                ELSE
                    MOVE IN-RECORD TO OUT-RECORD2
                    WRITE OUT-RECORD2
                END-IF
    END-PERFORM
    CLOSE IN-FILE
    CLOSE OUT-FILE1
    CLOSE OUT-FILE2
    STOP RUN.
```
解説：
SPLIT-POINT: 分割ポイントを定義します。この例では、最初の50レコードをsplit1.txtに書き込み、それ以降のレコードをsplit2.txtに書き込みます。
PERFORM UNTIL EOF = 'Y': ファイルの終わりまで処理を繰り返します。
READ IN-FILE INTO IN-RECORD: ファイルからデータを読み込みます。
IF WS-RECORD-COUNT <= SPLIT-POINT: 分割ポイントまでのレコードを1つのファイルに、それ以降のレコードを別のファイルに書き込みます。

実行結果：
（largefile.txtの内容）
Record 1
Record 2
...
Record 100

（生成されたsplit1.txtの内容）
Record 1
Record 2
...
Record 50

（生成されたsplit2.txtの内容）
Record 51
Record 52
...
Record 100

# 15. ソート処理
COBOLでは、内蔵のソート機能を使用してデータをソートすることができます。以下は、ファイルの内容をソートする例です。
```cobol: SortExample
IDENTIFICATION DIVISION.
PROGRAM-ID. SortExample.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT IN-FILE ASSIGN TO 'input.txt'
           ORGANIZATION IS LINE SEQUENTIAL.
    SELECT OUT-FILE ASSIGN TO 'sorted.txt'
           ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
    01 IN-RECORD PIC X(80).
FD OUT-FILE.
    01 OUT-RECORD PIC X(80).
WORKING-STORAGE SECTION.
01 SORT-RECORD PIC X(80).
PROCEDURE DIVISION.
    SORT SORT-WORK-FILE
         ON ASCENDING KEY IN-RECORD
         USING IN-FILE
         GIVING OUT-FILE
    STOP RUN.
```
解説：
SORT SORT-WORK-FILE: ソート処理を開始します。
ON ASCENDING KEY IN-RECORD: 昇順でソートするキーを指定します。
USING IN-FILE: ソート対象の入力ファイルを指定します。
GIVING OUT-FILE: ソート結果を出力するファイルを指定します。

実行結果：
（input.txtの内容）
Zebra
Apple
Mango
Banana

（生成されたsorted.txtの内容）
Apple
Banana
Mango
Zebra

# 16. 書式付き出力
COBOLでは、出力のフォーマットを細かく制御することができます。以下は、データをフォーマットして出力する例です。
```cobol: FormattedOutputExample
IDENTIFICATION DIVISION.
PROGRAM-ID. FormattedOutputExample.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 WS-NAME     PIC X(20) VALUE 'John Doe'.
    01 WS-AGE      PIC 9(2)  VALUE 30.
    01 WS-SALARY   PIC 9(7)V99 VALUE 50000.75.
    01 WS-DATE-OF-BIRTH.
       05 WS-YEAR  PIC 9(4) VALUE 1990.
       05 WS-MONTH PIC 9(2) VALUE 12.
       05 WS-DAY   PIC 9(2) VALUE 25.
PROCEDURE DIVISION.
    DISPLAY 'Name: ' WS-NAME
    DISPLAY 'Age: ' WS-AGE
    DISPLAY 'Salary: ' WS-SALARY
    DISPLAY 'Date of Birth: ' WS-YEAR '-' WS-MONTH '-' WS-DAY
    STOP RUN.
```
解説：
WS-NAME: 名前を格納するフィールド。
WS-AGE: 年齢を格納するフィールド。
WS-SALARY: 給与を格納するフィールド。小数点以下2桁の数値。
WS-DATE-OF-BIRTH: 生年月日を格納するフィールド。年、月、日で構成されます。

実行結果：
Name: John Doe
Age: 30
Salary: 50000.75
Date of Birth: 1990-12-25

# 17. 動的メモリ管理
COBOLでは、動的にメモリを割り当てることができます。以下は、動的メモリ管理の例です。
```cobol: コード
IDENTIFICATION DIVISION.
PROGRAM-ID. DynamicMemoryExample.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 PTR           USAGE IS POINTER.
    01 MEM-BUFFER    PIC X(100).
PROCEDURE DIVISION.
    CALL 'CBL_ALLOC_MEM' USING BY VALUE 100 BY REFERENCE PTR
    IF PTR = NULL
        DISPLAY 'Memory allocation failed'
    ELSE
        MOVE 'Dynamic memory allocated' TO MEM-BUFFER
        CALL 'CBL_MOVE_MEM' USING BY REFERENCE PTR BY REFERENCE MEM-BUFFER BY VALUE 100
        DISPLAY 'MEM-BUFFER: ' MEM-BUFFER
        CALL 'CBL_FREE_MEM' USING BY REFERENCE PTR
        DISPLAY 'Memory freed'
    END-IF
    STOP RUN.
```
解説：
USAGE IS POINTER: ポインタ型の変数を宣言します。
CALL 'CBL_ALLOC_MEM' USING BY VALUE 100 BY REFERENCE PTR: 100バイトのメモリを動的に割り当て、ポインタPTRにアドレスを格納します。
CALL 'CBL_MOVE_MEM' USING BY REFERENCE PTR BY REFERENCE MEM-BUFFER BY VALUE 100: メモリバッファの内容を動的に割り当てたメモリにコピーします。
CALL 'CBL_FREE_MEM' USING BY REFERENCE PTR: 動的に割り当てたメモリを解放します。

実行結果：
MEM-BUFFER: Dynamic memory allocated
Memory freed

# 18. COBOLと外部プログラムの連携
COBOLは他のプログラム言語と連携することができます。以下は、C言語のサブルーチンを呼び出す例です。
```cobol: コード
IDENTIFICATION DIVISION.
PROGRAM-ID. CCallExample.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 A PIC 9(2) VALUE 5.
    01 B PIC 9(2) VALUE 10.
    01 RESULT PIC 9(3).
PROCEDURE DIVISION.
    CALL 'CSub' USING BY VALUE A BY VALUE B BY REFERENCE RESULT
    DISPLAY 'The result is ' RESULT
    STOP RUN.
```
```cobol: CSub.c
#include <stdio.h>

void CSub(int a, int b, int *result) {
    *result = a + b;
}
```
解説：
CALL 'CSub' USING BY VALUE A BY VALUE B BY REFERENCE RESULT: C言語のサブルーチンCSubを呼び出し、引数A、Bを渡し、結果をRESULTに格納します。

実行結果：
The result is 15

# 19. COBOLとWebサービスの連携
COBOLはWebサービスと連携することができます。以下は、SOAP Webサービスを呼び出す例です。
```cobol: コード
IDENTIFICATION DIVISION.
PROGRAM-ID. WebServiceExample.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT WS-FILE ASSIGN TO 'webservice.wsdl'
           ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD WS-FILE.
    01 WS-REQUEST PIC X(100).
    01 WS-RESPONSE PIC X(100).
WORKING-STORAGE SECTION.
    01 SERVICE-ENDPOINT PIC X(100) VALUE 'http://example.com/soap'.
PROCEDURE DIVISION.
    OPEN INPUT WS-FILE
    PERFORM UNTIL EOF
        READ WS-FILE INTO WS-REQUEST
            AT END
                SET EOF TO TRUE
            NOT AT END
                CALL 'WebServiceCall' USING BY REFERENCE SERVICE-ENDPOINT BY REFERENCE WS-REQUEST BY REFERENCE WS-RESPONSE
                DISPLAY 'Response: ' WS-RESPONSE
    END-PERFORM
    CLOSE WS-FILE
    STOP RUN.
```
解説：
CALL 'WebServiceCall' USING BY REFERENCE SERVICE-ENDPOINT BY REFERENCE WS-REQUEST BY REFERENCE WS-RESPONSE: Webサービスを呼び出し、サービスエンドポイントとリクエストを渡し、レスポンスを取得します。

実行結果：
Response: 

# 20. エラーロギングとデバッグ
COBOLでエラーロギングやデバッグを行う場合の例です。
```cobol: コード
IDENTIFICATION DIVISION.
PROGRAM-ID. DebugExample.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT LOG-FILE ASSIGN TO 'error.log'
           ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD LOG-FILE.
    01 LOG-RECORD PIC X(80).
WORKING-STORAGE SECTION.
    01 WS-ERROR-MESSAGE PIC X(80) VALUE 'An error occurred.'.
PROCEDURE DIVISION.
    OPEN OUTPUT LOG-FILE
    MOVE WS-ERROR-MESSAGE TO LOG-RECORD
    WRITE LOG-RECORD
    CLOSE LOG-FILE
    DISPLAY 'Logged error message to error.log'
    STOP RUN.
```
解説：
LOG-FILE: エラーログファイルを指定します。
MOVE WS-ERROR-MESSAGE TO LOG-RECORD: エラーメッセージをログレコードに移動します。
WRITE LOG-RECORD: ログファイルにエラーメッセージを書き込みます。

実行結果：
Logged error message to error.log

# 21. マルチスレッド処理
COBOLはマルチスレッド処理もサポートしています。以下は、複数のスレッドを使用して並列処理を行う例です。
```cobol: コード
IDENTIFICATION DIVISION.
PROGRAM-ID. MultiThreadExample.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 THREAD-ID     PIC 9(4) VALUE 0.
    01 THREAD-STATUS PIC X(10).

PROCEDURE DIVISION.
    CALL 'CBL_CREATE_THREAD' USING BY REFERENCE THREAD-ID
                                  BY CONTENT 'Thread1'
                                  BY VALUE LENGTH OF 'Thread1'
                                  BY REFERENCE THREAD-STATUS
    DISPLAY 'Thread1 Created with ID: ' THREAD-ID

    CALL 'CBL_CREATE_THREAD' USING BY REFERENCE THREAD-ID
                                  BY CONTENT 'Thread2'
                                  BY VALUE LENGTH OF 'Thread2'
                                  BY REFERENCE THREAD-STATUS
    DISPLAY 'Thread2 Created with ID: ' THREAD-ID

    CALL 'CBL_WAIT_THREAD' USING BY REFERENCE THREAD-ID
                                BY REFERENCE THREAD-STATUS
    DISPLAY 'Thread1 Completed'

    CALL 'CBL_WAIT_THREAD' USING BY REFERENCE THREAD-ID
                                BY REFERENCE THREAD-STATUS
    DISPLAY 'Thread2 Completed'

    STOP RUN.

THREAD-1 SECTION.
THREAD-1-BEGIN.
    DISPLAY 'Thread1 is running...'
    EXIT.

THREAD-2 SECTION.
THREAD-2-BEGIN.
    DISPLAY 'Thread2 is running...'
    EXIT.
```
解説：
CBL_CREATE_THREAD: 新しいスレッドを作成します。
CBL_WAIT_THREAD: スレッドの完了を待機します。
THREAD-1 SECTION: スレッド1の処理内容。
THREAD-2 SECTION: スレッド2の処理内容。

実行結果：
Thread1 Created with ID: 0001
Thread2 Created with ID: 0002
Thread1 is running...
Thread2 is running...
Thread1 Completed
Thread2 Completed

# 22. 画面レイアウト
COBOLでは、画面レイアウトを使ってユーザーインターフェースを作成することができます。以下は、簡単な画面レイアウトの例です。
```cobol: コード
      IDENTIFICATION DIVISION.
      PROGRAM-ID. ScreenLayoutExample.
      ENVIRONMENT DIVISION.
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 WS-NAME PIC X(20).
      01 WS-AGE  PIC 9(2).

      SCREEN SECTION.
      01 SCREEN-1.
          05 BLANK SCREEN.
          05 LINE 1 COLUMN 1 VALUE 'Name: '.
          05 LINE 2 COLUMN 1 VALUE 'Age: '.
          05 LINE 1 COLUMN 10 PIC X(20) TO WS-NAME.
          05 LINE 2 COLUMN 10 PIC 9(2) TO WS-AGE.

      PROCEDURE DIVISION.
          DISPLAY SCREEN-1
          ACCEPT SCREEN-1
          DISPLAY 'You entered: ' WS-NAME ' and ' WS-AGE
          STOP RUN.
```
解説：
SCREEN SECTION: 画面レイアウトを定義します。
BLANK SCREEN: 画面をクリアします。
LINE: 画面の行と列を指定します。
PIC: 入力フィールドを定義します。

実行結果：
Name: John Doe
Age: 30
You entered: John Doe and 30

# 23. 日付と時刻の操作
COBOLでは、日付と時刻の操作も行うことができます。以下は、現在の日付と時刻を取得する例です。
```cobol: コード
      IDENTIFICATION DIVISION.
      PROGRAM-ID. DateTimeExample.
      ENVIRONMENT DIVISION.
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 WS-DATE PIC 9(8).
      01 WS-TIME PIC 9(6).

      PROCEDURE DIVISION.
          ACCEPT WS-DATE FROM DATE
          ACCEPT WS-TIME FROM TIME
          DISPLAY 'Current Date: ' WS-DATE
          DISPLAY 'Current Time: ' WS-TIME
          STOP RUN.
```
解説：
ACCEPT WS-DATE FROM DATE: 現在の日付を取得します。
ACCEPT WS-TIME FROM TIME: 現在の時刻を取得します。

実行結果：
Current Date: 20231010
Current Time: 143015

# 24. XMLの操作
COBOLでは、XMLデータの操作も行うことができます。以下は、簡単なXMLの読み込みと解析の例です。
```cobol: コード
      IDENTIFICATION DIVISION.
      PROGRAM-ID. XMLExample.
      ENVIRONMENT DIVISION.
      INPUT-OUTPUT SECTION.
      FILE-CONTROL.
          SELECT XML-FILE ASSIGN TO 'data.xml'
              ORGANIZATION IS LINE SEQUENTIAL.

      DATA DIVISION.
      FILE SECTION.
      FD XML-FILE.
      01 XML-RECORD PIC X(100).

      WORKING-STORAGE SECTION.
      01 WS-XML-DATA PIC X(100).

      PROCEDURE DIVISION.
          OPEN INPUT XML-FILE
          READ XML-FILE INTO WS-XML-DATA
          DISPLAY 'XML Data: ' WS-XML-DATA
          CLOSE XML-FILE
          STOP RUN.
```
解説：
XML-FILE: XMLファイルを指定します。
READ XML-FILE INTO WS-XML-DATA: XMLデータを読み込みます。

実行結果：
XML Data: <data>John Doe30</data>

25. サブルーチンの詳細COBOLでは、サブルーチン（外部プログラム）を呼び出すことでコードの再利用やモジュール化を行うことができます。以下は、サブルーチンを使ってパラメータを渡し、結果を受け取る例です。
```cobol: メインプログラム
IDENTIFICATION DIVISION.
PROGRAM-ID. MainProgram.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 9(2) VALUE 5.
01 B PIC 9(2) VALUE 10.
01 RESULT PIC 9(3).

PROCEDURE DIVISION.
    DISPLAY 'Calling SubProgram...'
    CALL 'SubProgram' USING BY VALUE A BY VALUE B BY REFERENCE RESULT
    DISPLAY 'The result is ' RESULT
    STOP RUN.
```
```cobol: サブルーチンプログラム
IDENTIFICATION DIVISION.
PROGRAM-ID. SubProgram.

ENVIRONMENT DIVISION.

DATA DIVISION.
LINKAGE SECTION.
01 A PIC 9(2).
01 B PIC 9(2).
01 RESULT PIC 9(3).

PROCEDURE DIVISION USING A B RESULT.
    ADD A TO B GIVING RESULT
    EXIT PROGRAM.
```
解説：
CALL 'SubProgram' USING BY VALUE A BY VALUE B BY REFERENCE RESULT: サブルーチンを呼び出し、引数AとBを渡し、結果をRESULTに格納します。
LINKAGE SECTION: サブルーチンで使用する引数を定義します。
PROCEDURE DIVISION USING A B RESULT: サブルーチンの処理内容。引数AとBを足してRESULTに代入します。

実行結果：
Calling SubProgram...The result is 15

# 26. インデックス付きファイルの操作
COBOLでは、インデックス付きファイルを使用してデータの高速検索を行うことができます。以下は、インデックス付きファイルを使用する例です。
```cobol: コード
IDENTIFICATION DIVISION.
PROGRAM-ID. IndexedFileExample.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT EMP-FILE ASSIGN TO 'employees.dat'
        ORGANIZATION IS INDEXED
        ACCESS MODE IS DYNAMIC
        RECORD KEY IS EMP-ID.

DATA DIVISION.
FILE SECTION.
FD EMP-FILE.
01 EMP-RECORD.
    05 EMP-ID PIC X(5).
    05 EMP-NAME PIC X(20).
    05 EMP-SALARY PIC 9(7)V99.

WORKING-STORAGE SECTION.
01 WS-EMP-ID PIC X(5).
01 WS-EMP-NAME PIC X(20).
01 WS-EMP-SALARY PIC 9(7)V99.

PROCEDURE DIVISION.
    OPEN OUTPUT EMP-FILE
    MOVE 'E0001' TO EMP-ID
    MOVE 'John Doe' TO EMP-NAME
    MOVE 50000.75 TO EMP-SALARY
    WRITE EMP-RECORD

    MOVE 'E0002' TO EMP-ID
    MOVE 'Jane Smith' TO EMP-NAME
    MOVE 60000.50 TO EMP-SALARY
    WRITE EMP-RECORD
    CLOSE EMP-FILE

    OPEN I-O EMP-FILE
    MOVE 'E0001' TO WS-EMP-ID
    READ EMP-FILE KEY IS WS-EMP-ID
        IF NOT INVALID KEY
            DISPLAY 'Employee: ' EMP-NAME ' Salary: ' EMP-SALARY
        ELSE
            DISPLAY 'Employee not found'
        END-IF
    CLOSE EMP-FILE

    STOP RUN.
```
解説：
ORGANIZATION IS INDEXED: インデックス付きファイルを指定します。
RECORD KEY IS EMP-ID: レコードキーを指定します。
ACCESS MODE IS DYNAMIC: 動的アクセスモードを指定します。
READ EMP-FILE KEY IS WS-EMP-ID: 指定されたキーでファイルを読み取ります。

実行結果：
Employee: John Doe Salary: 50000.75

# 27. エラーハンドリングの詳細
COBOLでは、さまざまなエラーハンドリングの方法があります。以下は、ファイル操作でエラーが発生した場合のエラーハンドリングの例です。
```cobol: コード
IDENTIFICATION DIVISION.
PROGRAM-ID. ErrorHandlingDetail.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT IN-FILE ASSIGN TO 'nonexistent.txt'
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-RECORD PIC X(80).

WORKING-STORAGE SECTION.
01 WS-STATUS-CODE PIC XX.
    88 FILE-NOT-FOUND VALUE '35'.

PROCEDURE DIVISION.
    OPEN INPUT IN-FILE
    MOVE STATUS-CODE OF IN-FILE TO WS-STATUS-CODE

    IF FILE-NOT-FOUND THEN
        DISPLAY 'Error: File not found'
    ELSE
        READ IN-FILE INTO IN-RECORD
            AT END
                DISPLAY 'End of file reached'
            NOT AT END
                DISPLAY 'Record: ' IN-RECORD
        END-READ
        CLOSE IN-FILE
    END-IF

    STOP RUN.
```
解説：
STATUS-CODE OF IN-FILE: ファイル操作のステータスコードを取得します。
88 FILE-NOT-FOUND VALUE '35': ステータスコード35をファイルが見つからないエラーとして定義します。
IF FILE-NOT-FOUND: ファイルが見つからない場合のエラーハンドリングを行います。

実行結果：
Error: File not found

# 28. パフォーマンスチューニングの基本
COBOLプログラムのパフォーマンスを向上させるための基本的なチューニング手法について説明します。

・効率的なファイル操作: 
ファイルの読み書きはバッファリングを利用し、必要以上にファイルを開閉しないようにします。
・インデックスの利用: 
大量のデータを検索する場合、インデックス付きファイルを利用して検索速度を向上させます。
・ループの最適化: 
ループ内での重複処理を避け、必要な処理だけを実行するようにします。
・不要なデータの削減: 
必要なデータだけを読み込み、不要なデータを避けるようにします。

# 29. マルチレコードファイルの操作
COBOLでは、1つのファイルに複数の異なるレコード形式を持たせることができます。以下は、マルチレコードファイルを操作する例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. MultiRecordFileExample.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT EMP-FILE ASSIGN TO 'employees.dat'
               ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD EMP-FILE.
       01 EMP-RECORD.
           05 EMP-ID PIC X(5).
           05 EMP-TYPE PIC X(1).
           05 EMP-NAME PIC X(20).
           05 EMP-SALARY PIC 9(7)V99.
           05 EMP-HOURLY-RATE PIC 9(4)V99.
       WORKING-STORAGE SECTION.
       01 WS-EMP-ID PIC X(5).
       01 WS-EMP-TYPE PIC X(1).
       01 WS-EMP-NAME PIC X(20).
       01 WS-EMP-SALARY PIC 9(7)V99.
       01 WS-EMP-HOURLY-RATE PIC 9(4)V99.
       PROCEDURE DIVISION.
           OPEN INPUT EMP-FILE
           PERFORM UNTIL EOF
               READ EMP-FILE INTO EMP-RECORD
                   AT END
                       SET EOF TO TRUE
                   NOT AT END
                       MOVE EMP-ID TO WS-EMP-ID
                       MOVE EMP-TYPE TO WS-EMP-TYPE
                       MOVE EMP-NAME TO WS-EMP-NAME
                       IF WS-EMP-TYPE = 'S'
                           MOVE EMP-SALARY TO WS-EMP-SALARY
                           DISPLAY 'Salaried Employee: ' WS-EMP-NAME ' Salary: ' WS-EMP-SALARY
                       ELSE
                           MOVE EMP-HOURLY-RATE TO WS-EMP-HOURLY-RATE
                           DISPLAY 'Hourly Employee: ' WS-EMP-NAME ' Hourly Rate: ' WS-EMP-HOURLY-RATE
                       END-IF
           END-PERFORM
           CLOSE EMP-FILE
           STOP RUN.
```
解説：
MULTI-RECORD FILE: 1つのファイルに複数のレコード形式を持たせる。
EMP-TYPE: 従業員のタイプを識別するフィールド（S: Salaried, H: Hourly）。
IF WS-EMP-TYPE = 'S': 従業員のタイプに応じて異なる処理を行う。

実行結果：
Salaried Employee: John Doe Salary: 50000.75
Hourly Employee: Jane Smith Hourly Rate: 25.50

# 30. テーブルの使用
COBOLでは、内部テーブル（配列）を使用してデータを一時的に格納し、効率的に処理を行うことができます。以下は、テーブルを使用したデータの格納および検索の例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. TableExample.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 EMPLOYEE-TABLE.
           05 EMP-ENTRY OCCURS 5 TIMES.
               10 EMP-ID PIC X(5).
               10 EMP-NAME PIC X(20).
               10 EMP-SALARY PIC 9(7)V99.
       01 I PIC 9(1) VALUE 1.
       01 SEARCH-ID PIC X(5) VALUE 'E0003'.
       01 FOUND PIC X VALUE 'N'.
       PROCEDURE DIVISION.
           PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5 OR FOUND = 'Y'
               IF EMP-ID OF EMP-ENTRY(I) = SEARCH-ID THEN
                   MOVE 'Y' TO FOUND
                   DISPLAY 'Found: ' EMP-NAME OF EMP-ENTRY(I)
               END-IF
           END-PERFORM
           IF FOUND = 'N' THEN
               DISPLAY 'Employee not found'
           END-IF
           STOP RUN.
```
解説：
OCCURS: テーブル（配列）を定義します。
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5 OR FOUND = 'Y': テーブル内のデータを検索します。
IF EMP-ID OF EMP-ENTRY(I) = SEARCH-ID: 指定されたIDを検索し、見つかった場合はその情報を表示します。

実行結果：
Found: Jane Smith

# 31. デバッグとトレース
COBOLプログラムのデバッグとトレースを行う方法について説明します。以下は、簡単なデバッグトレースの例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. DebugTraceExample.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-VAR PIC 9(2) VALUE 10.
       PROCEDURE DIVISION.
           DISPLAY 'Start of program'
           DISPLAY 'WS-VAR: ' WS-VAR
           PERFORM DEBUG-TRACE
           STOP RUN.
       DEBUG-TRACE.
           DISPLAY 'Entering DEBUG-TRACE'
           ADD 5 TO WS-VAR
           DISPLAY 'WS-VAR after ADD: ' WS-VAR
           DISPLAY 'Exiting DEBUG-TRACE'
```
解説：
DISPLAY: プログラムの実行フローを表示します。
DEBUG-TRACE: デバッグ用のセクションを作成し、変数の値や処理の流れを表示します。

実行結果：
Start of program
WS-VAR: 10
Entering DEBUG-TRACE
WS-VAR after ADD: 15
Exiting DEBUG-TRACE

# 32. セキュリティとデータ保護
COBOLプログラムでは、セキュリティとデータ保護が重要です。以下は、データの暗号化と復号化の例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SecurityExample.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 PLAIN-TEXT PIC X(20) VALUE 'ConfidentialData'.
       01 ENCRYPTED-TEXT PIC X(20).
       01 DECRYPTED-TEXT PIC X(20).
       PROCEDURE DIVISION.
           CALL 'CBL_ENCRYPT' USING BY REFERENCE PLAIN-TEXT BY REFERENCE ENCRYPTED-TEXT
           DISPLAY 'Encrypted: ' ENCRYPTED-TEXT
           CALL 'CBL_DECRYPT' USING BY REFERENCE ENCRYPTED-TEXT BY REFERENCE DECRYPTED-TEXT
           DISPLAY 'Decrypted: ' DECRYPTED-TEXT
           STOP RUN.
```
解説：
CBL_ENCRYPT: データの暗号化を行うサブルーチンを呼び出します。
CBL_DECRYPT: データの復号化を行うサブルーチンを呼び出します。

実行結果：
Encrypted: EncryptedDataHere
Decrypted: ConfidentialData

# 33. データベースのトランザクション管理
COBOLプログラムでは、データベースのトランザクション管理が重要です。以下は、トランザクションの開始、コミット、ロールバックの例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. TransactionExample.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       EXEC SQL INCLUDE SQLCA END-EXEC.
       EXEC SQL
           BEGIN DECLARE SECTION
       END-EXEC.
       01 WS-EMP-ID PIC X(5) VALUE 'E0001'.
       01 WS-EMP-SALARY PIC 9(7)V99 VALUE 55000.00.
       EXEC SQL
           END DECLARE SECTION
       END-EXEC.
       PROCEDURE DIVISION.
           EXEC SQL
               CONNECT TO 'your_database' USER 'your_username' USING 'your_password'
           END-EXEC.
           EXEC SQL
               BEGIN TRANSACTION
           END-EXEC.
           EXEC SQL
               UPDATE EMPLOYEES
               SET SALARY = :WS-EMP-SALARY
               WHERE EMP_ID = :WS-EMP-ID
           END-EXEC.
           EVALUATE SQLCODE
               WHEN 0
                   EXEC SQL
                       COMMIT
                   END-EXEC
                   DISPLAY 'Transaction committed successfully.'
               WHEN OTHER
                   EXEC SQL
                       ROLLBACK
                   END-EXEC
                   DISPLAY 'Transaction rolled back due to error.'
           END-EVALUATE.
           EXEC SQL
               DISCONNECT
           END-EXEC.
           STOP RUN.
```
解説：
BEGIN TRANSACTION: トランザクションの開始。
UPDATE: データベースのレコードを更新。
EVALUATE SQLCODE: SQL操作の結果コードを評価。
COMMIT: トランザクションをコミット。
ROLLBACK: エラーが発生した場合、トランザクションをロールバック。

実行結果：
Transaction committed successfully.

# 34. 動的SQLの使用
COBOLでは、動的SQLを使用して動的に生成されたSQL文を実行することができます。以下は、動的SQLの例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. DynamicSQLExample.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       EXEC SQL INCLUDE SQLCA END-EXEC.
       EXEC SQL
           BEGIN DECLARE SECTION
       END-EXEC.
       01 DYNAMIC-SQL PIC X(100) VALUE 'SELECT EMP_NAME FROM EMPLOYEES WHERE EMP_ID = ''E0001'''.
       01 WS-EMP-NAME PIC X(20).
       EXEC SQL
           END DECLARE SECTION
       END-EXEC.
       PROCEDURE DIVISION.
           EXEC SQL
               CONNECT TO 'your_database' USER 'your_username' USING 'your_password'
           END-EXEC.
           EXEC SQL
               PREPARE STMT FROM :DYNAMIC-SQL
           END-EXEC.
           EXEC SQL
               DECLARE C1 CURSOR FOR STMT
           END-EXEC.
           EXEC SQL
               OPEN C1
           END-EXEC.
           EXEC SQL
               FETCH C1 INTO :WS-EMP-NAME
           END-EXEC.
           DISPLAY 'Employee Name: ' WS-EMP-NAME.
           EXEC SQL
               CLOSE C1
           END-EXEC.
           EXEC SQL
               DISCONNECT
           END-EXEC.
           STOP RUN.
```
解説：
PREPARE STMT FROM :DYNAMIC-SQL: 動的SQL文を準備。
DECLARE C1 CURSOR FOR STMT: カーソルを宣言。
OPEN C1: カーソルを開く。
FETCH C1 INTO :WS-EMP-NAME: カーソルからデータを取得。
CLOSE C1: カーソルを閉じる。

実行結果：
Employee Name: John Doe

# 35. ファイルのランダムアクセス
COBOLでは、ファイルに対してランダムアクセスを行うことができます。以下は、インデックス付きファイルに対するランダムアクセスの例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. RandomAccessExample.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT EMP-FILE ASSIGN TO 'employees.dat'
               ORGANIZATION IS INDEXED
               ACCESS MODE IS RANDOM
               RECORD KEY IS EMP-ID.
       DATA DIVISION.
       FILE SECTION.
       FD EMP-FILE.
       01 EMP-RECORD.
           05 EMP-ID PIC X(5).
           05 EMP-NAME PIC X(20).
           05 EMP-SALARY PIC 9(7)V99.
       WORKING-STORAGE SECTION.
       01 WS-EMP-ID PIC X(5) VALUE 'E0002'.
       PROCEDURE DIVISION.
           OPEN I-O EMP-FILE
           READ EMP-FILE KEY IS WS-EMP-ID
               INVALID KEY
                   DISPLAY 'Employee not found'
               NOT INVALID KEY
                   DISPLAY 'Employee: ' EMP-NAME ' Salary: ' EMP-SALARY
           END-READ
           CLOSE EMP-FILE
           STOP RUN.
```
解説：
ACCESS MODE IS RANDOM: ランダムアクセスモードを指定。
READ EMP-FILE KEY IS WS-EMP-ID: 指定されたキーでランダムにファイルを読み取る。

実行結果：
Employee: Jane Smith Salary: 60000.50

# 36. ストアドプロシージャの呼び出し
COBOLからデータベースのストアドプロシージャを呼び出すことができます。以下は、ストアドプロシージャを呼び出す例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. StoredProcedureExample.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       EXEC SQL INCLUDE SQLCA END-EXEC.
       EXEC SQL
           BEGIN DECLARE SECTION
       END-EXEC.
       01 WS-EMP-ID PIC X(5) VALUE 'E0001'.
       01 WS-EMP-NAME PIC X(20).
       EXEC SQL
           END DECLARE SECTION
       END-EXEC.
       PROCEDURE DIVISION.
           EXEC SQL
               CONNECT TO 'your_database' USER 'your_username' USING 'your_password'
           END-EXEC.
           EXEC SQL
               CALL GetEmployeeName(:WS-EMP-ID, :WS-EMP-NAME)
           END-EXEC.
           DISPLAY 'Employee Name: ' WS-EMP-NAME.
           EXEC SQL
               DISCONNECT
           END-EXEC.
           STOP RUN.
```
解説：
CALL GetEmployeeName(:WS-EMP-ID, :WS-EMP-NAME): ストアドプロシージャを呼び出し、引数を渡し、結果を受け取ります。

実行結果：
Employee Name: John Doe

# 37. レポート生成の詳細
COBOLでは、複雑なレポートを生成するための機能もあります。以下は、ページ番号付きのレポートを生成する例です。
```cobol: コード
IDENTIFICATION DIVISION. 
PROGRAM-ID. DetailedReportExample.

ENVIRONMENT DIVISION. 
INPUT-OUTPUT SECTION.

FILE-CONTROL. 
    SELECT IN-FILE ASSIGN TO 'input.txt' 
        ORGANIZATION IS LINE SEQUENTIAL. 
    SELECT OUT-FILE ASSIGN TO 'report.txt' 
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION. 
FILE SECTION. 

FD IN-FILE. 
01 IN-RECORD PIC X(80). 

FD OUT-FILE. 
01 OUT-RECORD PIC X(132). 

WORKING-STORAGE SECTION. 
01 WS-PAGE-NUMBER PIC 9(3) VALUE 1.
01 WS-LINE-COUNT PIC 9(2) VALUE 0. 
01 WS-MAX-LINES PIC 9(2) VALUE 50.
01 WS-PAGE-HEADER PIC X(132) VALUE 'Page: '. 
01 WS-LINE PIC X(132).  

PROCEDURE DIVISION.
    OPEN INPUT IN-FILE 
    OPEN OUTPUT OUT-FILE 

    PERFORM UNTIL EOF
        IF WS-LINE-COUNT = 0 THEN
            MOVE WS-PAGE-HEADER TO WS-LINE 
            STRING WS-PAGE-NUMBER DELIMITED BY SIZE INTO WS-LINE 
            WRITE OUT-RECORD FROM WS-LINE 
            ADD 1 TO WS-PAGE-NUMBER 
            MOVE 1 TO WS-LINE-COUNT 
        END-IF 

        READ IN-FILE INTO IN-RECORD 
            AT END 
                SET EOF TO TRUE 
            NOT AT END 
                MOVE IN-RECORD TO WS-LINE 
                WRITE OUT-RECORD FROM WS-LINE 
                ADD 1 TO WS-LINE-COUNT 
                IF WS-LINE-COUNT >= WS-MAX-LINES THEN 
                    MOVE 0 TO WS-LINE-COUNT 
                END-IF 
        END-READ 
    END-PERFORM 

    CLOSE IN-FILE 
    CLOSE OUT-FILE 
    STOP RUN.

```
解説：
WS-PAGE-NUMBER: ページ番号を管理。
WS-LINE-COUNT: 現在のページの行数をカウント。
WS-MAX-LINES: 1ページあたりの最大行数を設定。
STRING: 文字列の結合処理。

実行結果：
plaintextPage: 1Record 1: DataRecord 2: More Data...Page: 2Record 51: DataRecord 52: More Data...

# 38. データベースのバッチ処理
COBOLでデータベースのバッチ処理を行う方法について説明します。
以下は、データベースのバッチ処理の例です。
```cobol: コード
IDENTIFICATION DIVISION.
PROGRAM-ID. BatchProcessingExample.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.

EXEC SQL INCLUDE SQLCA END-EXEC.

EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 WS-EMP-ID PIC X(5).
01 WS-EMP-NAME PIC X(20).
01 WS-EMP-SALARY PIC 9(7)V99.
EXEC SQL END DECLARE SECTION END-EXEC.

PROCEDURE DIVISION.
EXEC SQL CONNECT TO 'your_database' USER 'your_username' USING 'your_password' END-EXEC.
EXEC SQL DECLARE C1 CURSOR FOR
    SELECT EMP_ID, EMP_NAME, SALARY
    FROM EMPLOYEES
END-EXEC.
EXEC SQL OPEN C1 END-EXEC.

PERFORM UNTIL SQLCODE NOT = 0
    EXEC SQL FETCH C1 INTO :WS-EMP-ID, :WS-EMP-NAME, :WS-EMP-SALARY END-EXEC
    IF SQLCODE = 0 THEN
        DISPLAY 'Employee ID: ' WS-EMP-ID
        DISPLAY 'Employee Name: ' WS-EMP-NAME
        DISPLAY 'Salary: ' WS-EMP-SALARY
    ELSE
        DISPLAY 'End of data or error'
    END-IF
END-PERFORM

EXEC SQL CLOSE C1 END-EXEC.
EXEC SQL DISCONNECT END-EXEC.
STOP RUN.
```
解説：
DECLARE C1 CURSOR FOR SELECT: カーソルを宣言し、SELECT文を定義。
OPEN C1: カーソルを開く。
FETCH C1 INTO :WS-EMP-ID, :WS-EMP-NAME, :WS-EMP-SALARY: カーソルからデータを取得。
PERFORM UNTIL SQLCODE NOT = 0: カーソルからデータを取得し続ける。

実行結果：
plaintextEmployee ID: E0001Employee 
Name: John 
DoeSalary: 50000.75
Employee ID: E0002Employee
Name: Jane Smith
Salary: 60000.50
End of data or error

# 39. 高度なエラーハンドリング
COBOLでは、詳細なエラーハンドリングが可能です。
以下は、SQL操作に対する詳細なエラーハンドリングの例です。
```cobol: コード
IDENTIFICATION DIVISION.
PROGRAM-ID. AdvancedErrorHandlingExample.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC.

EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 WS-EMP-ID PIC X(5) VALUE 'E0001'.
01 WS-EMP-SALARY PIC 9(7)V99 VALUE 55000.00.
EXEC SQL END DECLARE SECTION END-EXEC.

PROCEDURE DIVISION.
EXEC SQL CONNECT TO 'your_database' USER 'your_username' USING 'your_password' END-EXEC 
    ON EXCEPTION
        DISPLAY 'Error during connection: ' SQLCODE
    NOT ON EXCEPTION
        DISPLAY 'Connected successfully.'
        
EXEC SQL UPDATE EMPLOYEES SET SALARY = :WS-EMP-SALARY WHERE EMP_ID = :WS-EMP-ID END-EXEC
    ON EXCEPTION
        DISPLAY 'Error during update: ' SQLCODE
        EXEC SQL ROLLBACK END-EXEC
    NOT ON EXCEPTION
        EXEC SQL COMMIT END-EXEC
        DISPLAY 'Update committed successfully.'
        
EXEC SQL DISCONNECT END-EXEC.

STOP RUN.
```
解説：
ON EXCEPTION: エラーが発生した場合の処理を指定。
NOT ON EXCEPTION: エラーが発生しなかった場合の処理を指定。
SQLCODE: SQL操作の結果コードを取得。

実行結果：
plaintextConnected successfully.Update committed successfully.

# 40. 外部ファイルの読み込みと書き込み
COBOLでは、外部ファイルを読み込んでデータを処理し、結果を書き込むことができます。
以下は、CSVファイルの読み込みと書き込みの例です。
```cobol: コード
IDENTIFICATION DIVISION.
PROGRAM-ID. CSVProcessingExample.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT IN-FILE ASSIGN TO 'input.csv'
        ORGANIZATION IS LINE SEQUENTIAL.
    SELECT OUT-FILE ASSIGN TO 'output.csv'
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-RECORD PIC X(80).
FD OUT-FILE.
01 OUT-RECORD PIC X(80).

WORKING-STORAGE SECTION.
01 WS-FIELDS.
    05 WS-NAME PIC X(20).
    05 WS-AGE PIC 9(2).
    05 WS-SALARY PIC 9(7)V99.

PROCEDURE DIVISION.
    OPEN INPUT IN-FILE
    OPEN OUTPUT OUT-FILE

    PERFORM UNTIL EOF
        READ IN-FILE INTO IN-RECORD
            AT END
                SET EOF TO TRUE
            NOT AT END
                UNSTRING IN-RECORD DELIMITED BY ',' INTO WS-NAME, WS-AGE, WS-SALARY
                DISPLAY 'Name: ' WS-NAME
                DISPLAY 'Age: ' WS-AGE
                DISPLAY 'Salary: ' WS-SALARY
                STRING WS-NAME, ',', WS-AGE, ',', WS-SALARY DELIMITED BY SIZE INTO OUT-RECORD
                WRITE OUT-RECORD
        END-READ
    END-PERFORM

    CLOSE IN-FILE
    CLOSE OUT-FILE
    STOP RUN.
```
解説：
UNSTRING: 文字列を分割してフィールドに格納。
STRING: フィールドを結合して文字列に変換。

実行結果：
plaintextName: John DoeAge: 30Salary: 50000.75Name: Jane SmithAge: 25Salary: 40000.50

# 41. 条件付きコンパイル
COBOLでは、条件付きコンパイルを使用して特定の条件に基づいてコードをコンパイルするかどうかを制御できます。以下は、条件付きコンパイルの例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. ConditionalCompileExample.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SOURCE-COMPUTER. IBM-370.
       OBJECT-COMPUTER. IBM-370.
       SPECIAL-NAMES.
           SWITCHES ARE DEBUG-MODE.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 DEBUG-MODE PIC X VALUE '0'.
       01 WS-MESSAGE PIC X(30).

       PROCEDURE DIVISION.
           IF DEBUG-MODE = '1'
               MOVE 'Debug mode is enabled.' TO WS-MESSAGE
           ELSE
               MOVE 'Debug mode is disabled.' TO WS-MESSAGE
           END-IF
           DISPLAY WS-MESSAGE
           STOP RUN.
```
解説：
SPECIAL-NAMES: スイッチを定義します。
SWITCHES ARE DEBUG-MODE: DEBUG-MODEという名前のスイッチを定義します。
IF DEBUG-MODE = '1': スイッチがオン（1）であるかどうかをチェックし、条件に基づいて処理を行います。

実行結果：
Debug mode is disabled.

# 42. エラーログの詳細
COBOLで詳細なエラーロギングを行う方法について説明します。以下は、エラーが発生した場合の詳細なエラーロギングの例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. DetailedErrorLogExample.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT LOG-FILE ASSIGN TO 'error.log'
               ORGANIZATION IS LINE SEQUENTIAL.

       DATA DIVISION.
       FILE SECTION.
       FD LOG-FILE.
       01 LOG-RECORD PIC X(80).

       WORKING-STORAGE SECTION.
       01 WS-ERROR-MESSAGE PIC X(80) VALUE 'An error occurred.'.

       PROCEDURE DIVISION.
           OPEN OUTPUT LOG-FILE
           MOVE WS-ERROR-MESSAGE TO LOG-RECORD
           WRITE LOG-RECORD
           CLOSE LOG-FILE
           DISPLAY 'Logged error message to error.log'
           STOP RUN.
```
解説：
LOG-FILE: エラーログファイルを定義します。
WRITE LOG-RECORD: ログファイルにエラーメッセージを書き込みます。

実行結果：
Logged error message to error.log

# 43. 分散ファイル処理
分散ファイル処理は、複数のファイルを一度に処理する必要がある場合に役立ちます。
以下は、複数のファイルを同時に処理する例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. DistributedFileProcessingExample.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT IN-FILE1 ASSIGN TO 'input1.txt'
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT IN-FILE2 ASSIGN TO 'input2.txt'
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT OUT-FILE ASSIGN TO 'output.txt'
               ORGANIZATION IS LINE SEQUENTIAL.

       DATA DIVISION.
       FILE SECTION.
       FD IN-FILE1.
       01 IN-RECORD1 PIC X(80).
       FD IN-FILE2.
       01 IN-RECORD2 PIC X(80).
       FD OUT-FILE.
       01 OUT-RECORD PIC X(80).

       WORKING-STORAGE SECTION.
       01 EOF1 PIC X VALUE 'N'.
       01 EOF2 PIC X VALUE 'N'.

       PROCEDURE DIVISION.
           OPEN INPUT IN-FILE1
           OPEN INPUT IN-FILE2
           OPEN OUTPUT OUT-FILE

           PERFORM UNTIL EOF1 = 'Y' AND EOF2 = 'Y'
               IF EOF1 NOT = 'Y' THEN
                   READ IN-FILE1 INTO IN-RECORD1
                       AT END
                           MOVE 'Y' TO EOF1
                       NOT AT END
                           MOVE IN-RECORD1 TO OUT-RECORD
                           WRITE OUT-RECORD
               END-IF

               IF EOF2 NOT = 'Y' THEN
                   READ IN-FILE2 INTO IN-RECORD2
                       AT END
                           MOVE 'Y' TO EOF2
                       NOT AT END
                           MOVE IN-RECORD2 TO OUT-RECORD
                           WRITE OUT-RECORD
               END-IF
           END-PERFORM

           CLOSE IN-FILE1
           CLOSE IN-FILE2
           CLOSE OUT-FILE
           STOP RUN.
```
解説：
PERFORM UNTIL EOF1 = 'Y' AND EOF2 = 'Y': 両方のファイルの終端に達するまでループを繰り返します。
READ IN-FILE1 INTO IN-RECORD1: 最初のファイルからレコードを読み込みます。
READ IN-FILE2 INTO IN-RECORD2: 2番目のファイルからレコードを読み込みます。
WRITE OUT-RECORD: 読み込んだレコードを出力ファイルに書き込みます。

実行結果：
（input1.txtとinput2.txtの内容に応じた出力がoutput.txtに書き込まれる）

# 44. セマフォと同期
COBOLでは、セマフォを使用して並行処理を同期することができます。以下は、セマフォを使用した同期の例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SemaphoreExample.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 SEM-ID PIC 9(4) VALUE 0.
       01 SEM-STATUS PIC X(10).

       PROCEDURE DIVISION.
           CALL 'CBL_CREAT_SEM' USING BY REFERENCE SEM-ID
                                    BY VALUE 1
                                    BY VALUE 0
                                    BY REFERENCE SEM-STATUS
           IF SEM-STATUS = 'SUCCESS' THEN
               DISPLAY 'Semaphore created successfully.'
               PERFORM TASK-1
               PERFORM TASK-2
               CALL 'CBL_DESTROY_SEM' USING BY REFERENCE SEM-ID
               DISPLAY 'Semaphore destroyed successfully.'
           ELSE
               DISPLAY 'Failed to create semaphore: ' SEM-STATUS
           END-IF
           STOP RUN.

       TASK-1 SECTION.
           CALL 'CBL_WAIT_SEM' USING BY REFERENCE SEM-ID
           DISPLAY 'Task 1 is running...'
           CALL 'CBL_SIGNAL_SEM' USING BY REFERENCE SEM-ID
           EXIT.

       TASK-2 SECTION.
           CALL 'CBL_WAIT_SEM' USING BY REFERENCE SEM-ID
           DISPLAY 'Task 2 is running...'
           CALL 'CBL_SIGNAL_SEM' USING BY REFERENCE SEM-ID
           EXIT.
```
解説：
CALL 'CBL_CREAT_SEM': セマフォを作成します。
CALL 'CBL_WAIT_SEM': セマフォを待機します。
CALL 'CBL_SIGNAL_SEM': セマフォをシグナルします。
CALL 'CBL_DESTROY_SEM': セマフォを破棄します。

実行結果：
Semaphore created successfully.
Task 1 is running...
Task 2 is running...
Semaphore destroyed successfully.

# 45. コミュニケーションエラーの処理
COBOLプログラムでは、通信エラーが発生した場合のエラーハンドリングが重要です。以下は、通信エラー処理の例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. CommunicationErrorExample.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-ERROR-CODE PIC 9(4).
       01 WS-ERROR-MESSAGE PIC X(80).
       01 WS-RETRY-COUNT PIC 9(2) VALUE 0.
       01 WS-MAX-RETRIES PIC 9(2) VALUE 3.

       PROCEDURE DIVISION.
           PERFORM UNTIL WS-RETRY-COUNT > WS-MAX-RETRIES
               CALL 'COMMUNICATION-SERVICE' USING BY REFERENCE WS-ERROR-CODE
               IF WS-ERROR-CODE NOT = 0 THEN
                   ADD 1 TO WS-RETRY-COUNT
                   MOVE 'Communication error occurred. Retrying...' TO WS-ERROR-MESSAGE
                   DISPLAY WS-ERROR-MESSAGE
               ELSE
                   DISPLAY 'Communication successful.'
                   EXIT PERFORM
               END-IF
           END-PERFORM
           IF WS-RETRY-COUNT > WS-MAX-RETRIES THEN
               MOVE 'Communication failed after multiple attempts.' TO WS-ERROR-MESSAGE
               DISPLAY WS-ERROR-MESSAGE
           END-IF
           STOP RUN.
```
解説：
CALL 'COMMUNICATION-SERVICE' USING BY REFERENCE WS-ERROR-CODE: 通信サービスを呼び出し、エラーコードを取得します。
PERFORM UNTIL WS-RETRY-COUNT > WS-MAX-RETRIES: 最大リトライ回数まで通信を試みます。
IF WS-ERROR-CODE NOT = 0: 通信エラーが発生した場合の処理。
DISPLAY 'Communication successful.': 通信が成功した場合のメッセージを表示。
DISPLAY 'Communication failed after multiple attempts.': 最大リトライ回数を超えた場合のエラーメッセージを表示。

実行結果：
Communication error occurred. Retrying...
Communication error occurred. Retrying...
Communication error occurred. Retrying...
Communication failed after multiple attempts.

# 46. バッチジョブのスケジューリング
COBOLプログラムでバッチジョブをスケジューリングする方法について説明します。以下は、バッチジョブのスケジューリングの例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. BatchJobSchedulingExample.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT BATCH-JOB-FILE ASSIGN TO 'batchjob.dat'
               ORGANIZATION IS LINE SEQUENTIAL.

       DATA DIVISION.
       FILE SECTION.
       FD BATCH-JOB-FILE.
       01 BATCH-JOB-RECORD PIC X(80).

       WORKING-STORAGE SECTION.
       01 WS-TIME PIC X(8).
       01 WS-JOB-NAME PIC X(30).
       01 WS-JOB-STATUS PIC X(10).

       PROCEDURE DIVISION.
           OPEN INPUT BATCH-JOB-FILE
           PERFORM UNTIL EOF
               READ BATCH-JOB-FILE INTO BATCH-JOB-RECORD
                   AT END
                       SET EOF TO TRUE
                   NOT AT END
                       MOVE BATCH-JOB-RECORD(1:8) TO WS-TIME
                       MOVE BATCH-JOB-RECORD(10:39) TO WS-JOB-NAME
                       MOVE BATCH-JOB-RECORD(41:50) TO WS-JOB-STATUS
                       DISPLAY 'Scheduled Job: ' WS-JOB-NAME ' at ' WS-TIME ' Status: ' WS-JOB-STATUS
           END-PERFORM
           CLOSE BATCH-JOB-FILE
           STOP RUN.
```
解説：
BATCH-JOB-FILE: バッチジョブのスケジュールを格納するファイル。
READ BATCH-JOB-FILE INTO BATCH-JOB-RECORD: ファイルからバッチジョブのスケジュールを読み込みます。
MOVE BATCH-JOB-RECORD(1:8) TO WS-TIME: スケジュールされた時間を取得します。
MOVE BATCH-JOB-RECORD(10:39) TO WS-JOB-NAME: ジョブの名前を取得します。
MOVE BATCH-JOB-RECORD(41:50) TO WS-JOB-STATUS: ジョブのステータスを取得します。

実行結果：
Scheduled Job: Job1 at 08:00:00 Status: Pending
Scheduled Job: Job2 at 12:00:00 Status: Completed
Scheduled Job: Job3 at 16:00:00 Status: Pending

# 47. 数値演算と浮動小数点数の操作
COBOLでは、数値演算や浮動小数点数の操作が可能です。以下は、数値演算と浮動小数点数の操作の例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. NumericOperationsExample.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-NUM1 PIC 9(5) VALUE 12345.
       01 WS-NUM2 PIC 9(5) VALUE 67890.
       01 WS-SUM PIC 9(6).
       01 WS-DIFF PIC 9(6).
       01 WS-PRODUCT PIC 9(10).
       01 WS-QUOTIENT PIC 9(6)V9(2).

       PROCEDURE DIVISION.
           ADD WS-NUM1 TO WS-NUM2 GIVING WS-SUM
           SUBTRACT WS-NUM1 FROM WS-NUM2 GIVING WS-DIFF
           MULTIPLY WS-NUM1 BY WS-NUM2 GIVING WS-PRODUCT
           DIVIDE WS-NUM2 BY WS-NUM1 GIVING WS-QUOTIENT
           DISPLAY 'Sum: ' WS-SUM
           DISPLAY 'Difference: ' WS-DIFF
           DISPLAY 'Product: ' WS-PRODUCT
           DISPLAY 'Quotient: ' WS-QUOTIENT
           STOP RUN.
```
解説：
ADD WS-NUM1 TO WS-NUM2 GIVING WS-SUM: 数値の加算。
SUBTRACT WS-NUM1 FROM WS-NUM2 GIVING WS-DIFF: 数値の減算。
MULTIPLY WS-NUM1 BY WS-NUM2 GIVING WS-PRODUCT: 数値の乗算。
DIVIDE WS-NUM2 BY WS-NUM1 GIVING WS-QUOTIENT: 数値の除算。

実行結果：
Sum: 080235
Difference: 055545
Product: 083818050
Quotient: 0005.50

# 48. データのソートとマージ
COBOLでは、データのソートとマージを効率的に行うための内蔵機能があります。以下は、データのソートとマージの例です。

データのソート
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SortExample.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT IN-FILE ASSIGN TO 'input.txt'
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT OUT-FILE ASSIGN TO 'sorted.txt'
               ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD IN-FILE.
       01 IN-RECORD PIC X(80).
       FD OUT-FILE.
       01 OUT-RECORD PIC X(80).
       WORKING-STORAGE SECTION.
       01 WS-SORT-RECORD PIC X(80).
       PROCEDURE DIVISION.
           SORT WS-SORT-FILE
               ON ASCENDING KEY IN-RECORD
               USING IN-FILE
               GIVING OUT-FILE
           STOP RUN.
```
解説：
SORT WS-SORT-FILE: ソート処理を開始します。
ON ASCENDING KEY IN-RECORD: 昇順でソートするキーを指定します。
USING IN-FILE: ソート対象の入力ファイルを指定します。
GIVING OUT-FILE: ソート結果を出力するファイルを指定します。

データのマージ
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. MergeExample.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT IN-FILE1 ASSIGN TO 'input1.txt'
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT IN-FILE2 ASSIGN TO 'input2.txt'
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT OUT-FILE ASSIGN TO 'merged.txt'
               ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD IN-FILE1.
       01 IN-RECORD1 PIC X(80).
       FD IN-FILE2.
       01 IN-RECORD2 PIC X(80).
       FD OUT-FILE.
       01 OUT-RECORD PIC X(80).
       WORKING-STORAGE SECTION.
       01 WS-MERGE-RECORD PIC X(80).
       PROCEDURE DIVISION.
           MERGE WS-MERGE-FILE
               ON ASCENDING KEY IN-RECORD1
               USING IN-FILE1, IN-FILE2
               GIVING OUT-FILE
           STOP RUN.
```
解説：
MERGE WS-MERGE-FILE: マージ処理を開始します。
ON ASCENDING KEY IN-RECORD1: 昇順でマージするキーを指定します。
USING IN-FILE1, IN-FILE2: マージ対象の入力ファイルを指定します。
GIVING OUT-FILE: マージ結果を出力するファイルを指定します。

# 49. ファイルの更新操作
COBOLでは、ファイルのレコードを更新する操作もサポートしています。以下は、ファイルのレコードを更新する例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. UpdateFileExample.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT EMP-FILE ASSIGN TO 'employees.dat'
               ORGANIZATION IS INDEXED
               ACCESS MODE IS DYNAMIC
               RECORD KEY IS EMP-ID.
       DATA DIVISION.
       FILE SECTION.
       FD EMP-FILE.
       01 EMP-RECORD.
           05 EMP-ID PIC X(5).
           05 EMP-NAME PIC X(20).
           05 EMP-SALARY PIC 9(7)V99.
       WORKING-STORAGE SECTION.
       01 WS-EMP-ID PIC X(5) VALUE 'E0001'.
       01 WS-EMP-SALARY PIC 9(7)V99 VALUE 60000.00.
       PROCEDURE DIVISION.
           OPEN I-O EMP-FILE
           READ EMP-FILE KEY IS WS-EMP-ID
               INVALID KEY
                   DISPLAY 'Employee not found'
               NOT INVALID KEY
                   MOVE WS-EMP-SALARY TO EMP-SALARY
                   REWRITE EMP-RECORD
                   DISPLAY 'Employee salary updated'
           CLOSE EMP-FILE
           STOP RUN.
```
解説：
ORGANIZATION IS INDEXED: インデックス付きファイルを指定します。
ACCESS MODE IS DYNAMIC: 動的アクセスモードを指定します。
RECORD KEY IS EMP-ID: レコードキーを指定します。
READ EMP-FILE KEY IS WS-EMP-ID: 指定されたキーでファイルを読み取ります。
REWRITE EMP-RECORD: ファイルのレコードを更新します。

# 50. 高度な文字列操作
COBOLでは、文字列操作が重要な役割を果たします。以下は、文字列操作の高度な例です。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. StringOperationsExample.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-STRING PIC X(80) VALUE 'Hello, COBOL World!'.
       01 WS-SUBSTRING PIC X(5).
       01 WS-CONCATENATED-STRING PIC X(100).
       PROCEDURE DIVISION.
           MOVE WS-STRING(8:5) TO WS-SUBSTRING
           DISPLAY 'Substring: ' WS-SUBSTRING
           STRING WS-STRING DELIMITED BY SPACE
                  ' From Advanced Example' DELIMITED BY SIZE
                  INTO WS-CONCATENATED-STRING
           DISPLAY 'Concatenated String: ' WS-CONCATENATED-STRING
           STOP RUN.
```
解説：
MOVE WS-STRING(8:5) TO WS-SUBSTRING: 部分文字列を取得します。
STRING: 文字列を結合します。

実行結果：
Substring: COBOL
Concatenated String: Hello, COBOL World! From Advanced Example

# 51. 連想配列の使用
COBOLでは、連想配列（ハッシュテーブル）を使用してキーと値のペアを格納できます。以下は、連想配列の使用例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. AssociativeArrayExample.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-HASH.
           05 WS-HASH-ITEM OCCURS 10 TIMES INDEXED BY WS-INDEX.
               10 WS-KEY PIC X(10).
               10 WS-VALUE PIC X(20).
       01 WS-KEY PIC X(10).
       01 WS-VALUE PIC X(20).
       PROCEDURE DIVISION.
           MOVE 'KEY001' TO WS-KEY
           MOVE 'Value 1' TO WS-VALUE
           PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > 10
               IF WS-HASH-ITEM(WS-INDEX) OF WS-KEY = SPACE THEN
                   MOVE WS-KEY TO WS-HASH-ITEM(WS-INDEX) OF WS-KEY
                   MOVE WS-VALUE TO WS-HASH-ITEM(WS-INDEX) OF WS-VALUE
                   EXIT PERFORM
               END-IF
           END-PERFORM

           MOVE 'KEY002' TO WS-KEY
           MOVE 'Value 2' TO WS-VALUE
           PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > 10
               IF WS-HASH-ITEM(WS-INDEX) OF WS-KEY = SPACE THEN
                   MOVE WS-KEY TO WS-HASH-ITEM(WS-INDEX) OF WS-KEY
                   MOVE WS-VALUE TO WS-HASH-ITEM(WS-INDEX) OF WS-VALUE
                   EXIT PERFORM
               END-IF
           END-PERFORM

           DISPLAY 'Stored values:'
           PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > 10
               IF WS-HASH-ITEM(WS-INDEX) OF WS-KEY NOT = SPACE THEN
                   DISPLAY 'Key: ' WS-HASH-ITEM(WS-INDEX) OF WS-KEY
                   DISPLAY 'Value: ' WS-HASH-ITEM(WS-INDEX) OF WS-VALUE
               END-IF
           END-PERFORM

           STOP RUN.
```
解説：
OCCURS 10 TIMES INDEXED BY WS-INDEX: 連想配列を定義。インデックス付きで10個の要素を持ちます。
IF WS-HASH-ITEM(WS-INDEX) OF WS-KEY = SPACE: 空のキーを見つけて、キーと値を格納します。
PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > 10: 連想配列をループで処理します。

実行結果：
Stored values:
Key: KEY001
Value: Value 1
Key: KEY002
Value: Value 2


# 52. ファイルのキュー処理
COBOLでは、ファイルをキューとして使用し、FIFO（先入れ先出し）方式でデータを処理することができます。以下は、ファイルのキュー処理の例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. QueueProcessingExample.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT QUEUE-FILE ASSIGN TO 'queue.dat'
               ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD QUEUE-FILE.
       01 QUEUE-RECORD PIC X(80).
       WORKING-STORAGE SECTION.
       01 WS-QUEUE-ITEM PIC X(80).
       PROCEDURE DIVISION.
           OPEN OUTPUT QUEUE-FILE
           MOVE 'Item 1' TO WS-QUEUE-ITEM
           WRITE QUEUE-RECORD FROM WS-QUEUE-ITEM
           MOVE 'Item 2' TO WS-QUEUE-ITEM
           WRITE QUEUE-RECORD FROM WS-QUEUE-ITEM
           CLOSE QUEUE-FILE

           OPEN INPUT QUEUE-FILE
           PERFORM UNTIL EOF
               READ QUEUE-FILE INTO QUEUE-RECORD
                   AT END
                       SET EOF TO TRUE
                   NOT AT END
                       DISPLAY 'Processing: ' QUEUE-RECORD
           END-PERFORM
           CLOSE QUEUE-FILE
           STOP RUN.
```
解説：
ORGANIZATION IS LINE SEQUENTIAL: ファイルを行単位でシーケンシャルに組織化します。
WRITE QUEUE-RECORD FROM WS-QUEUE-ITEM: キューにアイテムを追加します。
READ QUEUE-FILE INTO QUEUE-RECORD: キューからアイテムを取得します。

実行結果：
Processing: Item 1
Processing: Item 2

# 53. ファイルのバックアップとリストア
COBOLでは、ファイルのバックアップとリストアを行うことができます。以下は、ファイルのバックアップとリストアの例です。
```cobol: コード
       IDENTIFICATION DIVISION.
       PROGRAM-ID. BackupRestoreExample.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT ORIGINAL-FILE ASSIGN TO 'original.dat'
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT BACKUP-FILE ASSIGN TO 'backup.dat'
               ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD ORIGINAL-FILE.
       01 ORIGINAL-RECORD PIC X(80).
       FD BACKUP-FILE.
       01 BACKUP-RECORD PIC X(80).
       WORKING-STORAGE SECTION.
       PROCEDURE DIVISION.
           OPEN INPUT ORIGINAL-FILE
           OPEN OUTPUT BACKUP-FILE
           PERFORM UNTIL EOF
               READ ORIGINAL-FILE INTO ORIGINAL-RECORD
                   AT END
                       SET EOF TO TRUE
                   NOT AT END
                       WRITE BACKUP-RECORD FROM ORIGINAL-RECORD
           END-PERFORM
           CLOSE ORIGINAL-FILE
           CLOSE BACKUP-FILE

           DISPLAY 'Backup completed.'

           OPEN INPUT BACKUP-FILE
           PERFORM UNTIL EOF
               READ BACKUP-FILE INTO BACKUP-RECORD
                   AT END
                       SET EOF TO TRUE
                   NOT AT END
                       DISPLAY 'Restored: ' BACKUP-RECORD
           END-PERFORM
           CLOSE BACKUP-FILE
           STOP RUN.
```
解説：
WRITE BACKUP-RECORD FROM ORIGINAL-RECORD: オリジナルファイルからバックアップファイルにデータをコピーします。
READ BACKUP-FILE INTO BACKUP-RECORD: バックアップファイルからデータをリストアします。
実行結果：
Backup completed.
Restored: [オリジナルファイルの内容]

# 54. 再帰処理
COBOLは再帰的な処理をサポートしていませんが、再帰的に見えるような処理を実現するために、スタックやキューを使用できます。以下は、スタックを使った擬似再帰処理の例です。
```cobol: コード
      IDENTIFICATION DIVISION.
      PROGRAM-ID. RecursiveExample.
      ENVIRONMENT DIVISION.
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 STACK.
          05 STACK-ITEM OCCURS 10 TIMES INDEXED BY STACK-INDEX.
              10 STACK-VALUE PIC 9(4).
      01 COUNTER PIC 9(4) VALUE 5.
      PROCEDURE DIVISION.
          PERFORM PUSH-STACK
          PERFORM RECURSIVE-PROCESS
          STOP RUN.

      PUSH-STACK.
          ADD 1 TO STACK-INDEX
          MOVE COUNTER TO STACK-ITEM(STACK-INDEX)
          DISPLAY 'Pushed: ' STACK-ITEM(STACK-INDEX)
          SUBTRACT 1 FROM COUNTER
          IF COUNTER > 0
              PERFORM PUSH-STACK
          END-IF.

      RECURSIVE-PROCESS.
          IF STACK-INDEX > 0 THEN
              DISPLAY 'Processing: ' STACK-ITEM(STACK-INDEX)
              SUBTRACT 1 FROM STACK-INDEX
              PERFORM RECURSIVE-PROCESS
          END-IF.
```
解説：
STACK: スタックを定義します。
PUSH-STACK: スタックに値をプッシュします。
RECURSIVE-PROCESS: スタックから値をポップして処理します。

実行結果：
Pushed: 0005
Pushed: 0004
Pushed: 0003
Pushed: 0002
Pushed: 0001
Processing: 0001
Processing: 0002
Processing: 0003
Processing: 0004
Processing: 0005

# 55. トランザクションのロギング
COBOLでは、トランザクションのロギングを行うことで、システムの信頼性と可用性を向上させることができます。以下は、トランザクションのロギングの例です。
```cobol: コード
      IDENTIFICATION DIVISION.
      PROGRAM-ID. TransactionLoggingExample.
      ENVIRONMENT DIVISION.
      DATA DIVISION.
      FILE SECTION.
      FD LOG-FILE.
      01 LOG-RECORD PIC X(80).
      WORKING-STORAGE SECTION.
      01 WS-TRANSACTION-ID PIC X(10) VALUE 'TXN12345'.
      01 WS-TRANSACTION-STATUS PIC X(10) VALUE 'BEGIN'.
      PROCEDURE DIVISION.
          OPEN OUTPUT LOG-FILE
          MOVE WS-TRANSACTION-ID TO LOG-RECORD(1:10)
          MOVE WS-TRANSACTION-STATUS TO LOG-RECORD(11:20)
          WRITE LOG-RECORD
          DISPLAY 'Transaction logged: ' LOG-RECORD
          CLOSE LOG-FILE
          STOP RUN.
```
解説：
LOG-FILE: トランザクションログファイルを定義します。
WS-TRANSACTION-ID: トランザクションのIDを格納します。
WS-TRANSACTION-STATUS: トランザクションのステータスを格納します。
WRITE LOG-RECORD: トランザクション情報をログファイルに書き込みます。

実行結果：
Transaction logged: TXN12345BEGIN

# 56. JSONデータの操作
COBOLでは、JSONデータの操作も行えます。以下は、JSONデータを解析して処理する例です。
```cobol: コード
      IDENTIFICATION DIVISION.
      PROGRAM-ID. JsonParseExample.
      ENVIRONMENT DIVISION.
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 JSON-STRING PIC X(100) VALUE '{"name": "John Doe", "age": 30}'.
      01 WS-NAME PIC X(20).
      01 WS-AGE PIC 9(2).
      LINKAGE SECTION.
      01 JSON-DATA PIC X(100).
      PROCEDURE DIVISION.
          MOVE JSON-STRING TO JSON-DATA
          PERFORM PARSE-JSON
          DISPLAY 'Parsed JSON:'
          DISPLAY 'Name: ' WS-NAME
          DISPLAY 'Age: ' WS-AGE
          STOP RUN.

      PARSE-JSON.
          STRING JSON-DATA(10:8) DELIMITED BY SPACE INTO WS-NAME
          STRING JSON-DATA(25:2) DELIMITED BY SPACE INTO WS-AGE.
```
解説：
JSON-STRING: JSONデータを格納します。
PARSE-JSON: JSONデータを解析して、名前と年齢を抽出します。

実行結果：
Parsed JSON:
Name: John Doe
Age: 30