IBM i 用のアプリケーションでは、ユーザーの「要求に応じて」レポートを作成するため、プログラムを2つ用意するのが一般的です。
第 1 のプログラムは対話的に動作します。まずユーザーに対して、レポートに記載するレコードの選択基準を指定するよう求めます。その後、この基準をパラメータとして渡し、バッチ処理でレポートを作成する第2のプログラムを呼び出します。
第 2 のプログラムは、選択基準をパラメータとし、バッチ方式で起動されて、実際にレポートを作成します。
このように2つに分割するのは、多くの場合レポート作成にはかなりのデータベース I/O を要するため、対話型の環境で動かしたのでは時間がかかりすぎて使いにくいからです。
プログラム自体は分割せずに、同等の効果を得ることも可能です。例えば次の PRNTBCH ファンクションを考えてみましょう。これは GLPROC01 プロセスに属します。
DEF_LINE NAME(#LINE01)
FIELDS(#GLNUMB #BATCH #CREDIT #DEBIT)
DEFINE FIELD(#MINCREDIT) REFFLD(#CREDIT)
IF COND('*JOBMODE = I')
REQUEST FIELDS(#GLNUMB #BATCH #MINCREDIT)
SUBMIT PROCESS(GLPROC01) FUNCTION(PRNTBCH)
EXCHANGE(#GLNUMB #BATCH #MINCREDIT)
ELSE
SELECT FIELDS(#CREDIT #DEBIT) FROM_FILE(GLMASTV3)
WITH_KEY(#GLNUMB #BATCH)
WHERE('#CREDIT *GE #MINCREDIT')
PRINT LINE(#LINE01)
ENDSELECT
ENDPRINT
ENDIF
「*JOBMODE = 1」として対話的に起動した場合は、ユーザーに対して元帳番号、バッチ番号、貸方金額の最小値を入力するよう求めます。その後、このデータをパラメータとして、自分自身をバッチ的に起動します。
バッチ的に起動された場合、論理ファイルGLMASTV3から条件に合致するレコードだけを検索し、レポートとして出力します。#GLNUMB、#BATCH、#MINCREDITの各フィールドの初期値は、対話的に起動されたファンクションから呼び出される際に渡された、パラメータによって決まります。