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

ディレクトリ構成
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 — まとめへ