理屈だけ説明されても、実際に動くところを見るまでは腹落ちしない性分なので、今回はサンプルの受発注プログラムを使って一通り動かしてみました。実際の出力を見てもらうのが一番早いと思います。

サンプルプロジェクト構成

COBOLデモサンプルプロジェクト実行図

図1: COBOLデモ — サンプルCOBOLプログラムのCRUD抽出実行

ディレクトリ構成
sample_project/
├── cobol_src/
│   ├── URIAGE-TOROKU.CBL   # 売上登録
│   ├── URIAGE-SHUKEI.CBL   # 売上集計
│   ├── SHOHIN-KANRI.CBL    # 商品管理
│   └── TOKUI-MEISHO.CBL    # 得意先名称更新
└── output/                  # 生成先

サンプルCOBOLソース(抜粋)

COBOL — URIAGE-TOROKU.CBL(抜粋)
       IDENTIFICATION DIVISION.
       PROGRAM-ID. URIAGE-TOROKU.
      *-----------------------------------------------
      * 売上登録プログラム
      *-----------------------------------------------
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           01 WK-TOKUI-CD       PIC X(6).
           01 WK-TOKUI-NM       PIC X(40).
           01 WK-URIAGE-NO      PIC 9(10).
           01 WK-KINGAK         PIC 9(10).
           01 WK-DATE           PIC X(8).
           01 SQLCODE           PIC S9(9) COMP.

       PROCEDURE DIVISION.
       MAIN-PROC.
      *    得意先チェック
           EXEC SQL
               SELECT TOKUI-CD, TOKUI-NM
               INTO :WK-TOKUI-CD, :WK-TOKUI-NM
               FROM TOKUI
               WHERE TOKUI-CD = :WK-INPUT-CD
           END-EXEC.

      *    売上ヘッダ登録
           EXEC SQL
               INSERT INTO URIAGE
                   (URIAGE-NO, TOKUI-CD, URIAGE-DT, KIN-GAK)
               VALUES
                   (:WK-URIAGE-NO, :WK-TOKUI-CD,
                    :WK-DATE, :WK-KINGAK)
           END-EXEC.

      *    明細削除(取消時)
           EXEC SQL
               DELETE FROM MEISAI
               WHERE URIAGE-NO = :WK-URIAGE-NO
           END-EXEC.

           STOP RUN.

ツールの実行

Python — main.py(エントリーポイント)
from cobol_crud import scan_cobol_directory, build_crud_matrix, CrudOutputWriter

def main():
    # STEP 1: COBOLソースをスキャンして SQL を抽出
    scan_results = scan_cobol_directory('./sample_project/cobol_src')

    # STEP 2: CRUD行列を構築
    matrix_result = build_crud_matrix(scan_results)

    # STEP 3: 各形式で出力
    writer = CrudOutputWriter(matrix_result, output_dir='./sample_project/output')
    writer.write_all()

if __name__ == '__main__':
    main()
実行ログ
スキャン完了: 4 プログラムでSQL検出
出力完了: sample_project/output
  → sample_project/output/crud_matrix.md
  → sample_project/output/crud_matrix_mermaid.md
  → sample_project/output/crud_matrix.puml
  → sample_project/output/crud_matrix.json

Markdown出力の確認

crud_matrix.md
| プログラム / テーブル | MEISAI | SHOHIN | TOKUI | URIAGE |
|------------------------|--------|--------|-------|--------|
| SHOHIN-KANRI           |        | CRUD   |       |        |
| TOKUI-MEISHO           |        |        | CU    |        |
| URIAGE-SHUKEI          | R      | R      | R     | R      |
| URIAGE-TOROKU          | RD     | R      | R     | CU     |

💡 URIAGE-TOROKU の MEISAI が RD になっている理由

サンプルでは MEISAI に対して DELETE(D)と、明細一覧取得の SELECT(R)の両方が記述されているため、RD となっています。実際の業務プログラムでは登録前の重複チェックSELECTが加わるケースが多く見られます。

Mermaid出力の確認

crud_matrix_mermaid.md(抜粋)
```mermaid
graph LR
    URIAGE_TOROKU["URIAGE-TOROKU"] -->|R| TOKUI[("TOKUI")]
    URIAGE_TOROKU["URIAGE-TOROKU"] -->|R| SHOHIN[("SHOHIN")]
    URIAGE_TOROKU["URIAGE-TOROKU"] -->|CU| URIAGE[("URIAGE")]
    URIAGE_TOROKU["URIAGE-TOROKU"] -->|RD| MEISAI[("MEISAI")]
    URIAGE_SHUKEI["URIAGE-SHUKEI"] -->|R| TOKUI[("TOKUI")]
    URIAGE_SHUKEI["URIAGE-SHUKEI"] -->|R| SHOHIN[("SHOHIN")]
    URIAGE_SHUKEI["URIAGE-SHUKEI"] -->|R| URIAGE[("URIAGE")]
    URIAGE_SHUKEI["URIAGE-SHUKEI"] -->|R| MEISAI[("MEISAI")]
    SHOHIN_KANRI["SHOHIN-KANRI"]   -->|CRUD| SHOHIN[("SHOHIN")]
    TOKUI_MEISHO["TOKUI-MEISHO"]   -->|CU| TOKUI[("TOKUI")]
```

次の章では…

PART 08(最終回)では静的解析の限界と動的SQLへの対処法、COPY句展開の必要性、CI/CDへの組み込み方法、そしてレガシー移行プロジェクトへの活用について総括します。

→ PART 08 — まとめへ

COBOL CRUD図生成デモでよくある誤り

サンプルコードを実際の環境で動かす際、環境差異や文字コードの問題でエラーが発生しやすいです。

誤り/失敗パターン何が起きるか正しい対処/防止策
COBOLファイルの文字コードをUTF-8と決め打ちする実際のレガシーファイルがShift-JISやEBCDICで書かれており、解析時に文字化けやエラーになるファイルの文字コードをchardetで自動検出するか、環境に合わせてopen()のencodingを明示して処理する
Pythonの実行パスとCOBOLファイルの相対パスを混同するFileNotFoundErrorが発生してどのファイルが見つからないか特定に時間がかかるos.path.abspathやPathlibで絶対パスを使い、ファイル存在チェックをデバッグログとして出力する
サンプルデータで動いたので本番ファイルに即適用する本番COBOLの特殊パターン(動的SQL・COPY REPLACING等)で解析が失敗し、不完全なCRUD図が生成される本番ファイルは少数サンプルから始めてエラーパターンを収集し、対応を追加してから全体適用する