Как скопировать DS с несколькими вхождениями в другую DS RPG

Я пытаюсь скопировать 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 — ИБМ


person Renier    schedule 08.09.2016    source источник


Ответы (2)


Во-первых, я бы посоветовал вам начать использовать 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 
person Adrian Bannister    schedule 08.09.2016
comment
Спасибо за ваш ответ, я использовал указатель в rpg, чтобы присвоить все значения. - person Renier; 08.09.2016

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

person Renier    schedule 08.09.2016
comment
Просто обратите внимание, что если вы сделаете этот метод, то MYRESULTS2 на самом деле просто наложит MYRESULTS, поэтому внесение изменений в MERESULTS2 также изменит MYRESULTS. Но если такое поведение не повлияет на вас, я бы предложил использовать этот метод. Он использует меньше системной памяти :) - person Adrian Bannister; 08.09.2016
comment
Я понимаю, спасибо, это не повлияет на меня, спасибо за информацию. - person Renier; 08.09.2016
comment
Поскольку это не копирует содержимое DS, неясно, как можно сказать, что это работает. Он предоставляет новое имя (и, возможно, новое описание) для DS, но это тот же DS, а не копия. - person user2338816; 08.09.2016