静的解析だけで完璧を目指すと、いつまで経っても着手できません。80〜90%の精度でも十分価値があると割り切れたのは、実際にレガシーCOBOLプロジェクトで手を動かしてからでした。このシリーズの結論はそこに尽きます。
シリーズ総括
図1: COBOL CRUDシリーズ総括 — モダナイゼーション・テスト支援・ドキュメント化への応用
| PART | 内容 | 成果物 |
|---|---|---|
| 01 | CRUD図の目的・シリーズ概要 | — |
| 02 | 静的解析 vs 動的解析・ツール選定 | アプローチ決定 |
| 03 | EXEC SQL〜END-EXEC 抽出実装 | ProgramSqlInfo リスト |
| 04 | JSqlParser / 正規表現でCRUD分類 | CrudEntry リスト |
| 05 | プログラム横断集約・行列構築 | CrudMatrixResult |
| 06 | Markdown・Mermaid・PlantUML出力 | .md / .puml / .json |
| 07 | サンプルプロジェクトでのデモ | 実際のCRUD図 |
| 08 | 限界・改善点・移行活用(本記事) | — |
静的解析の限界
⚠️ 静的解析で対応できないケース
① EXECUTE IMMEDIATE — 文字列変数にSQL全体を代入して動的実行するパターン。変数の中身は実行時にしか確定しない。
② WORKING-STORAGE での SQL 組み立て — STRING WS-SQL ' WHERE ' WS-COND DELIMITED SIZE INTO WS-STMT のような文字列連結。
③ COPY 句経由のSQL — EXEC SQL COPY URIAGE-SELECT END-EXEC のようにCOPY句でSQL全体を取り込むパターン。COPY展開が必要。
実際の経験では、レガシーCOBOLの全SQLの 80〜90%は静的SQL であり、このツールだけでも十分な価値があります。
COPY句展開への対応
import re
from pathlib import Path
def expand_copy(source: str, copy_dir: str) -> str:
"""
COPY句をコピーライブラリの内容に展開する(簡易版)。
COPY ライブラリ名. → ライブラリファイルの内容に置換
"""
copy_pattern = re.compile(
r'^\s{6}\s+COPY\s+([A-Z][A-Z0-9-]*)\s*\.',
re.IGNORECASE | re.MULTILINE
)
copy_base = Path(copy_dir)
def replace_copy(m):
lib_name = m.group(1).upper()
for ext in ('.cpy', '.CPY', '.cbl', '.CBL'):
lib_file = copy_base / (lib_name + ext)
if lib_file.exists():
return lib_file.read_text(encoding='cp932', errors='replace')
return m.group(0) # 見つからない場合はそのまま
return copy_pattern.sub(replace_copy, source)
動的SQLへの対処
CI/CDへの組み込み
name: Generate COBOL CRUD Matrix
on:
push:
paths:
- 'cobol_src/**/*.CBL'
- 'cobol_src/**/*.cbl'
jobs:
crud-gen:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Generate CRUD matrix
run: |
python -m pip install --quiet .
python main.py
- name: Commit CRUD matrix
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: 'docs: update COBOL CRUD matrix [skip ci]'
file_pattern: 'output/crud_matrix.*'
レガシー移行プロジェクトへの活用
このツールが最も力を発揮するのは、COBOL→Javaマイグレーション等のレガシー移行プロジェクトです。
次のステップ
✅ さらに発展させるには
① COBOL可視化シリーズとの統合 — COBOL可視化シリーズで生成したParagraph Call GraphとCRUD図を組み合わせることで「どのParagraphがどのテーブルにアクセスするか」という更に詳細な分析が可能になる。
② Java版CRUD図との比較 — Java CRUD図生成シリーズと同じ出力形式(Markdown・Mermaid)を採ることで、COBOL版とJava版の移行対応状況を横並びで比較できる。
③ Webダッシュボード化 — JSON出力をJavaScriptで読み込みインタラクティブなフィルタ付き行列ビューとして提供することで、非エンジニアのステークホルダーへの説明資料として活用できる。
COBOL CRUD図生成の総まとめでよくある誤り
CRUD図生成ツールの導入後、運用・活用フェーズで陥りやすいミスを整理します。
| 誤り/失敗パターン | 何が起きるか | 正しい対処/防止策 |
|---|---|---|
| ソース変更のたびにCRUD図を手動で更新する | 更新漏れが生じてCRUD図が実態と乖離し、設計資料として信頼できなくなる | CI/CDパイプラインにCRUD図生成ステップを組み込み、ソース変更時に自動再生成してリポジトリにコミットする |
| CRUD図の精度が100%でないと使えないと考える | 動的SQL等の限界を理由に導入を先送りし、手動管理の現状維持が続く | 80〜90%の精度でも動的SQL部分を手動補完することで、手動管理より大幅に正確なCRUD図を維持できる |
| CRUD図を作成したまま活用方法を定義しない | 「とりあえず作った」状態になり、移行計画や影響調査への活用に結びつかない | CRUD図の用途(影響範囲分析・移行優先度判定・テスト設計)を事前に定義し、具体的な活用シナリオで利用する |