Cobol 文件和格式化输出的数据验证

Cobol 文件和格式化输出的数据验证,cobol,mainframe,Cobol,Mainframe,我试图编写一个程序,以确定给定文件中是否出现不同类型的错误。我要发布我的全部代码,因为我真的不知道我哪里出错了。这只是在教唆我。数据验证是2100错误检查 IDENTIFICATION DIVISION. PROGRAM-ID. ASSIGNMENT1. AUTHOR. AARON. ****************************************************************** ENVIRONMENT DIVISION.

我试图编写一个程序,以确定给定文件中是否出现不同类型的错误。我要发布我的全部代码,因为我真的不知道我哪里出错了。这只是在教唆我。数据验证是2100错误检查

   IDENTIFICATION DIVISION.
   PROGRAM-ID. ASSIGNMENT1.
   AUTHOR.  AARON.

  ******************************************************************
   ENVIRONMENT DIVISION.
  *  defines the external files - an input file and output file
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.


       SELECT DATVAL02 ASSIGN TO DATAIN
          FILE STATUS IS EF-STATUS.

       SELECT REPORT-FILE ASSIGN TO DATAOUT
          FILE STATUS IS PF-STATUS.

   DATA DIVISION.

   FILE SECTION.
   FD DATVAL02.
   01 SALES-RECORD.
       05 RECORD-CODE   PIC XX.
       05 FILLER        PIC X.
       05 VEND-NUM      PIC X(8).
       05 DATE-DUE.
            05 YEAR-DUE      PIC XX.
            05 MONTH-DUE     PIC XX.
            05 DAY-DUE       PIC XX.
       05 VEND-NAME     PIC X(20).
       05 FILLER        PIC XXX.
       05 AMT-DUE       PIC S9(6)V99.


   FD REPORT-FILE.
   01 REPORT-RECORD                PIC X(80).

   WORKING-STORAGE SECTION.

   01 FLAGS-AND-ACCUMLATORS.
       05 VALID-RECORDS     PIC S99 VALUE 0.
       05 INVALID-RECORDS   PIC S99 VALUE 0.
       05 EF-STATUS       PIC 99  VALUE 0.
       05 PF-STATUS       PIC 99  VALUE 0.
       05 A-ERROR           PIC X VALUE SPACE.
       05 C-ERROR           PIC X VALUE SPACE.
       05 E-ERROR           PIC X VALUE SPACE.
       05 F-ERROR           PIC X VALUE SPACE.
       05 B-ERROR           PIC X VALUE SPACE.
       05 D-ERROR           PIC X VALUE SPACE.
       05 G-ERROR           PIC X VALUE SPACE.
       05 H-ERROR           PIC X VALUE SPACE.
       05 I-ERROR           PIC X VALUE SPACE.
       05 A-AST             PIC XX VALUE SPACES.
       05 BC-AST            PIC X(8) VALUE SPACES.
       05 D-AST             PIC XX VALUE SPACES.
       05 E-AST             PIC XX VALUE SPACES.
       05 F-AST             PIC XX VALUE SPACES.
       05 G-AST             PIC X(15) VALUE SPACES.
       05 H-AST             PIC X(15) VALUE SPACES.
       05 I-AST             PIC X(8) VALUE SPACES.
       05 END-OF-FILE      PIC XXX VALUE "NO".
       05 ERROR-FLAG        PIC XXX VALUE SPACES.
       05 ERROR-FLAG2       PIC XXX VALUE SPACES.
       05 ERROR-FILLER      PIC XXX VALUE SPACES.
       05 VC                PIC XX VALUE "VC".
       05 NOO               PIC XX VALUE "NO".
       05 D-CHECK           PIC S9999999V99.
       05 DAY-DUE-NUM       PIC 99.
       05 MONTH-DUE-NUM     PIC 99.


   01 HEADING-LINE-1.
       05           PIC X(15) VALUE SPACES.
       05           PIC X(24) VALUE
            "VENDOR RECORD VALIDATION".
       05           PIC X(24) VALUE SPACES.
       05           PIC X(6)  VALUE
            "PAGE 1".

   01 HEADING-LINE-2.
       05           PIC XX VALUE
            "RC".
       05           PIC X VALUE SPACE.
       05           PIC X(8) VALUE
            "VENDOR #".
       05           PIC XX VALUE SPACES.
       05           PIC X(8) VALUE
            "DATE DUE".
       05           PIC XX VALUE SPACES.
       05           PIC X(11) VALUE
            "VENDOR NAME".
       05           PIC X(6) VALUE SPACES.
       05           PIC X(10) VALUE
            "AMOUNT DUE".
       05           PIC XXX VALUE SPACES.
       05           PIC X(16) VALUE
            "-- ERROR CODES--".

    01 DETAIL-LINE.
       05 RECORD-CODE-OUT           PIC XX.
       05                           PIC X VALUE SPACE.
       05 VEND-NUM-OUT              PIC X(8).
       05                           PIC XX VALUE SPACES.
       05 YEAR-DUE-OUT              PIC XX.
       05 MONTH-DUE-OUT             PIC XX.
       05 DAY-DUE-OUT               PIC XX.
       05                           PIC XX VALUE SPACES.
       05 VEND-NAME-OUT             PIC X(20).
       05                           PIC XX VALUE SPACES.
       05 AMT-DUE-OUT               PIC 999,999.99.
       05                           PIC XX VALUE SPACES.
       05 A-ERROR-OUT               PIC X VALUE SPACES.
       05                           PIC XX VALUE SPACES.
       05 B-ERROR-OUT               PIC X VALUE SPACE.
       05                           PIC XX VALUE SPACES.
       05 C-ERROR-OUT               PIC X VALUE SPACE.
       05                           PIC XX VALUE SPACES.
       05 D-ERROR-OUT               PIC X VALUE SPACE.
       05                           PIC XX VALUE SPACES.
       05 E-ERROR-OUT               PIC X VALUE SPACE.
       05                           PIC XX VALUE SPACES.
       05 F-ERROR-OUT               PIC X VALUE SPACE.
       05                           PIC XX VALUE SPACES.
       05 G-ERROR-OUT               PIC X VALUE SPACE.
       05                           PIC XX VALUE SPACES.
       05 H-ERROR-OUT               PIC X VALUE SPACE.
       05                           PIC XX VALUE SPACES.
       05 I-ERROR-OUT               PIC X VALUE SPACE.

   01 ASTERISK-LINE.
       05 A-AST-OUT                 PIC XX VALUE SPACES.
       05                           PIC X VALUE SPACE.
       05 BC-AST-OUT                PIC X(8) VALUE SPACES.
       05                           PIC XX VALUE SPACES.
       05 D-AST-OUT                 PIC XX VALUE SPACES.
       05                           PIC X VALUE SPACE.
       05 E-AST-OUT                 PIC XX VALUE SPACES.
       05                           PIC X VALUE SPACE.
       05 F-AST-OUT                 PIC XX VALUE SPACES.
       05                           PIC XX VALUE SPACES.
       05 G-AST-OUT                 PIC X(15) VALUE SPACES.
       05                           PIC XX VALUE SPACES.
       05 I-AST-OUT                 PIC X(8) VALUE SPACES.
       05                           PIC XX VALUE SPACES.
       05 H-AST-OUT                 PIC X(8) VALUE SPACES.


   01 RECORD-TOTALS.
       05                           PIC X(16) VALUE
            "VALID RECORDS: ".
       05 VALID-RECORDS-OUT         PIC 99.
       05                           PIC XX VALUE SPACES.
       05                           PIC X(17) VALUE
            "INVALID RECORDS: ".
       05 INVALID-RECORDS-OUT       PIC 99.

   PROCEDURE DIVISION.

   1000-MAIN-CONTROL.
       PERFORM 2000-INITIALIZE.
       PERFORM UNTIL END-OF-FILE = "YES"
         READ DATVAL02
           AT END
             MOVE "YES" TO END-OF-FILE
           NOT AT END
             PERFORM 2100-ERROR-ROUTINE
             IF ERROR-FLAG = "YES"
                PERFORM 2500-PROCESS
                PERFORM 3000-PROCESS
                PERFORM 4200-REINITILIZE
             END-IF
             IF ERROR-FLAG = "NO"
                PERFORM 2500-PROCESS
             END-IF
         END-READ
       END-PERFORM.
       PERFORM 4000-PROCESS.
       PERFORM 4500-TERMINATE.
       STOP RUN.

   2000-INITIALIZE.
       OPEN INPUT DATVAL02.
       OPEN OUTPUT REPORT-FILE.

       WRITE REPORT-RECORD         FROM HEADING-LINE-1.
       WRITE REPORT-RECORD         FROM HEADING-LINE-2.

   2100-ERROR-ROUTINE.
       MOVE "NO"                   TO ERROR-FLAG.
       MOVE "NO"                   TO ERROR-FLAG2.

       IF VEND-NUM = SPACES
           MOVE "YES"              TO ERROR-FLAG
           MOVE "********"         TO BC-AST-OUT
           MOVE "B"               TO B-ERROR-OUT
       END-IF.

       IF VEND-NUM IS NOT NUMERIC AND ERROR-FLAG = NOO
           MOVE "YES"              TO ERROR-FLAG
           MOVE "********"        TO BC-AST-OUT
           MOVE "C"                TO C-ERROR-OUT
       END-IF.

       IF RECORD-CODE IS NOT = VC
           MOVE "YES"              TO ERROR-FLAG
           MOVE "**"               TO A-AST-OUT
           MOVE "A"                TO A-ERROR-OUT
       END-IF.

       IF DATE-DUE IS NOT NUMERIC
           MOVE "YES"              TO ERROR-FLAG2
           MOVE "YES"              TO ERROR-FLAG
           MOVE "**"               TO D-AST-OUT
           MOVE "D"               TO D-ERROR-OUT
           MOVE "**"              TO E-AST-OUT
           MOVE "**"              TO F-AST-OUT
       END-IF.

       IF DATE-DUE = 0 AND ERROR-FLAG2 = NOO
          IF AMT-DUE IS > 0
              MOVE "YES"           TO ERROR-FLAG
              MOVE "YES"           TO ERROR-FLAG2
              MOVE "**"           TO D-AST-OUT
              MOVE "D"             TO D-ERROR-OUT
              MOVE "**"           TO E-AST-OUT
              MOVE "**"           TO F-AST-OUT
          END-IF
       END-IF.

       MOVE DAY-DUE TO DAY-DUE-NUM.
       MOVE MONTH-DUE TO MONTH-DUE-NUM.

       IF DAY-DUE-NUM > 31 OR DAY-DUE < 0 AND ERROR-FLAG2 = NOO
           MOVE "YES"              TO ERROR-FLAG
           MOVE "**"              TO E-AST-OUT
           MOVE "E"                TO E-ERROR-OUT
       END-IF.

       IF MONTH-DUE-NUM > 12 OR < 1 AND ERROR-FLAG2 = NOO
           MOVE "YES"              TO ERROR-FLAG
           MOVE "**"             TO F-AST-OUT
           MOVE "F"                TO F-ERROR-OUT
       END-IF.

       IF VEND-NAME = SPACES
           MOVE "YES"              TO ERROR-FLAG
           MOVE "***************"               TO G-AST-OUT
           MOVE "G"                TO G-ERROR-OUT
       END-IF.

       IF VEND-NAME(1:1) IS EQUAL TO SPACE
           MOVE "YES"              TO ERROR-FLAG
           MOVE "***************"         TO H-AST-OUT
           MOVE "H"                TO H-ERROR-OUT

       IF AMT-DUE IS NOT NUMERIC
           MOVE "YES"              TO ERROR-FLAG
           MOVE "********"               TO I-AST-OUT
           MOVE "I"               TO I-ERROR-OUT
       END-IF.

       IF ERROR-FLAG = "YES"
            ADD 1 TO INVALID-RECORDS
       END-IF.

       IF ERROR-FLAG = "NO"
           ADD 1 TO VALID-RECORDS
       END-IF.



   2500-PROCESS.
       MOVE RECORD-CODE    TO RECORD-CODE-OUT.
       MOVE VEND-NUM       TO VEND-NUM-OUT.
       MOVE YEAR-DUE       TO YEAR-DUE-OUT.
       MOVE MONTH-DUE      TO MONTH-DUE-OUT.
       MOVE DAY-DUE        TO DAY-DUE-OUT.
       MOVE VEND-NAME      TO VEND-NAME-OUT.
       MOVE AMT-DUE        TO AMT-DUE-OUT.

       WRITE REPORT-RECORD FROM DETAIL-LINE.

   3000-PROCESS.
       WRITE REPORT-RECORD FROM ASTERISK-LINE.

   4000-PROCESS.
       MOVE VALID-RECORDS      TO VALID-RECORDS-OUT.
       MOVE INVALID-RECORDS    TO INVALID-RECORDS-OUT.
       WRITE REPORT-RECORD     FROM RECORD-TOTALS.

   4200-REINITILIZE.
       MOVE A-ERROR            TO A-ERROR-OUT.
       MOVE B-ERROR            TO B-ERROR-OUT.
       MOVE C-ERROR            TO C-ERROR-OUT.
       MOVE D-ERROR            TO D-ERROR-OUT.
       MOVE E-ERROR            TO E-ERROR-OUT.
       MOVE F-ERROR            TO F-ERROR-OUT.
       MOVE G-ERROR            TO G-ERROR-OUT.
       MOVE H-ERROR            TO H-ERROR-OUT.
       MOVE I-ERROR            TO I-ERROR-OUT.
       MOVE A-AST              TO A-AST-OUT.
       MOVE BC-AST             TO BC-AST-OUT.
       MOVE D-AST              TO D-AST-OUT.
       MOVE E-AST              TO E-AST-OUT.
       MOVE F-AST              TO F-AST-OUT.
       MOVE G-AST              TO G-AST-OUT.
       MOVE H-AST              TO H-AST-OUT.
       MOVE I-AST              TO I-AST-OUT.
       MOVE ERROR-FILLER       TO ERROR-FLAG.
       MOVE ERROR-FILLER       TO ERROR-FLAG2.
       MOVE A-AST              TO DAY-DUE-NUM.
       MOVE A-AST              TO MONTH-DUE-NUM.
   4500-TERMINATE.
       CLOSE DATVAL02, REPORT-FILE.
希望实现这一目标

XX 9AAA9999  99/99/99       SHIFTED      12A 4GL 78   A   C   E F   H I
** ********     ** **  ***************   *** *** **

其中*在数据错误下。字母表示发现的错误。

在最新版本中,您已经创建了一个组项目(到期日期),但您没有调整从属于它的其他日期字段的级别号。我已经将这三个级别设置为10级。为了方便使用SYSIN数据,我在输入记录的末尾添加了一个32字节的填充符

我编译,得到一个4的RC/CC,所以linkedit/binder运行

我使用了你另一个问题中的数据:

VC 10045380051005ABC电子00001298 VC 050926XYZ公司00R00549 VT 12348760051115质量保证公司00400053 VC A14BCF80051201 00100930

得到了这个输出,没有异常终止:

               VENDOR RECORD VALIDATION                        PAGE 1        
RC VENDOR #  DATE DUE  VENDOR NAME      AMOUNT DUE   -- ERROR CODES--        
VC 10045380  051005  ABC ELECTRONICS       000,012.98                        
VC           050926  XYZ COMPANY           009,005.49     B                  
   ********                                                                  
VT 12348760  051115  QUALITY ASSURANCE CO  004,000.53  A                     
**                                                                           
VC A14BCF80  051201                        001,009.30        C           G  H
   ********            ***************            ********                   
VALID RECORDS:  01  INVALID RECORDS: 03 
我已经粘贴了你另一个问题的数据

注意,如果您的实际数据不正确,您可能会得到金额字段的异常终止

还要注意金额字段中的R发生了什么。你还没有为数字验证它


现在,我已经编译并运行了您的程序,其中包含两个更正(两个计数的VALUE子句和END-READ)。以下是输出:

               VENDOR RECORD VALIDATION                        PAGE 1
RC VENDOR #  DATE DUE  VENDOR NAME      AMOUNT DUE   -- ERROR CODES--
VC 10045380  051005  ABC ELECTRONICS       000,01298                 
VT        0  000000                        000,20000     B           
   ********                                                          
VALID RECORDS:  01  INVALID RECORDS: 01                              
我使用了一个固定长度的文件,因为我无法访问您的实际文件,该文件必须是可变长度的(最好在FD中显式显示,这样在编译结束时就不会得到这些I-information消息)

您仍有一些事情需要解决,但程序正在运行并生成输出。如果您进行了这些代码更改,但仍然存在问题,那么出错的是您的文件

你有一个非常令人沮丧的问题,这似乎是由于“环境”。您需要能够查看您的编译列表。如果编译失败(RC/CC高于4),那么您的linkedit/binder步骤将无法运行,并且您将无法获得新的可执行程序。我认为这是您的问题,但您需要导师的帮助,以确定如何找到编译列表并确认没有错误

我没有使用Rational Developer,也不知道您是在使用zPDT还是在大型机上编译,也不知道您在Rational Developer会话中如何看待编译器输出

对于学习者来说,您的代码基本上是正常的,可能已经有几天了。您一直在努力解决一个与代码无关的问题,而与不知道程序有编译错误有关。基本上,除了几个打字错误,它就在那里

当您在您的环境中运行它时,请更新您的代码审查问题


要知道的一件真正好的事情是,编译器生成了您运行的程序的版本,不管它是否被禁用

您可以显示程序编译的日期和时间:

   WORKING-STORAGE SECTION.
   01  W-WHEN-COMPILED                      PIC X(8)BX(8).
   ...
在执行任何其他操作之前,除了确定这是在被调用的子程序中的第一次外,如下所示:

   MOVE WHEN-COMPILED                TO W-WHEN-COMPILED
   DISPLAY 
           "Program XXXXXXXX compiled on "
           W-WHEN-COMPILED
您得到的输出将是该程序实际编译的日期/时间,与编译列表上的日期/时间完全匹配

30多年来,我一直使用这样的代码,并将其推荐给其他人,它节省了大量的时间

在编译时,还有一个内在函数。这是相同的,但有一个四位数的年份。因为在可预见的未来,一年的CC将是20,你可以选择做哪一个。这两个问题都是在编译时解决的,对运行时的影响最小


你没有结尾。这将为您提供编译的E级诊断,返回代码/条件代码为8,并且您可能尚未运行下面的linkedit/binder步骤(请查看作业的假脱机文件2中步骤的条件)

以下是您的代码作为提醒:

 PERFORM UNTIL END-OF-FILE = "YES"
     READ DATVAL02
       AT END
         MOVE "YES" TO END-OF-FILE
       NOT AT END
         PERFORM 2100-ERROR-ROUTINE
         IF ERROR-FLAG = "YES"
            PERFORM 2500-PROCESS
            PERFORM 3000-PROCESS
         END-IF
         IF ERROR-FLAG = "NO"
            PERFORM 2500-PROCESS
         END-IF
   END-PERFORM.
以下是END-READ的外观:

 PERFORM UNTIL END-OF-FILE = "YES"
     READ DATVAL02
       AT END
         MOVE "YES" TO END-OF-FILE
       NOT AT END
         PERFORM 2100-ERROR-ROUTINE
         IF ERROR-FLAG = "YES"
            PERFORM 2500-PROCESS
            PERFORM 3000-PROCESS
         END-IF
         IF ERROR-FLAG = "NO"
            PERFORM 2500-PROCESS
         END-IF
       END-READ
   END-PERFORM
由于没有链接新程序,您仍然在运行旧程序,并且仍然会收到旧错误


您正在添加未给定初始值的非二进制字段

   05 VALID-RECORDS     PIC S99.
   05 INVALID-RECORDS   PIC S99.

   IF ERROR-FLAG = "YES"
        ADD 1 TO INVALID-RECORDS
   END-IF.

   IF ERROR-FLAG = "NO"
       ADD 1 TO VALID-RECORDS
   END-IF.
如果没有初始值(来自value子句,或MOVE,甚至dread INITIALIZE),则该值未定义,不太可能对分区十进制字段有效,因此S0C7

看看这个:看看你是否能从中找出你的程序中失败的地方


编译干净、带RC 0且无诊断消息且运行时无异常终止的程序:

   ID DIVISION.                                                     
   PROGRAM-ID. VARA.                                                
   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.


       SELECT DATVAL02 ASSIGN TO DATAIN
          FILE STATUS IS EF-STATUS.

       SELECT REPORT-FILE ASSIGN TO DATAOUT
          FILE STATUS IS PF-STATUS.

   DATA DIVISION.

   FILE SECTION.
   FD DATVAL02 RECORDING MODE F.
   01 SALES-RECORD.
       05 RECORD-CODE   PIC XX.
       05 FILLER        PIC X.
       05 VEND-NUM      PIC X(8).
       05 YEAR-DUE      PIC 99.
       05 MONTH-DUE     PIC 99.
       05 DAY-DUE       PIC 99.
       05 VEND-NAME     PIC X(20).
       05 FILLER        PIC XXX.
       05 AMT-DUE       PIC S9(6)V99.
       05  FILLER PIC X(32).

   FD REPORT-FILE RECORDING MODE F.
   01 REPORT-RECORD                PIC X(80).

   WORKING-STORAGE SECTION.
   01  W-WHEN-COMPILED             PIC X(8)BX(8).

   01 FLAGS-AND-ACCUMLATORS.
       05 VALID-RECORDS     PIC S99 VALUE ZERO.
       05 INVALID-RECORDS   PIC S99 VALUE ZERO.
       05   EF-STATUS       PIC 99  VALUE 0.
       05   PF-STATUS       PIC 99  VALUE 0.
       05 A-ERROR           PIC X VALUE SPACE.
       05 C-ERROR           PIC X VALUE SPACE.
       05 E-ERROR           PIC X VALUE SPACE.
       05 F-ERROR           PIC X VALUE SPACE.
       05 B-ERROR           PIC X VALUE SPACE.
       05 D-ERROR           PIC X VALUE SPACE.
       05 G-ERROR           PIC X VALUE SPACE.
       05 H-ERROR           PIC X VALUE SPACE.
       05 I-ERROR           PIC X VALUE SPACE.
       05 A-AST             PIC XX VALUE SPACES.
       05 BC-AST            PIC X(8) VALUE SPACES.
       05 D-AST             PIC XX VALUE SPACES.
       05 E-AST             PIC XX VALUE SPACES.
       05 F-AST             PIC XX VALUE SPACES.
       05 G-AST             PIC X(15) VALUE SPACES.
       05 I-AST             PIC X(8) VALUE SPACES.
       05  END-OF-FILE      PIC XXX VALUE "NO".
       05 ERROR-FLAG        PIC XXX VALUE SPACES.
       05 ERROR-FLAG2       PIC XXX VALUE SPACES.
       05 VC                PIC XX VALUE "VC".
       05 NOO               PIC XX VALUE "NO".
       05 D-CHECK           PIC S9999999V99.


   01 HEADING-LINE-1.
       05           PIC X(15) VALUE SPACES.
       05           PIC X(24) VALUE
            "VENDOR RECORD VALIDATION".
       05           PIC X(24) VALUE SPACES.
       05           PIC X(6)  VALUE
            "PAGE 1".

   01 HEADING-LINE-2.
       05           PIC XX VALUE
            "RC".
       05           PIC X VALUE SPACE.
       05           PIC X(8) VALUE
            "VENDOR #".
       05           PIC XX VALUE SPACES.
       05           PIC X(8) VALUE
            "DATE DUE".
       05           PIC XX VALUE SPACES.
       05           PIC X(11) VALUE
            "VENDOR NAME".
       05           PIC X(6) VALUE SPACES.
       05           PIC X(10) VALUE
            "AMOUNT DUE".
       05           PIC XXX VALUE SPACES.
       05           PIC X(16) VALUE
            "-- ERROR CODES--".

   01 DETAIL-LINE.
       05 RECORD-CODE-OUT           PIC XX.
       05                           PIC X VALUE SPACE.
       05 VEND-NUM-OUT              PIC 9(8).
       05                           PIC XX VALUE SPACES.
       05 YEAR-DUE-OUT              PIC XX.
       05 MONTH-DUE-OUT             PIC XX.
       05 DAY-DUE-OUT               PIC XX.
       05                           PIC XX VALUE SPACES.
       05 VEND-NAME-OUT             PIC X(20).
       05                           PIC XX VALUE SPACES.
       05 AMT-DUE-OUT               PIC 999,999.99.
       05                           PIC XX VALUE SPACES.
       05 A-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 B-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 C-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 D-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 E-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 F-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 G-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 H-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 I-ERROR-OUT               PIC X.

   01 ASTERISK-LINE.
       05 A-AST-OUT                 PIC XX.
       05                           PIC X VALUE SPACE.
       05 BC-AST-OUT                PIC X(8).
       05                           PIC XX VALUE SPACES.
       05 D-AST-OUT                 PIC XX.
       05                           PIC X VALUE SPACE.
       05 E-AST-OUT                 PIC XX.
       05                           PIC X VALUE SPACE.
       05 F-AST-OUT                 PIC XX.
       05                           PIC XX VALUE SPACES.
       05 G-AST-OUT                 PIC X(15).
       05                           PIC XX VALUE SPACES.
       05 I-AST-OUT                 PIC X(8).
       05                           PIC XX VALUE SPACES.
       05 H-AST-OUT                 PIC X(8).

   01 RECORD-TOTALS.
       05                           PIC X(16) VALUE
            "VALID RECORDS: ".
       05 VALID-RECORDS-OUT         PIC 99.
       05                           PIC XX VALUE SPACES.
       05                           PIC X(17) VALUE
            "INVALID RECORDS: ".
       05 INVALID-RECORDS-OUT       PIC 99.

   PROCEDURE DIVISION.

   1000-MAIN-CONTROL.
       MOVE WHEN-COMPILED         TO W-WHEN-COMPILED
       DISPLAY
               "TEST PROGRAM COMPILED ON "
               W-WHEN-COMPILED
       PERFORM 2000-INITIALIZE.
       PERFORM UNTIL END-OF-FILE = "YES"
         READ DATVAL02
           AT END
             MOVE "YES" TO END-OF-FILE
           NOT AT END
             PERFORM 2100-ERROR-ROUTINE
             IF ERROR-FLAG = "YES"
                PERFORM 2500-PROCESS
                PERFORM 3000-PROCESS
             END-IF
             IF ERROR-FLAG = "NO"
                PERFORM 2500-PROCESS
             END-IF
         END-READ
       END-PERFORM.
       PERFORM 4000-PROCESS.
       PERFORM 4500-TERMINATE.
       STOP RUN.

   2000-INITIALIZE.
       OPEN INPUT DATVAL02.
       OPEN OUTPUT REPORT-FILE.

       WRITE REPORT-RECORD         FROM HEADING-LINE-1.
       WRITE REPORT-RECORD         FROM HEADING-LINE-2.

   2100-ERROR-ROUTINE.
       MOVE "NO"                   TO ERROR-FLAG.
       MOVE "NO"                   TO ERROR-FLAG2.

       IF VEND-NUM = SPACES
           MOVE "YES"              TO ERROR-FLAG
           MOVE "********"         TO BC-AST-OUT
           MOVE "B"                TO B-ERROR-OUT
       END-IF.


       IF ERROR-FLAG = "YES"
            ADD 1 TO INVALID-RECORDS
       END-IF.

       IF ERROR-FLAG = "NO"
           ADD 1 TO VALID-RECORDS
       END-IF.



   2500-PROCESS.
       MOVE RECORD-CODE    TO RECORD-CODE-OUT.
       MOVE VEND-NUM       TO VEND-NUM-OUT.
       MOVE YEAR-DUE       TO YEAR-DUE-OUT.
       MOVE MONTH-DUE      TO MONTH-DUE-OUT.
       MOVE DAY-DUE        TO DAY-DUE-OUT.
       MOVE VEND-NAME      TO VEND-NAME-OUT.
       MOVE AMT-DUE        TO AMT-DUE-OUT.

       WRITE REPORT-RECORD FROM DETAIL-LINE.

   3000-PROCESS.
       WRITE REPORT-RECORD FROM ASTERISK-LINE.

   4000-PROCESS.
       MOVE VALID-RECORDS      TO VALID-RECORDS-OUT.
       MOVE INVALID-RECORDS    TO INVALID-RECORDS-OUT.
       WRITE REPORT-RECORD     FROM RECORD-TOTALS.

   4500-TERMINATE.
       CLOSE DATVAL02, REPORT-FILE.

我所能告诉你的是,它发生在错误检查中,除非你想要一份abendI的22k作业假脱机的副本,在查看之前,我会问:-),认为你的程序会比它更复杂。若你们感兴趣的话,你们还有一些其他的事情需要注意。你们有并没有检查你们编译的诊断列表?我至少可以看到两件事。我认为足以破坏编译,因此链接/绑定不会运行,因此您正在执行的程序是早期版本,仍然存在相同的问题。好的,已确认,您运行的代码的旧版本中存在旧错误。更新答案,稍后再看更多。等等,它正在为你运行吗?哇。。。我真不敢相信我错过了。我做了更改,但它仍然对meI有利。我仍然为出了什么问题而烦恼,它必须在几行错误检查中进行,但我就是不知道是什么。添加了尾读。我相当肯定这就是你想要的,但实际上你应该最清楚:-)
   ID DIVISION.                                                     
   PROGRAM-ID. VARA.                                                
   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.


       SELECT DATVAL02 ASSIGN TO DATAIN
          FILE STATUS IS EF-STATUS.

       SELECT REPORT-FILE ASSIGN TO DATAOUT
          FILE STATUS IS PF-STATUS.

   DATA DIVISION.

   FILE SECTION.
   FD DATVAL02 RECORDING MODE F.
   01 SALES-RECORD.
       05 RECORD-CODE   PIC XX.
       05 FILLER        PIC X.
       05 VEND-NUM      PIC X(8).
       05 YEAR-DUE      PIC 99.
       05 MONTH-DUE     PIC 99.
       05 DAY-DUE       PIC 99.
       05 VEND-NAME     PIC X(20).
       05 FILLER        PIC XXX.
       05 AMT-DUE       PIC S9(6)V99.
       05  FILLER PIC X(32).

   FD REPORT-FILE RECORDING MODE F.
   01 REPORT-RECORD                PIC X(80).

   WORKING-STORAGE SECTION.
   01  W-WHEN-COMPILED             PIC X(8)BX(8).

   01 FLAGS-AND-ACCUMLATORS.
       05 VALID-RECORDS     PIC S99 VALUE ZERO.
       05 INVALID-RECORDS   PIC S99 VALUE ZERO.
       05   EF-STATUS       PIC 99  VALUE 0.
       05   PF-STATUS       PIC 99  VALUE 0.
       05 A-ERROR           PIC X VALUE SPACE.
       05 C-ERROR           PIC X VALUE SPACE.
       05 E-ERROR           PIC X VALUE SPACE.
       05 F-ERROR           PIC X VALUE SPACE.
       05 B-ERROR           PIC X VALUE SPACE.
       05 D-ERROR           PIC X VALUE SPACE.
       05 G-ERROR           PIC X VALUE SPACE.
       05 H-ERROR           PIC X VALUE SPACE.
       05 I-ERROR           PIC X VALUE SPACE.
       05 A-AST             PIC XX VALUE SPACES.
       05 BC-AST            PIC X(8) VALUE SPACES.
       05 D-AST             PIC XX VALUE SPACES.
       05 E-AST             PIC XX VALUE SPACES.
       05 F-AST             PIC XX VALUE SPACES.
       05 G-AST             PIC X(15) VALUE SPACES.
       05 I-AST             PIC X(8) VALUE SPACES.
       05  END-OF-FILE      PIC XXX VALUE "NO".
       05 ERROR-FLAG        PIC XXX VALUE SPACES.
       05 ERROR-FLAG2       PIC XXX VALUE SPACES.
       05 VC                PIC XX VALUE "VC".
       05 NOO               PIC XX VALUE "NO".
       05 D-CHECK           PIC S9999999V99.


   01 HEADING-LINE-1.
       05           PIC X(15) VALUE SPACES.
       05           PIC X(24) VALUE
            "VENDOR RECORD VALIDATION".
       05           PIC X(24) VALUE SPACES.
       05           PIC X(6)  VALUE
            "PAGE 1".

   01 HEADING-LINE-2.
       05           PIC XX VALUE
            "RC".
       05           PIC X VALUE SPACE.
       05           PIC X(8) VALUE
            "VENDOR #".
       05           PIC XX VALUE SPACES.
       05           PIC X(8) VALUE
            "DATE DUE".
       05           PIC XX VALUE SPACES.
       05           PIC X(11) VALUE
            "VENDOR NAME".
       05           PIC X(6) VALUE SPACES.
       05           PIC X(10) VALUE
            "AMOUNT DUE".
       05           PIC XXX VALUE SPACES.
       05           PIC X(16) VALUE
            "-- ERROR CODES--".

   01 DETAIL-LINE.
       05 RECORD-CODE-OUT           PIC XX.
       05                           PIC X VALUE SPACE.
       05 VEND-NUM-OUT              PIC 9(8).
       05                           PIC XX VALUE SPACES.
       05 YEAR-DUE-OUT              PIC XX.
       05 MONTH-DUE-OUT             PIC XX.
       05 DAY-DUE-OUT               PIC XX.
       05                           PIC XX VALUE SPACES.
       05 VEND-NAME-OUT             PIC X(20).
       05                           PIC XX VALUE SPACES.
       05 AMT-DUE-OUT               PIC 999,999.99.
       05                           PIC XX VALUE SPACES.
       05 A-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 B-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 C-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 D-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 E-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 F-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 G-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 H-ERROR-OUT               PIC X.
       05                           PIC XX VALUE SPACES.
       05 I-ERROR-OUT               PIC X.

   01 ASTERISK-LINE.
       05 A-AST-OUT                 PIC XX.
       05                           PIC X VALUE SPACE.
       05 BC-AST-OUT                PIC X(8).
       05                           PIC XX VALUE SPACES.
       05 D-AST-OUT                 PIC XX.
       05                           PIC X VALUE SPACE.
       05 E-AST-OUT                 PIC XX.
       05                           PIC X VALUE SPACE.
       05 F-AST-OUT                 PIC XX.
       05                           PIC XX VALUE SPACES.
       05 G-AST-OUT                 PIC X(15).
       05                           PIC XX VALUE SPACES.
       05 I-AST-OUT                 PIC X(8).
       05                           PIC XX VALUE SPACES.
       05 H-AST-OUT                 PIC X(8).

   01 RECORD-TOTALS.
       05                           PIC X(16) VALUE
            "VALID RECORDS: ".
       05 VALID-RECORDS-OUT         PIC 99.
       05                           PIC XX VALUE SPACES.
       05                           PIC X(17) VALUE
            "INVALID RECORDS: ".
       05 INVALID-RECORDS-OUT       PIC 99.

   PROCEDURE DIVISION.

   1000-MAIN-CONTROL.
       MOVE WHEN-COMPILED         TO W-WHEN-COMPILED
       DISPLAY
               "TEST PROGRAM COMPILED ON "
               W-WHEN-COMPILED
       PERFORM 2000-INITIALIZE.
       PERFORM UNTIL END-OF-FILE = "YES"
         READ DATVAL02
           AT END
             MOVE "YES" TO END-OF-FILE
           NOT AT END
             PERFORM 2100-ERROR-ROUTINE
             IF ERROR-FLAG = "YES"
                PERFORM 2500-PROCESS
                PERFORM 3000-PROCESS
             END-IF
             IF ERROR-FLAG = "NO"
                PERFORM 2500-PROCESS
             END-IF
         END-READ
       END-PERFORM.
       PERFORM 4000-PROCESS.
       PERFORM 4500-TERMINATE.
       STOP RUN.

   2000-INITIALIZE.
       OPEN INPUT DATVAL02.
       OPEN OUTPUT REPORT-FILE.

       WRITE REPORT-RECORD         FROM HEADING-LINE-1.
       WRITE REPORT-RECORD         FROM HEADING-LINE-2.

   2100-ERROR-ROUTINE.
       MOVE "NO"                   TO ERROR-FLAG.
       MOVE "NO"                   TO ERROR-FLAG2.

       IF VEND-NUM = SPACES
           MOVE "YES"              TO ERROR-FLAG
           MOVE "********"         TO BC-AST-OUT
           MOVE "B"                TO B-ERROR-OUT
       END-IF.


       IF ERROR-FLAG = "YES"
            ADD 1 TO INVALID-RECORDS
       END-IF.

       IF ERROR-FLAG = "NO"
           ADD 1 TO VALID-RECORDS
       END-IF.



   2500-PROCESS.
       MOVE RECORD-CODE    TO RECORD-CODE-OUT.
       MOVE VEND-NUM       TO VEND-NUM-OUT.
       MOVE YEAR-DUE       TO YEAR-DUE-OUT.
       MOVE MONTH-DUE      TO MONTH-DUE-OUT.
       MOVE DAY-DUE        TO DAY-DUE-OUT.
       MOVE VEND-NAME      TO VEND-NAME-OUT.
       MOVE AMT-DUE        TO AMT-DUE-OUT.

       WRITE REPORT-RECORD FROM DETAIL-LINE.

   3000-PROCESS.
       WRITE REPORT-RECORD FROM ASTERISK-LINE.

   4000-PROCESS.
       MOVE VALID-RECORDS      TO VALID-RECORDS-OUT.
       MOVE INVALID-RECORDS    TO INVALID-RECORDS-OUT.
       WRITE REPORT-RECORD     FROM RECORD-TOTALS.

   4500-TERMINATE.
       CLOSE DATVAL02, REPORT-FILE.