通过名字的第一个字母提取记录

时间:2014-11-30 22:57:47

标签: cobol

我正在尝试制作下面的程序来提取客户名称以字母开头的记录" M"并将记录写入临时文件。该程序运行但它不会将记录写入输出文件。我调试了代码,它似乎是代码行" WRITE MAST2-RECORD"永远不会跑。它会跳过这行代码。

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
       SELECT MAST-FILE ASSIGN TO 'G:\CPSC315-COBOL\COBOLAssignments\P15-1\OVERDUE.IND.TXT'
           ORGANIZATION IS INDEXED
           ACCESS IS RANDOM
           RECORD KEY IS M-ACCT-NUM.

       SELECT MAST2-FILE ASSIGN TO 'G:\CPSC315-COBOL\COBOLAssignments\P15-1\OVERDUE2.IND.TXT'
           ORGANIZATION IS LINE SEQUENTIAL.

   DATA DIVISION.
   FILE SECTION.
   FD MAST-FILE
       LABEL RECORDS ARE STANDARD.
   01 MAST-RECORD.
       05 M-ACCT-NUM         PIC X(4).
       05 M-CUSTOMER-NAME    PIC X(15).
       05 M-DAYS-OVERDUE     PIC 99.
       05 M-BALANCE-DUE      PIC 999V99.

   FD MAST2-FILE
       LABEL RECORDS ARE STANDARD.
   01 MAST2-RECORD           PIC X(50).

   WORKING-STORAGE SECTION.
   01  COUNTER                PIC 9.

   01  PROGRAM-DATA-ITEMS.
       05 WRITE-OK            PIC X VALUE 'Y'.

   PROCEDURE DIVISION.
   10-MAINLINE.
       OPEN OUTPUT MAST-FILE
           OUTPUT MAST2-FILE
       PERFORM 20-LOAD-MAST-FILE
       CLOSE MAST-FILE
           MAST2-FILE
       STOP RUN.

   20-LOAD-MAST-FILE.
       PERFORM 30-INPUT-INDEX
           PERFORM UNTIL M-ACCT-NUM = 0 OR WRITE-OK = 'N'
           PERFORM 40-WRITE-FILE
           PERFORM 50-FIND-CUSTOMER-START-WITH-M
           PERFORM 30-INPUT-INDEX
       END-PERFORM.

   30-INPUT-INDEX.
       DISPLAY 'ENTER ACCOUNT NUMBER (0 TO QUIT): ' WITH NO ADVANCING
       ACCEPT M-ACCT-NUM.

   40-WRITE-FILE.
       DISPLAY '   ENTER CUSTOMER NAME: ' WITH NO ADVANCING
           ACCEPT M-CUSTOMER-NAME
           DISPLAY '       ENTER DAYS OVERDUE: ' WITH NO ADVANCING
           ACCEPT M-DAYS-OVERDUE
           DISPLAY '           ENTER BALANCE DUE: ' WITH NO ADVANCING
           ACCEPT M-BALANCE-DUE
           WRITE MAST-RECORD 
               INVALID KEY
                   MOVE 'N' TO WRITE-OK
                   DISPLAY 'ERROR ' MAST-RECORD
           END-WRITE.

   50-FIND-CUSTOMER-START-WITH-M.
       MOVE 0 TO COUNTER
       INSPECT MAST-RECORD TALLYING COUNTER FOR ALL ' M '
       IF COUNTER > 0
           WRITE MAST2-RECORD
       END-IF.

   end program Program1.

1 个答案:

答案 0 :(得分:3)

您正在寻找整个记录中的空白-M空白。

您说您想要做的是以M开头的优质客户名称。

   05 M-CUSTOMER-NAME.
      10  M-CUSTOMER-NAME-FIST-CHARACTER PIC X.
          88  M-CUSTOMER-NAME-START-M VALUE "M".

如果您使用该定义代替您所拥有的内容,并在测试中使用88来进行编写,那么您应该得到您想要的内容。

例如替换:

50-FIND-CUSTOMER-START-WITH-M.
    MOVE 0 TO COUNTER
    INSPECT MAST-RECORD TALLYING COUNTER FOR ALL ' M '
    IF COUNTER > 0
        WRITE MAST2-RECORD
    END-IF.

人:

50-FIND-CUSTOMER-START-WITH-M.
    IF M-CUSTOMER-NAME-START-M
        WRITE MAST2-RECORD
    END-IF
    .

更简单,更易于理解,更易于维护。

您应该考虑可能的"有效性"你的名字在一个好的系统中,没有领先的空白。在一个糟糕的系统中可能会有。

要处理这个问题,请测试客户名称的第一个字节是否为空格,如果是,请测试客户名称是否为完全空格。如果不是完全空间,循环直到找到第一个非空白。测试M的第一个非空白。所以在这种情况下你有两个测试。

您可以通过复制和删除此程序以及报告/输出客户名称的第一个字节为空白的位置来单独评估数据质量。

一旦你知道了,你就去找分析师(导师)并询问你是否需要处理可能的领先空白。如果你不这样做,请在实际程序中将测试保持为空白,并在这种情况下崩溃: - )