【SAP】バックグラウンド実行プログラムをデバッグする

ABAP

ABAPのプログラム実行方法は2種類存在します。

1つが、オンライン実行

もう1つが、バックグラウンド実行です。

本記事では、前提知識として2つの実行方法の違い、利用シーンについて解説。その後、デバッグできないバックグラウンド実行プログラムをどうにかデバッグする方法を解説します。

スポンサーリンク
スポンサーリンク

オンライン実行とは

オンライン実行とバックグラウンド実行の大きな違い。語弊を恐れずに説明すれば、ユーザによる「画面入力」があるものがオンライン実行ないものがバックグラウンド実行です。

イメージが浮かびやすいように、順を追って説明します。

基本的にABAPのプログラムが開始されると、まずユーザが最初に行うのは画面選択、値入力です。

例として、未転記伝票入力(トランザクションコード:FBV1)を考えてみると

① ユーザがトランザクションコード「FBV1」を実行する

② トランザクションコード:FBV1に紐づくプログラム「 SAPMF05V 」が実行される

③ プログラム:SAPMF05V が実行されると、未転記伝票入力画面が表示される。この際、ヘッダーデータの入力や、明細データの入力などデータの種類によって複数の画面が表示されます。

④ 保存ボタンを押下すると、チェック処理が行われデータがテーブルへ保存されます。

太字下線で示した部分が、オンライン実行の特徴です。画面の入力値によって、プログラムの動きや実行タイミングが動的に変わります。

オンライン実行のデメリット

オンライン実行のデメリットは、リソースを多く利用してしまう傾向にあることです。例えば、トランザクションコード:FBV1を入力した後に、ユーザがデータを入力する時間。この間、このプログラムは常に動き続けているため、メモリやCPUなどのリソースを占有していることになります。

※オンライン実行の場合、画面数に応じてワークプロセスを占有するため、1ユーザだけで複数のワークプロセスを利用してしまうことがあります。

このため、オンライン実行には制限時間が設けられています。デフォルトでは、5分ですが、設定次第で短くすることも長くすることも可能です。制限時間を越えてプロセスが実行された場合、強制終了されます。

バックグラウンド実行は、このオンライン実行のデメリットを考慮せずに実行が可能。つまり、①コンピュータリソース、及びワークプロセスを占有過多を防ぎつつ、②長時間の処理を行いたい場合に向いています。

バックグラウンド実行とは

バックグラウンド実行はオンライン実行の対となる概念です。

バックグラウンド実行では、画面の表示を伴いません。そのため、使用されるリソースが限定され、効率的な資源利用が可能となります。

※画面入力を必要とする処理をバックグラウンド実行するためには、追加の設定が必要となります。

他システムからのインターフェース処理や、DB再編成(※ざっくり言うと、データベースを綺麗にする処理)などがバックグラウンド実行に適した処理の代表例です。

画面操作を伴う処理(ユーザが実業務で利用する処理)はオンライン実行で。データ更新処理などの画面操作を伴なわない処理はバックグラウンド実行を利用することになります。

バックグラウンド実行のメリット

オンライン実行と比較した際、バックグラウンド実行には2つのメリットがあります。

① スケジューリングできる

オンライン実行はスケジューリングができません。これは、ユーザの画面入力が処理のトリガーとなるためです。

対してバックグラウンド実行の場合、ジョブを組むことによって定期的に処理を行うことが可能です。DB再編成処理や、データ更新処理など、日次・月次で処理が決まっている場合は、このスケジューリング機能が威力を発揮します。

毎日決まった時間にユーザがマニュアルで実行する必要がなくなります。

スケジューリングには、ジョブの優先度を設定することも可能です。

② リソース配分が最適化できる

①で解説したように、バックグラウンド実行はスケジューリングが可能です。よって、長時間で重めの処理を、リソース利用が少ない夜間に実行することが可能です。

バックグラウンド実行と、オンライン実行はその特性を踏まえて適切な利用方法を検討していきましょう。

バックグラウンド実行のデメリット

バックグラウンド実行のデメリットとして、最大だと思うのが

「デバッグができない!」

ことです。

デバッグはオンライン実行のみで可能なのです。恐らくページにたどりついた方の半分は「バックグラウンド実行 デバッグ」などで検索された方だと思います。

最後にこの障壁を乗り越える裏ワザを紹介して解説を終えます。

※デバッグって何?そんな方はこちらから先にご覧ください。

バックグラウンド実行プログラムをdebugする!

代表的な裏技は全部で3つ。

方法①②はコピープログラム作成が前提です。同じプログラムを何度もデバッグする場合に向いています。また、直接コードを修正するので注意が必要であり、ブラックボックスである標準プログラムには向きません。

方法③は、一番簡易で現実的な方法です。標準プログラム、アドオンプログラム問わず最も効率的な方法です。

方法① SY-BATCH行をコメントアウト

バックグラウンド実行プログラムには以下のようなコードがあります。

CHECK SY-BATCH IS NOT INITIAL. 

バックグラウンド実行プログラムが、バックグラウンド実行しかできないのはこのコードがあるからです。

SY-BATCHはバックグラウンド実行の場合に「X」が格納されます。もし、ここに「X」が格納されていれば、そのプログラムは「バックグラウンド実行されている」ことになりますし、ブランクであれば「オンライン実行」されているということになります。

先ほどの1行で、SY-BATCHが空白でないこと、つまりバックグラウンド実行でプログラムが動かされていることを、このコードで制限しているわけです。

ので、このコードがなければバックグラウンド実行のみが許可されているプログラムでもオンライン実行が可能になり、デバッグができるようになります。

したがって、「SY-BATCH」が含まれる行をコメントアウトすればデバッグができるようになります。

※システム項目?という方はこちら。

方法② SY-BATCHに「X」を入れる

前述したように、バックグラウンド実行しかできないプログラムは、SY-BATCHの値によって制限しています。

つまり、SY-BATCHに「X」を格納する記述をすれば、オンライン実行が可能となりデバッグができるようになります。

コメントアウトの方が楽かと思いますので、①を推奨します。

方法③ デバッグ中に「SY-BATCH」の値書き換え

(1)プログラムをSE38から実行

(2)/h でデバッグ起動

(3)実行後に「SY-BATCH」の値を「X」に書き換え

こうすることで、動的にオンライン実行の状態を再現することができます。

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