MOVE ステートメント

MOVE ステートメントは、target によって示される参照変数の指すフィールドを変更します。

構文

注:
  1. The RepeatClause は、PREVIOUSSIBLING および NEXTSIBLING 修飾子とだけ使用できます。

TO 文節を組み込む場合、ソースが指すのと同じエンティティーを指すように、 ターゲット参照が変更されます。 これは、メッセージ・フィールドか、宣言した変数のどちらかにできます。

PARENT、PREVIOUSSIBLING、NEXTSIBLING、FIRSTCHILD、または LASTCHILD 文節を組み込む場合、 MOVE ステートメントは、ターゲット参照変数を、現在の位置との相対関係で指定した方向に移動しようとします。 指定した方向にフィールドがあれば、移動は成功します。 該当するフィールドがなければ、移動は失敗するので、参照変数は、 引き続き以前と同じフィールドまたは変数を指し、LASTMOVE 関数が FALSE を戻します。 移動が成功したか失敗したかは LASTMOVE 関数を使うことによって判定できます。

TYPE 文節、NAME 文節、またはその両方が存在する場合には、 ターゲットが指定された方向 (PREVIOUSSIBLING、NEXTSIBLING、FIRSTCHILD、または LASTCHILD) にやはり移動しますが、 この場合は、指定されたタイプ、名前、またはその両方を持つフィールドまで移動します。 ターゲット・フィールドの名前またはタイプ (またはその両方) が分かっている場合に、 これは特に役立ちます。なぜなら、こうすることによりフィールドをナビゲートするのに必要な MOVE ステートメントの数を減らすことができるからです。 その理由は基準に一致しないフィールドがスキップされるところにあります。 そのようなフィールドには、予期しないメッセージ・ツリー・フィールド (たとえばホワイト・スペースを表すフィールド) が含まれます。

指定された移動が実行できない (つまり、 指定されたタイプまたは名前を持つフィールドが存在しない) 場合には、 ターゲットが未変更のままにされ、LASTMOVE 関数が FALSE を戻します。 TYPE 文節、NAME 文節、またはその両方には、 適切なデータ・タイプの値 (タイプには INTEGER、名前には CHARACTER) を戻す式を含めることができます。 指定された値が NULL の場合には、例外が送出されます。

さらに 2 つの文節 NAMESPACE および IDENTITY は、 NAME 文節の機能を向上させます。

NAMESPACE 文節は、タイプが文字のヌル以外の値を戻すすべての式を取ります。 また、任意のネーム・スペースを表す * も取ります。 * は ESQL の単項演算子ではないので、これを式と混同しないように注意してください。

意味は、NAME および NAMESPACE 文節の有無によって、次のように左右されます。
NAMESPACE NAME エレメントの検索キー
いいえ いいえ タイプと索引、または索引のみ
いいえ はい 名前とネーム・スペース (パスから選択する)
* はい 名前
はい いいえ ネーム・スペース
はい はい 名前とネーム・スペース

IDENTITY 文節は TYPE および NAME 文節の代わりに単一のパス・エレメントを取り、 フィールド参照に関する部分で説明されている規則すべてに従います (ESQL フィールド参照を参照してください)。

MOVE を PREVIOUSSIBLING または NEXTSIBLING を指定して使用するときには、 REPEAT、TYPE、および NAME キーワードを指定することができます。 そうすれば、現行フィールドと同じタイプおよび名前を持つ、直前または次のフィールドにターゲットが移動します。 REPEAT キーワードは、同じ種類の兄弟に移動するときに特に便利です。 なぜなら、タイプおよび名前を定義する式を書く必要がないからです。

MOVE cursor FIRSTCHILD TYPE 0x01000000 NAME 'Field1';

この例は、参照変数 cursor を、cursor が現在指しているフィールドの子フィールドのうち、 タイプ 0x01000000 と名前 Field1 を持つ最初のものに移動させます。

MOVE ステートメントは、新規フィールドを絶対に作成しません。

MOVE ステートメントの一般的な使用方法は、繰り返し構造の特定インスタンスから、 次のインスタンスへ移動することです。 その後で、相対フィールド参照を使用して、構造内のフィールドにアクセスできます。 例を以下に示します。
WHILE LASTMOVE(sourceCursor) DO
    SET targetCursor.ItemNumber  = sourceCursor.item;
    SET targetCursor.Description = sourceCursor.name;
    SET targetCursor.Price       = sourceCursor.prc;
    SET targetCursor.Tax         = sourceCursor.prc * 0.175;
    SET targetCursor.quantity    = 1;
  CREATE NEXTSIBLING OF targetCursor AS targetCursor REPEAT;
    MOVE sourceCursor NEXTSIBLING REPEAT TYPE NAME;
END WHILE;

参照変数、および参照変数の移動の例の詳細については、 動的フィールド参照の作成を参照してください。

関連概念
ESQL

関連タスク
ESQL の開発
動的フィールド参照の作成

関連資料
構文の設定
ESQL のステートメント
LASTMOVE 関数