【ABAP】SY-SUBRCとは?1分で学ぶシステム項目(変数)の役割と使い方

ABAP

このページでは、ABAPのコーディングをしていく上で必ず1度は必要になる知識がシステム項目についてABAP初心者向けに解説します。

システム項目とはSAP側で値が自動的に付与される項目(変数)のこと。ABAPのプログラム実行時にはこのシステム項目の値を条件として利用したりすることができます。

ABAPを読んだことがある人であれば「SY-SUBRC(サブアールシー)」という言葉を聞いたことがあると思いますが、それがシステム項目です。

このページでは「SY-SUBRC」以外にもABAPにおける様々なシステム項目の意味と使い方、覚えておきたい代表的なシステム項目を解説します。

このページで学べる内容
  • システム項目とは何か?
    • SY-SUBRCとは?
  • これだけは覚えておきたいシステム項目SY-DATUM
    • SY-UNAME
    • SY-DBCNT
    • SY-BATCH
    • SY-TABIX
  • システム項目利用時の注意点
  • Tips:システム項目の探し方

ABAPerを目指す方や、SAPに関係する仕事をしている方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。

スポンサーリンク

システム項目(システム変数)とは?

システム項目とは、プログラム実行時にシステムが値を自動的に設定している変数(のようなもの)です。

例えば、プログラムの中で本日の日付を取得したいような場合。プログラム実行時に既に自動的に「SY-DATUM」というシステム項目に当日の日付が設定されているので、一からコーディングをする必要はありません。システム項目を参照するだけで当日日付を取得することが可能です。

このように、ABAPプログラミングを行う中で汎用的に必要となるような情報は大体システム項目が持っています。

本来、変数はDATA命令を用いて事前に定義しておく必要がありますが、このシステム項目は宣言する必要がありません。どのようなプログラムを実行する際でも、必ずあるルールに沿って値が自動的に代入されていきます。

ABAPをコーディングする際には、このシステム項目の値を利用して条件を分岐させたり、画面に値を表示させたりすることができるため、使いどころがたくさんあります。

以下では、ABABerとして知らないと恥ずかしい代表的なシステム項目の意味と使い方の例を解説していきます。

SY-SUBRC

IF SY-SUBRC = 0.
  MESSAGE
    S001(ZZZ00)         " &1 に成功しました。
    WITH TEXT-S01.      " データ更新
ELSE.
  MESSAGE 
    E196(ZCM00)         " &1 に失敗しました。
    WITH TEXT-S01.      " データ更新
ENDIF.

もっとも基本的で、もっとも利用頻度の高いシステム項目です。

SY-SUBRCの「RC」は”Return Code”の略。その名の通り、処理の結果がその変数に値として入っています。処理の結果といっても、SELECT文などで抽出した結果が入るのではなく、その処理が成功したか否かが入ります。

他のプログラミング言語の経験者の方であればBoolean型の変数であると理解するとGood!

普通Boolean型はTrue/Falseのどちらかが設定されますが、SY-SUBRCの場合はもう少し細かい値(成功:0 / 失敗:4 / 特殊な失敗:8 など)が設定されます。

処理成功:SY-SUBRC = 0

処理が正常に完了した場合、変数には0が入ります。例えば、SELECT文で言えば目的のデータが取得された場合にSY-SUBRCに"0"がセットされます。

逆に0以外が入っていれば、処理が正常に終了しなかったことを示します。つまり、何らかの理由でデータが抽出できなかったことを意味します。

SELECT * FROM ZZT001
  WHERE QSSKZ IN QSTKZ.

IF SY-SUBRC <> '0'.
  MESSAGE E151.
ENDIF.

上記のように、IF文とセットで利用することが多いです。続けてエラーメッセージの出力処理や、処理中段のロジックを記述するのが一般的な使用例です。

IF SY-SUBRC = 0.
  MESSAGE
    S001(ZZZ00)         " &1 に成功しました。
    WITH TEXT-S01.      " データ更新
ELSE.
  MESSAGE 
    E196(ZCM00)         " &1 に失敗しました。
    WITH TEXT-S01.      " データ更新
ENDIF.

処理失敗:SY-SUBRC = 4

SY-SUBRC = 4 となるのは直前の処理が正常に終了しない場合です。

ただし、先ほど解説した通り「失敗」を表すのは4だけではなく、条件によっては8の場合もある点に注意。

「失敗の場合」のロジックを書きたい場合は、下記のように「SY-SUBRC <> 0」というように成功ではない場合の分岐を作るようにしましょう。

IF SY-SUBRC <> 0.
  FLG_ERR = 'X'.
    EXIT.
ELSE.

補足:ABAPにboolean型はある?

ここまで解説してきた通り、SY-SUBRCは他のプログラミング言語でいう「boolean」型の変数のような使い方がされていることが分かります。が、決してSY-SUBRCはBoolean型ではありません。INT型です。

ABAPにBoolean型のデータオブジェクトは存在しないという点を頭に入れておきましょう。

SY-DATUM

システム項目「SY-DATUM」には現在の日付が入ります。例えば選択項目の初期値に本日日付を入れるようなコードを書く場合などにこの変数が役立ちます。

SY-DATUMの値はサーバーの日付と一致します。

逆に言えば、サーバーの日付が実際とずれてしまっているような場合は、それに伴ってSY-DATUMの値もずれた状態となります。

SY-UNAME

SY-UNAMEは、ログインしているユーザIDが入ってきます。

ユーザIDに応じてデータの抽出結果を変えたい場合、帳票作成やALVを実行した人の名前を画面上に表示したい場合など。使いどころは工夫次第です。

SY-DBCNT

SY-DBCNTは、オープンSQLでデータベースを操作した際、処理に成功したレコード数を保持するためのシステム項目です。わかりやすい例でいえば、SELECT-SINGLE命令を発して、レコードの取得に成功した場合、SY-DBCNTには「1」が入ります。

レコード処理の成功可否については、SY-SUBRCに値が入ります。SY-DBCNTは、あくまでも「レコードの処理件数」が入ります。

一つの処理で、複数のシステム項目の値が変わるという点を理解しておきましょう。

SY-BATCH

SY-BATCHはプログラムの実行方法、すなわち今実行しているプログラムが「オンライン実行」されているのか?「バックグラウンド実行」されているのか?を判別するシステム項目です。

バックグラウンド実行の場合に「SY-BATCH」は「X」が設定されます。オンライン実行の場合はブランクです。バックグラウンド実行のみを許可しているプログラムでは、この「SY-BATCH」の値が「X」のみの場合に実行を許可する仕様にしています。

SY-TABIX

SY-TABIXは、現在ループしているテーブルの対象行を格納する項目です。

例えば、内部テーブルの10行目をループしている最中であれば、SY-TABIXには「10」が設定されます。

LOOP命令については以下の記事で解説しております。是非、この機会に合わせてご覧ください。

ここまで、システム項目が何なのか?どのようなものがあるのか?を解説してきました。

が、システム項目はこのページで解説したものだけではありません。実はもっと様々な種類が用意されています。システム項目の探し方をご紹介しておきます。

システム項目の探し方

システム項目を探す際はSE11:ABAPディクショナリから構造:SYSTを検索することで確認可能です。

システム項目とは、システム的に見ていくと構造「SYST」の1項目としての位置づけ。プログラム実行時にはこの構造に一気に値が設定されるという仕組みなのです。

構造とは?

システム項目利用時の注意点:無理やり値を変えないこと

最後に、システム項目を利用する際の注意点です。

システム項目を利用する際の唯一の注意点は、無理やり値を変更するようなコードにしない!ということです。

システム項目の値はあくまでもシステムが自動的に設定するものであって、開発者が自由に書き換えることは基本おすすめされていません。もちろん、システム的にABAP上で無理やり値を編集することは可能ですが、予期せぬエラーにつながる可能性が高いプログラムとなります。

筆者が過去に見た恐ろしいコードを最後にご紹介。このコードのやばさが分かればシステム項目の理解はOKです。

IF SY-SUBRC <> 0.
  SY-SUBRC = 0.
ENDIF.

ABAPを1から勉強したい方は

SAP/ABAPを1から学習したい初心者の方向けに、できるだけ網羅的にABAPが理解できるよう以下ページに知識体系を整理しています。

特に初心者のうちは、どこから学べばよいか?どう勉強すれば良いか?すらわからない状態になりがち。

ある程度の知識を持ったうえで、はじめて実践的な理解へとつながります。

是非、一度ご覧になってみてください。

タイトルとURLをコピーしました