I need to find how many policies are in each territory based on the territory code. So everytime I find the territory in the record, I need to increment the count for that territory in my table then I would be able to move it to my output. I can't figure out how to count the policies in each territory based on the record below. I've tried a variety of things but nothing seems to work.

If you need more information, please let me know.

Below is the definition and an excerpt from the record (total of 57 records)

rec-94-type pic x(2)
rec-94-policy-number pic x(8)
filler pic x(5)
rec-94-parish-code pic x(3)
filler pic x(1)
rec-94-territory-code pic x(1)

94A 018517     080     1       
94A 027721     090     1      
94A 036470     250     6 

94A 049137     010     1  
......

My most recent attempt:

05  T2-TERRITORY-COUNT.                                    
  10  FILLER                   PIC X(4) VALUE '1   '.    
  10  FILLER                   PIC X(4) VALUE '2   '.    
  10  FILLER                   PIC X(4) VALUE '3   '.    
  10  FILLER                   PIC X(4) VALUE '4   '.    
  10  FILLER                   PIC X(4) VALUE '5   '.    
  10  FILLER                   PIC X(4) VALUE '6   '.    
  10  FILLER                   PIC X(4) VALUE '7   '.    
  10  FILLER                   PIC X(4) VALUE '8   '.    
  10  FILLER                   PIC X(4) VALUE '9   '.    

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

A000-MAINLINE.                                     

 PERFORM B000-OPENING-PROCEDURE.                
 PERFORM B600-PRINT-HEADINGS.                   
 PERFORM B200-READ-FILE.                        
 PERFORM B300-MAIN-PROCEDURE                    
      UNTIL END-OF-FILE-SW = 'YES'.             
 PERFORM B800-MOVE-TERRITORY-CODE               
      VARYING T2-INDEX FROM 1 BY 1              
      UNTIL T2-INDEX > 9.                       

 PERFORM B110-MOVE-COUNTS                       
 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           
                PERFORM B900-COUNT-POLICIES             
           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                       
         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.                  

     B800-MOVE-TERRITORY-CODE.                                     
          MOVE T2-TERRITORY-CODE(T2-INDEX) TO DET-TERRITORY.       
          WRITE PRINT-RECORD FROM DETAIL-LINE.                     


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

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

I'd appreciate any pointers or just the correct direction to go in for this.. Thanks in advance!

My final code:

        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.      
有帮助吗?

解决方案

The version of B900 with the search statement should work, but B900 is called, and only called once, from A000. Move the PERFORM B900 statement to B300 and you should collect a count for each record read.

Also, T2-TERRITORY-COUNTER is initialized with spaces. Please initialize it with zeros. Depending on your compiler, it might not make a difference, but it is easier to understand the intent of the variable if it starts from zero.

* update * Your updated code still has spaces for T2-TERRITORY-COUNTER. Perhaps the following will help. It is based on your code, but some parts were removed to make the relevant parts easier to see. The code below works for GNU Cobol (formerly OpenCobol - see sourceforge.net).

   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
       .

其他提示

You PERFORM B900-COUNT-POLICIES only once, after the end-of-file is already reached.

B900- also just uses whatever value T2-INDEX last had.

You have two main choices: either a loop to do it; or, assuming that your territory is zero to less-than-or-equal-to nine - in which case you can use the value of the territory to set the value for your index and just add. SEARCH is possible (the reason it didn't work for you was still the execution of the paragraph only after end-of-file, not with each record), but in my experience it is not a method that is chosen for this type of task.

If you want to use the territory to get the value for the index to use for the ADD, use SET:

SET T2-INDEX TO rec-94-territory-code

Except you can't. rec-94-territory-code is an alpha-numeric (a PIC X field. This is good for anything not used in a calculation). It is unproblematic to define a new numeric field in your WORKING-STORAGE and first

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

then

SET T2-INDEX TO new-numeric-field

For the loop, I think you can already get there.

However, before you do any adding either way, it would be a good idea if your per-territory counts started off at zero. Yours state off at space. Even if that "works", it is not good practice.

So you need to start those from zero - a loop is good for now.

In the light of your code changes, your next problem is how you've attempted to set initial values to your table of counts.

For now, add a paragraph after your OPEN paragraph and PERFORM that new paragraph. In that paragraph, make a loop to set the values in your table to zero, starting from the first and ending with the ninth.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top