Как сбросить указатель файла в программе CL?

В настоящее время я работаю над программой CL, которая должна прочитать некоторые записи из файла. Файл переопределяется для одного из его участников. Затем есть несколько операций RCVF для извлечения записей этого конкретного члена. При получении сообщения об окончании файла переопределенный файл удаляется. Затем выполняется другой OVRDBF с другим членом в этом файле. На этот раз, когда выполняется операция RCVF, он сразу же попадает в конец файла - сообщение принимается сразу после него. Есть ли способ сбросить указатель файла, чтобы последующие операции RCVF могли извлечь содержимое во втором члене?

2 ответа

Вам придется вручную открыть файл с помощью OPNDBF и закрыть его с помощью CLOF, а также указать идентификатор открытого файла в команде RCVF.

            PGM

            DCLF       FILE(TESTFILE) OPNID(TESTFILE)

            /* CRTSRCPF   FILE(QTEMP/TESTFILE) */
            /* ADDPFM     FILE(QTEMP/TESTFILE) MBR(MBR1) */
            /* ADDPFM     FILE(QTEMP/TESTFILE) MBR(MBR2) */

            OPNDBF     FILE(TESTFILE) OPTION(*INP) MBR(MBR1)
MBR1:       RCVF       OPNID(TESTFILE)
            MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(MBR2))
            GOTO       CMDLBL(MBR1)

MBR2:       CLOF       OPNID(TESTFILE)
            OPNDBF     FILE(TESTFILE) OPTION(*INP) MBR(MBR2)
LOOP:       RCVF       OPNID(TESTFILE)
            MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(ENDPGM))
            GOTO       CMDLBL(LOOP)

ENDPGM:     ENDPGM

Исторически существовало два способа перечитывания файла в CL.

Во-первых, использовать RTVMBRD для получения количества записей в элементе. Циклически перебирайте записи по количеству файлов и останавливайтесь, когда количество записей достигает последней записи. Это позволяет избежать выброса CPF0864, ​​поэтому проблема устранена.

Второе - написать две программы. Первый выполняет любые необходимые переопределения, затем вызывает вторую программу, чтобы выполнить цикл чтения. После возврата к первой программе CPF0864 очищается. Может быть применено новое переопределение, и вторая программа может быть вызвана снова. Так как это новый вызов, он может прочитать тот же файл снова без проблем.

В V5R3 было предоставлено частичное решение, позволяющее использовать до пяти DCLF в одной программе CL. Это может легко работать для этого случая. Просто используйте один DCLF для первого члена и второй DCLF для другого члена. Это может также использоваться, чтобы перечитать тот же самый член. (Если требуется более пяти участников, это не поможет.)

Однако, это все еще не очищает условие CPF0864 для определенного DCLF.

Но в версии 6.1 предложено гораздо более полное решение. Команда CLOSE была добавлена, и она очистит CPF0864. Он выполняет полное закрытие, поэтому файлы могут быть легко использованы в одной программе CL.

Другие вопросы по тегам