サンプルプロジェクト構成
sample_project/
├── cobol_src/
│ ├── URIAGE-TOROKU.CBL # 売上登録
│ ├── URIAGE-SHUKEI.CBL # 売上集計
│ ├── SHOHIN-KANRI.CBL # 商品管理
│ └── TOKUI-MEISHO.CBL # 得意先名称更新
└── output/ # 生成先
サンプルCOBOLソース(抜粋)
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.
ツールの実行
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への組み込み方法、そしてレガシー移行プロジェクトへの活用について総括します。