Замена основного файла в RPGLE

Есть ли у кого-нибудь опыт замены основного файла в программе RPG, в которой определены индикаторы уровня (индикатор уровня используется для целей расчета)?

Вместо цикла RPG мне нужно ввести новый файл (заменяющий основной файл), который будет определен как полностью процедурный файл (больше нет основного файла).

Благодарю.

1 ответ

Решение

Почему вы хотите прекратить использование основного файла? Выполнение собственных сравнений для имитации индикаторов уровня, вероятно, будет гораздо более трудоемким, чем внесение изменений в первичный файл.

В общем, чтобы заменить первичный файл полным процедурным файлом, поместите READ + DOW, а не%EOF(первичный файл) в начале вычислений, а второй READ и ENDDO в конце вычислений.

Для вычислений с индикаторами уровня L0, L1 и т. Д. В столбцах 7 и 8 я сначала перенесу эти вычисления в подпрограммы, а теперь назову их чем-то вроде L0_subr, L1_subr и т. Д.

Чтобы обработать сравнения с предыдущей записью, после первой операции READ перед DOW добавьте операторы, чтобы сохранить текущие значения полей индикатора уровня. В конце вычислений перед вторым READ добавьте операторы, чтобы сравнить текущие значения с сохраненными значениями, и, если они отличаются, вызовите соответствующие Lx_subr(s). После вызова всех Lx_subrs обновите сохраненные значения для этого конкретного индикатора уровня.

Внесение таких изменений подвержено ошибкам. Я бы просто оставил его как основной файл и добавил бы дополнительные индикаторы уровня в спецификации I, если это необходимо.

Обновление 2017-11-06 начинается здесь:

Чтобы включить отслеживание как предыдущей, так и текущей записи, используйте функцию, с помощью которой вы можете считывать данные в структуру данных.

read rec cur_ds; 
dow not %eof;
    ... 
    if have_prv_ds; 
      compare the previous record to the current record 
    endif; 
    eval-corr prv_ds = cur_ds; 
    have_prv_ds = *on; 
    read rec cur_ds; 
enddo; 

Поскольку READ не влияет на автономные поля, связанные с файлом, рекомендуется избегать случайного обращения к этим автономным полям, даже избегая определения автономных полей. Для этого определите файл с ключевым словом QUALIFIED. Затем вы должны обратиться к формату записи с помощью file.fmt, и поля, связанные с файлом, не будут существовать.

dcl-f myfile qualified;
dcl-ds cur_ds likerec(myfile.fmt);
dcl-ds prv_ds likerec(myfile.fmt);

read myfile.fmt cur_ds; 
dow not %eof(myfile);
    ... 
    if have_prv_ds; 
      compare the previous record to the current record 
    endif; 
    eval-corr prv_ds = cur_ds; 
    have_prv_ds = *on; 
    read myfile.fmt cur_ds; 
enddo; 
Другие вопросы по тегам