Как печатать только уникальные номера дел?
Я пытаюсь распечатать только уникальные номера дел (которые расположены в первых 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
.