如何将多次出现的DS复制到另一个DS RPG

时间:2016-09-08 09:39:17

标签: ibm-midrange rpgle rpg

我正在尝试将DS复制到另一个DS。

notifyItemChanged(int position)

所以我想将D MYRESULTS DS OCCURS(2000) D QUALIFIED D PAOPIID 20A D POPITPE 10A D POPISTPE 10A D POPIKNID 20A D PINSTAT 10A D PLEAFIND 1A D CLOPIID 20A D COPITPE 10A D COPISTPE 10A D COPIKNID 20A D CINSTAT 10A D CLEAFIND 1A D INSTAT 10A D MYRESULTS2 DS OCCURS(2000) D QUALIFIED D PAOPIID 20A D POPITPE 10A D POPISTPE 10A D POPIKNID 20A D PINSTAT 10A D PLEAFIND 1A D CLOPIID 20A D COPITPE 10A D COPISTPE 10A D COPIKNID 20A D CINSTAT 10A D CLEAFIND 1A D INSTAT 10A 复制到MYRESULTS而不循环MYRESULTS2并处理每个元素以将其复制到MYRESULTS

我确实尝试过分配它。

MYRESULTS2

第一次出现有效......但它不复制其余的即...发生3。

我确实通过循环 MYRESULTS2 = MYRESULTS; %OCCUR(MYRESULTS2) = 3 ; opsitem = %TRIM(MYRESULTS2.PAOPIID); PrintLine =opsitem ; Except; 使其工作,并且每次出现都将其复制到MYRESULTS

是否有更快捷的方式将所有发生的事件从MYRESULTS2分配到MYRESULTS

V6.1 - IBM

2 个答案:

答案 0 :(得分:4)

我首先建议你开始使用dim而不是数组。因为那时它将是一个简单的单行eval语句。

无论如何,您可以使用C ++函数MEMCPY获得最快的结果(假设两个数据结构的格式和尺寸完全相同):

 hdftactgrp(*no) actgrp(*new)

 dMEMCPY           pr                  extproc('memcpy')
 d TargetPointer                   *   value
 d SourcePointer                   *   value
 d CopyLength                    10u 0 value

 dSample1          ds                  qualified occurs(10)
 dNumber                          3p 0
 dValue                          10a
 dSample2          ds                  qualified occurs(10)
 dNumber                          3p 0
 dValue                          10a

 dresult           s              1a
  /free
   %occur(Sample1) = 1;
   Sample1.Number = 1;
   Sample1.Value = 'One';
   %occur(Sample1) = 10;
   Sample1.Number = 10;
   Sample1.Value = 'Ten';

   %occur(Sample1) = 1;
   %occur(Sample2) = 1;
   MEMCPY(%addr(Sample2): %addr(Sample1): %size(Sample1) * %elem(Sample1));

   %occur(Sample2) = 10;

   dsply Sample2.Value '*EXT' result;

   *inlr = *on;

  /end-free 

答案 1 :(得分:0)

我使用指向DS的指针工作。

 D Mypointer       s               *

 D  MYRESULTS2     DS                  OCCURS(2000) based(Mypointer)
 D                                     QUALIFIED
 D  PAOPIID                      20A
 D  POPITPE                      10A
 D  POPISTPE                     10A     

然后当你想要分配它时。

 Mypointer = %ADDR(MYRESULTS);

在此之后,您可以使用DS中的所有匹配项