COBOL搜索/增量表

COBOL搜索/增量表,cobol,Cobol,我需要根据地区代码找出每个地区有多少保单。所以每次我在记录中找到区域时,我需要增加表中该区域的计数 然后我就可以将它移动到我的输出。根据下面的记录,我不知道如何计算每个地区的保单数量。我试过各种各样的方法,但似乎都不管用 如果你需要更多的信息,请告诉我 以下是该记录的定义和摘录(共57条记录) 我希望你能给我一些建议,或者给我一个正确的方向。。提前谢谢 我的最终代码: PERFORM B000-OPENING-PROCEDURE.

我需要根据地区代码找出每个地区有多少保单。所以每次我在记录中找到区域时,我需要增加表中该区域的计数 然后我就可以将它移动到我的输出。根据下面的记录,我不知道如何计算每个地区的保单数量。我试过各种各样的方法,但似乎都不管用

如果你需要更多的信息,请告诉我

以下是该记录的定义和摘录(共57条记录)

我希望你能给我一些建议,或者给我一个正确的方向。。提前谢谢

我的最终代码:

        PERFORM B000-OPENING-PROCEDURE.                              
        PERFORM B600-PRINT-HEADINGS.                                 
        PERFORM B200-READ-FILE.                                      
        PERFORM B300-MAIN-PROCEDURE                                  
             UNTIL END-OF-FILE-SW = 'YES'.                           
        PERFORM C100-MOVE-COUNTS                                     
             VARYING T2-INDEX FROM 1 BY 1                            
             UNTIL T2-INDEX > 9.                                     
        PERFORM B100-CLOSING-PROCEDURE.                              
        STOP RUN.                                                    

    B000-OPENING-PROCEDURE.                                          
          OPEN OUTPUT REPORT-FILE.                                   
          OPEN OUTPUT PRINT-FILE.                                    
          OPEN INPUT INPUT-FILE.                                     

    B100-CLOSING-PROCEDURE.                                          
          PERFORM B500-PRINT-TOTAL-LINE.  
          CLOSE REPORT-FILE.                                         
          CLOSE PRINT-FILE.                                          
          CLOSE INPUT-FILE.                                          

    B200-READ-FILE.                                                  
          READ INPUT-FILE INTO RECORD-TYPE-94                        
               AT END MOVE 'YES' TO END-OF-FILE-SW.                  

    B300-MAIN-PROCEDURE.                                             
          IF REC-94-TYPE = "94"                                      
               PERFORM B400-SEARCH-TERRITORY                         
          ELSE                                                       
             WRITE REPORT-RECORD FROM RECORD-TYPE-94                 
          END-IF.                                                    
          ADD 1 TO A-LINE-COUNT.                                     
          PERFORM B200-READ-FILE. 
     B400-SEARCH-TERRITORY.                                          
          SET T1-INDEX TO 1.                                         
          SEARCH T1-ENTRY                                            
               AT END                                                
                    DISPLAY 'PARISH NOT FOUND IN TABLE'              
                    CALL 'CEE3ABD' USING BY VALUE 12 BY VALUE 1      
               WHEN                                                  
                    REC-94-PARISH-CODE = T1-PARISH(T1-INDEX)         
                    MOVE T1-TERRITORY(T1-INDEX) TO                   
                         REC-94-TERRITORY-CODE                       
                    ADD 1 TO A-DISK-COUNTER                          
                    PERFORM B700-MOVE-RECORDS                        
                    PERFORM B900-COUNT-POLICIES                      
          END-SEARCH.                                                

     B500-PRINT-TOTAL-LINE.                                          
           MOVE A-LINE-COUNT TO TOTAL-RECORDS.                       
           MOVE A-DISK-COUNTER TO TOTAL-POLICIES.       
           WRITE PRINT-RECORD FROM TOTAL-LINE.                      

     B600-PRINT-HEADINGS.                                           
           ADD 1 TO A-PAGE-COUNT.                                   
           MOVE A-PAGE-COUNT TO PRINT-PAGE-NUMBER.                  
           WRITE PRINT-RECORD FROM HEADER.                          
           WRITE PRINT-RECORD FROM HEADER-LINE-2.                   
           WRITE PRINT-RECORD FROM COLUMN-LINE.                     

     B700-MOVE-RECORDS.                                             
           MOVE REC-94-TYPE TO REC-94-TYPE-OUT                      
           MOVE REC-94-POLICY-NUMBER TO REC-94-POLICY-NUMBER-OUT    
           MOVE REC-94-PARISH-CODE TO REC-94-PARISH-CODE-OUT        
           MOVE REC-94-TERRITORY-CODE TO REC-94-TERRITORY-CODE-OUT  
           WRITE REPORT-RECORD FROM TRNREC94-OUT.                   

     B900-COUNT-POLICIES.                                           
           SET T2-INDEX TO 1.                                         
           SEARCH T2-ENTRY                                            
           AT END                                                 
               DISPLAY 'NO POLICIES FOUND.'                       
           WHEN                                                   
               REC-94-TERRITORY-CODE = T2-TERRITORY-CODE(T2-INDEX)
               DD 1 TO T2-TERRITORY-COUNTER(T2-INDEX)            
           END-SEARCH.                                                   


     C100-MOVE-COUNTS.                                               
          MOVE T2-TERRITORY-CODE(T2-INDEX) TO DET-TERRITORY.         
          MOVE T2-TERRITORY-COUNTER(T2-INDEX) TO DET-NUMBER-POLICIES.
          WRITE PRINT-RECORD FROM DETAIL-LINE.      

在到达文件末尾后,仅执行一次B900-COUNT-POLICIES

B900-也只是使用T2-INDEX最后的值

你有两个主要的选择:一个循环去做;或者,假设您的区域为0到小于或等于9,在这种情况下,您可以使用区域的值来设置索引的值,然后只需添加。搜索是可能的(它对您不起作用的原因仍然是在文件结束后才执行段落,而不是每个记录),但根据我的经验,它不是为此类任务选择的方法

如果要使用territory获取要用于添加的索引的值,请使用SET:

SET T2-INDEX TO rec-94-territory-code
除非你不能。rec-94-territory-code是字母数字字段(PIC X字段。这适用于计算中未使用的任何内容)。首先在工作存储器中定义一个新的数字字段是没有问题的

MOVE rec-94-territory-code TO new-numeric-field
然后

对于循环,我想你已经可以到达那里了

然而,在进行任何添加之前,如果您的每领土计数从零开始,这将是一个好主意。你在太空的状态。即使这种做法“奏效”,也不是好的做法

所以你需要从零开始-现在循环是好的

根据代码更改,下一个问题是如何尝试将初始值设置到计数表中


现在,在打开的段落之后添加一个段落,然后执行新段落。在该段中,创建一个循环,将表中的值设置为零,从第一个值开始,到第九个值结束。

带有搜索语句的B900版本应该可以工作,但从A000调用B900,并且只调用一次。将performb900语句移动到B300,您应该为每次读取的记录收集计数

此外,T2-TERRITORY-COUNTER用空格初始化。请用零初始化它。根据编译器的不同,这可能没有什么区别,但如果变量从零开始,则更容易理解变量的意图

*更新* 您更新的代码仍有T2-TERRITORY-COUNTER的空间。 也许下面的内容会有所帮助。它基于您的代码,但删除了一些部分以使相关部分更易于查看。下面的代码适用于GNUCobol(以前的OpenCobol-请参阅sourceforge.net)。


我编辑了代码,没什么变化。我不知道你说的阿本德是什么意思?事实上我不太确定那是什么意思。“有可能是企业号。”比尔伍德和瓦尔迪斯非常感谢你们的帮助。我最终做了一些不同于亚尔建议的事情,并发布了最终代码。我知道有一个更简单的方法,但这是我现在唯一能让它工作的方法。我听到了你关于88的说法,我打算把它们加进去,我只是想先得到正确的输出!:)
SET T2-INDEX TO rec-94-territory-code
MOVE rec-94-territory-code TO new-numeric-field
SET T2-INDEX TO new-numeric-field
   IDENTIFICATION DIVISION.
   PROGRAM-ID. COUNT-TERRITORY.

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT POLICY-FILE ASSIGN TO 'POLICY.DAT'
       FILE STATUS IS POLICY-FILE-STATUS
       ORGANIZATION IS LINE SEQUENTIAL.

   SELECT REPORT-FILE ASSIGN TO 'POLICY.RPT'
       FILE STATUS IS REPORT-FILE-STATUS
       ORGANIZATION IS LINE SEQUENTIAL.

   DATA DIVISION.
   FILE SECTION.
   FD  POLICY-FILE.
   01  POLICY-RECORD               PIC X(20).

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

   WORKING-STORAGE SECTION.

   01  IS-POLICY-FILE-AT-END       PIC XXX VALUE 'NO '.
       88  POLICY-FILE-AT-END      VALUE 'YES'.

   01  POLICY-FILE-STATUS          PIC 9(2).
       88  POLICY-FILE-OK          VALUES 0 10.
  *                                VALUE 00 = SUCCESS 
  *                                VALUE 10 = END OF FILE

   01  REPORT-FILE-STATUS          PIC 9(2).
       88  REPORT-FILE-OK          VALUES 0 10.
  *                                VALUE 00 = SUCCESS 
  *                                VALUE 10 = END OF FILE

   01  RECORD-TYPE-94.
       05  REC-94-TYPE             PIC X(2).
           88  INCLUDED-RECORD-TYPE    VALUE '94'.
       05  REC-94-POLICY-NUMBER    PIC X(8).
       05  FILLER                  PIC X(5).
       05  REC-94-PARISH-CODE      PIC X(3).
       05  FILLER                  PIC X(1).
       05  REC-94-TERRITORY-CODE   PIC X(1).

   01  T2-TERRITORY-COUNT.                                    
       05  FILLER                  PIC X(4) VALUE '1000'.    
       05  FILLER                  PIC X(4) VALUE '2000'.    
       05  FILLER                  PIC X(4) VALUE '3000'.    
       05  FILLER                  PIC X(4) VALUE '4000'.    
       05  FILLER                  PIC X(4) VALUE '5000'.    
       05  FILLER                  PIC X(4) VALUE '6000'.    
       05  FILLER                  PIC X(4) VALUE '7000'.    
       05  FILLER                  PIC X(4) VALUE '8000'.    
       05  FILLER                  PIC X(4) VALUE '9000'.    

   01  T2-TERRITORY-TABLE REDEFINES T2-TERRITORY-COUNT.       
       05  T2-ENTRY                OCCURS 9 TIMES            
           INDEXED BY T2-INDEX.   
           10 T2-TERRITORY-CODE    PIC X.                  
           10 T2-TERRITORY-COUNTER PIC 999. 

   PROCEDURE DIVISION.

   A000-MAINLINE.                                     
       PERFORM B000-OPENING-PROCEDURE
       PERFORM B200-READ-FILE
       PERFORM B300-MAIN-PROCEDURE
           UNTIL POLICY-FILE-AT-END
       PERFORM C100-WRITE-TERRITORY-COUNTS
       PERFORM B100-CLOSING-PROCEDURE
       STOP RUN
       .

   B000-OPENING-PROCEDURE.                                      
       OPEN INPUT  POLICY-FILE
       OPEN OUTPUT REPORT-FILE
       .

   B100-CLOSING-PROCEDURE.                                      
       CLOSE POLICY-FILE
       CLOSE REPORT-FILE
       .

   B200-READ-FILE.                                              
       READ POLICY-FILE INTO RECORD-TYPE-94                    
           AT END SET POLICY-FILE-AT-END TO TRUE
       PERFORM D100-CHECK-POLICY-FILE-STATUS
       .

   B300-MAIN-PROCEDURE.                               
       IF INCLUDED-RECORD-TYPE
           PERFORM B900-COUNT-POLICIES
       ELSE
           WRITE REPORT-RECORD FROM RECORD-TYPE-94
           PERFORM D200-CHECK-REPORT-FILE-STATUS
       END-IF
       PERFORM B200-READ-FILE
       .

   B900-COUNT-POLICIES.
       SET T2-INDEX TO 1
       SEARCH T2-ENTRY
           AT END
               DISPLAY 'TERRITORY ' REC-94-TERRITORY-CODE
                       ' UNKNOWN'
           WHEN REC-94-TERRITORY-CODE = T2-TERRITORY-CODE (T2-INDEX)
               ADD 1 TO T2-TERRITORY-COUNTER (T2-INDEX)
       END-SEARCH
       .

   C100-WRITE-TERRITORY-COUNTS.
       MOVE SPACES TO REPORT-RECORD
       WRITE REPORT-RECORD
       PERFORM D200-CHECK-REPORT-FILE-STATUS
       PERFORM VARYING T2-INDEX FROM 1 BY 1
           UNTIL T2-INDEX > 9
           STRING 'POLICY COUNT FOR TERRITORY '
                  T2-TERRITORY-CODE (T2-INDEX)
                  ': '
                  T2-TERRITORY-COUNTER (T2-INDEX)
           INTO REPORT-RECORD
           WRITE REPORT-RECORD
           PERFORM D200-CHECK-REPORT-FILE-STATUS
       END-PERFORM
       .

   D100-CHECK-POLICY-FILE-STATUS.
       IF NOT POLICY-FILE-OK
           DISPLAY 'ERROR CODE READING POLICY FILE: '
                   POLICY-FILE-STATUS
       END-IF
       .

   D200-CHECK-REPORT-FILE-STATUS.
       IF NOT REPORT-FILE-OK
           DISPLAY 'ERROR CODE WRITING REPORT FILE: '
                   POLICY-FILE-STATUS
       END-IF
       .