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

COBOL程序写入输出文件时丢失部分数据问题求助

COBOL程序输出截断问题的解决方案

问题根源分析

你的程序无法完整写入数据,主要由以下三个问题导致:

1. 输出记录长度不匹配

WS-DETALLE总长度为78字符,远大于REG-REPORTE定义的50字符。执行WRITE操作时,发送区长度超过接收区,会触发编译器错误、截断数据,甚至直接终止程序执行。

2. 计数变量名错误

你在WORKING-STORAGE中定义的计数变量是WS-LEIDOS-EMP,但在PROCEDURE DIVISION中错误使用了WS-TOT-LEIDOS——该变量属于WS-DETALLE-LEIDOS,未设置初始值,默认是空格。对空格执行数值加法操作会引发数据异常,导致程序中断。

3. 输入文件标签定义错误

对于普通文本文件,LABEL RECORDS ARE STANDARD会让编译器误判文件结构(该选项适用于带标准标签的磁带/特殊格式文件),应改为LABEL RECORDS ARE OMITTED,否则可能导致读取记录异常。

修正后的代码

IDENTIFICATION DIVISION.
       PROGRAM-ID.                PROG01.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.

       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT EMPLEADOS ASSIGN TO "C:\COBOL\Archivos\EMPLEADOS.txt"
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT REPORTE   ASSIGN TO "C:\COBOL\Archivos\REPORTE.txt"
               ORGANIZATION IS LINE SEQUENTIAL.

       DATA DIVISION.
       FILE SECTION.
       FD EMPLEADOS
           LABEL RECORDS ARE OMITTED
           RECORD CONTAINS 50 CHARACTERS
           BLOCK CONTAINS 0 RECORDS
           DATA RECORD IS REG-EMPLEADOS.
       01  REG-EMPLEADOS          PIC X(50).

       FD REPORTE
           LABEL RECORDS ARE OMITTED
           RECORD CONTAINS 78 CHARACTERS
           BLOCK CONTAINS 0 RECORDS
           DATA RECORD IS REG-REPORTE.
       01  REG-REPORTE            PIC X(78).

       WORKING-STORAGE SECTION.
       01  WS-AREAS-A-USAR.
           05 WS-REG-EMPLEADOS.
              10 WS-NUMERO-EMP    PIC 9(05).
              10 WS-NOMBRE-EMP    PIC X(30).
              10 WS-STATUS-EMP    PIC 9(01).
              10 WS-DEPTO-EMP     PIC 9(03).
              10 WS-PUESTO-EMP    PIC 9(02).
              10 WS-SALARIO-EMP   PIC 9(07)V99.
           05 WS-LEIDOS-EMP       PIC 9(05)    VALUE ZEROS.
           05 WS-IMPRESOS         PIC 9(05)    VALUE ZEROS.
           05 WS-TOTAL-SALARIOS   PIC 9(09)V99 VALUE ZEROS.

       01  WS-TITULO-1.
           05 FILLER              PIC X(27)    VALUE SPACES.
           05 WS-TIT-1            PIC X(25)
                                  VALUE "EMPLEADOS DE LA EMPRESA: ".
           05 FILLER              PIC X(26)    VALUE SPACES.  // 调整长度适配78字符

       01  WS-TITULO-2.
           05 FILLER              PIC X(01)    VALUE "/".

       01  WS-DETALLE.
           05 FILLER              PIC X(04)    VALUE SPACES.
           05 WS-DET-NUMERO       PIC ZZZZ9.
           05 FILLER              PIC X(04)    VALUE SPACES.
           05 WS-DET-NOMBRE       PIC X(30).
           05 FILLER              PIC X(04)    VALUE SPACES.
           05 WS-DET-STATUS       PIC 9(01).
           05 FILLER              PIC X(04)    VALUE SPACES.
           05 WS-DET-DEPTO        PIC 9(03).
           05 FILLER              PIC X(04)    VALUE SPACES.
           05 WS-DET-PUESTO       PIC 9(02).
           05 FILLER              PIC X(03)    VALUE SPACES.
           05 WS-DET-SALARIO      PIC Z,ZZZ,ZZ9.99.
           05 FILLER              PIC X(04)    VALUE SPACES.

       01  WS-DETALLE-LEIDOS.
           05 FILLER              PIC X(01).
           05 FILLER              PIC X(29)
                                  VALUE "TOTAL DE EMPLEADOS LEIDOS  : ".
           05 WS-TOT-LEIDOS       PIC 9(05).
           05 FILLER              PIC X(43)    VALUE SPACES.  // 调整长度适配78字符

       01  WS-DETALLE-IMPRESOS.
           05 FILLER              PIC X(01).
           05 FILLER              PIC X(29)
                                  VALUE "TOTAL DE EMPLEADOS IMPRESOS: ".
           05 WS-TOT-IMPRESOS     PIC 9(05).
           05 FILLER              PIC X(43)    VALUE SPACES.  // 调整长度适配78字符

       PROCEDURE DIVISION.
       010-INICIO.
           OPEN INPUT  EMPLEADOS
                OUTPUT REPORTE
           WRITE REG-REPORTE FROM WS-TITULO-1.
       020-LEE.
           READ EMPLEADOS INTO WS-REG-EMPLEADOS AT END
                GO TO 100-FIN.

           ADD 1 TO WS-LEIDOS-EMP
           MOVE WS-NUMERO-EMP     TO WS-DET-NUMERO
           MOVE WS-NOMBRE-EMP     TO WS-DET-NOMBRE
           MOVE WS-STATUS-EMP     TO WS-DET-STATUS
           MOVE WS-DEPTO-EMP      TO WS-DET-DEPTO
           MOVE WS-PUESTO-EMP     TO WS-DET-PUESTO
           MOVE WS-SALARIO-EMP    TO WS-DET-SALARIO
           WRITE REG-REPORTE FROM WS-DETALLE AFTER ADVANCING 1
           ADD 1 TO WS-IMPRESOS
           
           GO TO 020-LEE.
       100-FIN.
           MOVE WS-LEIDOS-EMP TO WS-TOT-LEIDOS
           MOVE WS-IMPRESOS TO WS-TOT-IMPRESOS
           WRITE REG-REPORTE FROM WS-DETALLE-LEIDOS AFTER ADVANCING 1
           WRITE REG-REPORTE FROM WS-DETALLE-IMPRESOS AFTER ADVANCING 1
           CLOSE EMPLEADOS
                 REPORTE
           GOBACK.

关键修正点说明

  • 将输入输出文件的LABEL RECORDS ARE STANDARD改为LABEL RECORDS ARE OMITTED,并添加ORGANIZATION IS LINE SEQUENTIAL适配文本文件格式。
  • 调整REG-REPORTE的长度为78字符,匹配WS-DETALLE的总长度,避免写入截断。
  • 修正计数变量:将ADD 1 TO WS-TOT-LEIDOS改为ADD 1 TO WS-LEIDOS-EMP,并在最终输出前将WS-LEIDOS-EMP的值移动到WS-TOT-LEIDOS中。
  • 调整标题和统计行的FILLER长度,使其适配78字符的输出记录。
  • 添加了WS-IMPRESOS的计数逻辑,完善统计功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:35:05