本ページでは、ABAPのMESSAGE命令について解説します。MESSAGE命令は、エラー時の制御や、ユーザの次のアクションを誘導するための重要な役割を担います。
どんな簡単なプログラムでも必ず1回利用する命令です!
必ず理解しておきましょう。
ABAPerを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。
MESSAGE命令とは?
MESSAGE命令とは、ユーザの入力ミスや何らかの例外処理が発生した際に画面に表示される文章メッセージを出力する命令です。
例えば、以下の画面がメッセージの出力例です。
FB03(会計伝票参照)の第1画面で、数値を入れるべき場合に文字列を入力すると、「!数値を入力してください」というメッセージが出力されます。
このように、ユーザにエラーの内容を知らせることを目的として利用されるのがMESSAGE命令です。適切なメッセージ出力はエラーハンドリングをする上で非常に重要な要因となるため、1つのプログラムにつき1個以上~数十回利用されることが基本です。
早速、MESSAGE命令の構文ルールを確認していきましょう。
構文ルール(原型):MESSAGE命令
MESSAGE ID (メッセージID) TYPE (メッセージタイプ) NUMBER (メッセージコード) WITH (データ項目&1) (データ項目&2) (データ項目&3) (データ項目&4).
MESSAGE命令には2通りの書き方が存在します。この記述方法は、割と古い書き方で年配のABAPerの方が好む記述方法です。
メッセージID・メッセージタイプなどの説明はページ後半で。
今は、なんとなく命令の書き方だけ理解しておきましょう。
よりイメージがつきやすいようにサンプルコードを2つ載せておきます。
MESSAGE ID 'ZZZ01' TYPE 'E' NUMBER '001' WITH '必須項目'.
IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
構文ルール(簡易型):MESSAGE命令
MESSAGE命令はより簡単に記述することもできます。
MESSAGE (メッセージタイプ+メッセージコード)(メッセージID) WITH (データ項目&1) (データ項目&2) (データ項目&3) (データ項目&4).
こちらの書き方だと、以下のようにMESSAGE命令をすっきり記述することができます。
先ほどと同じようにサンプルコードを2つほど記載しておきます。
IF SY-SUBRC = 0. MESSAGE S001(ZZZ00) " &1 に成功しました。 WITH TEXT-S01. " データ更新 ELSE. MESSAGE E196(ZCM00) " &1 に失敗しました。 WITH TEXT-S01. " データ更新 ENDIF.
*メッセージを出力する MESSAGE E001(ZZZ01) "テーブル &1 に &2 が存在しません WITH TVKO "&1 P_VKORG. "&2
ここからは、メッセージID・メッセージタイプなどの用語について解説します。
T100:メッセージテーブル
MESSAGE命令で指定する、メッセージIDやメッセージタイプはすべて標準テーブルT100のテーブル項目を表しています。
それぞれ概要は以下の通り。
いたって、単純なテーブルです。「言語:SPRSL」「メッセージID:ARBGB」「メッセージコード:MSGNR」「文章:TEXT」の4つのみで構成されます。
このテーブルはリポジトリオブジェクトであり、トランザクションコード:SE91から更新することができます。
言語:SPRSL
日本語であれば「JA」英語であれば「EN」です。
グローバル企業の場合は言語ごとに表示させることができるため非常に便利な仕組みです。ユーザのログオン言語によって、自動的にどの言語のメッセージが表示されるか?が決まります。
ご覧いただくと分かるようにMESSAGE命令では、直接言語を指定することはありません。
MESSAGE ID 'ZZZ01' TYPE 'E' NUMBER '001' WITH '必須項目'.
テキストシンボルも同じようにログオン言語に応じたテキスト表示が可能となるため、以下のようにデータ項目にテキストシンボルの仕組みを指定するのが一般的です。
多言語化対応が必要なプロジェクトでは、必須の知識です。
IF SY-SUBRC = 0. MESSAGE S001(ZZZ00) " &1 に成功しました。 WITH TEXT-S01. " データ更新 ELSE. MESSAGE E002(ZCM00) " &1 に失敗しました。 WITH TEXT-S01. " データ更新 ENDIF.
テキストシンボルは、名称付きのデータオブジェクトのことで、画面上で表示する文字・テキストをIDで管理したものです。
テキストシンボルについては以下のページで詳しく解説しておりますので合わせてご覧ください。
ID:ARBGB
IDはメッセージクラスと呼ばれます。数万個あるメッセージを特定の分類に応じて整理する役割を担っています。
FIモジュール用、MMモジュール用といった形で分類していきます。
メッセージコード:MSGNR
メッセージコードは、最大3桁の数字で構成されます。現場によっては、このコードに規約を持たせることもありますが、通常は連番で採番していきます。
メッセージテキスト:TEXT
画面に表示するメッセージはメッセージテキスト項目に登録されています。最大73桁のテキストを保持することができます。
なお、この項目には「&」を利用することで最大4つまでデータ項目(変数)を指定することができます。先ほどの構文ルールの章で説明したように、WITH句で&1に対応する言語を指定し、動的にメッセージを出力をすることが可能です。
メッセージテーブル「T100」が上記のように登録されていれば、以下のようなメッセージが表示されます。
*メッセージを出力する MESSAGE S001(ZZZ00) " &1 が登録されました・ WITH '会計伝票' "&1. ⇒「会計伝票が登録されました」
データ項目を適切に指定することで、同じような意味のメッセージ1つで複数のバリエーションを実現することができます。
&1 をデータ項目と説明しましたが、より専門的な用語で「プレースホルダ」と呼ぶ場合もあります。
以上が、メッセージテーブル「T100」の概要です。
最後に、MESSAGE命令の肝「メッセージタイプ」についての解説に移ります。
メッセージタイプとは
メッセージタイプとは、メッセージが表示される際の処理の挙動を制御する役割を担います。
つまり、そのメッセージは「成功」のメッセージなのか?「エラー」メッセージなのか?という分類がメッセージタイプです。
例えば、メッセージを表示する際に合わせて処理を中断する場合には「A:異常終了」を。成功したことを知らせるメッセージであれば「S:成功」を指定します。
IF SY-SUBRC = 0. MESSAGE S001(ZZZ00) " &1 に成功しました。 WITH TEXT-S01. " データ更新 ELSE. MESSAGE A002(ZCM00) " &1 に失敗しました。 WITH TEXT-S01. " データ更新 ENDIF.
同じ文章でも、このメッセージタイプの指定によって画面の制御を変えることができます。メッセージタイプは全部で6つ存在します。
A:異常終了
このメッセージタイプを指定すると、メッセージの表示とともにプログラムが強制終了します。
X:異常終了
メッセージタイプ「X:異常終了」も「A:異常終了」と同様、処理が強制的に終了します。
Xを指定した場合はプログラムがショートダンプで終了するため、トランザクションコード:ST22乗からエラーの詳細(どこでエラーになったか?など)を確認することができます。
E:エラー
最も使用頻度の高いメッセージタイプです。このメッセージタイプでは、処理を終了させるのではなく「処理の中断」を行わせることができます。
ユーザの入力に誤りがある場合、エラーメッセージ(※〇〇が正しくありません。)を表示し、新たな値を入力させることができます。正しい値が入力されるため何度もメッセージが表示されます。
「A:異常終了」とした場合、プログラムが強制終了してしまうため正しい値をもう一度入力することができなくなります。
W:警告
メッセージタイプ「E」と同様、処理を中断させます。ただし、この場合メッセージが表示されるのは一度きり。つまり、正しい値にしても良いし、しなくても良い場合に利用します。
その名の通りあくまでも「警告」であるため、「本当にそれでいいの?」といったニュアンスのメッセージを表示する場合に使われるメッセージタイプです。
I:情報
このメッセージタイプは、処理を中断させた後、ユーザがEnterキーを押下することで処理を再開することができるメッセージタイプです。
処理に影響は与えないが、ユーザに注意喚起したい場合に用いることが一般的です。
S:成功
その名の通りです。ユーザが入力に成功した場合に表示されるメッセージの場合にこのメッセージタイプを利用します。
メッセージが表示されるのは、入力に成功した場合なので、入力画面ではなく、その次の画面です。よく間違いが散見される点なので注意が必要です。
DISPLAY LIKEオプション
DISPLAY LIKEオプションを利用することで、指定したメッセージタイプで出力されます。
このオプションを利用すると、メッセージは必ずダイアログボックスで表示されるようになるため、画面の下ではなくポップアップ表示させたい場合に用いる場合が多いオプションです。
IF SY-SUBRC <> 0. * 読込に失敗しました。 MESSAGE S001(ZZZ00) WITH TEXT-S01 DISPLAY LIKE 'E'. ENDIF.
INTOオプション
INTOオプションを利用することで、メッセージを画面に表示する代わりに変数に代入することができます。
一旦メッセージ内容を保存しておき、別の処理を行った後で画面に表示させたいようなシーンで利用します。
DATA aaa TYPE STRING. IF SY-SUBRC <> 0. * 読込に失敗しました。 MESSAGE S001(ZZZ00) WITH TEXT-S01 INTO aaa. ENDIF.
SAP / ABAPを1から学習したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!