在没有READ操作或DOW循环或移动操作的情况下将记录从一个PF写入另一个PF。

时间:2015-02-09 17:15:54

标签: copy move ibm-midrange rpgle

我知道如何通过读取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 

3 个答案:

答案 0 :(得分:1)

正如Buck的答案中提到的那样,你的队友暗指使用RPG循环来处理文件。该循环基本上是声明为' P' rimary的文件的隐式读循环。 http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzasc/sc09250726.htm%23wq121

最初,即使您没有实际声明任何输入主文件,即使是RPG IV程序也包含用作循环一部分的代码,例如自动打开文件。但是,现在你可以创建" Linear Main"使用MAIN()h-spec的程序和你的程序将是无循环的。

在现代RPG中使用这个循环是不受欢迎的。主要是因为所发生的事情的隐含性使得理解非平凡代码变得棘手。另外,循环代码不比非循环代码执行得更好;它写得更少。正在完成的I / O保持完全相同。

最后,再次如评论中所述。如果要优化性能,请使用SQL。 SQL的基于集合的性质一次击败RPG一行。我最近没有对它进行基准测试,但是回到v5r2左右,使用SQL比使用RPG复制100行或更多行更快。

答案 1 :(得分:1)

仅供参考,FWiW;即不是推荐,只是可以完成的例子,尤其是在案件中提到但没有给出具体细节:

  

我的队友告诉我,他只能在4行中编写这个问题的代码,包括在F-spec中声明这两个文件。他也不会使用read,move或dow循环。我不知道他怎么能这样做。这就是我渴望了解这一点的原因。

以下来源是循环程序的示例;我的REC1的FLD1有一个10字节的字段,但我描述了我的输出20字节,所以为了避免编译失败,每个sev-20 RNF7501“结果字段中的数据结构长度不等于因子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       
  

我不想使用CL程序。我只想用RPG3或RPG4中的单个程序来完成它

类似的RPG循环程序可以有效地执行相同的操作,类似地将数据从PF1复制到PF2,尽管列名不同,并且[因此本身也]不同的记录格式,使用CL命令不用一个CL程序和几乎几行。以下示例依赖于QSYS2中名为QSQPTABL的必须始终为一行的表,该表通常位于系统库列表中,第二个参数可以反映命令字符串的实际长度,但同样容易编码根据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)

虽然上述两个来源对于不熟悉Cycle的人来说可能是一个谜,但后者的整体效果很可能被正确推断[¿可能更准确地描述为猜测正确?尽管他们对循环不了解,但几乎任何了解CL命令字符串的人都会这样做。

当然,正如所指出的那样,使用SQL,该程序可能更容易\更简单;对于不熟悉的人来说可能更具可读性[虽然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进行编码,而根据设置\给定的确定目标是eval @fld1 = fld1

答案 2 :(得分:0)

如果您需要使用RPG,请使用嵌入式SQL。查找INSERT INTO。 如果您不限于RPG,请考虑CPYF ... MBROPT(* ADD)。

你试图以另一种方式解决什么业务问题?