バージョン 4.2.5
 —  ステートメント  —

MOVE

このドキュメントでは、次のトピックについて説明します。

関連ステートメント:ADD | COMPRESS | COMPUTE | DIVIDE | EXAMINE | MOVE ALL | MULTIPLY | RESET | SEPARATE | SUBTRACT

関連機能グループ:「算術演算とデータ移動操作


機能

MOVE ステートメントは、オペランドの値を 1 つ以上のオペランド(フィールドまたは配列)に移動するために使用します。

複数のターゲットオペランドを持つ MOVE ステートメントは、対応する個々の MOVE ステートメントと同一です。

MOVE #SOURCE TO #TARGET1 #TARGET2

これは、以下と同じです。

MOVE #SOURCE TO #TARGET1 
MOVE #SOURCE TO #TARGET2

例:

DEFINE DATA LOCAL
1 #ARRAY(I4/1:3) INIT <3,0,9>
1 #INDEX(I4)
1 #RESULT(I4)
END-DEFINE
*
#INDEX := 1
MOVE #ARRAY(#INDEX) TO #INDEX       /* #INDEX is 3 
                       #RESULT      /* #RESULT is 9  
*
#INDEX := 2
MOVE #ARRAY(#INDEX) TO  #INDEX     /* #INDEX is 0
                        #ARRAY(3)  /* returns run time error NAT1316 

operand2 がダイナミック変数 変数のとき、その長さは MOVE 操作によって変更できます。 ダイナミック変数の現在の長さは、システム変数 *LENGTH を使用して確認できます。 ダイナミック変数については、『プログラミングガイド』の「ラージ変数/フィールドとダイナミック変数/フィールド」を参照してください。

operand2 のフォーマットが C の場合、operand1(parameter) として指定することもできます。 有効なパラメータは以下のとおりです。

MOVE ステートメントで指定可能なパラメータ 指定(S = ステートメントレベル、E = 要素レベル)
AD 属性定義 SE
CD カラー定義 S

データ転送の互換性および規則についての詳細は、『プログラミングガイド』の「データ転送」を参照してください。

その他の考慮事項

受け取りフィールドにデータベースフィールドが指定されても、MOVE 処理はプログラム内のフィールドの内部値を更新するだけで、 データベースのフィールドの値は変更しません。

AT BREAKAT END OF DATA または AT END OF PAGE ステートメントとともに MOVE ステートメントが指定された場合にのみ Natural システム関数が使用できます。

プログラミングガイド』の「演算割り当てのルール」も参照してください。

注意:
operand1 が時間変数(フォーマット T)のとき、変数内容の時間コンポーネントだけが転送され、日付コンポーネントは転送されません(構文 4構文 5 で説明されている MOVE EDITED の場合を除く)。

Top of page

構文説明

このステートメントには異なる構造が可能です。

次の構文図で使用されている記号については、「構文記号」を参照してください。

構文 1 - MOVE ROUNDED

MOVE [ROUNDED] operand1 [( parameter)] TOoperand2

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand1 C S A   N A U N P I F B D T L C G O 不可
operand2   S A   M A U N P I F B D T L C G O

構文要素の説明:

MOVE ROUNDED

当オプションは、operand2 を四捨五入します。

ROUNDED が指定できるのは operand2 が数字タイプのときだけです。

operand2 のフォーマットが N または P で、operand2 が複数回指定されている場合は、ROUNDED は、小数点後の 7 桁を持つターゲットオペランドについては無視されます。

例 1 - MOVE ステートメントのさまざまな使用例」も参照してください。

(parameter) parameter として、オプション PM=I またはセッションパラメータ DF を指定できます。
PM=I

右から左に記述する言語をサポートするために、PM=I を指定して、operand1 の値を逆(右から左)方向で operand2 に渡すことができます。

例えば、次のステートメントの結果、#B の内容は ZYX となります。

MOVE 'XYZ' TO #A
MOVE #A (PM=I) TO #B

PM=I は、operand2 が英数字フォーマットのときにのみ指定できます。

operand1 のトレーリングブランクは削除され(ブランクとバイナリゼロは削除され)、その後の値が逆向きに並べ替えられ、operand2 に移されます。 operand1 が英数字フォーマットではない場合には、英数字フォーマットに変換されてから、逆向きに並べられます。

PM=IMOVE LEFT/RIGHT JUSTIFIED も参照してください。

DF operand1 が日付変数で、operand2 が英数字フィールドのとき、この日付変数に対するパラメータとして、セッションパラメータ DF を指定できます。 セッションパラメータ DF については、『パラメータリファレンス』を参照してください。

構文 2 - MOVE SUBSTRING

MOVE

operand1

[(parameter)] TO

operand2

SUBSTRING (operand1,operand3,operand4) SUBSTRING (operand2,operand5,operand6)

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand1 C S A     A U         B             不可
operand2   S A     A U         B             不可
operand3 C S           N P I   B*             不可
operand4 C S           N P I   B*             不可
operand5 C S           N P I   B*             不可
operand6 C S           N P I   B*             不可

* 説明を参照してください。

構文要素の説明:

MOVE SUBSTRING

SUBSTRING オプションの指定がないと、フィールドの内容全体が転送されます。

SUBSTRING オプションで、英数字、Unicode またはバイナリフィールドの一部分だけを転送できます。 SUBSTRING 節のフィールド名(operand1)の後に、まず開始位置(operand3)、次に移動するフィールド部分の長さ(operand4)を指定します。

operand1 の基礎となるフィールドフォーマットが以下に該当する場合:

  • 英数字(A)またはバイナリ(B)の場合は、operand3 またはoperand4 で提供される値はバイト数と見なされます。

  • Unicode(U)の場合は、operand3 またはoperand4 で提供される値は Unicode コード単位数、つまりダブルバイトと見なされます。

例えば、フィールド #A の値の 5 桁目から 12 桁目をフィールド #B に転送するには、次のように指定します。

MOVE SUBSTRING(#A,5,8) TO #B

operand1 がダイナミック変数のとき、転送するフィールド部分は現在の長さ以下である必要があります。そうしないと、ランタイムエラーになります。

また、受け取りフィールドの一部分に英数字、Unicode またはバイナリを転送することもできます。 SUBSTRING 節のフィールド名(operand2)の後に、まず開始位置(operand5)、次に値を移動するフィールド部分の長さ(operand6)を指定します。

operand2 の基礎となるフィールドフォーマットが以下に該当する場合:

  • 英数字(A)またはバイナリ(B)の場合は、operand5 またはoperand6 で提供される値はバイト数と見なされます。

  • Unicode(U)の場合は、operand3 またはoperand4 で提供される値は Unicode コード単位数、つまりダブルバイトと見なされます。

例えば、フィールド #A の値をフィールド #B の 3 桁目から 6 桁目に転送するには、次のように指定します。

MOVE #A TO SUBSTRING(#B,3,4)

operand2 がダイナミック変数のとき、その開始位置(operand5)は、現在の変数の長さに 1 を加えた長さ以下である必要があります。開始位置がその長さを超過すると、ランタイムエラーになります。これは、operand2 の内容に確かでないギャップが生じるからです。

operand3/5 または operand4/6 がバイナリ変数の場合は、4 以下の長さでのみ使用できます。

operand3/5 を省略すると、開始位置は 1 と見なされます。 operand4/6 を省略すると、長さはフィールドの開始位置から終わりまでの範囲とみなされます。

operand2 がダイナミック変数であり、その指定開始位置(operand5)が現在の変数の長さに 1 を加えた長さ(MOVE 処理が変数の長さを拡張するために使用されることを意味する)の場合、operand6 は変数の新しい長さを決定するために指定する必要があります。

注意:
SUBSTRING オプション指定の MOVE はバイトごとの転送です(『プログラミングガイド』の「算術演算の規則」に記述されている規則は適用されません)。

構文 3 - MOVE BY NAME / POSITION

MOVE BY

[NAME]

operand1TO operand2
POSITION

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand1       G                           不可
operand2       G                           不可

構文要素の説明:

MOVE BY NAME operand1 TO operand2

当オプションは、あるデータ構造内の個々のフィールドを、その構造内の位置に関係なく別のデータ構造へと転送します。

ただし、フィールド名が両方の構造に存在する場合にのみ転送されます。これは、再定義で作成されたフィールドと同様に再定義されたフィールドも含みます。 個々のフィールドは、どのフォーマットでもかまいません。 オペランドにビューを指定することもできます。

注意:
個々の MOVE の順番は、operand1 のフィールド順で決まります。

例 2 - MOVE BY NAME ステートメント」も参照してください。

配列を伴うMOVE BY NAME

データ構造が配列を持つ場合、MOVE 時その配列に添字 (*) が割り当てられます。その配列が割り当て処理の規則に合わない場合は、エラーを返します(『プログラミングガイド』の「配列処理」を参照)。

例 3 - 配列を伴う MOVE BY NAME」も参照してください。

MOVE BY POSITION operand1 TO operand2

当オプションは、フィールド名に関係なく、グループ内のフィールドの内容を別のグループに転送するために使用します。

値は定義されたフィールドの順にあるグループから他のグループへフィールドごとに転送されます(再定義で作成されたフィールドは入りません)。

個々のフィールドは、どのフォーマットでもかまいません。 各グループ内のフィールド数は同じにする必要があります。また、フィールドのレベル構造および配列の次元は一致している必要があります。 フォーマット変換は、算術演算の規則に従って行われます。『プログラミングガイド』の「演算割り当てのルール」を参照してください。 オペランドにビューを指定することもできます。

例 4 - MOVE BY POSITION」も参照してください。

構文 4 - MOVE EDITED(operand2 で指定された編集マスク)

MOVE EDITED operand1TO operand2 (EM=value)

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand1 C S A     A U         B             不可
operand2   S A     A U N P I F B D T L      

構文要素の説明:

MOVE EDITED

編集マスクが operand2 に対して指定されている場合、operand1 の値はこの編集マスクを使用して operand2 に配置されます。

編集マスクは、operand2入力編集マスクとみなすことができます。これは、operand1 の英数字の内容のどの位置に operand2 の大量の入力データが見つかるかを指定するために使用されます。

そのため、編集マスクが operand2 に存在する以上の文字または桁を参照する場合は、編集マスクは切り捨てられます。 operand1 の長さは、編集マスクで表される入力値の長さより短くすることはできません。 operand1 が編集マスクの長さよりも長い場合は、余ったデータが無視されます。

operand1 を編集マスクの長さより長くしないという前提条件のもとでは、次のステートメントを、

MOVE EDITED operand1 TO operand2 (EM=value)

次のステートメントの実行のような操作とみなすことができます。

STACK TOP DATA operand1
INPUT operand2 (EM=value)

例 1 - MOVE ステートメントのさまざまな使用例」も参照してください。

EM 編集マスクの詳細については、『パラメータリファレンス』でセッションパラメータ EM を参照してください。

構文 5 - MOVE EDITED(operand1 で指定された編集マスク)

MOVE EDITED operand1 (EM=value) TO operand2

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand1 C S A   N A U N P I F B D T L       不可
operand2   S A     A U         B            

構文要素の説明:

MOVE EDITED

operand1 に編集マスクが指定されると、指定の編集マスクを operand1 に適用し、結果が operand2 に転送されます。

編集マスクは、operand1出力編集マスクとみなすことができます。これは、編集マスクで記述されたレイアウトおよび長さで英数字文字列を作成するために使用されます。 operand1 のデータ文字または数字の他に、出力文字列に追加の装飾文字を含めることができます。

そのため、編集マスクが operand1 に存在する以上の文字または桁を参照する場合は、編集マスクは切り捨てられます。 作成された出力文字列(編集マスクが適用された後の operand1 値の結果)の長さが operand2 の長さを超過しないようにする必要があります。

operand2 を編集マスクの長さより短くしないという前提条件のもとでは、次のステートメントを

MOVE EDITED operand1 (EM=value) TO operand2

次のステートメントのような操作とみなすことができます。

WRITE operand1 (EM=value)

このステートメントは、画面に出力を表示せずに、変数 operand2 に書き込みます。

例 1 - MOVE ステートメントのさまざまな使用例」も参照してください。

EM 編集マスクの詳細については、『パラメータリファレンス』でセッションパラメータ EM を参照してください。

構文 6 - MOVE LEFT/RIGHT JUSTIFIED

MOVE

LEFT

[JUSTIFIED]operand1 [(parameter)] TOoperand2
RIGHT

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand1 C S A   N A U N P I F B D T L       不可
operand2   S A     A U                      

構文要素の説明:

MOVE LEFT/RIGHT JUSTIFIED

当オプションを使用すると、値は operand2 に左詰めまたは右詰めで転送されます。

operand2 がダイナミック変数のとき、MOVE LEFT/RIGHT JUSTIFIED は使用できません。

MOVE LEFT JUSTIFIED MOVE LEFT JUSTIFIED で、operand1 のリーディングブランク(空白とバイナリゼロ)は削除されて、operand2 に値が左詰めで置かれます。 operand2 の残りは空白で埋められます。 値が operand2 よりも長いときには、値の右側が切り捨てられます。
MOVE RIGHT JUSTIFIED

MOVE RIGHT JUSTIFIED で、operand1 のトレーリングブランクは切り捨てられて(空白とバイナリゼロが削除されて)、operand2 に値が右詰めで置かれます。 operand2 の残りは空白で埋められます。 値が operand2 よりも長いときには、値の左側が切り捨てられます。

例 1 - MOVE ステートメントのさまざまな使用例」も参照してください。

parameter

MOVE LEFT/RIGHT JUSTIFIEDPM=I を一緒に使用するとき、転送処理は次の手順で行われます。

  1. operand1 が英数字フォーマットではない場合、値は英数字フォーマットに変換されます。

  2. operand1 のトレーリングブランク(空白とバイナリゼロ)が削除されます。

  3. LEFT JUSTIFIED の場合、operand1 のリーディングブランク(空白とバイナリセロ)も削除されます。

  4. 値を逆に並べ替えてから operand2 に移します。

  5. 必要に応じて、operand2 の残りを空白で充填するか、または値を切り捨てます(前述参照)。

構文 7 - MOVE NORMALIZED

MOVE NORMALIZED ステートメントは、Unicode 文字列を "Unicode Normalization Form C"(NFC)に変換します。 結果として生成される Unicode 文字列には、構成前の文字として使用可能な文字の結合順序が含まれません。

ターゲットオペランドの形式が Unicode でない場合は、Unicode からターゲットオペランドへの暗黙的な変換が行われます。この変換中に、デフォルトのコードページ(システム変数「*CODEPAGE」を参照)が使用されます。

MOVE NORMALIZED ステートメントの詳細は、『Unicode およびコードページのサポート』ドキュメントの「ステートメント」を参照してください。

構文図:

MOVE NORMALIZEDoperand1 TOoperand2

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand1 C S A       U                       不可
operand2   S A     A U                      

構文要素の説明:

MOVE NORMALIZED

このオプションは、正規化されていない内容を含む可能性のある Unicode フィールドを "Unicode Normalization Form C"(NFC)に変換するために使用されます。 この複合形式の Unicode 文字列には、構成前の文字として使用可能な文字の結合順序が含まれません。 http://www.unicode.org/reports/tr15/#Canonical_Composition_Examples("正規化フォーム D と C の例")も参照してください。

例:

MOVE NORMALIZED #SCR TO #TGT
operand1 変換する Unicode 文字列。
operand2 ターゲットオペランド。

例:

一部のコードポイントは、異なる Unicode 表現を持ちます。 例えば、ドイツ語の文字 'Ä' では、Unicode の分解表現は U+0041 に続いて U+0308 であり、結合文字(U+0308)を使用します。代替表現は、構成前の文字 U+00C4 です。 MOVE NORMALIZED ステートメントは、可能な限り構成前の文字を使用して、結合文字を持つ Unicode 表現を正規化された Unicode 表現に変換します。

構文 8 - MOVE ENCODED

このセクションでは、MOVE ENCODED ステートメントの構文について説明します。 このステートメントの目的の詳細は、『Unicode およびコードページのサポート』ドキュメントの「ステートメント」を参照してください。

構文図:

MOVE ENCODED
   operand1 [[IN] CODEPAGE operand2] TO
   operand3 [[IN] CODEPAGE operand4]
   [GIVINGoperand5]

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand1 C S A     A U B                     不可
operand2   S       A U                       不可
operand3   S       A U B                    
operand4   S A     A U                       不可
operand5   S             I4                  

構文要素の説明:

MOVE ENCODED MOVE ENCODED ステートメントは、1 つのコードページにエンコードされている文字列を、別のコードページの同等の文字列に変換します。
operand1 変換する文字列。
operand2 operand1 のコードページ。 operand1 の形式が A または B の場合にのみ指定できます。 注 1 および 3 を参照してください。
operand3

ターゲット。

変換結果がターゲットフィールドに適合しない場合は、結果がパディングまたは切り捨てられます。パディング文字には結果のコードページの空白が使用されます。

ダイナミック変数の長さは変換結果の長さに自動的に調整されるため、ターゲットフィールドがダイナミック変数として定義されている場合、パディングや切り捨ては不要です。

operand4 operand3 のコードページ。 operand3 の形式が A または B の場合にのみ指定できます。 注 1 および 3 を参照してください。
operand5

キーワード GIVING がない場合は、エラーが発生したときに Natural エラーメッセージが返されます。 キーワード GIVING が使用されている場合、operand5 では Natural エラーメッセージの代わりに 0 または Natural エラーコードが返されます。

ターゲットが切り捨てられた場合、Natural エラーメッセージは返されませんが、キーワード GIVING が使用されている場合は、operand5 に切り捨てを示す適切なエラーコードが格納されます。

注意:

  1. コードページオペランドが指定されていない場合は、デフォルトのコードページ(システム変数 *CODEPAGE の値)が使用されます。
  2. ステートメント SET GLOBALS またはシステムコマンド GLOBALS のセッションパラメータ CPCVERRON に設定されている場合は、ソースフィールドの少なくとも 1 文字を目的のコードページに正しく変換できなかった場合にエラーが出力されますが、ターゲットフィールドでは置換文字で置換されます。
  3. ソースモジュール NATCONFG のマクロ NTCPAGE で定義されているコードページ名のみ使用できます。 その他のコードページ名は、対応するランタイムエラーで拒否されます。

例:

MOVE ENCODED A-FIELD1 TO A-FIELD2

無効:コードページ名がデフォルトで取得され、operand1operand3 に対して同じであるため、構文エラーになります。

MOVE ENCODED A-FIELD1 CODEPAGE 'IBM01140' TO A-FIELD2 CODEPAGE 'IBM01140'

無効:コーディングされたコードページ名が operand1operand3 に対して同じであるため、エラーになります。

MOVE ENCODED A-FIELD1 CODEPAGE 'IBM01140' TO A-FIELD2 CODEPAGE 'IBM037'

有効:IBM01140 でコーディングされている A-FIELD1 の文字列は、IBM037 でコーディングされた A-FIELD2 に変換されます。

MOVE ENCODED U-FIELD TO U-FIELD

無効:少なくとも 1 つのオペランドが A または B の形式である必要があるため、エラーになります。

MOVE ENCODED U-FIELD TO A-FIELD

有効:UTF-16 でエンコードされるものとみなされる U-FIELD の Unicode 文字列は、デフォルトのコードページ(*CODEPAGE)の英数字 A-FIELD に変換されます。

MOVE ENCODED A-FIELD TO U-FIELD

有効:デフォルトのコードページ(*CODEPAGE)でエンコードされるものとみなされる A-FIELD の文字列は、Unicode フィールド U-FIELD に変換されます。

MOVE ENCODED A100-FIELD CODEPAGE 'IBM1140' TO A50-FIELD CODEPAGE 'IBM037'

有効:関連するコードページを使用して、A100-FIELD(フォーマット/長さ:A100)から A50-FIELD(フォーマット/長さ:A50)に変換されます。 ターゲットは切り捨てられます。 Natural エラーメッセージは返されません。

MOVE ENCODED A100-FIELD CODEPAGE 'IBM1140' TO A50-FIELD CODEPAGE 'IBM037' GIVING RC-FIELD

有効:関連するコードページを使用して、A100-FIELD(フォーマット/長さ:A100)から A50-FIELD(フォーマット/長さ:A50)に変換されます。 ターゲットは切り捨てられます。 GIVING 節が指定されていないため、RC-FIELD は、値の切り捨てが行われたことを示すエラーコードを受け取ります。

Top of page

例 1 - MOVE ステートメントのさまざまな使用例

** Example 'MOVEX1': MOVE                                               
************************************************************************
DEFINE DATA LOCAL                                                       
1 #A (N3)                                                               
1 #B (A5)                                                               
1 #C (A2)                                                               
1 #D (A7)                                                               
1 #E (N1.0)                                                             
1 #F (A5)                                                               
1 #G (N3.2)                                                             
1 #H (A6)                                                               
END-DEFINE                                                              
*                                                                       
MOVE 5 TO #A                                                            
WRITE NOTITLE 'MOVE 5 TO #A'      30X '=' #A                            
*                                                                       
MOVE 'ABCDE' TO #B #C #D                                                
WRITE 'MOVE ABCDE TO #B #C #D'    20X '=' #B '=' #C '=' #D              
*                                                                       
MOVE -1  TO #E                                             
WRITE 'MOVE -1  TO #E'            28X '=' #E               
*                                                          
MOVE ROUNDED 1.995 TO #E                                   
WRITE 'MOVE ROUNDED 1.995 TO #E'  18X '=' #E               
*                                                          
*                                                          
MOVE RIGHT JUSTIFIED 'ABC' TO #F                           
WRITE 'MOVE RIGHT JUSTIFIED ''ABC'' TO #F'       10X '=' #F
*                                                          
MOVE EDITED '003.45' TO #G (EM=999.99)                     
WRITE 'MOVE EDITED ''003.45'' TO #G (EM=999.99)'  4X '=' #G
*                                                          
MOVE EDITED 123.45 (EM=999.99) TO #H                      
WRITE 'MOVE EDITED 123.45 (EM=999.99) TO #H'      6X '=' #H
*                                                          
END                                   

プログラム MOVEX1 の出力:

MOVE 5 TO #A                              #A:    5                  
MOVE ABCDE TO #B #C #D                    #B: ABCDE #C: AB #D: ABCDE
MOVE -1  TO #E                            #E: -1                    
MOVE ROUNDED 1.995 TO #E                  #E:  2                    
MOVE RIGHT JUSTIFIED 'ABC' TO #F          #F:   ABC                 
MOVE EDITED '003.45' TO #G (EM=999.99)    #G:    3.45               
MOVE EDITED 123.45 (EM=999.99) TO #H      #H: 123.45            

例 2 - MOVE BY NAME

** Example 'MOVEX2': MOVE BY NAME                                       
************************************************************************
DEFINE DATA LOCAL                                                       
1 #SBLOCK                                                               
  2 #FIELDA (A10) INIT <'AAAAAAAAAA'>                                   
  2 #FIELDB (A10) INIT <'BBBBBBBBBB'>                                   
  2 #FIELDC (A10) INIT <'CCCCCCCCCC'>                                   
  2 #FIELDD (A10) INIT <'DDDDDDDDDD'>                                   
1 #TBLOCK                                                               
  2 #FIELD1 (A15) INIT <' '>                                            
  2 #FIELDA (A10) INIT <' '>                                            
  2 #FIELD2 (A10) INIT <' '>                                            
  2 #FIELDB (A10) INIT <' '>                                            
  2 #FIELD3 (A20) INIT <' '>                                            
  2 #FIELDC (A10) INIT <' '>                                            
END-DEFINE                                                              
*                                                                       
MOVE BY NAME #SBLOCK TO #TBLOCK                                      
*                                                                       
WRITE NOTITLE 'CONTENTS OF #TBLOCK AFTER MOVE BY NAME:'
       // '=' #TBLOCK.#FIELD1                          
        / '=' #TBLOCK.#FIELDA                          
        / '=' #TBLOCK.#FIELD2                          
        / '=' #TBLOCK.#FIELDB                          
        / '=' #TBLOCK.#FIELD3                          
        / '=' #TBLOCK.#FIELDC                          
*                                                      
END                                                   

MOVE BY NAME 処理後の #TBLOCK の内容:

CONTENTS OF #TBLOCK AFTER MOVE BY NAME:
                                       
#FIELD1:                               
#FIELDA: AAAAAAAAAA                    
#FIELD2:                               
#FIELDB: BBBBBBBBBB                    
#FIELD3:                               
#FIELDC: CCCCCCCCCC                   

例 3 - 配列を伴う MOVE BY NAME

DEFINE DATA LOCAL
  1 #GROUP1
    2 #FIELD (A10/1:10)
  1 #GROUP2
    2 #FIELD (A10/1:10)
END-DEFINE
... 
MOVE BY NAME #GROUP1 TO #GROUP2
...

この例では、MOVE ステートメントは内部的に次のように解決されます。

MOVE #GROUP1.#FIELD (*) TO #GROUP2.#FIELD (*)

添字付きグループの一部分が同一グループの他の部分に転送される場合、次の例のような予期しない結果となります。

DEFINE DATA LOCAL
  1 #GROUP1 (1:5)
    2 #FIELDA (N1) INIT <1,2,3,4,5>
    2 REDEFINE #FIELDA
      3 #FIELDB (N1)
END-DEFINE
...
MOVE BY NAME #GROUP1 (2:4) TO #GROUP1 (1:3)
...

この例では、MOVE ステートメントは内部的に次のように解決されます。

MOVE #FIELDA (2:4) TO #FIELDA (1:3)MOVE #FIELDB (2:4) TO #FIELDB (1:3)

まず、#FIELDA のオカレンス 2 から 4 の内容は、#FIELDA のオカレンス 1 から 3 に移動されます。つまり、オカレンスは次の値を受け取ります。

オカレンス 1. 2. 3. 4. 5.
前の値: 1 2 3 4 5
後の値: 2 3 4 4 5

#FIELDB のオカレンス 2 から 4 の内容は、#FIELDB のオカレンス 1 から 3 に移動されます。つまり、オカレンスは次の値を受け取ります。

オカレンス 1. 2. 3. 4. 5.
前の値: 2 3 4 4 5
後の値: 3 4 4 4 5

例 4 - MOVE BY POSITION

DEFINE DATA LOCAL
  1 #GROUP1
    2 #FIELD1A (N5)
    2 #FIELD1B (A3/1:3)
    2 REDEFINE #FIELD1B
      3 #FIELD1BR (A9)
  1 #GROUP2
    2 #FIELD2A (N5)
    2 #FIELD2B (A3/1:3)
    2 REDEFINE #FIELD2B
      3 #FIELD2BR (A9)
END-DEFINE
...
MOVE BY POSITION #GROUP1 TO #GROUP2   
...

#FIELD1A の内容は、#FIELD2A に転送され、#FIELD1B の内容は、#FIELD2B に転送されます。フィールド #FIELD1BR#FIELD2BR は影響を受けません。

Top of page