Я новичок в COBOL и не удалось найти конкретные записи в файле .dat. Идея состоит в том, чтобы искать файл для всех записей, имеющих определенный код в одном из полей.Получить конкретные записи из .dat-файла с помощью COBOL
Я попытался найти ответ в google, но везде, где я пошел, ответ был другим, и я не знаю, почему я не мог адаптировать его к моей проблеме.
Я также нашел этот вопрос:
Но ответ не вдаваться в подробности.
Это мой код:
IDENTIFICATION DIVISION.
program-id. AR AS "A.AR".
environment division.
configuration section.
special-names. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ARQ-ATUALIZACAO ASSIGN "C:\temp\atualizacao.dat"
ORGANIZATION IS INDEXED
ACCESS MODE IS SEQUENTIAL
RECORD KEY IS ID-ATUALIZACAO
ALTERNATE RECORD KEY IS COD-RASTREIO
FILE STATUS IS ST-ATUALIZACAO.
data division.
FILE SECTION.
FD ARQ-ATUALIZACAO.
01 REG-ATUALIZACAO.
05 ID-ATUALIZACAO PIC 9(10).
05 COD-RASTREIO PIC X(13).
05 TITULO PIC X(15).
05 DESCRICAO PIC X(30).
05 FILLER PIC X(30).
working-storage section.
01 WS-RECORD.
03 ENTRIES OCCURS 18 TIMES INDEXED BY I.
05 WS-ID PIC 9(10).
05 WS-RAST PIC X(13).
05 WS-TIT PIC X(15).
05 WS-DESC PIC X(30).
77 ARE-THERE-MORE-RECORDS PIC XXX VALUE "YES".
77 NAME-COUNT PIC 99.
77 PROCURA PIC X(13).
77 ST-ATUALIZACAO PIC XX VALUE SPACES.
procedure division.
OPEN INPUT ARQ-ATUALIZACAO
PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
READ ARQ-ATUALIZACAO
AT END
MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
NOT AT END
PERFORM 300-STORE-NAME
END-READ
END-PERFORM
CLOSE ARQ-ATUALIZACAO.
300-STORE-NAME.
ADD 1 TO NAME-COUNT
MOVE REG-ATUALIZACAO TO ENTRIES OF WS-RECORD(NAME-COUNT).
OPEN I-O ARQ-ATUALIZACAO
DISPLAY "CODIGO DA ENCOMENDA.:" AT 1010
DISPLAY "STATUS:" AT 2433
DISPLAY ST-ATUALIZACAO AT 2440
ACCEPT PROCURA AT 1030 WITH REQUIRED FULL
SEARCH ENTRIES
AT END DISPLAY "CODIGO NAO ENCONTRADO" AT 0210
WHEN WS-RAST(I) = PROCURA
DISPLAY "REGISTROS ENCONTRADOS" AT 0210
DISPLAY WS-RAST(I) AT 0310
DISPLAY WS-ID(I) AT 0410
DISPLAY WS-TIT(I) AT 0510
DISPLAY WS-DESC(I) AT 0610
END-SEARCH
CLOSE ARQ-ATUALIZACAO
EXIT PROGRAM.
Edit - Я изменил код много, поэтому я выложу новый здесь:
IDENTIFICATION DIVISION.
program-id. ATUALIZACAOR AS "ATUALIZACAO.ATUALIZACAOR".
environment division.
configuration section.
special-names. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ARQ-ATUALIZACAO ASSIGN "C:\temp\atualizacao.dat"
ORGANIZATION IS INDEXED
RECORD KEY IS ID-ATUALIZACAO
ALTERNATE RECORD KEY IS COD-RASTREIO
ACCESS MODE IS RANDOM
FILE STATUS IS ST-ATUALIZACAO.
data division.
FILE SECTION.
FD ARQ-ATUALIZACAO.
01 REG-ATUALIZACAO.
05 ID-ATUALIZACAO PIC 9(10).
05 COD-RASTREIO PIC X(13).
05 TITULO PIC X(15).
05 DESCRICAO PIC X(30).
05 FILLER PIC X(30).
working-storage section.
01 ST-ATUALIZACAO PIC XX.
88 end-of-input-file VALUE "10".
88 INPUT-FILE-OK VALUE ZERO "10".
77 PROCURA PIC X(13).
77 RESP PIC X VALUE SPACE.
procedure division.
INICIO.
PERFORM WITH TEST AFTER UNTIL RESP = "N"
DISPLAY "CODIGO DA ENCOMENDA.:" AT 1010 ERASE SCREEN
DISPLAY "STATUS:" AT 2433
DISPLAY ST-ATUALIZACAO AT 2440
ACCEPT PROCURA AT 1030 WITH REQUIRED FULL
OPEN I-O ARQ-ATUALIZACAO
PERFORM priming-READ-input-file
PERFORM
UNTIL end-of-input-file
PERFORM process-input
PERFORM READ-input-file
END-PERFORM
DISPLAY "DESEJA CONSULTAR OUTRA ATUALIZACAO? (S/N)"
AT 2001
ACCEPT RESP AT 2044 WITH UPPER
END-PERFORM
CLOSE ARQ-ATUALIZACAO
EXIT PROGRAM
.
priming-READ-input-file.
PERFORM READ-input-file
IF end-of-input-file
DISPLAY "END OF FILE" AT 2510
END-IF
.
READ-input-file.
READ ARQ-ATUALIZACAO
IF NOT INPUT-FILE-OK
DISPLAY "FILE NOT OK" AT 2310
DISPLAY ST-ATUALIZACAO AT 2440
STOP " "
END-IF
.
process-input.
IF COD-RASTREIO = PROCURA
DISPLAY ID-ATUALIZACAO AT 2410
STOP " "
END-IF
.
выборочные данные, которые у меня есть в файле 'atualizacao.dat' является:
ID-ATUALIZACAO: 0000000001
ХПК-RASTREIO: qweqweqweqweqwee
título: тест
Descrição: Описание
ID-ATUALIZACAO: 0000000002
COD-RASTREIO: qweqweqweqweqwee
título: test2
Descrição: description2
Какая у вас проблема? –
Первая часть должна была прочитать все записи из файла, но она застряла в цикле в этой части 'PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO' READ ARQ-ATUALIZACAO' это не goinig внутри' AT END 'и' NOT AT END' –
@JohnAnthonyRinehart No. Если это не 'AT END', то это' NOT AT END'. Нет среднего пути. Они являются взаимоисключающими, без альтернативного маршрута в рамках ПРОЧИТАНИЯ. –