2013-10-29 183 views
1

我试图搜索一个表,但它保持结局。我对COBOL很陌生,我不确定我是否犯了一个简单的错误。当我尝试调试时,它看起来好像教区代码匹配,所以我不确定它为什么不输出领土代码。这个例程的说明和我的代码在以下情况下有帮助。我知道我错过了很多(如计数),但我只是想先获得一些输出。任何帮助,将不胜感激!COBOL搜索功能

  1. 阅读每条记录。如果记录类型为94,则使用SEARCH动词在教区/地区表中查找教区代码并查找地区代码。将地区代码添加到输出记录并将记录写入磁盘。

  2. 如果在教区/地区表中找到教区,请在地区表中增加该地区的计数。

  3. 如果教区不在教区/地区表中,则将该程序异常终止。

  4. 将每个地区和该地区相应的政策数量打印到报告中。

  5. 打印处理的总记录数和总处理报告的策略数。

 
FILE SECTION.            

    FD REPORT-FILE            
     LABEL RECORDS ARE OMITTED        
     DATA RECORD IS REPORT-RECORD.       

    01 REPORT-RECORD     PIC X(132).    

    FD PRINT-FILE            
     LABEL RECORDS ARE OMITTED        
     DATA RECORD IS PRINT-RECORD.        

    01 PRINT-RECORD     PIC X(132).    

    FD INPUT-FILE            
     LABEL RECORD IS STANDARD.        

     COPY TRNREC94.            

     EJECT              

    WORKING-STORAGE SECTION.          

01 record-ws. 
    05 rec-record-type pic x(2) read input-file 
    05 rec-policy-number pic x(8) 
    05 filler  pic x(5) 
    05 rec-parish-code pic x(3) 
    05 filler  pic x(1) 
    05 rec-territory-code pic x(1) 
    05 filler  pic x(60) 



01 HEADER.              
     05 FILLER     PIC X(8) VALUE 'TSTHC020'.  
     05 FILLER     PIC X(30) VALUE SPACES.   
     05 FILLER     PIC X(41)      
      VALUE 'LOUISIANA FARM BUREAU INSURANCE COMPANIES'.  
     05 FILLER     PIC X(30) VALUE SPACES.   
     05 FILLER     PIC X(5) VALUE 'PAGE '.  
     05 PRINT-PAGE-NUMBER  PIC ZZZZZZ9.     

    01 HEADER-LINE-2.            
     05 FILLER     PIC X(10) VALUE '10/22/2013'. 



    01 DETAIL-LINE.            
     05 DET-TERRITORY   PIC X(2).      
     05 DET-NUMBER-POLICIES  PIC X(2).      

    01 COLUMN-LINE.            
     05 FILLER     PIC X(9) VALUE 'TERRITORY'. 
     05 FILLER     PIC X(10) VALUE SPACES.   
     05 FILLER     PIC X(18)      
      VALUE 'NUMBER OF POLICIES'.        

    01 TOTAL-LINE.             
     05 FILLER     PIC X(26)      
      VALUE 'TOTAL RECORDS PROCESSED IS'.      
     05 TOTAL-RECORDS   PIC X(3).      
     05 FILER     PIC X(32)      
      VALUE 'AND TOTAL POLICIES PROCESSED IS'.  
     05 TOTAL-POLICIES   PIC X(3).      


    01 PROG-ID.              
     05 FILLER     PIC X(50)      
      VALUE 'PROGRAM - TSTXX002- WORKING STORAGE STARTS HERE'. 

    01 MISC-VARIABLES-SW.           
     05 END-OF-FILE-SW   PIC XXX.       
      88 ALL-RECORDS-ARE-PROCESSED  VALUE 'YES'.   
      88 MORE-RECORDS     VALUE 'NO'.   


    01 FILE-STATUS-VALUES.           
     05 FILE-STATUS    PIC 99.       
      88 SUCCESSFUL-READ     VALUE 0.    
      88 SUCCESSFUL-START    VALUE 0.    
      88 SUCCESSFUL-WRITE    VALUE 0. 
      88 SUCCESSFUL-DELETE    VALUE 0.   
      88 SUCCESSFUL-OPEN     VALUE 0.   
      88 SUCCESSFUL-CLOSE    VALUE 0.   
      88 END-OF-FILE      VALUE 10.   
      88 RECORD-NOT-FOUND    VALUE 23.   

     05 PAGE-CONTROLLERS.          
      10 A-LINE-COUNT  PIC 999 COMP-3 VALUE 0.  
      10 A-PAGE-COUNT  PIC 999 COMP-3 VALUE 0.  
      10 A-DISK-COUNTER  PIC 9(5) COMP-3 VALUE 0.  

    01 TABLES.             

     05 T1-TERRITORY-VALUES.         
      10 FILLER    PIC X(4) VALUE '0101'.  
      10 FILLER    PIC X(4) VALUE '0207'.  
      10 FILLER    PIC X(4) VALUE '0307'.  
      10 FILLER    PIC X(4) VALUE '0409'.  
      10 FILLER    PIC X(4) VALUE '0509'.  
      10 FILLER    PIC X(4) VALUE '0609'.  
      10 FILLER    PIC X(4) VALUE '0709'.  
      10 FILLER    PIC X(4) VALUE '0801'.  
      10 FILLER    PIC X(4) VALUE '0901'.  
      10 FILLER    PIC X(4) VALUE '1001'.  
      10 FILLER    PIC X(4) VALUE '1104'.  
      10 FILLER    PIC X(4) VALUE '1204'.  
      10 FILLER    PIC X(4) VALUE '1305'.  
      10 FILLER    PIC X(4) VALUE '1405'.  
      10 FILLER    PIC X(4) VALUE '1506'.  
      10 FILLER    PIC X(4) VALUE '1606'.  
      10 FILLER    PIC X(4) VALUE '1707'.  
      10 FILLER    PIC X(4) VALUE '1802'.  
      10 FILLER    PIC X(4) VALUE '1902'.  
      10 FILLER    PIC X(4) VALUE '2002'.  
      10 FILLER    PIC X(4) VALUE '2103'.  
      10 FILLER    PIC X(4) VALUE '2208'. 
      10 FILLER    PIC X(4) VALUE '2308'.  
      10 FILLER    PIC X(4) VALUE '2409'.  
      10 FILLER    PIC X(4) VALUE '2506'.  
      10 FILLER    PIC X(4) VALUE '2605'.  
      10 FILLER    PIC X(4) VALUE '2704'.  
      10 FILLER    PIC X(4) VALUE '2804'.  
      10 FILLER    PIC X(4) VALUE '2903'.  
      10 FILLER    PIC X(4) VALUE '3003'.  

     05 T1-TERRITORY-TABLE REDEFINES T1-TERRITORY-VALUES.  
      10 T1-ENTRY     OCCURS 30 TIMES   
              INDEXED BY T1-INDEX. 

       15 T1-PARISH    PIC XXX.     
       15 T1-TERRITORY   PIC X.  


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 XXX. 

PROCEDURE DIVISION. 
A000-MAINLINE.             

      PERFORM B000-OPENING-PROCEDURE.        
      PERFORM B110-PRINT-HEADINGS.         
      PERFORM B300-READ-FILE.        
      PERFORM B500-MAIN-PROCEDURE         
       UNTIL END-OF-FILE-SW = 'YES'.       
      PERFORM B100-CLOSING-PROCEDURE.        
      STOP RUN.              

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

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

     B200-PRINT-HEADER.            
       MOVE HEADER TO PRINT-RECORD.        
       WRITE PRINT-RECORD.           
       MOVE HEADER-LINE-2 TO PRINT-RECORD.       
       WRITE PRINT-RECORD BEFORE ADVANCING 1.      

     B300-READ-FILE.           
       READ INPUT-FILE NEXT RECORD         
        AT END MOVE 'YES' TO END-OF-FILE-SW.     


     B500-MAIN-PROCEDURE.            
      PERFORM B600-SEARCH-TERRITORY     
      PERFORM B300-READ-FILE.        


     B600-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 
           DET-TERRITORY.        


     B700-PRINT-DETAIL-LINE.           
       MOVE DETAIL-LINE TO PRINT-RECORD.       
       WRITE PRINT-RECORD BEFORE ADVANCING 1.      

     B800-PRINT-TOTAL-LINE.           
       MOVE A-LINE-COUNT TO TOTAL-RECORDS.      
       MOVE TOTAL-LINE TO PRINT-RECORD.       
       WRITE PRINT-RECORD AFTER ADVANCING 1.      

     B900-PRINT-COLUMN-LINE.           
       MOVE COLUMN-LINE TO PRINT-RECORD.       
       WRITE PRINT-RECORD BEFORE ADVANCING 1. 

     B110-PRINT-HEADINGS.            
       ADD 1 TO A-PAGE-COUNT.          
       MOVE A-PAGE-COUNT TO PRINT-PAGE-NUMBER.     
       PERFORM B200-PRINT-HEADER.         
       PERFORM B900-PRINT-COLUMN-LINE.  
+1

什么是您的抄写本中REC-94-PARISH-CODE的定义?您也没有任何东西来检查类型94.如果您有其他记录类型,他们是否有教区代码在同一位置?如果没有,并且在94条记录之前还有另一种记录类型,则不会得到一个匹配(除非您不幸),并且您会得到您的结尾。 –

+0

COPYBOOK:TRNREC94 01 RECORD-TYPE-94。 05 REC-94-TYPE PIC X(2)。 05 REC-94-POLICY-NUMBER PIC X(8)。 (5)。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)。 FILLER PIC X(60)。 其他记录类型没有教区代码在我认为相同的位置。我不确定抄本是如何工作的,这就是为什么我没有检查类型94的原因,我认为复制记录94就足够了。 – Meg

回答

2

它认为你的问题是在为94S不是测试。仅包含一个字帖是不够的。

B500-MAIN-PROCEDURE.       
     IF REC-94-TYPE EQUAL TO "94"      
      PERFORM B600-SEARCH-TERRITORY 
     END-IF     
     PERFORM B300-READ-FILE 
     . 

理想情况下,您将有一个记录类型88,您可以在另一个副本上找到相同的文件。

请注意,在段落/ SECTION开始或到达程序结束之前,我已经使用了作用域分隔符(END-IF)并将句点数/满站数限制为强制句柄。

你正在做IO,你甚至已经设置了88个,但是你没有对IO进行任何状态检查。你应该。总是。

为什么你打开你的I-O输入?如果你有一个普通的顺序文件,阅读它,然后写一个新文件。否则,您必须在程序运行之前创建备份。如果你不这样做,那么你的更新就会变成腐败现场。

+0

我使用了IF语句,当我调试时,我发现我终于阅读了正确的记录。我只得到一行输出,只是显示了我读取的总记录。一旦找到教区代码,我需要弄清楚如何增加每个区域的计数(一个磁盘计数器只是计算我正在阅读的记录,这也让我花了很长时间才弄清楚),但是我没有认为我的MOVE声明正在按照我的想法工作。关于如何在领土数量表中增加计数的任何提示?感谢您的耐心,因为我显然对此非常陌生! – Meg

+0

@MeaganOh B500-MAIN-PROCEDURE不写任何东西 - 那是你可以添加计数器和输出语句的地方吗?无论如何,你的时间再次开始为自己思考。比尔回答了你的问题,你应该承认,接受这个答案,也许勾选upvote按钮。 – NealB