MOVE ステートメント
MOVE ステートメントは、データをあるストレージ域から別の 1 つまたは複数のストレージ域に転送します。
| フォーマット 1 |
 .------.
V |
>>-MOVE--+-ID-1-------+--TO----ID-2-+--------------------------><
'-リテラル-1-'
|
| フォーマット 2 |
 >>-MOVE--+-CORRESPONDING-+--ID-1--TO--ID-2---------------------><
'-CORR----------'
|
CORR は、CORRESPONDING の省略形で、意味は同じです。
- ID-1、リテラル-1
- 送り出し領域。
- ID-2
- 受け取り領域。ID-2 は組み込み関数を参照してはなりません。
フォーマット 1 を指定する場合:
- すべての ID は、英数字グループ項目、国別グループ項目、または基本項目を参照することができます。
- ID-1 または ID-2 の一方が国別グループ項目を参照し、もう一方のオペランドが英数字グループ項目を参照するときには、国別グループは 1 つのグループ項目として処理されます。それ以外の場合には、国別グループ項目は国別カテゴリーの基本データ項目として処理されます。
- 送り出し領域のデータは、ID-2 データ項目が MOVE ステートメントに指定された順に ID-2 のそれぞれによって参照されるデータ項目の中に移動されます。基本移動と グループ移動を参照してください。
フォーマット 2 を指定する場合:
- ID は両方ともグループ項目でなければなりません。
- 国別グループ項目はグループ項目として (国別カテゴリーの基本データ項目としてではなく) 処理されます。
- ID-1 で選択された項目が、CORRESPONDING 句の規則に従って、ID-2 へ移動されます。結果は、CORRESPONDING ID のそれぞれの対が、別々の MOVE ステートメントで参照された場合と同じです。
以下の種類の使用法を指定して記述されたデータ項目は、MOVE ステートメントに指定できません。
- INDEX
- POINTER
- FUNCTION-POINTER
- PROCEDURE-POINTER
- OBJECT REFERENCE
INDEX、POINTER、FUNCTION-POINTER、PROCEDURE-POINTER、または
OBJECT REFERENCE の使用法で定義されたデータ項目は、MOVE CORRESPONDING
ステートメント内で参照される英数字グループ項目に含めることができます。ただし、これらのデ
ータ項目からデータが移動されることはありません。
送り出し領域または受け取り領域の長さの評価は、OCCURS 文節の DEPENDING ON 句の影響を受けます (OCCURS 文節を参照)。
送り出しフィールド (ID-1) が参照による変更、添え字付き、もしくは英数字、または国別関数 ID の場合、参照修飾子、添え字、または関数は、データが受け取りオペランドの先頭に移動される直前に一度だけ評価されます。
受け取りフィールド (ID-2) に関連する長さの計算、添え字付け、または参照による修正は、
データがその受け取りフィールドに移動される直前に評価されます。
例えば、
MOVE A(B) TO B, C(B).
のステートメントは、次のステートメントと同じ結果になります。
MOVE A(B) TO TEMP.
MOVE TEMP TO B.
MOVE TEMP TO C(B).
ここで TEMP は、中間結果項目として定義されています。添え字 B は、
最初の移動が行われた時と C(B) の移動が最後に実行された時とでは、
値が変わっています。
中間結果の詳細については、「COBOL for Windows プログラミング・ガイド」を参照してください。
MOVE ステートメントを実行した後も、送り出しフィールドには、実行前と同じデータが入っています。
注: MOVE ステートメント内にオーバーラップするオペランドがあると、
予測できない結果が生じる可能性があります。
基本移動
基本移動とは、受け取り項目が基本データ項目であり、送り出し項目が基本データ項目またはリテラルである移動のことです。
有効なオペランドは、以下のいずれかのカテゴリーに属します。
- 英字: 英字カテゴリーのデータ項目および表意定数 SPACE が含まれます。
- 英数字: 以下が含まれます。
- 英数字カテゴリーのデータ項目
- 英数字関数
- 英数字リテラル
- 表意定数 ALL 英数字リテラル および NULL を除くその他すべての表意定数 (英数字送り出し項目を必要とする文脈で使用される場合)
- 英字数字編集: 英数字編集カテゴリーのデータ項目が含まれます。
- DBCS: DBCS カテゴリーのデータ項目、DBCS リテラル、および表意定数 ALL DBCS リテラルが含まれます。
- 外部浮動小数点: 外部浮動小数点カテゴリーのデータ項目 (USAGE DISPLAY または USAGE NATIONAL を指定して記述) および浮動小数点リテラルが含まれます。
- 内部浮動小数点: 内部浮動小数点カテゴリーのデータ項目 (USAGE COMP-1 または USAGE COMP-2 として定義) が含まれます。
- 国別: 以下が含まれます。
- 国別グループ項目 (国別カテゴリーの基本項目として扱われる)
- 国別カテゴリーのデータ項目
- 国別リテラル
- 国別関数
- 表意定数 ZERO、SPACE、QUOTE、および ALL 国別リテラル (国別送り出し項目を必要とする文脈で使用される場合)
- 国別編集: 国別編集カテゴリーのデータ項目が含まれます。
- 数字: 以下が含まれます。
- 数字カテゴリーのデータ項目
- 数字リテラル
- 表意定数 ZERO (ZERO が数字または数字編集項目へ移動される場合)
- 数字編集: 数字編集カテゴリーのデータ項目が含まれます。
基本移動の規則
データをある 1 つの形式の内部表現のものから別の形式のものに変換する必要がある場合、その変換は、移動中に受け取り項目によって指定された編集またはそれに合わせて暗黙の編集解除を行います。
英数字文字へ、または英数字文字からの変換で
使用されるコード・ページは、実行時に特定のデータ項目に適用可能なコード・ページです。
次の規則は、有効な基本移動がどのように実行されるかを示します。受け取りフィールドは、以下のとおりです。
英字:
- 位置合わせと必要なスペースの埋め込みまたは切り捨ては、位置合わせの規則の説明のようにして行われます。
- 送り出し項目のサイズが、受け取り項目のサイズより大きければ、受け取り項目がいっぱいになった後は、
右端の余分の文字が切り捨てられます。
英数字または英数字編集:
- 送り出し項目が国別 10 進数の整数項目の場合、その送り出しデータ項目は使用法 DISPLAY に変換され、送り出し項目と同じ文字位置数の英数字カテゴリーの一時データ項目へ移動されるように処理されます。生成された英数字データ項目は、送り出し項目として扱われます。
- 位置合わせと必要なスペースの埋め込みまたは切り捨ては、位置合わせの規則の説明のようにして行われます。
- 送り出し項目のサイズが、受け取り項目のサイズより大きければ、受け取り項目がいっぱいになった後は、
右端の余分の文字が切り捨てられます。
- 最初の送り出し項目が演算符号を持つ場合、符号なしの値が使われます。演算符号が別の 1 文字を占有している場合には、その文字は移動されず、
送り出し項目のサイズは実際のサイズよりも 1 文字分だけ小さいとみなされます。
DBCS:
- 送り出し項目と受け取り項目のサイズが異なる場合、送り出しデータは右側で切り捨てられるか、右側が DBCS スペースで埋められます。
必要な埋め込みバイトが 2 バイト文字に合う倍数に
なっていない場合、1 バイト文字が使用されます (例えば、英数字グループ項目に
移される DBCS データ項目など)。
外部浮動小数点:
- 浮動小数点の送り出し項目の場合、浮動小数点値は受け取り側の外部浮動小数点項目の使用法に変換されます (送り出し項目の表現と異なる場合)。
- その他の送り出し項目の場合は、値が内部浮動小数点に変換されてから、受け取り側の外部浮動小数点項目の使用法に変換されるように、数値が処理されます。
内部浮動小数点:
- 送り出しオペランドのカテゴリーが内部浮動小数点ではない場合、送り出し項目の数値は内部浮動小数点フォーマットに変換されます。
国別 または国別編集:
- 送り出し項目の表現が国別文字ではない場合、その送り出しデータは国別文字に変換され、切り捨てや埋め込みが行われることのない長さの、国別カテゴリーの一時データ項目に移動されるように扱われます。生成された国別カテゴリーのデータ項目は、送り出しデータ項目として扱われます。
- 送り出し項目の表現が国別文字の場合は、送り出しデータが変換されずに使用されます。
- 位置合わせと必要なスペースの埋め込みまたは切り捨ては、位置合わせの規則の説明のようにして行われます。プログラマーは、1 つの図形文字を形成する複数のエンコード・ユニットが切り捨てによって分離されることのないようにする必要があります。
- 送り出し項目が演算符号を持つ場合には、記号なしの値が使われます。演算符号が別の 1 文字を占有している場合には、その文字は移動されず、
送り出し項目のサイズは実際のサイズよりも 1 文字分だけ小さいとみなされます。
数字または数字編集:
- 編集上の必要により 0 が置き換えられる場合を除き、小数点による位置合わせと 0 による埋め込み (必要な場合) が行われます。詳しくは、位置合わせの規則を参照してください。
- 受け取り項目に記号が付いていれば、送り出し項目の記号は記号変換されてから (必要な場合)、
受け取り項目に入れられます。送り出し項目が無記号であるときは、受け取り項目に対して正の演算符号が生成されます。
- 受け取り項目が符号なしのときは、受け取り項目に対して演算符号は生成されず、移動では送り出し項目の絶対値が使用されます。
- 送り出し項目のカテゴリーが英数字、英数字編集、国別、または国別編集のときは、送り出し項目が符号なし整数として記述されているかのようにデータが移動されます。
- 送り出し項目が浮動小数点であるときは、
データはまず 2 進数かまたは内部 10 進表記に変換されてから移動されます。
- 受け取り項目が数字編集のときは、その受け取り項目に関連付けられた PICTURE 文字ストリングまたは BLANK WHEN ZERO 文節で定義されているように編集が行われます。
- 送り出し項目が数字編集のときは、コンパイラーは送り出しデータを編集解除して、数字編集項目の未編集の値を設定します (この値は符号付きにすることができます)。数字または数字編集の受け取りデータ項目への移動では、未編集の数値が使用されます。
注:
- 受け取り項目のカテゴリーが英数字、英数字編集、数字編集、国別、または国別編集のときに、送り出しフィールドが数字の場合は、ピクチャー記号 P を指定して記述された送り出し項目内のすべての桁位置はゼロの値を持つとみなされます。
それぞれの P は、送り出し項目サイズの計算に入れられます。
- 受け取り項目が数字で、送り出しフィールドが英数字リテラル、国別リテラル、または ALL リテラルの場合は、そのリテラルのすべての文字は数字でなければなりません。
有効な基本移動と無効な基本移動
以下の表は、それぞれのカテゴリーごとに有効な基本移動と無効な基本移動を示したものです。この表では、「はい」と「いいえ」は次のような意味です。
- はい = 移動が有効である。
- いいえ = 移動は無効である。
- 列見出しは受け取り項目のカテゴリーを示します。
表 46. 有効な基本移動と無効な基本移動
| |
英字 |
英数字 |
英数字編集 |
数字 |
数字編集 |
外部浮動小数点 |
内部浮動小数点 |
DBCS1 |
国別、国別編集 |
| 英字および SPACE 送り出し項目 |
はい |
はい |
はい |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
はい |
| 英数字 送り出し項目2 |
はい |
はい |
はい |
はい3 |
はい3 |
はい8 |
はい8 |
いいえ |
はい |
| 英数字編集 送り出し項目 |
はい |
はい |
はい |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
はい |
| 数字整数と ZERO 送り出し項目4 |
いいえ |
はい |
はい |
はい |
はい |
はい |
はい |
いいえ |
はい |
| 数字非整数 送り出し項目5 |
いいえ |
いいえ |
いいえ |
はい |
はい |
はい |
はい |
いいえ |
いいえ |
| 数字編集 送り出し項目 |
いいえ |
はい |
はい |
はい |
はい |
はい |
はい |
いいえ |
はい |
| 浮動小数点 送り出し項目6 |
いいえ |
いいえ |
いいえ |
はい |
はい |
はい |
はい |
いいえ |
いいえ |
| DBCS 送り出し項目7 |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
はい |
はい |
| 国別送り出し項目9 |
いいえ |
いいえ |
いいえ |
はい |
はい |
はい |
はい |
いいえ |
はい |
| 国別編集送り出し項目 |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
はい |
- DBCS データ項目を含む。
- 英数字リテラルを含む。
- 表意定数と英数字リテラルは、数字だけで構成しなければならず、数字整数フィールドとして扱われる。
- 整数の数字リテラルを含む。
- 非整数の数字リテラルを含む。
- 浮動小数点リテラル、外部浮動小数点データ項目 (USAGE DISPLAY または USAGE NATIONAL)、
および内部浮動小数点データ項目 (USAGE COMP-1 または USAGE COMP-2) を含む。
- DBCS データ項目、DBCS リテラル、および表意定数 SPACE を含む。
- 表意定数と英数字リテラルは、数字だけで構成しなければならず、数字整数フィールドとして扱われる。リテラル ALL は、送り出し項目として使用することはできない。
- 国別データ項目、国別リテラル、国別関数、および表意定数 ZERO、SPACE、QUOTE、および ALL 国別リテラルを含む。
|
日付フィールドが関係する移動
送り出し項目を年末尾型日付フィールドとして指定した場合は、
受け取りフィールドもすべて年末尾型日付フィールドにし、その日付フォーマットを送り出し項目と同じにしなければなりません。
また、年末尾型日付フィールドを受け取り項目として指定した場合は、
送り出し項目を非日付データまたは年末尾型日付フィールドのいずれかにし、その日付フォーマットを受け取り項目と同じにしなければなりません。そのようにするなら、どちらの場合も移動が実行され、項目がすべて非日付データになっている場合と同じ結果になります。
『日付フィールドが関係する移動』(表 47) は、非年末尾型日付フィールドが関係する移動の動作を示しています。送り出し項目が日付フィールドである場合、受け取りフィールドは互換日付フィールドでなければなりません。送り出し項目と受け取り項目の両方が日付フィールドである場合は、
それらに互換性がなければなりません。すなわち、
ウィンドウ化西暦年でも拡張西暦年でも可能な年部分を除いて、同じ日付フォーマットにする必要があります。
この表では、移動を記述するのに以下の用語を使用しています。
- 通常
- 送り出し項目と受け取り項目の両方が非日付データであるかのように、
日付感知動作なしで移動が実行されます。
- 拡張
- ウィンドウ化日付フィールドの送り出し項目は、ウィンドウ化日付フィールドのセマンティクスで説明されているように、
最初に拡張形式に変換されたかのように扱われます。
- 無効
- 移動は許可されません。
表 47. 日付フィールドが関係する移動
|
非日付データ受け取り項目 |
ウィンドウ化日付フィールド受け取り項目 |
拡張日付フィールド 受け取り項目 |
| 非日付データ送り出し項目 |
通常 |
通常 |
通常 |
| ウィンドウ化日付フィールド 送り出し項目 |
無効 |
通常 |
拡張 |
| 拡張日付フィールド送り出し項目 |
無効 |
通常1 |
通常 |
- 拡張日付フィールドからウィンドウ化日付フィールドに移動すると、拡張日付フィールドの世紀部分が切り捨てられることになるため、それは実際には「ウィンドウ化」移動になります。移動が英数字の場合は、
受け取りウィンドウ化日付フィールドはそのデータ記述に JUSTIFIED RIGHT を指定した場合と同じ方法で処理されます。これは、
受け取りウィンドウ化日付フィールドがグループ項目 (JUSTIFIED 文節を指定できない) である場合も同様です。
|
ファイル・レコード域が関係する移動
あるファイルに対して OPEN ステートメントが正常に実行されると、そのファイルのレコード域が使用可能になります。
ファイルに関連したレコード記述項目との間でデータをやり取りできるのは、そのファイルがオープン状態になっている場合のみです。暗黙的または明示的な CLOSE ステートメントを実行すると、ファイルがオープン状態から除去され、レコード域が使用不可になります。
グループ移動
グループ移動とは、送り出し項目または受け取り項目、あるいはその両方が英数字グループ項目であるような移動のことです。
グループ移動には以下のものがあります。
- 以下のいずれかから英数字グループ項目への移動
- MOVE ステートメント内で送り出し項目として有効な任意の基本データ項目
- 国別グループ項目
- リテラル
- 表意定数
- 英数字グループ項目から以下のいずれかへの移動
- MOVE ステートメント内で受け取り項目として有効な任意の基本データ項目
- 国別グループ項目
- 英数字グループ項目
グループ移動は、ある内部表現の形式から別の形式へのデータ変換を行わないことを除けば、英数字から英数字への基本移動と同じように扱われます。グループ移動では、
送り出し領域または受け取り領域に含まれている個々の基本項目には関係なく、受け取り領域にデータが満たされます。ただし、OCCURS 文節で注記されている場合を除きます (OCCURS 文節を参照)。
|