ABAPには業務データを扱うための型が揃っています。特に、金額と数量を正確に扱うための型が用意されている点は、業務言語としての性格をよく表しています。
組み込み型
| 型 | 内容 | 既定長 | 初期値 |
|---|---|---|---|
| C | 文字列(固定長) | 1 | スペース |
| N | 数字文字列(0埋め) | 1 | '0' |
| D | 日付(YYYYMMDD) | 8 | '00000000' |
| T | 時刻(HHMMSS) | 6 | '000000' |
| I | 整数(4バイト) | — | 0 |
| INT8 | 整数(8バイト) | — | 0 |
| P | パック数(小数桁を指定) | 8 | 0 |
| F | 浮動小数点 | 8 | 0 |
| STRING | 可変長文字列 | 可変 | 空 |
| XSTRING | 可変長バイト列 | 可変 | 空 |
N型とC型の違い
N型は「数字だけを格納する文字列」です。数値ではないため計算には使えませんが、前ゼロが保持されます。
DATA lv_num TYPE n LENGTH 5.
DATA lv_chr TYPE c LENGTH 5.
lv_num = 42. " 結果: '00042' (前ゼロで埋まる)
lv_chr = 42. " 結果: '42 ' (後ろがスペース)SAPの伝票番号や品目コードは、多くがN型で定義されています。「0000012345」のような前ゼロ付きのコードが表示されるのは、この型を使っているためです。
変数の宣言
" 組み込み型を直接指定
DATA lv_name TYPE c LENGTH 30.
DATA lv_amount TYPE p LENGTH 8 DECIMALS 2.
" データディクショナリの型を参照(推奨)
DATA lv_matnr TYPE matnr.
DATA lv_werks TYPE werks_d.
" テーブル項目を参照
DATA lv_bukrs TYPE bkpf-bukrs.
" 初期値の指定
DATA lv_count TYPE i VALUE 10.
" 定数
CONSTANTS lc_status TYPE c LENGTH 1 VALUE 'A'.構造体(Structure)
構造体は、複数の項目をまとめた型です。1件のレコードを表現するのに使います。
TYPES: BEGIN OF ty_item,
matnr TYPE matnr,
maktx TYPE maktx,
menge TYPE i,
price TYPE p LENGTH 8 DECIMALS 2,
END OF ty_item.
DATA ls_item TYPE ty_item.
ls_item-matnr = 'MAT-001'.
ls_item-menge = 10.
" ディクショナリの構造を参照
DATA ls_mara TYPE mara.内部テーブルの型
内部テーブルは、構造体を複数保持するためのメモリ上の表です。詳細は専用のセクションで扱いますが、宣言の書き方だけ押さえておきます。
" 標準テーブル
DATA lt_items TYPE STANDARD TABLE OF ty_item.
" 作業領域つき(古い書き方)
DATA lt_items TYPE TABLE OF ty_item WITH HEADER LINE.
" ディクショナリ構造を使う
DATA lt_mara TYPE STANDARD TABLE OF mara.
" キー付きソート済テーブル
DATA lt_sorted TYPE SORTED TABLE OF ty_item
WITH UNIQUE KEY matnr.インライン宣言(ABAP 7.4以降)
ABAP 7.4からは、使う場所で変数を宣言できるようになりました。型はコンパイラが推論します。
" 従来の書き方
DATA ls_mara TYPE mara.
SELECT SINGLE * FROM mara INTO ls_mara WHERE matnr = @lv_matnr.
" インライン宣言
SELECT SINGLE * FROM mara INTO @DATA(ls_mara) WHERE matnr = @lv_matnr.
" ループでの使用
LOOP AT lt_items INTO DATA(ls_item).
WRITE: / ls_item-matnr.
ENDLOOP.
" 値のコンストラクタ式
DATA(lt_numbers) = VALUE int_tab( ( 1 ) ( 2 ) ( 3 ) ).インライン宣言により、宣言部とロジックが離れることによる読みにくさが解消されます。変数のスコープが使用箇所の近くに限定されるため、可読性が向上します。