!--a11y-->

次の構文で非数値基本 ABAP タイプまたは内部テーブルを含まない構造が発生する命令の文字列セクションをアドレスすることができます。
<f>[+<o>][(<l>)]
項目名 <f> の直後にオフセット+<o> および長さ (<l>) を指定して、ポジション <o>+1 から長さ<l> までの部分を、独立したデータオブジェクトのようにアドレスすることが可能です。文字列セクションのデータ型および長さは、次のとおりです。
|
オリジナル項目 |
セクション |
|
|
データ型 |
データ型 |
長さ |
|
C |
C |
<l> |
|
D |
N |
<l> |
|
N |
N |
<l> |
|
T |
N |
<l> |
|
X |
X |
<l> |
|
構造 |
C |
<l> |
長さ <l> を指定しない場合は、<o> から最後までのセクションがアドレスされます。指定したオフセットと長さの組み合わせが、無効な項目セクションになる場合 ( たとえば、元の項目より長くなる場合) 、構文エラーまたは実行時エラーが発生します。オフセットや長さを指定して、リテラルまたはテキストシンボルをアドレスすることはできません。
構造のコンポーネントをアドレスする場合は、特に注意が必要です。データ型が I と F のコンポーネントをプラットフォームに合わせて正しく整列させるために、フィラー項目が含まれる場合があります。フィラー項目の長さも考慮して、正しいオフセットを計算してください。さらに文字型の内部表記は、ユニコードに変換される予定です。ユニコードでは、1 つの文字が従来のように 1 バイトではなく、2 バイトか 4 バイトで構成されます。オフセットと長さの指定は、文字項目 ( データ型 C 、D 、N 、T) および 16 進項目 ( データ型 X) に対して有効ですが、数値、文字、16 進項目が混ざった構造では、変更を変換できない場合があります。したがって、構造コンポーネントをアドレスするときは、オフセットおよび長さを指定 しないことをお奨めします。
原則として、オフセット <o> および長さ<l> は符号なしの数字リテラルで指定します。以下の場合には、動的な指定が可能です。
キ MOVE または代入演算子を使用して値を割り当てる場合
キ WRITE TO を使用して値を割り当てる場合
キ ASSIGN を使用してフィールドシンボルを割り当てる場合
キ PERFORM 命令で実パラメータをサブルーチンに渡す場合

DATA TIME TYPE T VALUE '172545'.
WRITE TIME.
WRITE / TIME+2(2).
CLEAR TIME+2(4).
WRITE / TIME.
出力は、次のように表示されます。
172545
25
170000
まず、WRITE 命令でオフセットを指定して、分を選択します。次に、clear 命令でオフセットを指定して、分と秒を初期値に設定します。
MOVE 命令でオフセットおよび長さを指定する構文は、次のとおりです。
MOVE <f1>[+<o1>][(<l1>)] TO <f2>[+<o2>][(<l2>)].
代入演算子を使用する場合は、次のようになります。
<f2>[+<o2>][(<l2>)] = <f1>[+<o1>][(<l1>)].
項目 <f1> の ポジション<o1>+1 から長さ <l1> までの部分の内容が、項目 <f2> に割り当てられます。これにより、項目 <f2> のポジション <o2>+1 から長さ <l2> までのセクションが上書きされます。
MOVE 命令では、すべてのオフセットおよび長さを変数で指定することができます。これは、MOVE 命令として記述されている限り、代入演算子を使用している場合でも同じです。代入演算子の後に項目名が指定されていない命令 ( たとえば、数値演算) では、オフセットおよび長さの指定には必ず符号なし数字リテラルを使用してください。
オフセットおよび長さが指定された値は、非数値項目間だけで割り当てることをお奨めします。数値項目では、結果が意味をなさないことがあります。

DATA:
F1(8) VALUE 'ABCDEFGH',
F2(20) VALUE
'12345678901234567890'.
F2+6(5) = F1+3(5).


DATA:
F1(8) VALUE 'ABCDEFGH',
F2(8).
DATA: O TYPE I VALUE 2,
L TYPE I
VALUE 4.
MOVE F1 TO
F2. WRITE F2.
MOVE F1+O(L) TO
F2. WRITE / F2.
MOVE F1 TO F2+O(L).WRITE /
F2.
CLEAR
F2.
MOVE F1 TO F2+O(L).WRITE /
F2.
MOVE F1+O(L) TO F2+O(L).WRITE / F2.
これにより、出力は以下のようになります。
ABCDEFGH
CDEF
CDABCD
ABCD
CDEF
まず、F1 の内容が F2 にオフセット指定なしで割り当てられます。次に、オフセットおよび長さ指定がある F1 が同じように処理されます。次の 3 つの MOVE 命令により、オフセット 2 で F2 の内容が上書きされます。ソースデータ型 C の変換ルールに従い、右にスペースを空けるかたちで F2 にデータが書き込まれることに注意してください。
WRITE TO 命令でオフセットおよび長さを指定する構文は、次のとおりです。
WRITE <f1>[+<o1>][(<l1>)] TO <f2>[+<o2>][(<l2>)].
項目 <f1> の ポジション<o1>+1 から長さ <l1> までの部分の内容が文字項目に変換され、項目 <f2> に割り当てられます。これにより、項目 <f2> のポジション <o2>+1 から長さ <l2> までのセクションが上書きされます。
WRITE TO 命令では、対象項目のオフセットおよび長さを変数で指定することができます。対象項目のオフセットおよび長さは、符号なしの数字リテラルで指定します。

DATA: STRING(20),
NUMBER(8) TYPE C VALUE '123456',
OFFSET
TYPE I VALUE 8,
LENGTH
TYPE I VALUE 12.
WRITE NUMBER(6) TO STRING+OFFSET(LENGTH)
LEFT-JUSTIFIED.
WRITE: / STRING.
CLEAR STRING.
WRITE NUMBER(6) TO STRING+OFFSET(LENGTH)
CENTERED.
WRITE: / STRING.
CLEAR STRING.
WRITE NUMBER TO STRING+OFFSET(LENGTH)
RIGHT-JUSTIFIED.
WRITE: / STRING.
CLEAR STRING.
これにより、出力は以下のようになります。
123456
123456
123456
項目 NUMBER の最初の 6 文字は、左寄せ、中央揃え、右寄せで、項目 STRING の最後の 12 文字に書き込まれます。
