ABAP

【ABAP】オフセットーデータ読込・書込

本ページでは、ABAPのオフセット(Offset)について解説しています。

オフセットってなんだ・・・・?

という方のために、オフセット(※ITの一般用語として使われます。ABAP限定ワードではありません。)とは何かも解説していますので、是非ご覧ください。

DATA命令の知識が必要になりますので、前提として以下のページをご一読ください。

オフセットとは?

オフセットとは、ざっくり説明するとデータの位置長さを表したものです。つまり、データの「どこから」「どれぐらいの長さ」を一度に表現するのが、オフセットです。

言葉で説明すると難しく感じてしまいますが、実際のイメージ図で考えると簡単に理解できます。

例として、「あいうえお!」という文字列データを考えてみましょう。

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

この場合、オフセットでは「2(3)」というように表します。

オフセットでは最初の文字を0として数えます

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にだけ関わる概念ではありませんので、他言語を学ぶ際にも役立ちますので是非覚えておいてください。