move
- バイト順
- 名前順。1 つの構造にある名前付きフィールドから、別の構造内の同じ名前が付いたフィールドへ。
- 位置順。1 つの構造の各フィールドから、別の構造内の同等な位置にあるフィールドへ。
- 必要に応じて、移動は、フィールド間の互換性を検査しながら行われます。 (バイト単位の移動の場合、これは行われません。) 切り捨て、埋め込み、 および型変換の規則は、EGL の代入 (『代入』を参照) で詳しく説明されている規則と同じですが、move 文の総体的な振る舞いは、代入の振る舞いとは異なります。
- 動的配列で作業する場合、最後の要素は、配列の現行サイズによって決まります。move 文は配列に要素を追加しないため、 動的配列を拡張するには、配列固有の関数 appendElement() または appendAll() を使用します。 『配列』を参照してください。
- ソースまたはターゲット要素に固定構造体がある場合、 move 文は、構造体のトップレベルで別のプリミティブ型が指定されていないかぎり、この構造体を CHAR フィールドとして扱います。 for all または for count が使用中である場合は、 move 文は副構造を考慮しません。
構文

ソースおよびターゲットの意味は、 文のオプションによって異なります。 move 文のさまざまな書式については、以下のセクションを参照してください。
move {justify = left} または move {justify = right}
justify は、固定長テキスト型ターゲット変数、または固定長テキスト型配列にのみ使用できます。 位置調整操作は、ソースが標準 EGL 操作 (データ型変換を含む) によって移動された後にターゲット上で行われます。 ターゲット変数でサブストリングが指定された場合は、サブストリング化された文字のみが位置調整によって変更されます。
move {justify=left} a to b;
left を指定した場合、結果のターゲット・オペランド内の先行ブランクはすべて除去され、値は左にシフトされます。 ソース・オペランドは変更されません。 固定長ターゲット変数の右側にある必要な文字はいずれも、スペースとして挿入されます。
move {justify=right} a to b;
right を指定した場合、結果のターゲット・オペランド内の末尾ブランクはすべて除去され、値は左にシフトされます。 ソース・オペランドは変更されません。 固定長ターゲット変数の左側にある必要な文字はいずれも、スペースとして挿入されます。
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』を参照してください。
- 別のケースでは、ソースまたはターゲットがレコードです。 ソースの最上位 フィールドまたはリーフ・フィールド (ソース・タイプに応じて) は、ターゲットの最上位フィールドまたはリーフ・フィールド (ターゲット・タイプに応じて) に割り当てられます。
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 文は副構造を無視します。
ソースが配列または配列の要素である場合は、そのソース配列の後続の各要素は、ターゲット配列の次の順次要素にコピーされます。 ターゲット配列またはソース配列のいずれかが他方より長くても問題ありません。この場合は、他の配列と一致する要素を持つ最後の要素からデータがコピーされると、操作が終了します。
ソースが配列の要素である場合、そのソースは、指定された要素が最初の要素である配列として扱われ、前の要素は無視されます。
ソースが配列でも、配列の要素でもない場合、この操作はソースの値を使用して、ターゲット配列のすべての要素を初期化します。
ソースがレコード配列 (またはレコード配列の要素) である場合、ターゲットはレコード配列でなければなりません。 ソースがプリミティブ変数配列 (またはプリミティブ変数配列の要素) である場合、ターゲットはプリミティブ変数配列または構造化フィールド配列でなければなりません。 ソースが構造化フィールド配列 (または構造化フィールド配列の要素) である場合、ターゲットはプリミティブ変数配列または構造化フィールド配列でなければなりません。
- 整数リテラル
- EGL が整数として評価する変数
- 数式。ただし、関数呼び出しではありません。
- 次の文は、"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 文との互換性が保たれます。
- ソースが以下の値のいずれかである場合、文は代入文と同様に処理されます。
- プリミティブ変数
- 固定構造体のフィールド
- リテラル
- 定数
- それ以外の場合、文は move by name として処理されます。
互換性
| プラットフォーム | 問題 |
|---|---|
| Rich UI | move はサポートされていません。 |