将记录从一个 PF 写入另一个 PF,无需 READ 操作或 DOW 循环或移动操作。
Write records from one PF to another without READ operation or DOW loop or move operation.
我知道如何通过在 dow 循环中读取一个文件并写入另一个文件来将记录从一个 pf 复制到另一个 pf,如下所示。文件是 PF1 和 PF2,分别具有记录格式 rec1 和 rec2,其中每个文件只有一个字段,分别名为 fld1 和 @fld1-
READ PF1
DOW not %eof(PF1) and not %error
eval fld1 = @fld1
write Rec2
READ PF1
ENDDO
如果您需要使用RPG,请使用嵌入式SQL。查找 INSERT INTO。
如果你不局限于RPG,可以考虑CPYF... MBROPT(*ADD).
您想通过另一种方式解决什么业务问题?
正如 Buck 的回答中提到的,您的队友暗示使用 RPG 循环来处理文件。该循环基本上是声明为“P”主要文件的隐式读取循环。
http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzasc/sc09250726.htm%23wq121
最初,甚至 RPG IV 程序都包含用作循环一部分的代码,例如自动打开文件,即使您实际上没有声明任何输入主文件。但是现在,您可以使用 MAIN() h-spec 创建 "Linear Main" 程序,并且您的程序将是无循环的。
在现代角色扮演游戏中使用循环是不受欢迎的。主要是因为正在发生的事情的隐含性质使得理解重要代码变得棘手。此外,循环代码并不比非循环代码执行得更好;只是写的少了。正在完成的 I/Os 保持完全相同。
最后,再次如评论中所述。如果要优化性能,请使用 SQL。 SQL 的基于集合的性质击败了角色扮演游戏的一次一行。我最近没有对它进行基准测试,但是回到 v5r2 左右,使用 SQL 复制 100 行或更多行比使用 RPG 更快。
仅供参考,FWiW;即不是建议,只是 可以 完成的示例,尤其是。在提到但没有给出具体细节的情况下:
My team mate told me that he can write code for this problem only in 4 lines including declaration of both files in F-spec. He will also not use read, move or dow loop. I don't know how can he do this. That's why I am eager to know this.
以下源代码是循环程序的例子;我的 REC1 的 FLD1 有一个 10 字节的字段,但我描述了 20 字节的输出,因此为了避免每个 sev-20 RNF7501 "Length of data structure in Result-Field does not equal the record length of Factor 2." 的编译失败,我在 CRTBNDRPG 上指定了 GENLVL(20):
FPF1 IP E DISK rename(rec1:rcd1)
FPF2 O F 20 DISK
DINOUT E DS EXTNAME(PF1)
C WRITE PF2 INOUT
I don't want to use CL program. I just want to do it with a single program either in RPG3 or RPG4
一个类似的 RPG 循环程序可以有效地执行相同的事情,类似地将数据从 PF1 复制到 PF2,尽管列名不同,[因此本质上] 记录格式也不同,使用 CL 命令 没有 CL 程序和几乎一样少的行。以下示例依赖于 QSYS2 中名为 QSQPTABL 的 must-always-be-one-row table,它通常位于系统库列表中,第二个参数可以反映命令字符串的实际长度,但只是根据 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 程序甚至可以说是 easier\simpler;对于外行来说可能更具可读性[尽管添加了 WITH NONE 子句,显示为 WITH NC,以防万一 COMMIT(*NONE) 在编译请求中被忽略,可能不容易凭直觉] :
C/Exec SQL
C+ insert into pf2 select * from pf1 WITH NC
C/End-Exec
C SETON LR
P.S。来自 OP 的源代码最初 [至少是,在我在这里添加评论之前] 用 eval fld1 = @fld1
错误编码,而根据 setup\given 确实预期的是 eval @fld1 = fld1
。
我知道如何通过在 dow 循环中读取一个文件并写入另一个文件来将记录从一个 pf 复制到另一个 pf,如下所示。文件是 PF1 和 PF2,分别具有记录格式 rec1 和 rec2,其中每个文件只有一个字段,分别名为 fld1 和 @fld1-
READ PF1
DOW not %eof(PF1) and not %error
eval fld1 = @fld1
write Rec2
READ PF1
ENDDO
如果您需要使用RPG,请使用嵌入式SQL。查找 INSERT INTO。 如果你不局限于RPG,可以考虑CPYF... MBROPT(*ADD).
您想通过另一种方式解决什么业务问题?
正如 Buck 的回答中提到的,您的队友暗示使用 RPG 循环来处理文件。该循环基本上是声明为“P”主要文件的隐式读取循环。 http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzasc/sc09250726.htm%23wq121
最初,甚至 RPG IV 程序都包含用作循环一部分的代码,例如自动打开文件,即使您实际上没有声明任何输入主文件。但是现在,您可以使用 MAIN() h-spec 创建 "Linear Main" 程序,并且您的程序将是无循环的。
在现代角色扮演游戏中使用循环是不受欢迎的。主要是因为正在发生的事情的隐含性质使得理解重要代码变得棘手。此外,循环代码并不比非循环代码执行得更好;只是写的少了。正在完成的 I/Os 保持完全相同。
最后,再次如评论中所述。如果要优化性能,请使用 SQL。 SQL 的基于集合的性质击败了角色扮演游戏的一次一行。我最近没有对它进行基准测试,但是回到 v5r2 左右,使用 SQL 复制 100 行或更多行比使用 RPG 更快。
仅供参考,FWiW;即不是建议,只是 可以 完成的示例,尤其是。在提到但没有给出具体细节的情况下:
My team mate told me that he can write code for this problem only in 4 lines including declaration of both files in F-spec. He will also not use read, move or dow loop. I don't know how can he do this. That's why I am eager to know this.
以下源代码是循环程序的例子;我的 REC1 的 FLD1 有一个 10 字节的字段,但我描述了 20 字节的输出,因此为了避免每个 sev-20 RNF7501 "Length of data structure in Result-Field does not equal the record length of Factor 2." 的编译失败,我在 CRTBNDRPG 上指定了 GENLVL(20):
FPF1 IP E DISK rename(rec1:rcd1)
FPF2 O F 20 DISK
DINOUT E DS EXTNAME(PF1)
C WRITE PF2 INOUT
I don't want to use CL program. I just want to do it with a single program either in RPG3 or RPG4
一个类似的 RPG 循环程序可以有效地执行相同的事情,类似地将数据从 PF1 复制到 PF2,尽管列名不同,[因此本质上] 记录格式也不同,使用 CL 命令 没有 CL 程序和几乎一样少的行。以下示例依赖于 QSYS2 中名为 QSQPTABL 的 must-always-be-one-row table,它通常位于系统库列表中,第二个参数可以反映命令字符串的实际长度,但只是根据 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 程序甚至可以说是 easier\simpler;对于外行来说可能更具可读性[尽管添加了 WITH NONE 子句,显示为 WITH NC,以防万一 COMMIT(*NONE) 在编译请求中被忽略,可能不容易凭直觉] :
C/Exec SQL
C+ insert into pf2 select * from pf1 WITH NC
C/End-Exec
C SETON LR
P.S。来自 OP 的源代码最初 [至少是,在我在这里添加评论之前] 用 eval fld1 = @fld1
错误编码,而根据 setup\given 确实预期的是 eval @fld1 = fld1
。