zenet_logo

-株式会社ゼネット技術ブログ-

【SAP】ABAPの基本的な命令について紹介します


はじめに

前回は、SAPにおける開発言語である「ABAP」について解説する記事を書かせていただきました。
media.zenet-web.co.jp

今回はそのABAPにおける基本的な命令について、紹介していきます。
SAPやABAPに興味を持つ人の一助となりましたら幸いです。

ABAPの基本的な命令

イベントブロック

このセクションではイベントブロックとは何か、また各イベントブロックでどのような処理がされるかを紹介いたします。

イベントブロックとは

イベントブロックとは、プログラム実行時に処理されるイベントキーワードごとのまとまりを指します。
そのイベントキーワード内の処理が終了したら次のイベントキーワード内の処理を行います。

例:

INITIALIZATION. "イベントキーワード
[処理A]

AT SELECTION-SCREEN. "イベントキーワード
[処理B]

START-OF-SELECTION. "イベントキーワード
[処理C]

あるイベントキーワードの直後からその次のイベントキーワードの直前までがイベントブロックとなります。
処理Aがすべて終了した後に処理Bが実行されます。処理Cについても同様です。

イベントブロックの種類

イベントブロックの中でも、使用頻度の多いイベントブロックを紹介します。

・INITIALIZATION
プログラム実行時に一度だけ実行されるイベントブロックになります。
選択画面、メイン処理が実行される前に処理が行われます。
そのため、選択画面の入力項目に初期値を設定するなどの処理を行なったりします。

・AT SELECTION-SCREEN
選択画面で実行ボタン、Enterキー押下時に実行されるイベントブロックになります。
選択画面で入力した値のチェックなどの処理を行います。

・START-OF-SELECTION
メイン処理を行うイベントブロックになります。
データの登録、更新、取得、帳票出力などの処理を行います。

他に一覧画面のヘッダの部分の処理を行う「TOP-OF-PAGE」、フッターの部分の処理を行う「END-OF-PAGE」などもありますが、今回は実際にプログラム作成を行なった中でもっとも使用頻度が多かった3つを紹介させていただきました。

定義・宣言命令

このセクションではABAPにおける変数の宣言と、その変数のデータ型等の定義を行うために使用される命令を紹介します。

TYPES命令

ABAPでは、後述する変数宣言の際に使用する基本データ型や構造、テーブルデータ型等をプログラム中で定義することができます。その際に使用される命令が「TYPES命令」です。


<基本データ型の定義>
TYPESキーワードに続けて、事前定義のABAPデータ型やABAPディクショナリに登録されているデータ型を指定します。

・構文

TYPES <データ型名> TYPE <データ型>.

・例文

TYPES: TYP_BNAME  TYPE XUBNAME,               "ユーザ名
       TYP_TEXT10 TYPE C LENGTH 10,           "文字型(10文字)
       TYP_NUMBER TYPE P LENGTH 4 DECIMALS 2. "数字型(4バイト、小数点以下2桁)

<構造の定義>
・構文

TYPES: BEGIN OF <構造名>,
         <項目名1> TYPE <データ型>,
         <項目名2> TYPE <データ型>,
       END OF <構造名>.

・例文

TYPES: BEGIN OF TYP_ST_USR02,
         BNAME TYPE USR02-BNAME, "ユーザ名
         GLTGV TYPE USR02-GLTGV, "有効開始日
         GLTGB TYPE USR02-GLTGB, "有効終了日
       END OF TYP_ST_USR02.

<テーブルデータ型の定義>
・構文

TYPES <テーブルデータ型名> TYPE <テーブル種類> OF <データ型>.

・例文

TYPES TYP_IT_USR02 TYPE STANDARD TABLE OF TYP_ST_USR02.

・テーブル種類
テーブル種類には次の5つが存在します。

  • STANDARD TABLE
  • SORTED TABLE
  • HASHED TABLE
  • ANY TABLE
  • INDEX TABLE
DATA命令

ABAPでは「DATA命令」を使用して変数宣言することで、任意のデータ型の変数を作成することができます。

・構文

DATA <変数名> TYPE <データ型>

・例文

DATA: ZBNAME     TYPE XUBNAME VALUE 'USER01',         "ユーザ名(VALUEキーワードで初期値を設定)
      ZTEXT10    TYPE C LENGTH 10,                    "文字型(10文字)
      ZNUMBER    TYPE P LENGTH 4 DECIMALS 2,          "数字型(4バイト、小数点以下2桁)
      ZST_USR02  TYPE TYP_ST_USR02,                   "TYPES命令で定義した構造の変数を作成
      ZIT_USR02A TYPE STANDARD TABLE OF TYP_ST_USR02, "TYPES命令で定義した構造から内部テーブルを作成
      ZIT_USR02B TYPE TYP_IT_USR02.                   "TYPES命令で定義したテーブルデータ型から内部テーブルを作成

テーブルからのデータの読み込み命令

このセクションではテーブル内のデータを読み込むために使用される命令を紹介します。

READ TABLE命令

ABAPにおける「READ TABLE命令」は、内部テーブルから特定のレコードを読み取るために使用する命令です。

<オプションの一例>
・INTO <作業領域>
 読み取ったレコードを指定した格納先に格納できます。
 作業領域に格納する場合、対象の内部テーブルと同じ構造を持つ作業領域を格納先に指定する必要があります。

・TRANSPORTING <項目名> INTO <変数>
読み取ったレコードのうち、指定した項目のみを指定した変数に格納します。

・TRANSPORTING NO FIELDS
 レコードをどこにも格納しない場合に利用します。
 存在チェックなど、後続処理で読み取ったレコードを使用しない場合に使用します。

・WITH KEY <項目名> = <指定の値>
 内部テーブルから指定した条件を持つレコードを取得します。
 条件を満たすレコードが複数ある場合、インデックス番号が小さいレコード(内部テーブルの上にあるレコード)が取得されます。

・INDEX
 指定したインデックスの行からレコードを取得します。
 内部テーブルのインデックス行より大きい値を指定するとエラーとなるため、事前に内部テーブルのレコード数を取得して指定するなどの対応が必要です。

・BINARY SERCH
 内部テーブルをバイナリ検索(二分探索)します。
 内部テーブルのレコード件数が膨大な場合、通常検索よりもパフォーマンス面で優位となりますが、事前に対象の内部テーブルをソートしておく必要があります。

<使用例>

READ TABLE it_example WITH KEY exkey1 = 'example'
INTO wk_example

→内部テーブル「it_example」から項目「exkey1」の値が'example'の
 レコードを読み込み、作業領域「wk_example」に格納します。

繰り返し処理を行う命令

このセクションでは、繰り返し処理を行う際に使用される命令を紹介します。

DO命令

DO命令は、終了命令(EXIT)が読み込まれるまでの間、または指定した実行回数分「DO.」~「ENDDO.」の中に書かれた処理を繰り返し実行する命令です。
実行回数の指定は省略することができます。その場合は終了命令(EXIT)が読み込まれるまでの間、「DO.」~「ENDDO.」間に書かれた処理を繰り返し実行します。

例:1から15までの数を列挙する処理
実行回数の指定なしの場合:

DATA NUM TYPE I.
NUM = 1.
DO.
	WRITE / NUM.
	NUM = NUM + 1.
	IF NUM >= 15.
		EXIT.
	ENDIF.
ENDDO.

実行回数の指定ありの場合:

DATA NUM TYPE I.
NUM = 1.
DO 15 TIMES.
	WRITE / NUM.
	NUM = NUM + 1.
ENDDO.
WHILE命令

WHILE命令は、指定した条件が偽となるまでの間「WHILE.」~「ENDWHILE.」の中に書かれた処理を繰り返し実行する命令です。

例:1から15までの数を列挙する処理

DATA NUM TYPE I.
NUM = 1.
WHILE NUM <=15.
	WRITE / NUM.
	NUM = NUM + 1.
ENDWHILE.
LOOP命令

LOOP命令は、内部テーブル内のすべてのレコードに対して「LOOP.」~「ENDLOOP.」の中の処理を実行する命令です。

例:内部テーブルに格納されているすべての内容を列挙する処理

LOOP AT (内部テーブル) INTO (構造).
	WRITE: / (構造)-(項目A), (構造)-(項目B), (構造)-(項目C).
ENDLOOP.
無限ループ

繰り返し処理が終了せずに無限に繰り返される状態のことを「無限ループ」といいます。
発生するとサーバに負荷がかかり、サーバ全体の処理速度が極端に遅くなるため、影響が広範におよぶことになります。
無限ループが発生する例:

  • 繰り返し回数を指定しないDO命令において繰り返す処理内にEXIT命令がない場合
  • 繰り返し回数を指定しないDO命令において繰り返す処理がEXIT命令にたどり着くことができない場合
  • WHILE命令において指定した条件が常に真のままとなる場合

繰り返し処理を強制終了させる命令

このセクションでは、前述の繰り返し処理を中断する際に使用される命令を紹介します。

CONTINUE命令

CONTINUE命令は、DO命令やWHILE命令、LOOP命令といった繰り返し処理を実行する命令において、それ以降の繰り返し処理をスキップして次の繰り返し処理をはじめから実行させる命令です。
次の例では処理A、処理Bは必ず実行されますが、処理CはIFの条件を満たす場合CONTINUE命令によってスキップされて実行されないことがあります。

例:

DO.
	【処理A】
	【処理B】
	IF (条件).
		CONTINUE.
	ENDIF.
【処理C】
ENDDO.
CHECK命令

この命令はループ中の現在のレコードの処理を条件付きで終了させ次のレコードの処理を開始させます。
条件には論理式を用いることができます。
条件に当てはまる場合、CHECK命令の後ろに他の命令文が存在していてもその命令は処理されません。

例:

LOOP itab_b INTO wk_b.
	CHECK wk_b-number < 3.
	WRITE wk_b-number.   "wk_b-numberが3未満の場合処理されない
ENDLOOP.
EXIT命令

この命令はループの次のレコードが存在していても即座に無条件で現在のループ処理そのものを終了させます。
ループ内で別にループ処理を行っている場合、現在のループ処理を終了させます。
例:

LOOP itab_c INTO wk_c.
	cnt_number = cnt_number + wk_c-number.
	IF cnt_number >= 3.
		EXIT.
	ENDIF.
	WRITE wk_c-number.   "cnt_numberが3以上になるとループが終了するので処理されない
ENDLOOP.

終わりに

今回はABAPにおける基本的な命令について紹介させていただきました。
この記事が皆様の一助となりましたら幸いです。

「そもそもSAPとは?」という方は以下の記事をご覧ください。
media.zenet-web.co.jp