move

EGL move 文は、次の 3 つの方法のいずれかでデータをコピーします。
以下の一般的な規則が適用されます。

構文

move 文の構文図

ソースおよびターゲットの意味は、 文のオプションによって異なります。 move 文のさまざまな書式については、以下のセクションを参照してください。

move (修飾子なし)

move 文に byName または byPosition 修飾子を指定していない場合、EGL は、ソースからターゲットへ情報を 1 バイトずつ移動します。 ソースは、ターゲットと代入の互換性がある 必要があります。詳しくは、『EGL における代入の互換性』を参照してください。

move byName

この書式の move 文では、EGL はソースの各フィールド からターゲットの同じ名前のフィールドにデータを代入します。 演算は、フィールドがソースにリストされている順に行われます。 ソースは、ターゲットと代入の互換性がある 必要があります。詳しくは、『EGL における代入の互換性』を参照してください。

ソースまたはターゲットは、次のいずれであってもかまいません。
  • 構造化レコードの動的配列
  • 非構造化レコード
  • 構造化レコード
  • 副構造を持つ指定された構造化フィールド
  • 副構造を持つ構造化フィールド配列
  • データ・テーブル
  • 書式

名前にアスタリスク (*) が付いた構造化フィールドは、ソース・フィールドとして使用できませんが、 そのフィールドの副構造内にあるどの名前付きフィールドでも使用できます。

以下の場合、操作は無効になります。
  • 同一ソース内に同じ名前のフィールドが複数ある。
  • 同一宛先内に同じ名前のフィールドが複数ある。
  • ソース・フィールドが、多次元の構造化フィールド配列であるか、配列内の 1 次元の構造化フィールド配列である。
  • ターゲット・フィールドが、多次元の構造化フィールド配列であるか、配列内の 1 次元の構造化フィールド配列である。
この操作は、以下のような場合に有効です。
  • 単純なケースでは、ソースが固定構造体であるが、それ自体が配列要素ではなく、ターゲットについても同様です。以下の規則が適用されます。
    • 配列をコピーしない場合は、ソース構造体内の各従属フィールドの値は、ターゲット構造体内の同じ名前の対応するフィールドにコピーされます。
    • 構造化フィールドの配列を別の構造化フィールドの配列にコピーする場合、操作は move for all として処理されます。このトピック内の『配列を持つ move』を参照してください。
  • 別のケースでは、ソースまたはターゲットがレコードです。 ソースのフィールドが、ターゲット内の同じ名前のフィールドに割り当てられます。
  • もう 1 つのケースは、それほど単純ではありませんが、次の例で最もよく説明されます。ソースは 10 個の構造化レコードから構成される配列であり、 それぞれに以下の構造化フィールドが含まれます。
      10 empnum  CHAR(3);
      10 empname CHAR(20); 
    ターゲットは、以下の構造化フィールドを含む固定構造体です。
      10 empnum CHAR(3)[10];
      10 empname CHAR(20)[10];
    move 操作は、次のアクションを実行します。
    • 最初の構造化レコード内のフィールド empnum の値を 構造化フィールド配列 empnum の最初の要素にコピーします。
    • 最初の構造化レコード内のフィールド empname の値を、 構造化フィールド配列 empname の最初の要素にコピーします。
    • ソース配列内の各構造化レコードについてこのプロセスを繰り返します。 つまり、ソース配列内にある 2 番目の構造化レコードの各フィールドを、 対応する構造化フィールド配列の 2 番目の要素にコピーするということです (3 番目以降も同様)。
    ソースが、以下のような副構造を持つ単一の構造化レコードの場合、同じ操作が行われます。
      10 mySubStructure[10]
        15 empnum  CHAR(3);
        15 empname CHAR(20);    
  • 最後に、ソースが以下の構造化フィールドを含む構造化レコードであるケースについて説明します。
      10 empnum  CHAR(3);
      10 empname CHAR(20)[10]; 
    ターゲットは、以下の副構造を持つ書式、構造化レコード、または構造化フィールドです。
      10 empnum CHAR(3)[10];
      10 empname CHAR(20);

    EGL は、empnum フィールドの値を、ソースからターゲットの empnum の最初の要素にコピーし、empname の最初の要素の値を、ソースからターゲットのフィールド empname にコピーします。配列に対するターゲット empname を変更せずに追加のコピーを実行することはできないため、move 文はここで終了します。

move byPosition

この書式の move 文では、EGL はデータを ソースの各フィールドからターゲットの同等の場所にあるフィールドにコピーします。 EGL は、各フィールドをソース内での配置順序に従って、1 バイトずつコピーします。ソースは、ターゲットと代入の互換性がある 必要があります。詳しくは、『EGL における代入の互換性』を参照してください。

ソースまたはターゲットは、次の種類のデータのいずれであってもかまいません。
  • 構造化レコードの動的配列
  • レコード
  • 構造化レコード
  • 副構造を持つ構造化フィールド
  • 副構造を持つ構造化フィールド配列
  • データ・テーブル

レコードと構造化レコードまたはフィールド間でデータを移動する場合は、ターゲットの最上位フィールドのみが考慮されます。 2 つの構造化レコードまたはフィールド間でデータを移動する場合は、どちらかの最下位 (リーフ) フィールドのみが考慮されます。

ソース・フィールドまたはターゲット・フィールドが多次元の構造化フィールド配列であるか、 配列内の 1 次元の構造化フィールド配列である場合、この操作は無効です。

操作により以下のアクションが実行されます。
  • 単純なケースでは、ソースが固定構造体であるが、それ自体が配列要素ではなく、ターゲットについても同様です。以下の規則が適用されます。
    • 配列をコピーしない場合、EGL はソース構造体内の各リーフ・フィールドの値を、ターゲット構造体内の対応する位置にあるリーフ・フィールドにコピーします。
    • 構造化フィールドを別の構造化フィールドの配列にコピーする場合、操作は move for all として処理されます。このトピック内の『配列を持つ move』を参照してください。
  • 別のケースでは、ソースまたはターゲットがレコードです。 ソースの最上位 フィールドまたはリーフ・フィールド (ソース・タイプに応じて) は、ターゲットの最上位フィールドまたはリーフ・フィールド (ターゲット・タイプに応じて) に割り当てられます。
次に、位置順の move の例を示します。2 つのレコード内の同等のフィールドが、異なる名前を持ちます。
record myCustomer type BasicRecord
  customerNumber CHAR(6);
  customerName CHAR(25);
end

record mySavedCustomer type BasicRecord
  savedCustomerNumber CHAR(6);
  savedCustomerName CHAR(25);
end

...

move myCustomer to mySavedCustomer byPosition;

配列を持つ move

move 文のターゲットが配列である場合、 すべての要素 (for all) または 要素の順次サブセット (for count) に値を割り当てることができます。

ソースは、次の種類のデータのいずれかです。
  • レコード、構造化レコード、またはプリミティブ変数の動的配列
  • レコード
  • 構造化レコード
  • 副構造を持つ構造化フィールド、または持たない構造化フィールド
  • 副構造を持つ構造化フィールド配列、または持たない構造化フィールド配列
  • プリミティブ変数
  • リテラルまたは定数
ターゲットは、次の種類のデータのいずれかです。
  • レコード、構造化レコード、またはプリミティブ変数の動的配列
  • 副構造を持つ構造化フィールド配列、または持たない構造化フィールド配列
  • 動的または構造化フィールド配列の要素

配列を持つ move 文は、複数の EGL のバイト単位コピー (ターゲット配列要素ごとに 1 つ) と同等であり、 コピー操作が無効な場合はエラーが発生します。妥当性について詳しくは、代入を参照してください。

for all または for count が使用中である場合は、move 文は副構造を無視します。

ソースが配列または配列の要素である場合は、そのソース配列の後続の各要素は、ターゲット配列の次の順次要素にコピーされます。 ターゲット配列またはソース配列のいずれかが他方より長くても問題ありません。この場合は、他の配列と一致する要素を持つ最後の要素からデータがコピーされると、操作が終了します。

ソースが配列の要素である場合、そのソースは、指定された要素が最初の要素である配列として扱われ、前の要素は無視されます。

ソースが配列でも、配列の要素でもない場合、この操作はソースの値を使用して、ターゲット配列のすべての要素を初期化します。

ソースがレコード配列 (またはレコード配列の要素) である場合、ターゲットはレコード配列でなければなりません。 ソースがプリミティブ変数配列 (またはプリミティブ変数配列の要素) である場合、ターゲットはプリミティブ変数配列または構造化フィールド配列でなければなりません。 ソースが構造化フィールド配列 (または構造化フィールド配列の要素) である場合、ターゲットはプリミティブ変数配列または構造化フィールド配列でなければなりません。

for count メソッドを使用する場合、count は、データを受け取るターゲット要素の数を示します。この count は、以下の値のいずれかになります。
  • 整数リテラル
  • EGL が整数として評価する変数
  • 数式。ただし、関数呼び出しではありません。
for count メソッドの例を次に示します。
  • 次の文は、"abc" を配列 target 内の要素 7、8、および 9 に移動します。
      move "abc" to target[7] for 3;
  • 次の文は、source の要素 2、3、および 4 を target の 7、8、および 9 に移動します。
      move source[2] to target[7] for 3;

move withV60Compat

withV60Compat 修飾子は、EGL バージョン 6 以前または VisualAge® Generator のプログラムからマイグレーションされたプログラムで使用します。 新規のコードではこの修飾子を使用しないでください。

move 文が参照する変数が独立型関数で宣言されていて、 マイグレーションによってその変数の型を決定できない場合に、この修飾子を使用します。 このオプションによって、修飾子を持たない move 文との互換性が保たれます。

withV60Compat 修飾子は以下のような動作をします。
  • ソースが以下の値のいずれかである場合、文は代入文と同様に処理されます。
    • プリミティブ変数
    • 固定構造体のフィールド
    • リテラル
    • 定数
  • それ以外の場合、文は move by name として処理されます。

互換性

表 1. move の互換性に関する考慮事項
プラットフォーム 問題
Rich UI move はサポートされていません。

フィードバック