Как печатать только уникальные номера дел?

Я пытаюсь распечатать только уникальные номера дел (которые расположены в первых 5 байтах каждой входной записи). Моя структура входного файла такая же, как в этом примере:

00001
00001
00002
00002
00002
00003
00004
00005

Я должен быть в состоянии прочитать номер дела, например, 0001 (или 00002, 00003, ...) и сохранить его во временной переменной. Затем сравните значение этой временной переменной с номером дела текущей обрабатываемой записи. Когда они не совпадают, мне нужно записать номер дела (как содержится в переменной temp) в мой выходной файл. А затем продолжите обработку оставшихся записей.

В итоге мой выходной файл должен выглядеть примерно так (обратите внимание, что были записаны только последние записи с номером дела 00001 или 00002):

00001
00002
00003
00004
00005

Вот мой код до сих пор:

READ WORK FILE 1 #I-RECORD                            
 IF #RECORD-READ = 0 DO                                   
    WRITE WORK 2 #OUT-HEADER                              
 DOEND /* 510                                             
 ADD 1 TO #RECORD-READ                                    
*                                                         
IF #AA-CASE NOT EQUAL ' ' DO                              
 #CURRENT-CASE-NUM = #AA-CASE                             
 IF #COUNT-CASES = 0 DO                                   
    #OLD-CASE-NUM = #AA-CASE                              
 DOEND /* 570                                             
*                                                         
 IF #OLD-CASE-NUM NOT EQUAL #CURRENT-CASE-NUM DO          
    #OO-CASE-NUMBER            = #OLD-CASE-NUM            
*   #OO-TOTAL-OF-MONTHS        = 0                        
*   #OO-TOTAL-OF-TRANSACTIONS = #COUNT-CASES              
    WRITE WORK 2 #OUTPUT-RECORD                           
    #OLD-CASE-NUM = 0   
 DOEND  
*                                                      
 DISPLAY #CURRENT-CASE-NUM #OLD-CASE-NUM #COUNT-CASES  
*                                                      
 IF #OLD-CASE-NUM NOT EQUAL #CURRENT-CASE-NUM DO       
    #OO-CASE-NUMBER            = #OLD-CASE-NUM         
*   #OO-TOTAL-OF-MONTHS        = 0                     
*   #OO-TOTAL-OF-TRANSACTIONS = #COUNT-CASES           
    WRITE WORK 2 #OUTPUT-RECORD                        
    #OLD-CASE-NUM = 0                                  
 DOEND /* 610                                          
 ELSE DO                                               
   ADD 1 TO #COUNT-CASES                               
 DOEND /* 710                                          
DOEND /* 510                                                
LOOP(0500) 

1 ответ

Решение

Ваш образец файла имеет номера дел в порядке. Это облегчает проблему. Вы можете решить эту проблему, сравнив текущий номер дела с предыдущим номером дела (см. Параграф TEST-CASE-NUMBER в приведенном ниже примере). Обратите внимание на порядок присвоения номера предыдущего дела и сравнения его с текущим номером дела. Приведенный ниже пример был написан для GNUCobol, но вы должны иметь возможность адаптировать его для мэйнфрейма Cobol. Кроме того, при чтении файла всегда проверяйте состояние файла, чтобы обнаруживать ошибки открытия, чтения и закрытия (параграф TEST-FILE-STATUS).

   IDENTIFICATION DIVISION.
   PROGRAM-ID. PRINT-UNIQUE.

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

   DATA DIVISION.
   FILE SECTION.
   FD CASE-FILE.
       01  CASE-NUMBER                  PIC X(5).

   WORKING-STORAGE SECTION.

   01  MORE-RECORDS                     PIC XXX VALUE 'YES'.
       88  HAS-MORE-RECORDS             VALUE 'YES'.
       88  NO-MORE-RECORDS              VALUE 'NO '.

   01  CASE-FILE-STATUS                 PIC XX.
       88  CASE-FILE-STATUS-OKAY        VALUES '00' '10'.
  *        VALUE 00 = SUCCESS
  *        VALUE 10 = END OF FILE

   01  PRIOR-CASE-NUMBER                PIC X(5) VALUE SPACES.

   PROCEDURE DIVISION.

   MAIN.
       OPEN INPUT CASE-FILE
       PERFORM TEST-FILE-STATUS
       PERFORM HANDLE-CASE-RECORD UNTIL NO-MORE-RECORDS
       CLOSE CASE-FILE
       PERFORM TEST-FILE-STATUS
       STOP RUN
       .

   HANDLE-CASE-RECORD.
       READ CASE-FILE
           AT END SET NO-MORE-RECORDS TO TRUE
           NOT AT END
               PERFORM TEST-CASE-NUMBER
       END-READ
       PERFORM TEST-FILE-STATUS
       .

   TEST-CASE-NUMBER.
       IF CASE-NUMBER NOT = PRIOR-CASE-NUMBER
           DISPLAY CASE-NUMBER
       END-IF
       MOVE CASE-NUMBER TO PRIOR-CASE-NUMBER
       .

   TEST-FILE-STATUS.
       IF NOT CASE-FILE-STATUS-OKAY THEN
           DISPLAY 'FILE READ ERROR ' CASE-FILE-STATUS
           CLOSE CASE-FILE
           STOP RUN
       END-IF
       .
Другие вопросы по тегам