You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个.dat文件生成保单报告?COBOL程序报错求助

COBOL保单报告合并报错问题排查与解决

问题描述

现有两个.dat文件:polnamei.dat为主文件,polfile.dat为副文件,尝试合并生成保单报告时,仅能生成报告表头,后续操作报错:'POLICY-IN' not numeric: \000\000\000\000\001\000。调整过MOVE、PERFORM语句及索引逻辑,问题仍未解决。

报错原因分析

  1. 文件格式不匹配:报错信息中的\000是二进制空字节,说明程序读取POLICY-IN字段时,读入了非数字的二进制数据。大概率是polnamei.dat的实际记录格式与程序中POLNAMEIREC的定义不匹配——比如实际记录长度不等于定义的总长度(6+15+15+30+30+15+9+10+9=139字节),或者POLICY-IN字段在文件中的位置与程序定义偏移,导致读入无效内容。
  2. 合并逻辑错误:当前程序的合并逻辑是读一条主文件记录,就读一条副文件记录,完全没有按保单号POLICY-IN/POLICY-FILE-IN进行匹配。这种逻辑仅在两个文件严格按保单号顺序一一对应时才有效,否则会出现数据错位,甚至读入无效记录。
  3. 数据定义截断:POLICY-OUT定义为PIC 9(4),但源字段POLICY-IN是PIC 9(6),直接MOVE会截断后两位数字,导致数据丢失,后续处理可能引发异常。
  4. 无效记录处理不当:在300-GET-POLICY-NUMBER中,当POLICY-IN非数字时使用CONTINUE,会导致程序带着无效的POLICY-NUMBER进入后续的400-READ-AND-DISPLAY逻辑,进一步触发错误。

代码修正方案

1. 验证文件格式一致性

  • 确认polnamei.dat每条记录的长度严格等于139字节,POLICY-IN字段为6位纯数字,无二进制空值或非数字字符。
  • 确认polfile.dat的记录长度与POLICYFILEREC定义的长度一致(6+10+8=24字节)。

2. 修复无效记录处理逻辑

修改300-GET-POLICY-NUMBER,遇到非数字的POLICY-IN时跳过该条记录,避免无效数据进入后续流程:

300-GET-POLICY-NUMBER.
    READ POLICYIN
        AT END
            MOVE 'Y' TO WS-END-OF-JOB
        NOT AT END
            IF POLICY-IN IS NUMERIC
                MOVE POLICY-IN TO POLICY-NUMBER
            ELSE
                DISPLAY "Invalid policy number skipped: " POLICY-IN
                PERFORM 300-GET-POLICY-NUMBER  // 递归读取下一条有效记录
            END-IF
    END-READ.

3. 实现按保单号匹配的合并逻辑

正确的合并逻辑应该是:读取一条主文件记录后,循环读取副文件记录,直到找到所有与当前保单号匹配的记录,或者副文件结束:

400-READ-AND-DISPLAY.
    PERFORM UNTIL POLICY-FILE-IN NOT = POLICY-NUMBER OR WS-END-OF-JOB = 'Y'
        READ POLICYFILE
            AT END
                MOVE 'Y' TO WS-END-OF-JOB
            NOT AT END
                IF POLICY-FILE-IN = POLICY-NUMBER
                    MOVE POLICY-IN TO POLICY-OUT  // 修正POLICY-OUT为PIC 9(6)
                    MOVE FIRSTNAME-IN TO FIRSTNAME-OUT
                    MOVE LASTNAME-IN TO LASTNAME-OUT
                    MOVE POLICYDATE-IN TO POLICYDATE-OUT
                    MOVE PREMIUM-IN TO PREMIUM-OUT

                    ADD PREMIUM-IN TO WS-TOTAL-PREMIUM

                    // 调整STRING语句,确保总长度不超过80字节
                    STRING
                        POLICY-OUT         DELIMITED BY SIZE
                        SPACE              DELIMITED BY SIZE
                        FIRSTNAME-OUT      DELIMITED BY SIZE
                        SPACE              DELIMITED BY SIZE
                        LASTNAME-OUT       DELIMITED BY SIZE
                        SPACE              DELIMITED BY SIZE
                        POLICYDATE-OUT     DELIMITED BY SIZE
                        SPACE              DELIMITED BY SIZE
                        PREMIUM-OUT        DELIMITED BY SIZE
                    INTO POLICYREPORTREC
                    WITH POINTER 1

                    WRITE POLICYREPORTREC AFTER ADVANCING 1 LINE.
                    ADD 1 TO LINCNT
                END-IF
        END-READ
    END-PERFORM.

同时修改DETAILLINE中的POLICY-OUT定义:

01 DETAILLINE.
    03 POLICY-OUT       PIC 9(6).  // 改为6位,与源字段一致
    03 FIRSTNAME-OUT    PIC X(15).
    03 LASTNAME-OUT     PIC X(15).
    03 POLICYDATE-OUT   PIC X(10).
    03 PREMIUM-OUT      PIC 9(6)V99.

4. 添加表头打印逻辑

原代码未实现表头打印,在200-OPEN中添加表头打印:

200-OPEN.
    OPEN INPUT POLICYIN
    OPEN INPUT POLICYFILE
    OPEN OUTPUT POLICYREPORT
    ACCEPT WSDATE FROM DATE
    MOVE MM TO MM-OUT
    MOVE YY TO YY-OUT
    MOVE DD TO DD-OUT
    MOVE ZEROES TO LINCNT
    MOVE 1 TO PAGE-IN.
    // 打印表头
    MOVE PAGE-IN TO PAGE-OUT
    WRITE POLICYREPORTREC FROM HEADER1 AFTER ADVANCING PAGE
    WRITE POLICYREPORTREC FROM HEADER2 AFTER ADVANCING 1 LINE.

5. 修复总计打印逻辑

原500-PRINT-TOTAL中的STRING语句会覆盖之前的'TOTAL PREMIUM: ',调整为:

500-PRINT-TOTAL.
    MOVE SPACES TO POLICYREPORTREC
    STRING
        'TOTAL PREMIUM: ' DELIMITED BY SIZE
        WS-TOTAL-PREMIUM  DELIMITED BY SIZE
    INTO POLICYREPORTREC
    WRITE POLICYREPORTREC AFTER ADVANCING 2 LINES.

总结

核心问题是文件格式不匹配导致读入无效非数字数据,加上合并逻辑未按保单号匹配、数据定义截断等问题共同引发报错。按照上述方案逐一修正后,即可正常合并两个文件生成保单报告。

内容的提问来源于stack exchange,提问作者Casey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:17:02