Как скопировать многократную DS в другую RPG DS

Я пытаюсь скопировать DS в другой DS.

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,

Я попытался просто назначить это.

 MYRESULTS2 = MYRESULTS;
       %OCCUR(MYRESULTS2) =  3 ;
        opsitem =  %TRIM(MYRESULTS2.PAOPIID);
       PrintLine =opsitem ;
       Except;

Первое вхождение работает... но не копирует остальные, т.е. появление 3.

Я сделал это работает за счет цикла MYRESULTS и для каждого случая скопировал его в MYRESULTS2,

Есть ли более быстрый способ назначить все случаи из MYRESULTS в MYRESULTS2

V6.1 - IBM

2 ответа

Решение

Во-первых, я бы посоветовал вам начать использовать dim, а не появляться для массивов. Потому что тогда это будет простой однострочный оператор eval.

В любом случае, вы можете использовать функцию CEM 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 

Я получил это работает, используя указатель на 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

Другие вопросы по тегам