Как сбросить указатель файла в программе CL? - PullRequest
3 голосов
/ 14 декабря 2011

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

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Вам придется вручную открыть файл с помощью 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
2 голосов
/ 05 апреля 2014

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

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

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

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

Тем не менее, он по-прежнему не очищает условие CPF0864 для определенного DCLF.

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

...