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

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

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

Спасибо.


person MAS400    schedule 02.11.2017    source источник
comment
Нам нужен код, но разница в обработке обычно означает полное переписывание программы. Вам нужно будет заменить не только чтение файла, но и логику прерывания цикла. То, что вы спрашиваете, примерно эквивалентно тому, как удалить структуру MVC моего веб-приложения?   -  person jmarkmurphy    schedule 02.11.2017
comment
Я сделал кучу. CL Переопределить первичный файл новым файлом, затем вызвать RPG. Все еще будет работать. Проблемы представляют собой новый файл в том же порядке, что и исходный файл. При обработке разрывов (группировка по SQL) действительно меняется порядок записей.   -  person danny117    schedule 03.11.2017
comment
Требование состоит в том, чтобы добавить еще 1 поле в основной файл, поэтому мы решили заменить цикл RPG.... Файл 1, который теперь является основным в RPG, имеет 30 полей, новый файл 2 будет иметь 30 + 10 новых полей.... В какой момент запись чтения цикла RPG из основного файла, мне нужно заменить ее на Read & dow.   -  person MAS400    schedule 03.11.2017
comment
и еще 1 вещь, чтобы заменить логику разрыва уровня, мне нужно сохранить ранее прочитанные данные записи и сравнить с текущими данными записи обработки, правильно?   -  person MAS400    schedule 03.11.2017


Ответы (1)


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

В общем случае, чтобы заменить первичный файл полноценным процедурным файлом, поставьте READ + DOW, а не %EOF(primaryfile) в начале вычислений, а второй 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; 
person Barbara Morris    schedule 03.11.2017
comment
Спасибо, Барбара, это так называемая модернизация :) это то, что мы ищем, чтобы перевести код на следующий уровень ...... Я знаю, что это рискованно .... Нам нужно сделать второе чтение, чтобы сравнить сохраненное первое чтение. значение.... ПРОЧИТАТЬ, СОХРАНИТЬ, DOW, ПОДРОБНО, ПРОЧИТАТЬ, если изменить ВСЕГО.... но проблема, если я прочитаю следующую запись, она сотрет все предыдущие записи из поля файла..... я планирую используйте чтение SQL вместо определения в спецификации F... Ребята, вы думаете, что Group by может помочь мне или любое другое предложение для безопасного перемещения? Любое предложение будет большой помощью? - person MAS400; 03.11.2017
comment
Если вы читаете структуры данных, вы можете иметь доступ как к новым, так и к старым записям. (Чтение в структуры данных и запись из структур данных также считаются современными, поскольку они дают вам больше контроля над тем, куда идут данные записи.) read rec cur_ds; не %eof; ... если есть_prv_ds; сравнить предыдущую запись с текущей записью endif; eval-corr prv_ds = cur_ds; have_prv_ds = * вкл.; прочитать запись cur_ds; конец; - person Barbara Morris; 06.11.2017
comment
См. мой оригинальный пост для кода в комментарии выше, а также дополнительную информацию о наилучшем способе использования структур данных для ввода-вывода. - person Barbara Morris; 06.11.2017
comment
Я обнаружил, что когда это самая первая запись, прочитанная в цикле RPG, она включает все индикаторы уровня, это правда? Еще один вопрос перед чтением следующей записи: включает ли система все индикаторы LEVEL для сравнения и включения релевантных? - person MAS400; 09.11.2017