ABAPのプログラム実行方法は2種類存在します。1つが、オンライン実行。もう1つが、バックグラウンド実行です。
後者のバックグラウンド実行は、JP1などのジョブ管理システムによって制御され、夜間や早朝などエンドユーザが意識しないところ(システムの裏側)で実行される仕組みです。現場によっては、「バッチ」や「バッチプログラム」、単に「ジョブ」などと呼ばれます。
本記事では、オンライン実行とバックグラウンド実行の違い、利用シーンについて解説。その後、本来デバッグできないバックグラウンド実行プログラムをどうにかデバッグする方法を解説します。
ABAPerであれば、知っておくと「いざという時」に役立つ必須知識です。是非最後までご覧ください。
SAP:オンライン実行とバックグラウンド実行の違い
オンライン実行とバックグラウンド実行の違い。
語弊を恐れず説明すると、表から動くか裏から動くか?の違いだけ。
表というのは、SAPの画面(GUI)から指示を飛ばすことで、エンドユーザが利用する形式です。裏はその逆で画面上の操作を伴わない形式をとります。
つまり、オンライン実行とバックグラウンド実行の違いは単に実行される形式が違うだけであって、動くプログラムの中身は同一です。
あくまでも、動かし方の違いであるという点に注意しましょう。
例えば、とあるプログラムをSAP GUIから呼び出して実行する場合はオンライン実行。事前にジョブとして定義しておき裏で勝手に動きだすようにしておけばバックグラウンド実行となります。
GUIは、グラフィカルユーザインターフェース(Graphical User Interface)を略した単語で「ぐい」と読みます。
マウスやタッチパネルで操作ができる画面であれば、GUIと呼んでOK。GUIと対となる概念がCUIです。GUIとCUIについて詳しく知りたい方は以下の記事をご覧ください。
オンライン実行のデメリット
オンライン実行のデメリットは、CPUなどの限られたリソースを多く消費してしまうこと。バックグラウンド実行では、画面遷移を伴わないため、画面上に描画する時間や処理が存在せず、リソースの消費を抑えることが可能です。
オンライン実行の場合、画面数に応じてワークプロセスを占有していく仕組みのため、1ユーザだけで複数のワークプロセスを利用してしまうこともあり、CPUやメモリを多く占有します。
そのため、オンライン実行には実行時間に制限が設けられており、デフォルトでは5分間1つの処理が続くとプロセスが矯正終了されます。
オンライン実行時間の制御は、システムプロファイルパラメータ rdisp/max_wprun_time の値(デフォルト値「300」)にて行われます。
SAP:バックグラウンド実行とは
先にも説明した通り、バックグラウンド実行では、画面の表示を伴いません。そのため、使用されるリソースが限定され、効率的な資源利用が可能となります。
画面遷移を伴わない分、事前にプログラム実行時のパラメータ(バリアント)の設定等が必要となります。
他システムからのインターフェース処理やDB再編成(※ざっくり言うと、データベースを綺麗にする処理)などがバックグラウンド実行に適した処理の代表例です。
画面操作を伴う処理(ユーザが実業務で利用する処理)はオンライン実行で。データ更新処理などの画面操作を伴なわない処理はバックグラウンド実行を利用することになります。
バックグラウンド実行のメリット
オンライン実行と比較した際、バックグラウンド実行には2つのメリットがあります。
メリット1:スケジューリング可能
バックグラウンド実行の場合、ジョブを組むことによって定期的に処理を行うことが可能です。DB再編成処理や、データ更新処理など、日次・月次で処理が決まっている場合は、このスケジューリング機能が威力を発揮します。
いちいち画面上から決まった操作を行う必要がなくなります。
メリット2:リソース配分の最適化
また、エンドユーザがシステムを利用しない夜間や休日などに処理を走らせるようにすることで、限られた資源を効率よく利用することが可能です。
メモリやCPUを多く占有する処理を日中帯に走らせてしまえば、その分エンドユーザのオンライン処理に影響が出てしまいます。
夜間や早朝帯に特定のプログラムをバックグラウンド実行することによってシステム全体を通しての効率的な運用が可能となります。
バックグラウンド実行のデメリット
使い方を間違わなければバックグラウンド実行にはメリットしかありません。そのため、バックグラウンド実行の選択肢をとりうるプログラムはできるだけバックグラウンド実行の設定をしておくのが定石。
ただし、ABAPerにとっては唯一「デバッグができない!」というデメリットが存在します。
実は、デバッグはオンライン実行時のみ可能。恐らくページにたどりついた方の半分は「バックグラウンド実行 デバッグ」などで検索された方だと思いますが、プログラムをバックグラウンド実行した場合、途中でデバッガを立ち上げてデバッグすることができません。
最後にこの障壁を乗り越える裏ワザを紹介して解説を終えます。
デバッグ(DEBUG)とは、プログラムを1行1行実行し、プログラムの不備やバグを発見する作業のこと。
システムに障害が発生した際や、コーディング後想定通り処理が動かない場合、なぜそのバグが起こったのか?を確認する手段として用います。
実際のプログラムを1ステップずつ実行しながら、その時の変数の値・構造/内部テーブルに格納されているレコードを確認。バグの調査においては必要不可欠の必須スキルです。
バックグラウンド実行プログラムをデバッグする!
代表的な裏技は2つ。
1つずつ順を追って解説します。
方法1:SM37からコマンド「jdbg」を実行する
意外としらないABAPerが多いのがこの裏技。一番効率的で正確なやり方です。
バックグラウンド実行のログはトランザクションコード:SM37から確認できますが、ここでデバッグをしたいログにカーソルを当てて、コマンドに「JDBG」を入力します。
これだけで、そのログに記録されているプログラム×バリアントがデバッガの起動とともに実行されます。
あくまでも、デバッグ中はオンライン実行の状態となりますが、バックグラウンド実行の状態を模してプログラムが処理されます。
方法2:システム項目「SY-BATCH」の値を「X」にする
方法1と意味的には同一です。
プログラム実行中に、そのプログラムがオンラインで実行されているのか?バックグラウンドで実行されているのか?という情報をシステム項目「SY-BATCH」が保持しています。
バックグラウンド実行の場合、「SY-BATCH」は「X」に。オンライン実行の場合、値はブランクとなります。
この「SY-BATCH」の値を無理やり「X」とすることで、そのプログラムがバックグラウンド実行されている状態を再現することが可能です。
システム項目とはSAP側で値が自動的に付与される項目(変数)のこと。中身をより詳しく知りたい方はこちらの記事をご覧ください。
SAP/ABAPを1から学習したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!