外部コマンドとは、その名の通りSAP上からOSコマンド(LinuxやAIXなど)やバッチやシェルを動かすときに利用する機能です。
例えば、サーバー上に配置されているファイル名称を取得したい!(Linuxのlsコマンド)といった場合や、ABAPからFTP連携できる仕組みを実現したい!といった場合に外部コマンドが活躍します。
このページでは、外部コマンドの仕組みを初心者向けに1から分かりやすく解説し、ABAPプログラミングのサンプルまでをご紹介します。
ちょっとニッチな機能ですが、これを知っていればABAPerとしての幅が広がる便利な知識です。是非最後までご覧ください。
外部コマンドとは?
外部コマンドとは、その名の通りサーバ上で直接OSコマンド(もしくはバッチorシェル)を実行する仕組みのこと。
トランザクションコード:SM69で事前に定義しておき、ABAPプログラムから呼び出す形で利用します。
SAPはあくまでもソフトウェア製品の1つなので、あくまでも何かしらのサーバー上に乗っかっている状態。このサーバーに対して直接コマンドを受け渡す唯一の手段は外部コマンドです。
サーバーとSAPの関係性をイメージできない方は、こちらの記事をご参照ください。
SM69:外部コマンドの登録方法
外部コマンドの事前定義はトランザクションコード:SM69から実行します。ここでは、外部コマンドの定義方法を必要最低限の項目に絞って解説。
外部コマンドというと何か難しいように感じますが、決して難しくはありませんので1個1個ゆっくり確認していきましょう。
コマンド定義
まずはじめにコマンド名を定義します。コマンド名は、特に制約なくどのような名称でも問題ありません。
標準であらかじめ用意されているコマンドも存在するため、頭に「Z」を付与しておくのがお勧めです。
オペレーティングシステムの項目で、OSの種類を指定します。上の画像では「Linux」を指定していますが、他にUNIX系のサーバやWindowsなどを選択することができます。
オペレーティングシステム項目の選択は、入力ミス防止の観点から検索ヘルプ経由の入力しか認められていません。
なお、ここで何も選択しないことも可能です。その場合、SAPは自動的に対象のオペレーティングシステムを選定する仕組みです。ただし、この自動選定には限界があるため、動作環境が確定している場合は明示的に対象のOSを指定するのがおすすめです。
OSコマンド定義
OSコマンド項目に外部コマンドを定義します。画像の例は、Linux上でファイル一覧を取得する「ls」コマンド定義です。
OSコマンドのパラメータに、例えば特定のディレクトリを指定しておけばそのディレクトリにあるファイル一覧を表示することができます。
あえて何も設定せず、追加パラメータはABAPのプログラムから渡すようにするのが一般的です。
実際のコーディング方法はページ後半で。
これで、外部コマンド定義は完了。SM69の画面上で実行ボタンを押せば実際に外部コマンドをサーバー上に渡すことが可能で、結果も確認することが可能です。
ABAPプログラムからの外部コマンド実行
ここからはSM69で定義した外部コマンドをプログラム上で実行する方法を解説します。
SXPG_CALL_SYSTEM
外部コマンドの実行は、SAP標準の汎用モジュール「SXPG_CALL_SYSTEM」を利用します。
汎用モジュールは、一言でいえば「再利用可能なプログラムの部品」です。事前にロジックを定義しておき、後から呼び出す形で利用します。
汎用モジュールって?という方はこちらの記事をご覧ください。
汎用モジュール「SXPG_CALL_SYSTEM」のサンプルプログラムはこちら。
CALL FUNCTION 'SXPG_CALL_SYSTEM' EXPORTING COMMANDNAME = 'ZLS' ADDITIONAL_PARAMETERS = '/test/test/test/' IMPORTING STATUS = LV_STATUS EXITCODE = LV_EXITCODE TABLES EXEC_PROTOCOL = LT_TBL EXCEPTIONS NO_PERMISSION = 1 COMMAND_NOT_FOUND = 2 PARAMETERS_TOO_LONG = 3 SECURITY_RISK = 4 WRONG_CHECK_CALL_INTERFACE = 5 PROGRAM_START_ERROR = 6 PROGRAM_TERMINATION_ERROR = 7 X_ERROR = 8 PARAMETER_EXPECTED = 9 TOO_MANY_PARAMETERS = 10 ILLEGAL_COMMAND = 11 OTHERS = 12.
Exportパラメータ | 説明 |
---|---|
COMMANDNAME | 外部コマンド名称(SM69で定義したコマンド名) |
ADDITIONAL_PARAMETERS | 外部コマンドへ渡すパラメータ |
Importパラメータ | 説明 |
---|---|
STATUS | 外部コマンドが正常に実行できたかどうか? |
EXITCODE | 外部コマンドから返却されるリターンコード |
Tablesパラメータ | 説明 |
---|---|
EXEC_PROTOCOL | 外部コマンドの出力結果 |
たったこれだけで、SAPにおける外部コマンドの利用はOKです。
実際に外部コマンドを利用するサンプルコードを以下に記載します。
REPORT Z_EXECUTE_OS_COMMAND. DATA: LS_COMMAND TYPE XSTRING, LT_OUTPUT TYPE TABLE OF STRING, LS_OUTPUT LIKE LINE OF LT_OUTPUT. LS_COMMAND = 'LS -L'. " 実行するOSコマンドを設定 CALL FUNCTION 'SXPG_CALL_SYSTEM' EXPORTING COMMANDNAME = LS_COMMAND TABLES EXEC_PROTOCOL = LT_OUTPUT EXCEPTIONS NO_PERMISSION = 1 COMMAND_NOT_FOUND = 2 PARAMETERS_TOO_LONG = 3 SECURITY_RISK = 4 WRONG_SHELL = 5 CANNOT_EXECUTE_COMMAND = 6 PROGRAM_START_FAILED = 7 PROGRAM_TERMINATION_FAILED = 8 X_ERROR = 9 PARAMETER_EXPECTED = 10 TOO_MANY_PARAMETERS = 11 ILLEGAL_COMMAND = 12 WRONG_ASYNCHRONOUS_TYPE = 13 JOBCOUNT_ERROR = 14 OTHERS = 15. IF SY-SUBRC = 0. LOOP AT LT_OUTPUT INTO LS_OUTPUT. WRITE: / LS_OUTPUT. ENDLOOP. ELSE. WRITE: / 'ERROR OCCURRED: ', SY-SUBRC. ENDIF.
上記のコードでは、 汎用モジュール "SXPG_CALL_SYSTEM" を使用して、 "ls -l" コマンドを実行し、その結果を出力します。
SXPG_CALL_SYSTEM 関数は、 commandname パラメーターに実行するコマンドを指定し、 exec_protocol パラメーターに出力を格納するテーブルを指定します。関数の呼び出し後、出力をループして表示します。
関連 DATA命令 / LOOP命令 / SY-SUBRC / WRITE命令
ABAPを1から学習したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!