ABAPをコーディングする上での超・基本となる変数・構造(ワークエリア)・内部テーブル:SAPのデータオブジェクトの基本について解説します。
変数・構造・内部テーブルの違いを端的に表した図がこちら。
このページでは、SAP・ABAP初心者向けにコーディングの基本となる変数・構造・内部テーブルの違いをわかりやすく図解して解説します。
SAPエンジニアやABAPerを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。
参考 ABAPの基本構文ルール
前提:メモリとは?
内部テーブル / 構造(ワークエリア) / 変数を理解する前提となる「メモリ」についてご説明しておきます。
メモリとは、プログラム実行時に中心的な役割を果たす部分で、実行中のプログラムが情報を一時的に保存する場所のこと。分かりやすく説明すると、メモリというのはコンピュータにとっての「メモ帳」のようなものです。
この場合のメモ帳の形式の違いが「変数・構造・内部テーブルの違い」です。
ABAP/プログラミング初心者の方が、内部「テーブル」という言葉に惑わされて、実際にデータベースに保存されているものだと誤認する場合を散見します。
まずは、変数・構造・内部テーブルはどれもプログラム実行中にのみ存在するメモリの一種だと理解してください。この理解の上で、変数・構造・内部テーブルの違いを1つ1つご説明していきます。
変数・構造・内部テーブルの違い
変数・構造・内部テーブルのイメージ図は以下の通り。
ABAPerは、変数/構造/内部テーブルといったら、これらのイメージ図が頭に思い浮かびます。
ざっくり言ってしまえば、1個だけメモできるのが変数で、複数のレコードをメモできるのが構造で、複数レコードをExcelのようにメモできるのが内部テーブルです。
これらの共通イメージを掴むことが第一歩となります。1つひとつ、深堀しながら解説していきます。
ABAP:変数
変数はExcelで例えると「1つのセル」に相当します。あるいは変数は「箱」のようなイメージです。
変数にはあくまでも1つのレコードしか格納することができません。今日の日付を格納した後に、昨日日付を格納しようとすると上書きされてしまいます。
「変数」という概念は、ABAPだけでなくどのプログラミング言語でも共通する基本知識です。
変数に関する基本的な理解やルールを押さえておきたい方は、是非こちらの記事をご覧ください。
変数の定義方法
DATA: <変数名> TYPE <データ型>.
参考 ABAPのデータ型
変数を定義する場合にはDATA命令を用います。
サンプルコード 変数の定義
DATA: number TYPE I, " 整数型変数 text TYPE STRING. " 文字列型変数
ABAP:構造
「構造」は「ワークエリア」とも呼ばれる場合もあります。
構造はExcelで例えると1行の複数セルに相当します。
よくある利用シーンとしてはABAPのLOOP処理などが有名です。
"LOOP" は内部テーブルから「特定のデータを抽出して1レコードずつ処理を行う場合」に利用される命令です。
詳しく知りたい方はこちらの記事をどうぞ。
構造の定義方法
" 構造「型」の定義 TYPES: BEGIN OF <StructName>, FieldName1 FieldType1, FieldName2 FieldType2, ... END OF <StructName>. " 構造の定義 DATA: <構造> TYPE <StructName>. ***既存のデータベーステーブル名や構造名をTYPEオプションに指定して構造を定義することも可能*** DATA: <構造> TYPE (データベーステーブル名 ex BKPF).
以下にいくつかサンプルコードを示します。
サンプルコード1
* 構造「型」の定義 TYPES: BEGIN OF t_employee, id TYPE n LENGTH 5, name TYPE string, age TYPE i, END OF t_employee. * 構造の宣言 DATA: employee TYPE t_employee. * 構造の各フィールドに値をセット employee-id = '00001'. employee-name = 'Tanaka'. employee-age = 30.
サンプルコード2
* データベーステーブルの構造体を利用する変数の宣言 DATA: flight TYPE SFLIGHT. * SELECT文でデータベースからデータを取得 SELECT SINGLE * FROM SFLIGHT INTO flight WHERE CARRID = 'AA' AND CONNID = '0017' AND FLDATE = '19910101'. * 変数のフィールドから値を取得 WRITE: / 'Airline Code: ', flight-CARRID. WRITE: / 'Connection ID: ', flight-CONNID. WRITE: / 'Flight Date: ', flight-FLDATE.
参考 SELECT SINGLE / WRITE
「DATA: flight TYPE SFLIGHT.」の部分では、あくまでもSFLIGHTというDBテーブルのカラム定義を参照しているだけであって、SFLIGHTと同じ行列を持つ内部テーブルを宣言しているわけではないということに注意しましょう。
内部テーブル
内部テーブルは、ご覧の通り「行」と「列」を保持するメモリ構造です。
Excelのようなイメージを持てればOK。
標準テーブルやアドオンテーブルのデータをそっくりそのまま(もしくは条件を絞って)メモしたい、というときに利用することができます。
内部テーブルの定義
内部テーブルの定義には基本的には以下の2つのステップが必要です。
- テーブルの行の構造を定義する(あるいは既存の型を利用する)
- その構造に基づく内部テーブルを定義する
具体的な構文ルールは以下の通り。
TYPES: BEGIN OF TypeName, FieldName1 FieldType1, FieldName2 FieldType2, ... END OF TypeName. DATA: TableName TYPE TABLE OF TypeName.
構造定義との違いはTYPEオプションの後ろ「TABLE OF」の部分だけ。そのため、通常は以下のように、内部テーブルと構造を同時に定義することが多くあります。
* 行の型を定義 TYPES: BEGIN OF t_employee, id TYPE n LENGTH 5, name TYPE string, age TYPE i, END OF t_employee. * 内部テーブルの定義 DATA: it_employees TYPE TABLE OF t_employee, wa_employee TYPE t_employee. * ワークエリアに値をセットして、内部テーブルに追加 wa_employee-id = '00001'. wa_employee-name = 'Tanaka'. wa_employee-age = 30. APPEND wa_employee TO it_employees. wa_employee-id = '00002'. wa_employee-name = 'Suzuki'. wa_employee-age = 25. APPEND wa_employee TO it_employees. * 内部テーブルからデータを取得 LOOP AT it_employees INTO wa_employee. WRITE: / 'ID: ', wa_employee-id, ' Name: ', wa_employee-name, ' Age: ', wa_employee-age. ENDLOOP.
参考 APPEND命令
↑のコードでは、まず従業員の情報(ID、名前、年齢)を保持する構造の「型」を定義。そしてその構造を行の型とする内部テーブルit_employees
を定義し、同じ型のワークエリアwa_employee
を定義しています。
変数・構造(ワークエリア)・内部テーブルのまとめ
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!