ABAPのコーディングをしていく上で必ず1度は必要になる知識が「システム項目」です。
システム項目とはSAP側で値が自動的に付与される項目(変数)であり、ABAPのプログラム実行時にはこのシステム項目の値を条件として利用するなど、このページの知識は必須と言えます。
ABAPを読んだことがある人であれば「SY-SUBRC(サブアールシー)」という言葉を聞いたことがある人もいるかもしれません。このページでは「SY-SUBRC」以外にもABAPにおける様々なシステム項目の意味と使い方、覚えておきたい代表的なシステム項目を解説します。
- システム項目とは何か?
- SY-SUBRCとは?
- これだけは覚えておきたいシステム項目
- SY-DATUM
- SY-UNAME
- SY-DBCNT
- SY-BATCH
- SY-TABIX
- システム項目利用時の注意点
- システム項目の探し方
ABAPerを目指す方や、SAPに関係する仕事をしている方であれば知らないと恥ずかしい超・基本知識ばかりですので是非最後までご覧ください。
システム項目(システム変数)とは?
システム項目とは、プログラム実行時にシステムが値を設定している変数(のようなもの)です。
例えば、プログラムの中で本日の日付を取得したいような場合。1からコーティングで日付を導く必要はありません。プログラム実行時に既に自動的に「SY-DATUM」というシステム項目に当日の日付が設定されており、そちらを参照するだけでOKとなります。
このように、ABAPプログラミングを行う中で汎用的に必要となるような情報は大体システム項目が持っています。
本来、変数はDATA命令を用いて事前に定義しておく必要がありますが、このシステム項目は宣言する必要がありません。どのようなプログラムを実行する際でも、必ずあるルールに沿って値が自動的に代入されていきます。
ABAPをコーディングする際には、このシステム項目の値を利用して条件を分岐させたり、画面に値を表示させたりすることができるため、使いどころがたくさんあります。
以下では、ABABerとして知らないと恥ずかしい代表的なシステム項目の意味と使い方の例を解説していきます。
SY-SUBRC

もっとも基本的で、もっとも利用頻度の高いシステム項目です。
SY-SUBRCの「RC」は”Return Code”の略。その名の通り、処理の結果がその変数に値として入っています。処理の結果といっても、SELECT文などで抽出した結果が入るのではなく、その処理が成功したか否かが入ります。
他のプログラミング言語の経験者の方であれば「Boolean型」の変数であると理解すると良いでしょう。(ABAPではTrue/Falseだけでなくもう少し細かく値が設定されます。)
処理成功:SY-SUBRC = 0
処理が正常に完了した場合、変数には0が入ります。例えば、SELECT文で言えば目的のデータが取得された場合にSY-SUBRCに"0"がセットされます。
逆に0以外が入っていれば、処理が正常に終了しなかったことを示します。つまり、何らかの理由でデータが抽出できなかったことを意味します。
SELECT * FROM ZZT001 WHERE QSSKZ IN QSTKZ. IF SY-SUBRC <> '0'. MESSAGE E151. ENDIF.
IF SY-SUBRC=0.
上記のように、IF文とセットで利用することが多いです。「もし処理が正常に完了したら、、、」という意味です。
逆に正常終了しない場合は
IF SY-SUBRC <>0.
以上のように記述し、続けてエラーメッセージの出力処理や、処理中段のロジックを記述するのが一般的な使用例です。
処理失敗:SY-SUBRC = 4
SY-SUBRC = 4 は、処理が正常に終了しない場合にセットされます。
ただし、実際のコーディングでは「SY-SUBRC = 4」ではなく、「SY-SUBRC <> 0」と記述することが普通です。
IF SY-SUBRC <> 0. FLG_ERR = 'X'. EXIT. ELSE.
理由は、処理失敗の場合に「SY-SUBRC」は1・2・3にもなる可能性があるためです。正常終了の場合は常に0と決まっていますが、正常ではない場合はそのパターンに沿って様々な値が入りえます。
通常の実務レベルでは「1~4」の区別はそこまで必要とされませんが、0以外であれば何かしらのエラー状態となっていることが分かります。そのため、基本は「SY-SUBRC<>0」で例外処理へ分岐させます。
補足:ABAPにboolean型はある?
ここまで解説してきた通り、SY-SUBRCは他のプログラミング言語でいう「boolean」型の変数のような使い方がされていることが分かります。
ABAPにBoolean型のデータオブジェクトは存在しないため、このシステム項目「SY-SUBRC」が利用されます。主に、IF文とセットで利用されるのが普通です。
SY-DATUM
現在の日付が入ります。
例えば選択画面の初期値に本日日付を入れるようなコードを書く場合、この変数が役立ちます。
また、本筋とは異なりますが、システム日付を知りたい場合なんかにも使えます。
SY-UNAME
SY-UNAMEは、ログインしているユーザIDが入っています。
これも選択画面の初期値にログインユーザのIDを入れておくなど、使えると便利な変数です。
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」が設定されます。
システム項目に関するFAQ
システム項目は別の値で上書きして良いか?
結論、システム項目は基本的に上書きはしないほうが良いです。プログラム的には明示的に値を上書きすることは可能なのですが、予期しないエラーが発生することがあります。
また、そもそもシステム項目は予め設定されていることがメリットなので、そこを上書きすることはそもそもの思想と反してしまいます。
基本、明示的にシステム項目への値を設定するのではなく、参照項目として利用するのが原則です。
システム項目を探す方法
上記代表的な3選を解説しましたが、その他の項目はどうすればよいでしょうか?ググるのもありですが、ご存知のようにSAPに関する知見はあまり存在しませんので、 SE11(ABAPディクショナリ)からテーブル「SYST」を検索する方法でSY-XXXXをお探しください。
トリビア:覚えておくと1ランクUP
上記の「システム項目を探す方法」を解説した時点で「ピンときた」方もいらっしゃるかもしれませんが、システム項目は「SYST」という構造データの一部です。
ゆえに、システム項目を調べるときは「SYST」というデータベースを調べるわけです。
※構造?変数? 疑問に思った方は以下のページも参考にお読みください。
ABAPを1から学習したい方は
ABAPを1から学習したい方のために、ABAPに関わる基本知識を1つのページにまとめました。
こちらの記事では、ABAPを用いて簡単な機能を実装できるようにするための必須知識を解説しております。今、本サイトで一番人気の記事ですので是非合わせてご覧ください。