【ABAP】構造(ワークエリア/作業領域)

概要

構造(ワークエリア/作業領域)は1行に3列や20列など1行複数列の仕切りを持った箱となります。
内部テーブルに値を格納したり、取出したりする場合に使用する事が多いです。
変数でも同様に構造(ワークエリア/作業領域)に値を格納したり取出したりすることもできます。

イメージする事が難しいと思いますので以下図を参考にしてください。
内部テーブルであれば1行の値を格納したり取出したりすることができます。
変数であれば1列(1項目)の値を格納したり取出したりすることができます。
図から分かりますが内部テーブルの値を変数に直接格納したり取出したりすることは基本できません。内部テーブルは複数の行列で出来ているためどこに値を格納するのか取出すのか特定できないため構造を経由して格納したり取出したりします。

命令文

構造(ワークエリア/作業領域)の定義については様々ありますが3種類紹介します。

命令文1はTYPES BEGIN OFで定義する方法で一般的な定義方法となります。

命令文2はディクショナリテーブルで定義する方法でこちらも使用される場合があります。
ABAPディクショナリ(標準/アドオンテーブル)だと内部テーブルと勘違いしやすいですが内部テーブルの場合はTYPEの後にTABLE OFが必要となります。後、ABAPディクショナリの構造も可です。

命令文3はDATA BEGIN OFで定義する方法ですがこちらは基本的に使われないです。
構造(ワークエリア/作業領域)を直接定義することとなり、再利用が出来ない事が主な理由です。

命令文1

TYPES:
BEGIN OF 構造化データ型,
項目 TYPE データ型,
項目 TYPE データ型,

END OF 構造化データ型.

DATA:
  構造(作業領域またはワークエリア) TYPE 構造化データ型,

命令文2

DATA:
  構造(作業領域またはワークエリア) TYPE ABAPディクショナリテーブル.

命令文3

DATA:
BEGIN OF 構造(作業領域またはワークエリア),
項目 TYPE データ型,
項目 TYPE データ型,

END OF 構造(作業領域またはワークエリア).

特徴

概要で説明した内容の通りですが特徴は以下となります。
コーディングをする上で当たり前のように使われるので特徴だけでも理解すると良いです。

  • 1行複数列を持つ箱が構造である
  • 内部テーブルの操作(格納/取出など)に使用されることが多い

コーディング

説明したすべての命令文をサンプルとして以下コーディングしています。
構造(ワークエリア/作業領域)の定義の仕方だけ異なり、値を格納して出力する使い方は同じとなります。
内部テーブルについては以下の記事で解説していますので参考にしてください。

*-----------------------------------------------------------------------*
* 型定義
*-----------------------------------------------------------------------*
TYPES:
  BEGIN OF TA_COMPANY,
    BUKRS TYPE BUKRS,  "会社コード
    BUTXT TYPE BUTXT,  "会社名称
    LAND1 TYPE LAND1,  "国コード
  END OF TA_COMPANY.

*-----------------------------------------------------------------------*
* 構造(ワークエリア/作業領域)定義
*-----------------------------------------------------------------------*
DATA:
  WA_COMPANY TYPE TA_COMPANY,
  WA_VBAK    TYPE VBAK.

DATA:
  BEGIN OF WA_BANK,
    BANKS TYPE BANKS,  "銀行国コード
    BANKL TYPE BANKL,  "銀行コード
    BANKA TYPE BANKA,  "銀行名
  END OF WA_BANK.

*************************************************************************
*START-OF-SELECTION.
*************************************************************************
WA_COMPANY-BUKRS = '0001'.
WA_COMPANY-BUTXT = '会社名'.
WA_COMPANY-LAND1 = 'JP'.

WA_VBAK-VBELN = '1000000001'.
WA_VBAK-ERDAT = '20210321'.
WA_VBAK-ERZET = '093045'.

WA_BANK-BANKS = 'JP'.
WA_BANK-BANKL = '0820134'.
WA_BANK-BANKA = '銀行名'.

*************************************************************************
*END-OF-SELECTION.
*************************************************************************
WRITE:
  /'TYPES BEGIN OF',
  /'WA_COMPANY-BUKRS' ,'WA_COMPANY-BUTXT' ,'WA_COMPANY-LAND1',
  / WA_COMPANY-BUKRS ,18 WA_COMPANY-BUTXT ,35 WA_COMPANY-LAND1.
SKIP.
WRITE:
  /'ディクショナリテーブル',
  /'WA_VBAK-VBELN' ,'WA_VBAK-ERDAT' ,'WA_VBAK-ERZET',
  / WA_VBAK-VBELN ,15 WA_VBAK-ERDAT ,29 WA_VBAK-ERZET.
SKIP.
WRITE:
  /'DATA BEGIN OF',
  /'WA_BANK-BANKS' ,'WA_BANK-BANKL' ,'WA_BANK-BANKA',
  / WA_BANK-BANKS ,15 WA_BANK-BANKL ,29 WA_BANK-BANKA.

以下出力結果