MOVE

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

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

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

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


関数

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

Natural システム関数は、MOVE ステートメントを AT BREAKAT END OF DATA または AT END OF PAGE ステートメントと組み合わせて指定した場合にのみ使用できます。

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

構文 1 - MOVE

MOVE [ROUNDED] operand1 [(parameter)] TO operand2

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

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

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
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
MOVE ROUNDED オプション:

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

ROUNDED は、operand2が数値でない場合、またはソースオペランドの小数部がターゲットオペランド以下である場合は無視されます。

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

operand1
operand2

ソースおよびターゲットオペランド:

operand1 は、値がターゲットオペランド operand2 に移動するソースオペランドです。

データ転送のルール、およびデータ変換と転送の互換性に関する情報については、『プログラミングガイド』の「データ転送」を参照してください。

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

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

MOVE #SOURCE TO #TARGET1 #TARGET2

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

MOVE #SOURCE TO #TARGET1 
MOVE #SOURCE TO #TARGET2
parameter
パラメータオプション:

parameter では、セッションパラメータ PM またはセッションパラメータ DF を指定できます。

PM=I   
右から左への表示オプション:

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

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

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

PM=I は、operand2 に英数字/Unicode 形式(Natural データフォーマット A または U)がある場合にのみ指定できます。

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

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

   
DF=S|I|L
日付フォーマット:

operand1 が日付変数で、operand2 が英数字/Unicode フィールドのとき、この日付変数に対するパラメータとして、セッションパラメータ DF を指定できます。

構文 2 - MOVE SUBSTRING

MOVE  

operand1
SUBSTRING (operand1,operand3,operand4)

[(parameter)]
  TO

operand2
SUBSTRING(operand2,operand5,operand6)

 

この構文は、ソースオペランドまたはターゲットオペランドあるいはその両方のフィールドの内容(サブストリング)の一部だけを移動する場合にのみ該当します。それ以外の場合、構文 1 が適用されます。

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

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

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
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
MOVE SUBSTRING:

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

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

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

  • 英数字/Unicode(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 の基礎となるフィールドフォーマットが以下に該当する場合:

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

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

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

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

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

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

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

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

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

parameter
パラメータオプション:
構文 1」の「parameter」を参照してください。

構文 3 - MOVE BY NAME / POSITION

MOVE BY

[NAME]

operand1 TOoperand2
POSITION

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

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

構文要素の説明:

構文要素 説明
MOVE BY NAME operand1 TO operand2
MOVE BY NAME オプション:

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

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

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

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

配列を伴うMOVE BY NAME

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

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

MOVE BY POSITION operand1 TO operand2
MOVE BY POSITION オプション:

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

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

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

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

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

MOVE EDITEDoperand1 TOoperand2

(EM=value)

(EMU=value)

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

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

構文要素の説明:

構文要素 説明
MOVE EDITED
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 を参照してください。

EMU
Unicode 編集マスク:

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

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

MOVE EDITED operand1

(EM=value)

TOoperand2
(EMU=value)

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

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

構文要素の説明:

構文要素 説明
MOVE EDITED
MOVE EDITED オプション:

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

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

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

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

MOVE EDITED operand1 (EM=value) TO operand2

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

WRITE operand1 (EM=value)

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

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

EM
編集マスク:

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

EMU
Unicode 編集マスク:

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

構文 6 - MOVE LEFT/RIGHT JUSTIFIED

MOVE

LEFT

[JUSTIFIED] operand1 [(parameter)]TO operand2
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
MOVE LEFT / RIGHT JUSTIFIED オプション:

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

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

MOVE LEFT JUSTIFIED
MOVE LEFT オプション:

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

MOVE RIGHT JUSTIFIED
右詰めオプション:

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

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

parameter
Parameter:

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

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

  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 およびコードページのサポート』ドキュメントの「ステートメント」を参照してください。

構文図:

MOVENORMALIZED operand1TO operand2

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

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

構文要素の説明:

構文要素 説明
MOVE NORMALIZED
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
ソースオペランド:

operand1 には、変換する Unicode 文字列が入ります。

operand2
ターゲットオペランド:

operand2 は、変換された Unicode 文字列を受け取ります。

例:

一部のコードポイントは、異なる 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]
   [GIVING operand5]

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

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
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 つのコードページにエンコードされている文字列を、別のコードページの同等の文字列に変換します。

注意:
Natural では、Unicode 変換に International Components for Unicode(ICU)ライブラリが使用されます。詳細については、http://userguide.icu-project.org/ の『ICU User Guide』を参照してください。

operand1
ソースオペランド:

operand1 には、変換する文字列が入ります。

CODEPAGE operand2
ソースオペランドのコードページ:

operand2 として、operand1 のコードページを指定します。

operand1 の形式が A または B の場合にのみ指定できます。注 1 を参照してください。

TO operand3
ターゲットオペランド:

operand3 は、変換された文字列を受け取ります。

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

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

CODEPAGE operand4
ターゲットオペランドのコードページ:

operand4 として、operand3 のコードページを指定します。

operand3 の形式が A または B の場合にのみ指定できます。注 1 を参照してください。

GIVING operand5
GIVING 節:

この節を省略すると、エラーが発生した場合に Natural エラーメッセージが返されます。

キーワード GIVING を指定する場合、operand5 では Natural エラーメッセージの代わりに 0 または Natural エラーコードが返されます。

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

注意:

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

MOVE ENCODED の例:

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 は、値の切り捨てが行われたことを示すエラーコードを受け取ります。

構文 9 - MOVE ALL

MOVE ALL ステートメントを使用すると、全ターゲットフィールドがいっぱいになるか、UNTIL 値(operand7)に達するまで、operand1 の内容を operand2 に繰り返し移動できます。

SUBSTRINGを使用すると、ソースフィールドとターゲットフィールドのセグメントのみに MOVE ALL 操作を制限できます。

構文図:

MOVE ALL

operand1
SUBSTRING (operand1,operand3,operand4)

  TO

operand2
SUBSTRING (operand2,operand5,operand6)

  [UNTILoperand7]    

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

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand1 C S A     A U N1       B             ×
operand2   S A     A U         B            
operand3 C S           N P I   B2             ×
operand4 C S           N P I   B2             ×
operand5 C S           N P I   B2             ×
operand6 C S           N P I   B2             ×
operand7 C S           N P I                 ×

1 operand1 の数値形式(N)は、SUBSTRING 節なしで使用されている場合にのみ許可されます。

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

構文要素の説明:

構文要素 説明
operand1
ソースオペランド:

ソースオペランドには転送する値が含まれています。

リーディングゼロを含む数値オペランドのすべての桁が転送されます。

TO operand2
ターゲットオペランド:

ターゲットオペランドは、MOVE ALL 処理の前にリセットされません。このことは UNTIL オプションを使用するときに特に重要です。operand2 にあらかじめ存在していたデータは、MOVE ALL 処理で明確に上書きしないと、そのまま残されるからです。

UNTIL operand7
UNTIL オプション:

UNTIL オプションは operand2 に対する桁数を指定することにより MOVE ALL 処理を制限するために使用します。operand3 には桁数を指定します。MOVE ALL 処理はこの値に達したときに終了します。

operand7operand2 の長さより大きい場合、MOVE ALL 処理は operand2 がいっぱいになったときに終了します。

UNTIL オプションを使用して、ダイナミック変数に初期値を割り当てることもできます。operand2 がダイナミック変数のとき、MOVE ALL 操作後のダイナミック変数の長さは、operand7 の値に対応します。ダイナミック変数の現在の長さは、システム変数 *LENGTH を使用して確認できます。

ダイナミック変数については、「ダイナミック変数の使用」を参照してください。

注意:
UNTIL オプションは、SUBSTRING 節がターゲットオペランドに使用されている場合は使用できません。

SUBSTRING
SUBSTRING 節:

SUBSTRING 節を使用すると、MOVE ALL ステートメントでソースまたはターゲット変数の固定セグメントを選択できます。SUBSTRING 節を指定しない場合、ソースまたはターゲット変数の内容全体が処理されます。

operand3 および operand4 に、ソース値として使用される operand1 セグメントの開始位置と長さを記述します。operand5 および operand6 に、この操作で入力される operand2 セグメントの開始位置と長さを記述します。開始位置(operand3 または operand5)が省略されている場合は、デフォルトで位置 1 になります。サブストリングの長さ(operand4 または operand6)を省略すると、フィールドの残りの長さとなります。

SUBSTRING がソースフィールドに使用されている場合、開始値と長さ(operand3 および operand4)は、完全に operand1 内部にあるデータセグメントを記述する必要があります。

SUBSTRING がターゲットフィールドに使用されている場合は、以下のルールが適用されます。

  • operand2 が固定長変数の場合、開始値と長さ(operand5 および operand6)で記述される範囲は、完全にフィールドの範囲内に存在する必要があります。

  • operand2 がダイナミック長変数の場合、開始値(operand5)は、現在のフィールド長(*LENGTH + 1)の内側または直後を参照できます。SUBSTRING 範囲の末尾が割り当てられたフィールドデータ内にある場合、操作は固定長フィールドと同じ方法で処理されます。SUBSTRING の末尾が現在のフィールドサイズを超えると、ダイナミック変数はこの範囲まで拡張されます。

次の「SUBSTRING 節の使用例」も参照してください。

SUBSTRING 節の使用例

DEFINE DATA LOCAL
1 ALFA (A10) INIT <'AAAAAAAAAA'>
1 DYN (A) DYNAMIC INIT <'1234567890'>
1 #VAL (A4) INIT <'1234'>
END-DEFINE
ステートメント
Result
処理前
処理後
MOVE ALL SUBSTRING (#VAL,1,2) TO ALFA AAAAAAAAAA 1212121212
MOVE ALL '123' TO SUBSTRING (ALFA,3,5) AAAAAAAAAA AA12312AAA
MOVE ALL 'x' TO SUBSTRING (DYN,7,3) 1234567890 (*LENGTH=10) 123456xxx0 (*LENGTH=10)
MOVE ALL 'xyz' TO SUBSTRING (DYN,7,6) 1234567890 (*LENGTH=10) 123456xyzxyz (*LENGTH=12)
MOVE ALL 'xyz' TO SUBSTRING (DYN,11,4) 1234567890 (*LENGTH=10) 1234567890xyzx (*LENGTH=14)

例 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 は影響を受けません。

例 5 - MOVE ALL

** Example 'MOAEX1': MOVE ALL                                           
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 PERSONNEL-ID                                                        
  2 FIRST-NAME                                                          
  2 NAME                                                                
  2 CITY                                                                
1 VEH-VIEW VIEW OF VEHICLES                                             
  2 PERSONNEL-ID                                                        
  2 MAKE                                                                
END-DEFINE                                                              
*                                                                       
LIMIT 4                                                                 
RD. READ EMPLOY-VIEW BY NAME                                            
  SUSPEND IDENTICAL SUPPRESS                                            
  /*                                                                    
  FD. FIND VEH-VIEW WITH PERSONNEL-ID = PERSONNEL-ID (RD.)              
    IF NO RECORDS FOUND                                                  
      MOVE ALL '*' TO FIRST-NAME (RD.)        
      MOVE ALL '*' TO CITY (RD.)              
      MOVE ALL '*' TO MAKE (FD.)              
    END-NOREC                                 
    /*                                        
    DISPLAY NOTITLE (ES=OFF IS=ON ZP=ON AL=15)
            NAME (RD.) FIRST-NAME (RD.)       
            CITY (RD.)                        
            MAKE (FD.) (IS=OFF)               
    /*                                        
  END-FIND                                    
END-READ                                      
END

プログラム MOAEX1 の出力:

     NAME         FIRST-NAME         CITY            MAKE      
--------------- --------------- --------------- ---------------
                                                               
ABELLAN         *************** *************** ***************
ACHIESON        ROBERT          DERBY           FORD           
ADAM            *************** *************** ***************
ADKINSON        JEFF            BROOKLYN        GENERAL MOTORS