財務会計システムの再構築事例 - 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方針)もすぐ用意します。



コメント

このブログの人気の投稿

ミライアイ内服薬は薬事法違反で、ほとんど効果がない詐欺ですか?

最高裁での上告理由書受理・却下の判断基準について

裁判官の忌避申立書の作成例