| 落とし穴 | 具体的な事象 | 影響度 | 実案件例 | 対策 |
| 和暦・西暦の混在 |
COBOLではPIC X(8)で「令和06年03月15日」と格納、JavaのLocalDateへ変換時に元号切替(2026年改元リスク)に非対応 |
不正確な満期日計算→損害賠償 |
某生保の満期給付システムで、平成→令和切替時に2,300件の給付日誤算 |
移行前に元号マスタを外部DB化。Java側でJapaneseDateクラスを使用し、内閣府改元データをリアルタイム連携 |
| 営業日・金融法廷日の判定 |
COBOL内にハードコードされた祝日テーブル(1990-2020年)。Java移行後、2025年以降の祝日(スポーツの日移動)が未更新 |
振込処理の営業日ズレ→顧客クレーム |
某地方銀行の振込システムで、2024年東京オリンピック特別休日を判定できず18件の遅延 |
日本銀行協会の「金融機関向け営業日API」を標準採用。COBOLの祝日ロジックは廃止とし、外部サービス依存とする |
| 月末・四半期末の切替タイミング |
COBOLのACCEPT FROM DATEは時刻23:59:59.999で切替、Javaのnew Date()は00:00:00基準。日次レポート集計で1秒差が生じ残高不一致 |
決算短信の數値が1円単位で合わず、監査指摘 |
某メガバンクの総勘定元帳システムで、四半期末の1秒差で60億円の残高差 |
Java側でCOBOL互換タイムスタンプクラスを作成。COBOLTimestamp.valueOf("2025-12-31 23:59:59.999")で統一 |
| 落とし穴 | 具体的な事象 | 影響度 | 実案件例 | 対策 |
| 端数処理(切捨て・切上げ・四捨五入) |
COBOLのCOMP-3(Packed Decimal)とJavaのBigDecimalで、小数点第3位の丸めロジックが微妙に異なる |
利子計算で0.01円差が10万口座集計で1,000円の損益差 |
某信託銀行の運用益計算システムで、10年分の誤算が発覚(累積3.2億円) |
①金融庁「顧計法」準拠の端数処理ユーティリティをJava側に独立ライブラリ化 ②COBOLとJavaで同一テストケース(10,000パターン)を実施し、差分ゼロを確認 |
| 金利計算の日数カウント(実日数・30/360) |
COBOLの日数カウントロジックは閏年の2/29をACCEPT FROM DAY-OF-WEEKで判定。Javaのjava.time.temporal.ChronoUnitはロケール依存 |
公社債の accrued interest 誤算 → 市場不正疑い |
某証券の債券管理システムで、閏年のaccrued interestが0.01%ずれ、顧客から指摘 |
日数計算エンジンを完全分離。COBOLの独自アルゴリズムをJavaにそのまま移植し、機械的変換は行わない |
| 税抜・税込計算の順序 |
消費税8%→10%切替時のCOBOLコードに、IF TRANSACTION-DATE < 20191001というマジックナンバーが残存。Java移行時に切替ロジックを誤認識 |
税率誤適用→脱税リスク |
某損保の自動車保険システムで、契約更新時の税率適用ミスで2億円の追徴税 |
税率マスタを外部化。Javaでは税率適用日付を引数として純粋関数で計算。COBOLの税率ロジックは全廃 |
| 落とし穴 | 具体的な事象 | 影響度 | 実案件例 | 対策 |
| レベル88条件名の暗黙的ロジック |
88 正常終了 VALUE '0000' THRU '0999'のような範囲指定。Javaのenumでは表現できず、条件分岐が漏れる |
異常系処理未実行→データ破損 |
某信用金庫の口座振替システムで、終了コード'0999'を異常と判定すべきところ正常扱い |
レベル88は全てJavaのPredicateインターフェースに変換。条件式をコード内にコメントで残し、レビュー時に可視化 |
| OCCURS DEPENDING ON(ODO) |
OCCURS 0 TO 100 TIMES DEPENDING ON カウンターで可変長配列。JavaでArrayListに変換する際、初期容量設定ミスでパフォーマンス劣化 |
オンライン処理で1秒以上の遅延→タイムアウト |
某メガバンクの為替注文システムで、ODO変換後の処理が0.02秒→1.2秒に劣化 |
ODO部分はLinkedListではなく事前サイズ確保のArrayListを使用。COBOLのカウンター最大値を静的解析で事前抽出し、初期容量に設定 |
| VSAMファイルのPrimary/Alternate Key |
COBOLのORGANIZATION IS INDEXEDで定義されたVSAM KSDS。JavaのRDBMS移行時、Alternate Keyのユニーク制約が失われる |
同一キーでの多重登録→データ不整合 |
某生保の契約管理システムで、Alternate Key抜けで契約番号重複登録 |
移行前にVSAM構造を完全可視化。Alternate KeyはユニークインデックスとしてRDBMSに定義。移行後、重複データを一括チェック |
| リ defines(REDEFINES)の暗黙的共用体 |
01 領域 PIC X(100). 01 明細 REDEFINES 領域.のようにメモリ共用。Javaのunionがないため、変換時にクラス設計誤り |
メモリ破壊ではないが、フィールド値の解釈違い→誤表示 |
某損保のレポートシステムで、REDEFINES変換後、金額が文字列として解釈され画面上で乱れ |
REDEFINESは全て明示的なByteBufferラッパーに変換。各interpretationメソッドを分離し、単一責任原則で設計 |
| 落とし穴 | 具体的な事象 | 影響度 | 実案件例 | 対策 |
| GDG(Generation Data Group)の世代管理 |
DSN=HLQ.FILE(+1)のような相対世代指定。JavaのSpring BatchでJobInstanceに変換時、ロールバック時の世代巻き戻しが未実装 |
リカバリー不能→前日データまで遡れず |
某生保の月次請求システムで、GDG巻き戻し失敗で過去6ヶ月分の再作成 |
GDGは全てAmazon S3 Versioning または Git LFSで模倣。世代番号を外部メタデータDBで管理し、ロールバック時に明示的に復元 |
| CONDパラメータの複雑な条件分岐 |
//STEP02 EXEC PGM=...,COND=(4,LT,STEP01)のような前ステップ戻り値判定。Airflow/Python移行時に依存関係誤り |
不要なステップ実行→処理時間2倍、RAID障害時のリカバリー失敗 |
某メガバンクの日次決済バッチで、COND誤変換で32ステップ中8ステップ無駄実行 |
CONDロジックは全て有向グラフ(DAG)として可視化。AirflowのBranchPythonOperatorで完全一致テストを実施 |