2016-09-08 8 views
0

DSを別のDSにコピーしようとしています。マルチオカレンスDSを別のDS RPGにコピーする方法

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にコピーし、各要素を処理せずにMYRESULTS2MYRESULTSをコピーしたいです。

私はちょうどそれを割り当てようとしました。

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

最初のオカレンスは機能しますが、残りの部分はコピーされません。出現3.

私はそれをMYRESULTSをループすることによって機能させ、それぞれ発生したものをMYRESULTS2にコピーしました。

MYRESULTS

MYRESULTS2にV6.1からのすべての出現箇所を割り当てるためのより高速な方法があります - IBM

答えて

4

私は、まずあなたが薄暗い使用して代わりの配列のために発生し始めることを示唆しています。そのため、単純な1行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 
+0

おかげですべてのオカレンスを使用することができます。 – Renier

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); 

は、この後には、私はすべての値を割り当てるためにRPGでポインタを使用しお返事DS

+2

このメソッドを実行すると、MYRESULTS2は実際にはMYRESULTSにオーバーレイするため、MERESULTS2を変更するとMYRESULTSも変更されます。しかし、この行動があなたに影響を及ぼすことがないなら、私はむしろこの方法をお勧めします。それは少ないシステムメモリを使用します:) –

+0

私は感謝を理解し、 – Renier

+1

これはDSのコンテンツをコピーしないので、「働いている」と言える方法は明確ではありません。これはDSの新しい名前(場合によっては新しい説明)を提供しますが、それは同じDSであり、 "コピー"ではありません。 – user2338816

関連する問題