出力命令と表示形式

18.1 出力命令と表示形式

出力命令(WRITE命令)にはさまざまな出力方法があり、以下について詳しく説明していきます。

●出力位置の制御
・開始位置
・改行
・寄せ
●表示の装飾
・空白除去
・符号
・区切り文字
・NO-ZERO
●表示形式
・小数表示
・日付形式
●業務データの変換
・ALPHA変換
・通貨換算
●帳票要素
・タイトル

出力命令(基本形)

WRITE命令は「画面に値を表示するための命令」です。
ABAPのレポートプログラムでは、SELECTしたデータや計算結果をユーザに見せるために使用します。
以降では、このWRITE命令に付けられる様々な表示制御の方法を学習します。

<変数>を画面に出力しなさい、という命令になります。


出力位置の制御

以下について説明します。
・開始位置と出力長
・改行
・左寄せ/中央寄せ/右寄せ

開始位置と出力長

WRITE命令の後に、開始位置と出力長を定義することができます。
出力長については、半角の丸カッコで囲む必要があります。
構文中の「m」、「n」は、不特定の数値を表す記号です。

出力命令のオプション①(開始位置と出力長)

WRITE命令の後に、開始位置と出力長を定義することができます。
出力長については、半角の丸カッコで囲む必要があります。
構文中の「m」、「n」は、不特定の数値を表す記号です。

<変数>を、開始位置mから、出力長nで、画面に出力しなさい、という命令になります。

■ 構文例 WRITE m(n)
REPORT Z_SAMPLE181_WRITE.

START-OF-SELECTION.

  DATA(LV_TEXT) = 'ABCDEFGHIJKLMNOPQRSTUXYZ'.

  "例題①:開始位置だけ指定(3列目から出力)
  WRITE / '例題①:WRITE 3 lv_text.'.
  NEW-LINE.
  WRITE 3 LV_TEXT.
  SKIP.

  "例題②:出力長だけ指定(先頭から10文字)
  WRITE / '例題②:WRITE (10) lv_text.'.
  NEW-LINE.
  WRITE (10) LV_TEXT.
  SKIP.

  "例題③:開始位置+出力長(3列目から10文字)
  WRITE / '例題③:WRITE 3(10) lv_text.'.
  NEW-LINE.
  WRITE 3(10) LV_TEXT.


例題①は、<変数>を、開始位置3から、画面に出力しなさい、という命令になります。
例題②は、<変数>を、出力長10で、画面に出力しなさい、という命令になります。
例題③は、<変数>を、開始位置3から、出力長10で、画面に出力しなさい、という命令になります。
例題②、③のように、出力長に10を指定した場合、<変数>の桁数が10バイト以上ある場合、
先頭から10バイトしか出力されません。
例題①、②のように、 開始位置と出力長は必ずセットで指定する必要はありません。
しかし、例題③のように両方指定している方がソースコードは見やすくなります。
開始位置と出力長は、動的に指定することもできます。


■ 構文例 WRITE AT m(n)
<変数> = ‘ABCDEFGHIJKLMNOPQRSTUXYZ’.
<COL> = 3
<LEN> = 10
WRITE AT <COL> (<LEN>) <変数>.


<変数>を、開始位置<COL>から、出力長<LEN>で、画面に出力しなさい、という命令になります。
WRITE命令の後に AT を付けることで、開始位置と出力長を動的に指定することが可能です。

ここでの結果は、前述の例題③と同じです。
<COL>に3、<LEN>に10を代入していますので、3カラム目から10バイトの領域に<変数>の内容が表示されます。


改行

改行には、NEW-LINE命令、またはWRITE命令の2通りがあります。

改行しなさい、という命令になります。

改行してから、<変数>を出力しなさい、という命令になります。

■ 構文例 NEW-LINE, WRITE
REPORT Z_SAMPLE18_LINEBREAK.

START-OF-SELECTION.

  DATA(LV_A) = '12345'.
  DATA(LV_B) = 'ABCDEFG'.

  WRITE 'NEW-LINE 版'.
  NEW-LINE.
  WRITE LV_A.
  NEW-LINE
  WRITE LV_B.
  ULINE.
  WRITE '/ 版(こちらがよく使われる)'.
  WRITE: / LV_A,
        / LV_B.

出力結果は、どちらの方法でも同じになります。 <変数 A>を出力後、改行し、<変数 B>を出力します。
実務では、改行には「WRITE /」を使用することがほとんどです。

開寄せ/中央寄せ/右寄せ

出力領域内で出力文字の配置を指定できます。
何も指定しない場合は、出力項目の属性により位置が決まり、
数値属性以外は左寄せ、数値属性は右寄せとなります。

<変数>を、左寄せ/中央寄せ/右寄せで出力しなさい、という命令になります。


■ 構文例 WRITE LEFT-JUSTIFIED / CENTERED / RIGHT-JUSTIFIED
REPORT Z_SAMPLE181_JUSTIFY.

START-OF-SELECTION.

  DATA(LV_TEXT) = 'ABCDEF'.

  "開始位置1、幅12の枠に配置を変えて出力
  WRITE 1(12) LV_TEXT LEFT-JUSTIFIED.
  ULINE.
  WRITE 1(12) LV_TEXT CENTERED.
  ULINE.
  WRITE 1(12) LV_TEXT RIGHT-JUSTIFIED.

順に、左寄せ出力、中央寄せ出力、右寄せ出力されています。


左寄せ/中央寄せ/右寄せ:新構文

文字列テンプレートでは、出力する値に対して 表示幅(WIDTH) と 寄せ(ALIGN) を指定できます。

構文

WRITE |{ <変数(定数)> WIDTH = N ALIGN = LEFT   }|.
WRITE |{ <変数(定数)> WIDTH = N ALIGN = CENTER }|.
WRITE |{ <変数(定数)> WIDTH = N ALIGN = RIGHT  }|.

WIDTHで表示幅を指定し、ALIGNで表示位置を指定しています。
※Nには表示幅(数値)を指定します。

サンプルコード
REPORT Z_SAMPLE195_WIDTHALIGN.

DATA(LV_TEXT) = 'ABCDEF'.

WRITE:
       / |{ LV_TEXT WIDTH = 20 ALIGN = LEFT   }|,
       / |{ LV_TEXT WIDTH = 20 ALIGN = CENTER }|,
       / |{ LV_TEXT WIDTH = 20 ALIGN = RIGHT  }|.

結果

表示の装飾

これらのオプションは「データの値を変更する」のではなく「表示の見た目だけを変更する」機能です。
内部データには影響しません。
・空白除去
・符号
・区切り文字
・NO-ZERO

空白除去

WRITE命令による出力を行った場合、カーソルは、次の位置の後ろにカーソルが配置されます。
そのため、 連続して出力を行うと空白文字が入ります。
NO-GAPを使用することで直後にカーソルが配置され、 間隔を空けずに出力することができます。

<変数>を、間隔を空けずに出力しなさい、という命令になります。


■ 構文例 WRITE NO-GAP
REPORT Z_SAMPLE181_NOGAP.

START-OF-SELECTION.

  DATA(LV_A) = 'ABC'.
  DATA(LV_B) = 'DEF'.

  WRITE: / '通常  :', LV_A, LV_B.
  WRITE: / 'NO-GAP:', LV_A NO-GAP, LV_B.


NO-GAPを指定した場合、<変数A>と<変数B>は間隔を空けずに出力されています。 出力桁数が固定されていれば、 開始位置の指定でも同様の対応は可能です。


符号の無効化

数値型かつ符号を持つ項目属性は、最後の1桁に符号の領域が用意されます。
符号領域を無効化する場合NO-SIGNを使用します。

<変数>を符号領域なしで出力しなさい、という命令になります。


■ 構文例 WRITE NO-SIGN
REPORT Z_SAMPLE181_NOSIGN.

START-OF-SELECTION.

  DATA LV_AMOUNT TYPE P LENGTH 11 DECIMALS 2.
  LV_AMOUNT = '-12345.67'.

  WRITE / '■通常出力(符号あり)'.
  NEW-LINE.
  WRITE LV_AMOUNT.

  SKIP.

  WRITE / '■NO-SIGN(符号を表示しない)'.
  NEW-LINE.
  WRITE LV_AMOUNT NO-SIGN.


① 最後の1桁に符号領域ありで出力されます。
② NO-SIGNオプションが指定されているため、最後の1桁に符号領域なしで出力されます。


桁区切り文字の無効化

数値型の属性は、ユーザごとに指定した桁区切り(ユーザプロファイルの10進表記)に自動変換して表示されます(例えば、1,234.567など)。
桁区切り表記を無効にする場合に、NO-GROUPINGを使用します。

<変数>を桁区切りなしで表示しなさい、という命令になります。


■ 構文例 WRITE NO-GROUPING
REPORT Z_SAMPLE181_NOGROUPING.

START-OF-SELECTION.

  DATA LV_AMOUNT TYPE P LENGTH 13 DECIMALS 2.
  LV_AMOUNT = '1234567.89'.

  WRITE / '■通常出力(桁区切りが付く場合あり)'.
  NEW-LINE.
  WRITE LV_AMOUNT.

  SKIP.

  WRITE / '■NO-GROUPING(桁区切りを無効化)'.
  NEW-LINE.
  WRITE LV_AMOUNT NO-GROUPING.

自分のユーザの桁区切りの設定は、ユーザプロファイルで確認できます。



ゼロを空白として出力

数値データ型で値ゼロを格納している場合に、出力長に対して空白が出力されます。
データ型C、N またはStringの場合、先行ゼロが空白として表示されます。

<変数>を先行ゼロなしで出力しなさい、という命令になります。

■ 構文例 WRITE NO-ZERO
REPORT Z_SAMPLE181_NOZERO.

START-OF-SELECTION.

  DATA LV_ZERO TYPE I VALUE 0.
  DATA LV_VAL  TYPE I VALUE 123.

  WRITE / '■通常出力(0も表示)'.
  NEW-LINE.
  WRITE: / '0 の場合   =', LV_ZERO,
         / '123 の場合 =', LV_VAL.

  SKIP.

  WRITE / '■NO-ZERO(0 は空欄表示)'.
  NEW-LINE.
  WRITE: / '0 の場合   =', LV_ZERO NO-ZERO,
         / '123 の場合 =', LV_VAL  NO-ZERO.	


表示形式

・小数表示
・日付形式


小数点以下の表示

数値項目(データ型I、PまたはF型)の小数点以下桁数の表示を指定できます。
小数点以下の表示桁数が項目の小数点以下より少ない場合は、次の桁数で四捨五入されて表示されます。
桁数をマイナスで指定した場合、ゼロとして処理されます。
数値項目以外のデータ型では、このオプションは無視されます。

<変数>を小数点以下桁数<桁数>で出力しなさい、という命令になります。


■ 構文例 WRITE DECIMALS
REPORT Z_SAMPLE181_DECIMALS.

START-OF-SELECTION.

  DATA LV_AMOUNT TYPE P LENGTH 11 DECIMALS 5.
  LV_AMOUNT = '12.34567'.

  WRITE / '■通常(型の小数桁で表示)'.
  NEW-LINE.
  WRITE LV_AMOUNT.

  SKIP.

  WRITE / '■DECIMALS 2(小数点以下2桁で表示)'.
  NEW-LINE.
  WRITE LV_AMOUNT DECIMALS 2.

  SKIP.

  WRITE / '■DECIMALS 0(整数で表示)'.
  NEW-LINE.
  WRITE LV_AMOUNT DECIMALS 0.

補足(「小数点以下を切り捨て」したい場合について)

小数点以下を切り捨てる際は、上記の「出力時のオプション」を設定する以外にも、「関数」や「汎用モジュール」を使用する方法があります。
関数に関しては、関数「FLOOR」と「CEIL」を用いることで切り捨てが可能です。
また画像のようにすることで、結果を入れる変数の型が小数点に対応しているかによって
切り捨て後に.00等をつけるかを変えられます。

「汎用モジュール」については「ROUND」という汎用モジュールで可能になります。

日付固有の出力形式

下記の構文のオプションは、日付項目のさまざまな出力形式です。
ユーザマスタの日付出力定義により年、月、日の順序が決まるので、日付形式の通りにはならないので注意してください。

<変数>を<日付形式>で出力しなさい、という命令になります。


■ 構文例 WRITE <日付形式>
REPORT Z_SAMPLE181_DATETIME.

START-OF-SELECTION.

  DATA LV_DATE TYPE DATS.
  DATA LV_TIME TYPE TIMS.

  LV_DATE = '20260104'.
  LV_TIME = '135959'.

  WRITE / '■DATS / TIMS(表示形式はユーザ設定に依存)'.
  NEW-LINE.
  WRITE: / 'DATS =', LV_DATE,
         / 'TIMS =', LV_TIME.

  SKIP.

  "固定形式で見せたい場合(初心者向け:文字列化して出力)
  DATA LV_DATE_TEXT TYPE C LENGTH 8.
  DATA LV_TIME_TEXT TYPE C LENGTH 6.

  LV_DATE_TEXT = LV_DATE.
  LV_TIME_TEXT = LV_TIME.

  WRITE / '■固定形式(内部値をそのまま文字として表示)'.
  NEW-LINE.
  WRITE: / 'YYYYMMDD =', LV_DATE_TEXT,
         / 'HHMMSS   =', LV_TIME_TEXT.		 

日付形式の設定が、「YYYY/MM/DD」のユーザで実行した結果となります。

DD/MM/YYYY でも同様の結果となります。
DD/MM/YY でも同様の結果となります。
DDMMYY でも同様の結果になります。

自分のユーザの日付形式の設定は、ユーザプロファイルで確認できます。
自分のユーザプロファイルの確認の仕方は、
2章 SAP操作手順4.③ 「ユーザデータの更新(デフォルトタブ)」をご確認ください。


日付固有の出力形式 – 新構文

新構文でも数値/日付(時刻)形式を指定することが可能です。

構文
WRITE |{ <変数> DATE = ISO  }|.
WRITE |{ <変数> TIME = ISO  }|.
WRITE |{ <変数> DATE = USER }|.
WRITE |{ <変数> NUMBER = USER }|.	

日付(時刻)はISO(国際標準)やユーザ設定など表示形式を指定できます。
また、数値もユーザ設定などを指定できます。

サンプルコード
REPORT Z_SAMPLE195_FORMAT.

DATA(LV_VALUE) = '20260101'.

WRITE:
       / |{ CONV D( LV_VALUE ) DATE = ISO  }|,  " YYYY-MM-DD
       / |{ CONV D( LV_VALUE ) DATE = USER }|,  " ユーザ設定の日付形式
       / |{ CONV I( LV_VALUE ) NUMBER = USER }|. " ユーザ設定の数値形式
	

※CONV<データ型>( 変数 )で変数をデータ型に変換します。

結果
補足

自分のユーザの数値/日付/時刻形式の設定は、ユーザプロファイルで確認できます。
自分のユーザプロファイルの確認の仕方は、 2章 SAP操作手順4.③ 「ユーザデータの更新(デフォルトタブ)」をご確認ください。

直前に出力した位置の利用

UNDERを利用すると、現在の行で直前のWRITE命令で出力された位置に出力が行われます。
例えば、項目ヘッダテキストを出力し、明細データを出力する場合に配置を指定せずに項目ヘッダテキストを参照させることで、正しい配置で出力することができます。
また、出力位置が変わった場合、項目ヘッダテキストの位置を変更することで、明細データの配置も自動で変わります。

<参照出力項目>の下に、<変数>を出力しなさい、という命令になります。


■ 構文例
REPORT Z_SAMPLE181_UNDER.

  TYPES: BEGIN OF TY_KNB1_LIKE,
           BUKRS TYPE BUKRS,
           KUNNR TYPE KUNNR,
         END OF TY_KNB1_LIKE.

  DATA LT_ROWS TYPE STANDARD TABLE OF TY_KNB1_LIKE WITH EMPTY KEY.

START-OF-SELECTION.

  "データ準備(例)
  LT_ROWS = VALUE #(
    ( BUKRS = '1000' KUNNR = '0000001000' )
    ( BUKRS = '2000' KUNNR = '0000002000' )
  ).

  "① ヘッダ出力(位置を固定)
  WRITE: 10 '会社コード',
         40 '得意先コード'.
  ULINE.

  "② 明細出力:ヘッダの“真下”に揃える
  LOOP AT LT_ROWS INTO DATA(LS_ROW).
    WRITE: / LS_ROW-BUKRS UNDER '会社コード',
             LS_ROW-KUNNR UNDER '得意先コード'.
  ENDLOOP.


「会社コード」の下に、構造:WA_KNB1の項目:BUKRS(会社コード)が出力され、
「得意先コード」の下に、構造:WA_KNB1のKUNNR(得意先コード)が出力されます。

業務データの変換

・ALPHA変換
・通過変換

ALPHA変換

ALPHA変換(前ゼロの付与/除去)は、文字列テンプレートのオプションで簡単に表現できます。
以前までは変換ルーチン「ALPHA」が使用されている場合、 「CONVERSION_EXIT_ALPHA_INPUT」と「CONVERSION_EXIT_ALPHA_OUTPUT」を 使用して、内部値/外部値変換する必要がありました。
しかし、新構文では以下の通り記述することで簡単に内部値/外部値変換が可能です。
伝票番号・得意先コード・品目コードなどの「キー項目」で頻繁に使用されます。

構文
WRITE |{ <変数> ALPHA = IN  }|.
WRITE |{ <変数> ALPHA = OUT }|.

IN なら前ゼロがつき、OUTなら前ゼロが取れます。


サンプルコード
REPORT Z_SAMPLE195_ALPHA.

*& ALPHA変換(IN / OUT)の確認
*&  - IN : 前ゼロを付ける
*&  - OUT: 前ゼロを外す

" 原本仕様:前ゼロ付きの文字列を用意して、OUTでゼロが外れることを確認する
DATA(WK_VBELN) = '0000012345'.

" 0が外れたことが分かるように、ラベル付きで出力する
WRITE:
       / |ORIGINAL : { WK_VBELN }|,
       / |ALPHA IN : { WK_VBELN ALPHA = IN  }|,
       / |ALPHA OUT: { WK_VBELN ALPHA = OUT }|.	
結果

通貨換算

SAPの金額は、 すべて小数点以下2桁で管理されています。
通貨ごとに小数点以下の桁数が定義されており、通貨コードと組み合わせることで通貨に伴った金額が表示されます。
(TCURCで通貨コードそのものが、TCURXで通貨コードの小数点以下桁数が見られます。
以下に確認方法になります。
<確認方法>
SE16→テーブル名に「TCURC | TCURX」を入力し、検索)

日本円の場合、画面で1,000円を入力するとSAPシステム上には10.00で格納されます。
通貨コードを指定することで1,000と表示されますが、指定しない場合は、SAPシステム上に格納されている内容で表示されてしまいます。
SAPの金額は「通貨とセット」で意味を持ちます。 金額だけでは正しく表示できないため、必ず通貨を指定します。

<変数>を通貨:<通貨コード>で出力しなさい、という命令になります。


■ 構文例 WRITE CURRENCY
REPORT Z_SAMPLE181_CURRENCY.

START-OF-SELECTION.

  DATA LV_AMOUNT TYPE P LENGTH 11 DECIMALS 2.
  LV_AMOUNT = '1234.56'.

  WRITE / '■通常(型の小数桁で表示)'.
  NEW-LINE.
  WRITE LV_AMOUNT.

  SKIP.

  WRITE / '■CURRENCY JPY(通貨設定に合わせた表示)'.
  NEW-LINE.
  WRITE LV_AMOUNT CURRENCY 'JPY'.

  SKIP.

  WRITE / '■CURRENCY USD(通貨設定に合わせた表示)'.
  NEW-LINE.
  WRITE LV_AMOUNT CURRENCY 'USD'.

通貨指定なしの場合、変数に格納されている内容で表示されます。
JPY通貨(小数点以下桁数=0)に変換されて表示されます。
USD通貨(小数点以下桁数=2)に変換されて表示されます。


出力命令のオプション(通貨換算 – 新構文)

通貨換算の指定を新構文で記述すると以下の通りです。

構文
WRITE |{ <金額> CURRENCY = 通貨コード }|.

通貨を指定すると小数点位置が変わります。
カンマで表示するなどの表示形式は後述します。
また、出力命令のオプションは複数記述することもできます。

サンプルコード
REPORT Z_SAMPLE195_CURRENCY.

DATA(LV_AMOUNT) = 1500000.

WRITE:
   / | USD:{ LV_AMOUNT CURRENCY = 'USD' }|,
   / | JPY:{ LV_AMOUNT CURRENCY = 'JPY' }|,
   / | JPY(右寄せ):{ LV_AMOUNT CURRENCY = 'JPY' WIDTH = 20 ALIGN = RIGHT }|.
結果

① USD通貨(小数点以下桁数=2)に変換されて表示されます。
② JPY通貨(小数点以下桁数=0)に変換されて表示されます
③ 出力位置オプションで出力幅20、右寄せを指定しています。

補足:DDIC変換と表示の関係(旧構文)

SAP の項目には、「内部値」と「外部値」という概念があります。
例えば得意先コード(KUNNR)は、内部では「0000001000」のように前ゼロ付きで保存されますが、画面では「1000」と表示されます。

これは「変換ルーチン」と呼ばれる仕組みにより、自動的に表示形式が変換されているためです。

通常のWRITE出力では、この変換ルーチンが自動的に適用されます。

WRITE lv_kunnr.  " 1000 と表示


しかし、内部値をそのまま確認したい場合もあります。その場合に使用するのが次の旧構文です。
この指定を行うと、変換ルーチンが無効化され、内部形式のまま表示されます。

WRITE lv_kunnr USING NO EDIT MASK. " 0000001000 と表示

なお現在の開発では、表示制御は文字列テンプレートを使用するのが基本であり、 USING EDIT MASK を新規開発で使用することはほとんどありません。
本項目は、新規開発では使用しませんが、既存プログラムの読解・デバッグのために知識として覚えます。

帳票タイトルの出力

SAP のレポートは標準で、プログラム属性の表題を「標準ページヘッダ」として表示します。
これを消したい場合は、NO STANDARD PAGE HEADING. を指定します。

■ 構文例 REPORT NO STANDARD PAGE HEADING
REPORT Z_SAMPLE181_HEADING NO STANDARD PAGE HEADING.

DATA GV_COUNT TYPE I.

TOP-OF-PAGE.
  "ページ先頭で毎回呼ばれるイベント:ここにタイトルを書く
  WRITE: / '<< サンプル帳票タイトル >>'.
  ULINE.

START-OF-SELECTION.

  DO 3 TIMES.
    WRITE: / '行:', GV_COUNT.
    GV_COUNT = GV_COUNT + 1.
  ENDDO.

■ 出力結果

オプションNO STANDARD PAGE HEADINGを指定したため、ヘッダが表示されません。


NEXT>> 18.2 文字列の編集

研修の詳細はこちら