【ABAP】内部テーブル/構造/変数(概要)

概要

内部テーブル/構造/変数について必要最低限に抑えたコーディングと図を使って解説します。
要点を絞り仕組みを理解する事に特化した内容となっています。
この仕組みを理解する事で内部テーブルの使い方がイメージしやすくなり、細かい説明になっても話が入りやすくなるかと思います。

ABAP言語を学習する上で1つの大きな山かと思います。私や同士も特に内部テーブルの仕組みや使い方を理解するのに苦戦していました。
以下の解説で定義の仕方から使い方を説明します。

解説

サンプルコーディングを分解して説明していきます。
流れは以下の通りとなります。内部テーブルに値を格納する場合は1行ずつ挿入していくので3から5の動作を繰返す事で複数行格納していきます。1から5の動作について詳しく解説します。
コーディングの全体はこの記事の最後である「サンプルコーディング」をご確認ください。

  1. 変数に値を格納
  2. 構造(作業領域/ワークエリア)と内部テーブルの定義
  3. 構造(作業領域/ワークエリア)に変数(値)を格納
  4. 内部テーブルに値を格納
  5. 構造(作業領域/ワークエリア)の値を空にする

変数に値を格納

ここでは変数に関する説明となります。変数の定義を行い、値を変数に格納します。
図1のコーディング「1.変数の定義」で変数の箱(値を格納する箱)を作っています。
コーディング「1.変数に値を格納」より先ほど作った箱に値を格納しています。

図1.変数に値を格納

変数についての詳しい内容は以下記事をご確認ください。

構造(作業領域/ワークエリア)と内部テーブルの定義

構造化データ型(TYPES命令)を定義します。その後、定義した構造化データ型を使用して構造(作業領域/ワークエリア)と内部テーブルを定義します。

図2のコーディング「2.構造化データ型」にて型を定義しています。図2の右側の構造がイメージとなります。型を定義しているだけで値は格納できないため、縦線のみの仕切りとして表現しています。
コーディング「2.構造(作業領域/ワークエリア)」にて構造(作業領域/ワークエリア)の箱(値を格納する箱)を作っています。
コーディング「2.内部テーブル」にて内部テーブルの箱(値を格納する箱)を作っています。

図2.構造(作業領域/ワークエリア)と内部テーブルの定義

どちらも構造化データ型を使用して定義しており、構造(作業領域/ワークエリア)の場合はTYPEで定義し、内部テーブルはTYPE STANDARD TABLE OFで定義しています。

同じ型で定義している理由は内部テーブルに値を格納するためです。
構造(作業領域/ワークエリア)の役割として作業領域の名前からイメージしやすく、内部テーブルに値を格納する(作業)ために作られる領域となります。
そのため内部テーブルに値を格納するには型が一致していないと値を格納する事ができないので、同じ型で定義しています。

詳しい内容は以下記事をご確認ください。

構造(作業領域/ワークエリア)に変数(値)を格納

構造(作業領域/ワークエリア)の各項目に変数(値)を格納します。
変数を経由しなくても直接値を格納しても良いです。
※以後、構造(作業領域/ワークエリア)を作業領域として記載しています。

図3のコーディング「3.作業領域に変数(値)を格納」にて作業領域に変数(値)を格納しています。
イメージでは変数となっていますが直接値を格納することも可能です。

画像に alt 属性が指定されていません。ファイル名: c8856789ec11ab8b1013037cef6929f9.png
図3.構造(作業領域/ワークエリア)に変数(値)を格納

内部テーブルに値を格納

内部テーブルに値を格納します。格納する際は作業領域により行を追加する形で格納します。

図4のコーディング「4.内部テーブルに値を格納」にてAPPEND命令を使用して作業領域に保持した値を内部テーブルに格納します。イメージとしては図の通りとなりますが内部テーブルの最終行に追加されます。


図4.内部テーブルに値を格納

構造(作業領域/ワークエリア)の値を空にする

作業領域の値を空にします。
図5のコーディング「5.作業領域の値を空にする」にて作業領域の値を全て空にします。
イメージは図の通りとなります。
空にした後でまたコーディング「3.作業領域に変数(値)を格納」を行うといった3~5の流れを繰り返して内部テーブルに値を格納していきます。

図5.領域構造(作業領域/ワークエリア)の値を空にする

作業領域を空にする理由ととしては上記説明した図5と以下の図6を比較すると分かりやすいです。
図6を例にすると、CLEAR命令を使用せずに作業領域の編集を行ったとします。
図6を見ると分かりますが項目「国コード」は編集していないため初期値(空)のままである事を想定しています。
しかし、1行目の値がそのまま残っているため、想定と異なる’JP’という値が格納されています。

作業領域の全項目を常に編集していれば上書きされるため問題ないですが、この様に全項目ではなく一部項目のみを編集する場合は編集していない項目に誤った値が格納されるバグが発生します。
そのため作業領域を編集し、内部テーブルに格納した後、次のレコードの編集に入る前に作業領域を空にします。
上記バグをクリア漏れとよく言われ、単体テストとかでよく検知します。

図6.クリア漏れ

サンプルコーディング

今回解説で使用したコーディングは以下の通りです。
サンプルコーディングを使用して値を変えたり、複数行追加してみたりして動かしてみてください。
理解が深まると思います。

*2.構造化データ型
TYPES:
  BEGIN OF TA_COMPANY,
    BUKRS TYPE BUKRS,  "会社コード
    BUTXT TYPE BUTXT,  "会社名称
    LAND1 TYPE LAND1,  "国コード
  END OF TA_COMPANY.

*2.構造(作業領域/ワークエリア)
DATA:
  WA_COMPANY TYPE TA_COMPANY.

*2.内部テーブル
DATA:
  IT_COMPANY  TYPE STANDARD TABLE OF TA_COMPANY.

*1.変数の定義
DATA:
  WK_BUKRS TYPE BUKRS,  "会社コード
  WK_BUTXT TYPE BUTXT,  "会社名称
  WK_LAND1 TYPE LAND1.  "国コード

*1.変数に値を格納
WK_BUKRS = '0005'.
WK_BUTXT = 'OKNO会社'.
WK_LAND1 = 'JP'.

*3.作業領域に変数(値)を格納
WA_COMPANY-BUKRS = WK_BUKRS.  "会社コード
WA_COMPANY-BUTXT = WK_BUTXT.  "会社名称
WA_COMPANY-LAND1 = WK_LAND1.  "国コード

*4.内部テーブルに値を格納
APPEND WA_COMPANY TO IT_COMPANY.
*5.作業領域の値を空にする
CLEAR WA_COMPANY.

*3.作業領域に値を格納
WA_COMPANY-BUKRS = '0015'.        "会社コード
WA_COMPANY-BUTXT = 'OKNO子会社'.  "会社名称

APPEND WA_COMPANY TO IT_COMPANY.
CLEAR WA_COMPANY.

*内部テーブルに格納された値を出力
WRITE:
  /'会社コード' ,12'会社名称' ,38 '国コード'.
LOOP AT IT_COMPANY INTO WA_COMPANY.
  WRITE:
    / WA_COMPANY-BUKRS ,12 WA_COMPANY-BUTXT ,38 WA_COMPANY-LAND1.
  CLEAR WA_COMPANY.
ENDLOOP.

実行結果は以下の通りです。