2015-02-09 8 views
0

Я знаю, как копировать записи с одного pf на другой, читая один файл в цикле dow и записывая в другой файл, как показано ниже. Файлы PF1 и PF2, имеющие формат записи REC1 и REC2 соответственно, где каждый файл имеет только одно поле с именем FLD1 и @ FLD1 respectively-Запись записей с одного PF на другой без операции READ или цикла DOW или перемещения.

READ PF1 
DOW not %eof(PF1) and not %error 
eval fld1 = @fld1 
write Rec2 
READ PF1 
ENDDO 

ответ

0

Если вам нужно использовать RPG, использование встроенного SQL. Посмотрите INSERT INTO. Если вы не ограничены РПГ, рассмотрите CPYF ... MBROPT (* ADD).

Какую бизнес-проблему вы пытаетесь решить, делая это по-другому?

+0

Я не хочу использовать программу CL. Я просто хочу сделать это с помощью одной программы либо в RPG3, либо в RPG4. Если возможно, пожалуйста, помогите мне. –

+0

Вы можете вставлять SQL-выражения в свою RPG-программу. http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rzasc/usesqlstmt.htm?lang=en –

+0

Я хочу очень оптимизированный код. Мой помощник по команде сказал мне, что он может написать код для этой проблемы только в 4 строках, включая объявление обоих файлов в спецификации F. Он также не будет использовать цикл чтения, перемещения или dow. Я не знаю, как он может это сделать. Вот почему я очень хочу это знать. Спасибо заранее ... –

1

Как указано в ответе Бака, ваш помощник по команде ссылается на использование цикла RPG для обработки файла. Цикл в основном представляет собой неявный цикл чтения файлов, объявленных как «P'rimary». http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzasc/sc09250726.htm%23wq121

Первоначально даже программы RPG IV включали код, используемый в качестве части цикла, например, автоматическое открытие файлов, даже если вы фактически не объявляли никаких входных первичных файлов. Однако теперь вы можете создавать программы «Линейные главные», используя MAIN() h-spec, и ваша программа будет бесплатной.

Использование цикла в современной RPG неодобрительно. Прежде всего потому, что неявный характер происходящего затрудняет понимание нетривиального кода. Кроме того, код цикла не работает лучше, чем код без цикла; это меньше, чем писать. Выполнение операций ввода-вывода остается таким же.

И наконец, как упоминалось в комментариях. Если вы хотите оптимизировать performace, используйте SQL. Установленный на основе SQL-кода превосходит по одной строке RPG. Я не тестировал это недавно, но вернувшись на v5r2 или около того, копирование 100 или более строк было быстрее с SQL, чем с RPG.

1

Только для справки, FWiW; то есть не рекомендации, просто примеры того, что может быть сделано, особенно. в случаях, если не указано иное:

Мой помощник по команде сказал мне, что он может написать код для этой проблемы только в 4 строках, включая объявление обоих файлов в F-spec. Он также не будет использовать цикл чтения, перемещения или dow. Я не знаю, как он может это сделать. Вот почему я очень хочу это знать.

Следующий источник представляет собой пример цикла программы; мой FLD1 из REC1 имел 10-байтовое поле, но я описал свой вывод на 20 байтов, поэтому, чтобы избежать неудачной компиляции на sev-20 RNF7501 «Длина структуры данных в поле результата не равна длине записи фактора 2.» , я указал GENLVL (20) на CRTBNDRPG:

FPF1  IP E    DISK rename(rec1:rcd1) 
    FPF2  O F 20  DISK      
    DINOUT   E DS     EXTNAME(PF1)  
    C     WRITE  PF2   INOUT  

Я не хочу, чтобы использовать программу CL. Я просто хочу сделать это с помощью одной программы либо в RPG3 или RPG4

Похожая RPG Cycle-программа могла бы эффективно выполнять то же самое, так же копирование данных из PF1 в PF2, несмотря на другое имя столбца и [таким образом, по своей сути также] в другом формате записи, используя команду CL без программы CL и почти так же мало строк.Следующий пример зависит от таблицы обязательно должна быть одной строки, которая называется QSQPTABL в QSYS2, которая обычно находится в списке системных библиотек, а второй аргумент может отражать фактическую длину командной строки, но так же легко кодирует макс прототип длиной согласно Const определению, гарантирующего чистое-заполнению до такой длины, фактически не имея посчитать [~ 53] байты конкатенированного строкового выражения:

FQSQPTABL IP E    DISK rename(qsqptabl:qsqptable) 
    DQcmdExc   PR     ExtPgm('QSYS/QCMDEXC') 
    D        200A const 
    D        15P05 const 
    c     callp  QcmdExc('cpyf pf1 pf2 mbropt(*add)' 
    c         +' fmtopt(*nochk) crtfile(*no)':200) 

Принимая во внимании, оба из указанных выше источников, вероятно, загадка для любого, кто не знаком с циклом, общие последствия последних, скорее всего, будут выведены правильно [возможно, более правильно описано как правильно угадали?], почти всем, кто понимает команду CL несмотря на отсутствие понимания цикла.

И, конечно же, как было отмечено, с SQL программа, вероятно, возможно еще проще \ simpler; возможно, даже более читаемым для непосвященных [хотя с пунктом NONE, показанный как с ЧПУ, добавлена ​​только в случае, COMMIT (* НЕТ) пропускался при запросе компиляции, вероятно, не так легко созерцаемое]:

C/Exec SQL               
    C+ insert into pf2 select * from pf1 WITH NC      
    C/End-Exec               
    C     SETON          LR 

PS Исходный код из OP был первоначально [по крайней мере, до того, как был добавлен мой комментарий здесь], некорректно закодированный с помощью eval fld1 = @fld1, когда, конечно, было предназначено eval @fld1 = fld1 в соответствии с настройкой \ данный.