財務会計システムの再構築事例 - COBOLコンソーシアム
財務会計システムの再構築事例 - COBOLコンソーシアム
提供元: COBOLコンソーシアム https://share.google/JIMtdKrZRsboRi01Z
のPDF資料を元にChatGPTにCOBOLプログラムを生成させてみた。
了解です。資料(財務会計システムの再構築/COBOL85→COBOL2002、OpenTP1、HiRDB、XMAP3/Web)に沿って、代表的な3本のCOBOLソースを用意しました。
①オンラインTP業務(OpenTP1・セッションID保証・DBIO呼出)
②DBIOモジュール(HiRDBの埋込SQLで仕訳登録)
③JP1バッチ(締処理・エラーハンドリング)
各プログラムはそのまま分割コンパイル可能な構成で、インタフェース名やフィールド名は資料の用語に合わせています(RECEIVE/SEND、DBIOCALL、埋込SQL、EXIT PROGRAM など)。
---
① オンラインTP業務(COBOL2002 / OpenTP1 / セッションID保証)
受信電文に含めた「端末固有情報(セッションID)」を自端末のセッションIDと照合して受信保証(不一致は破棄→次電文受信)
正常時はDBIOへ渡して登録 or 照会し、応答電文を返送
典型的なRECEIVE ... INTO → 業務処理 → SEND ... FROM の流れ
IDENTIFICATION DIVISION.
PROGRAM-ID. ACCT0101-ONLINE.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WK-SESSION.
05 WK-SESSION-ID PIC X(32).
01 RECV-AREA.
05 RECV-HEAD.
10 RECV-SESSION-ID PIC X(32).
10 RECV-MSG-KIND PIC X(02).
05 RECV-DATA.
10 RECV-ACCT-NO PIC X(12).
10 RECV-DEBIT-AC PIC X(10).
10 RECV-CREDIT-AC PIC X(10).
10 RECV-AMOUNT PIC 9(11)V99.
10 RECV-DESC PIC X(40).
01 SEND-AREA.
05 SEND-HEAD.
10 SEND-SESSION-ID PIC X(32).
10 SEND-STATUS PIC X(02).
05 SEND-DATA.
10 SEND-MSG PIC X(60).
01 DBIO-REQ.
05 DBIO-FUNC PIC X(02). *> '01':仕訳登録, '02':残高照会 等
05 DBIO-ACCT-NO PIC X(12).
05 DBIO-DEBIT-AC PIC X(10).
05 DBIO-CREDIT-AC PIC X(10).
05 DBIO-AMOUNT PIC 9(11)V99.
05 DBIO-DESC PIC X(40).
01 DBIO-RES.
05 DBIO-RTNCD PIC 9(04) COMP.
05 DBIO-RTNMSG PIC X(60).
LINKAGE SECTION.
01 TP-CLIENT-INFO.
05 TP-SESSION-ID PIC X(32).
PROCEDURE DIVISION USING TP-CLIENT-INFO.
MAIN-PROC SECTION.
MAIN-PROC-000.
MOVE TP-SESSION-ID TO WK-SESSION-ID
*> ---- 受信保証:セッションID一致までループ ----
PERFORM UNTIL RECV-SESSION-ID = WK-SESSION-ID
RECEIVE RECV-INF FIRST SEGMENT INTO RECV-AREA
ON EXCEPTION
MOVE "99" TO SEND-STATUS
MOVE WK-SESSION-ID TO SEND-SESSION-ID
MOVE "RECEIVE ERROR" TO SEND-MSG
PERFORM SEND-REPLY
EXIT PROGRAM
END-RECEIVE
IF RECV-SESSION-ID NOT = WK-SESSION-ID
CONTINUE *> 破棄して次電文を待つ(資料の受信保証方式)
END-IF
END-PERFORM
*> ---- 業務処理分岐 ----
EVALUATE RECV-MSG-KIND
WHEN "01" *> 仕訳登録
MOVE "01" TO DBIO-FUNC
MOVE RECV-ACCT-NO TO DBIO-ACCT-NO
MOVE RECV-DEBIT-AC TO DBIO-DEBIT-AC
MOVE RECV-CREDIT-AC TO DBIO-CREDIT-AC
MOVE RECV-AMOUNT TO DBIO-AMOUNT
MOVE RECV-DESC TO DBIO-DESC
PERFORM CALL-DBIO
WHEN "02" *> 残高照会(例)
MOVE "02" TO DBIO-FUNC
MOVE RECV-ACCT-NO TO DBIO-ACCT-NO
PERFORM CALL-DBIO
WHEN OTHER
MOVE 9001 TO DBIO-RTNCD
MOVE "UNKNOWN MSG" TO DBIO-RTNMSG
END-EVALUATE
*> ---- 応答整形・送信 ----
MOVE WK-SESSION-ID TO SEND-SESSION-ID
IF DBIO-RTNCD = 0
MOVE "00" TO SEND-STATUS
MOVE "OK" TO SEND-MSG
ELSE
MOVE "90" TO SEND-STATUS
MOVE DBIO-RTNMSG TO SEND-MSG
END-IF
PERFORM SEND-REPLY
EXIT PROGRAM.
CALL-DBIO.
CALL 'DBIOCALL' USING DBIO-REQ DBIO-RES.
EXIT.
SEND-REPLY.
SEND SEND-INF FROM SEND-AREA.
EXIT.
> ポイント
OpenTP1準拠の電文:RECEIVE ... INTO → SEND ... FROM の往復(従来DCCM3からOpenTP1へ)
セッションID保証:受信ヘッダのRECV-SESSION-IDが自端末WK-SESSION-IDと一致するまで、異常電文は破棄(資料の「端末固有情報(セッションID)付与→比較」方式)
COBOL2002:EXIT PROGRAM使用/COBOL85からの仕様差に留意(数値項目へのSPACE MOVE禁止 等)
---
② DBIOモジュール(HiRDB 埋込SQL/仕訳登録)
仕訳(借方・貸方・金額・摘要)を HiRDB のテーブルJOURNAL_ENTRYへ登録
例外時はSQLCODEで判定 → 呼出し元にRTNCD/RTNMSG返却
階層DB→RDBへの移行を意識し、キー項目をテーブルの主キー/UKに含める前提
IDENTIFICATION DIVISION.
PROGRAM-ID. DBIOCALL.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC.
01 W-MSG PIC X(60).
LINKAGE SECTION.
01 DBIO-REQ.
05 DBIO-FUNC PIC X(02).
05 DBIO-ACCT-NO PIC X(12).
05 DBIO-DEBIT-AC PIC X(10).
05 DBIO-CREDIT-AC PIC X(10).
05 DBIO-AMOUNT PIC 9(11)V99.
05 DBIO-DESC PIC X(40).
01 DBIO-RES.
05 DBIO-RTNCD PIC 9(04) COMP.
05 DBIO-RTNMSG PIC X(60).
PROCEDURE DIVISION USING DBIO-REQ DBIO-RES.
MAIN-DBIO SECTION.
MAIN-DBIO-000.
MOVE 0 TO DBIO-RTNCD
MOVE SPACES TO DBIO-RTNMSG
EVALUATE DBIO-FUNC
WHEN "01" *> 仕訳登録
PERFORM INS-JE
WHEN "02" *> 残高照会(例:アカウント残高集計)
PERFORM SEL-BAL
WHEN OTHER
MOVE 9002 TO DBIO-RTNCD
MOVE "UNKNOWN FUNC" TO DBIO-RTNMSG
END-EVALUATE
EXIT PROGRAM.
INS-JE.
EXEC SQL
INSERT INTO JOURNAL_ENTRY
(ACCT_NO,
DEBIT_ACC,
CREDIT_ACC,
AMOUNT,
JE_DESC,
JE_DATE)
VALUES
(:DBIO-ACCT-NO,
:DBIO-DEBIT-AC,
:DBIO-CREDIT-AC,
:DBIO-AMOUNT,
:DBIO-DESC,
CURRENT DATE)
END-EXEC
IF SQLCODE NOT = 0
MOVE 1001 TO DBIO-RTNCD
STRING "INSERT ERR SQLCODE="
FUNCTION NUMVAL-C (SQLCODE) DELIMITED BY SIZE
INTO W-MSG
END-STRING
MOVE W-MSG TO DBIO-RTNMSG
EXEC SQL ROLLBACK END-EXEC
ELSE
EXEC SQL COMMIT END-EXEC
END-IF
EXIT.
SEL-BAL.
*> 例:口座別残高(借方-貸方を集計)を返すなら、DBIO-RTNMSGに詰めるなど
EXEC SQL
SELECT COALESCE(SUM(CASE WHEN DEBIT_ACC = :DBIO-ACCT-NO
THEN AMOUNT ELSE 0 END),0)
- COALESCE(SUM(CASE WHEN CREDIT_ACC = :DBIO-ACCT-NO
THEN AMOUNT ELSE 0 END),0)
INTO :DBIO-AMOUNT
FROM JOURNAL_ENTRY
END-EXEC
IF SQLCODE NOT = 0
MOVE 1002 TO DBIO-RTNCD
MOVE "SELECT ERR" TO DBIO-RTNMSG
ELSE
MOVE 0 TO DBIO-RTNCD
MOVE "OK" TO DBIO-RTNMSG
END-IF
EXIT.
> ポイント
埋込SQLでHiRDBアクセス(EXEC SQL ... END-EXEC)
トランザクション管理はOpenTP1の外であっても、INSERT単位でCOMMIT/ROLLBACKを実装
階層→RDB移行の基本として、キーフィールドを表側に包含(資料の「階層キーを各テーブルの主キーへ」方針)
---
③ JP1バッチ(締処理:日次集計→サマリ登録)
JP1/AJS2 から起動されるCOBOLバッチ。エラー時はリターンコード≠0
例:当日仕訳を集計してDAILY_SUMMARYへ書込み
IDENTIFICATION DIVISION.
PROGRAM-ID. ACCT9000-CLOSE.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC.
01 WS-ERRCD PIC S9(9) COMP VALUE 0.
01 WS-DEBIT-SUM PIC 9(13)V99 VALUE 0.
01 WS-CREDIT-SUM PIC 9(13)V99 VALUE 0.
PROCEDURE DIVISION.
MAIN-CLS SECTION.
MAIN-CLS-000.
PERFORM SUM-TODAY
IF WS-ERRCD NOT = 0
GOBACK
END-IF
PERFORM WRITE-SUMMARY
GOBACK.
SUM-TODAY.
EXEC SQL
SELECT
COALESCE(SUM(AMOUNT),0)
INTO :WS-DEBIT-SUM
FROM JOURNAL_ENTRY
WHERE JE_DATE = CURRENT DATE
END-EXEC
IF SQLCODE NOT = 0
MOVE 2001 TO WS-ERRCD
EXIT PARAGRAPH
END-IF
EXEC SQL
SELECT
COALESCE(SUM(AMOUNT),0)
INTO :WS-CREDIT-SUM
FROM JOURNAL_ENTRY
WHERE JE_DATE = CURRENT DATE
END-EXEC
IF SQLCODE NOT = 0
MOVE 2002 TO WS-ERRCD
END-IF
EXIT.
WRITE-SUMMARY.
EXEC SQL
INSERT INTO DAILY_SUMMARY
(SUM_DATE, DEBIT_SUM, CREDIT_SUM)
VALUES
(CURRENT DATE, :WS-DEBIT-SUM, :WS-CREDIT-SUM)
END-EXEC
IF SQLCODE NOT = 0
EXEC SQL ROLLBACK END-EXEC
ELSE
EXEC SQL COMMIT END-EXEC
END-IF
EXIT.
> ポイント
JP1起動を想定した戻り値管理(GOBACK時のRCをスクリプト側で評価)
RDBは上位互換性重視でバージョンアップ時のアプリ改修最小(資料のHiRDB方針)
実際の集計定義は制度要件に合わせて拡張(締切時間、エビデンス帳票出力など)
---
実装上の注意(資料の方針に準拠)
マイグレーション基本方針:ビジネスロジックのCOBOLを極力継承し、プレゼン(XMAP3/Web)、TP(OpenTP1)、DB(HiRDB)で設計資産流用+必要最小限の差分修正。
COBOL85→2002の差異:GOBACK/EXIT PROGRAM、エンディアン/文字コード(SJIS→EBCDIC差分はPC版ではSJIS/UTF-8系へ、電文I/Fで統一)、数値項目へSPACEをMOVEしない等に注意。
画面制御:単項目・関連項目チェックはWebサーバ側(画面制御COBOL)に寄せ、クライアント⇄Webの通信増大を抑制(XMAP側の自動計算は多用しすぎない)。
受信保証:セッションID付与・照合で未送信残留誤受信を防止(上記①実装)。
SSO連携:別システムのJavaポータルからの引継情報はJava-COBOL連携I/FでXMAP入出力に橋渡しする想定。
> これらの設計・移行の考え方は、あなたのPDF資料の各スライド(変更概要、OpenTP1・HiRDB・XMAP、DB移行、受信保証、SSO連携、ツール変換率等)に基づいています。
---
必要でしたら、XMAP3/Web用の「画面制御COBOLの雛形(単項目/関連項目チェックや自動計算の最小実装)」や、JOURNAL_ENTRY/DAILY_SUMMARYのHiRDB DDL(主キー・インデックス設計、UTF-8/SJIS方針)もすぐ用意します。
コメント
コメントを投稿