本ページでは、ABAPのオフセット(Offset)について解説しています。
オフセットってなんだ・・・・?
という方のために、オフセット(※ITの一般用語として使われます。ABAP限定ワードではありません。)とは何かも解説していますので、是非ご覧ください。
DATA命令の知識が必要になりますので、前提として以下のページをご一読ください。
オフセットとは?
オフセットとは、ざっくり説明するとデータの位置と長さを表したものです。つまり、データの「どこから」「どれぐらいの長さ」を一度に表現するのが、オフセットです。
言葉で説明すると難しく感じてしまいますが、実際のイメージ図で考えると簡単に理解できます。
例として、「あいうえお!」という文字列データを考えてみましょう。

実際のオフセットの利用例として「文字列からある特定の部分を切り取って利用したい!」みたいな場合を想像してみます。例えば、「あいうえお」から、「うえお」というデータを切り取ります。
この場合、オフセットでは「2(3)」というように表します。

「2(3)」というのは、「どこから」の位置情報と「どれぐらいの長さ」というデータ長情報を一度に表現した形です。

上記オフセットは、「あいうえお!」の3文字目(※0番目から3つ移動)から3文字分の長さを指定しているという意味になります。
「オフセット」の最初の数字は、0番目になる点に注意が必要です。
文字列の操作や、日付処理など結構多くのシーンで利用することができるので、しばしばソースコードの中で見かけることになるでしょう。
オフセットのイメージを理解したところで、ABAPでの用いかたを確認してみましょう。
ABAPでのオフセット利用方法
オフセットの利用方法について、構文ルールをサンプルコードを用いて解説します。
構文ルール:オフセット
変数名+2(4)
変数名の直後に「どこから」「どれぐらいの長さ」かを指定します。先ほど解説したものと同一の書き方です。上記では、指定した変数名の2文字目から4文字分を指定していることになります。
例えば、変数名に「123456789」が格納されている場合、「3456」が切り取られます。
サンプルコード:オフセット
下記のサンプルコードは、オフセットを利用した構文です。
DATA:
W_YEAR(4) TYPE N VALUE 2020,
W_MONTH(2) TYPE N VALUE 07,
W_DAY(2) TYPE N VALUE 24,
W_CLD TYPE D.
W_CLD+0(4) = W_YEAR.
W_CLD+4(2) = W_MONTH.
W_CLD+6(2) = W_DAY.
※上記サンプルコードで用いられているVALUEオプションについては、こちらの記事をご覧ください。
さて、このサンプルコードを実行した後に、W_CLDに格納されている値は何になるでしょうか?順を追って考えてみましょう。
難しいコードではありません。落ちついて呼んでいけば分かります。※ヒントは「東京オリンピック」です。
サンプルコードの解説:オフセット
このコードの1行目から4行目は「変数」の定義ですね。「W_YEAR」「W_MONTH」「W_DAY」の変数に、それぞれに対応する初期値がセットされている状況です。
※ここが分からない方は、DATA命令のページをご覧ください。
今回のツボは後半3行にあります。6行目「W_CLD+0(4)」は、W_CLDの0文字目(※つまり1番最初)から4文字分の長さということを表しています。
そこが「=」で結ばれているため、指定された4文字の空間に「W_YEAR」を格納するという処理を実現しています。
同様に考えていくと、「W_CLD+4(2)」は、W_CLDの5文字目から2文字分を、「W_CLD+6(2)」はW_CLDの7文字目から2文字分を指定していることが分かります。
答えは「20200724」東京オリンピックの開会式です。ちなみに、上記の逆パターンで
W_YEAR = W_CLD+0(4) .
オフセットで指定した値を逆に格納することもできます。オフセットは、ABAPにだけ関わる概念ではありませんので、他言語を学ぶ際にも役立ちますので是非覚えておいてください。