印刷プログラムの範囲指定は DSPF を作成して行っている開発者も多いと思うが
範囲指定に DSPF を作成していたのでは、
- 毎度に作成する手間が要る
- 作成者によって画面イメージや操作が異なっていて統一できない
- レイアウトが面倒である
などの問題がある。
印刷指定を画面ファイル(DSPF)ではなくコマンド・プロンプトによって実現できれば
- レイアウトの手間は全く不要
- OS によるレイアウトなので誰が作っても同じ形式となる
- 作成が簡単
のように利点ばかりが目立つ。
なのに一般にコマンドによる印刷指定がまだまだ普及していないのは
- コマンドを作成するのは難しいのではないか
- コマンドでは独自の検査ができないのではないか
- コマンドでは表示をカスタマイズでくないのではないか
との疑問があるからではないだろうか ?
実はこれらの3つの疑問の答えはすべて NO である。
逆にコマンドであれば
- 簡単に作れて
- 見栄えもバランス良く
- カスタマイズも可能
になる。
ここでは印刷の範囲指定コマンドのパラメータの補足説明テキストを
カスタマイズする方法を紹介しよう。
例えば
月次入出庫表 日付 .................. 20150401 から 20150430 まで
のようなコマンド指定画面での「から」および「まで」を
表示する方法を解説する。
印刷用のコマンド・プロンプトではこのように範囲を指定することが多く
そのため「から」「まで」を指定できるようにすることが必要となる。
【コマンド・サンプル PRTINQ】
0001.00 CMD PROMPT(' 納期問合せ一覧表 ')
0002.00 PARM KWD(TAFROM) TYPE(*CHAR) LEN(4) CHOICE(*PGM) +
0003.00 CHOICEPGM(MYLIB/DSPRANGE) +
0004.00 PROMPT(' 担当者コード ')
0005.00 PARM KWD(TAEND) TYPE(*CHAR) LEN(4) DFT(9999) +
0006.00 CHOICE(*PGM) CHOICEPGM(YAMATO/DSPRANGE)
0007.00 PARM KWD(DATFROM) TYPE(*DEC) LEN(8 0) +
0008.00 CHOICE(*PGM) CHOICEPGM(YAMATO/DSPRANGE) +
0009.00 PROMPT(' 日付 ')
0010.00 PARM KWD(DATEND) TYPE(*DEC) LEN(8 0) +
0011.00 DFT(99999999) CHOICE(*PGM) +
0012.00 CHOICEPGM(YAMATO/DSPRANGE)
0013.00 PARM KWD(OUTPUT) TYPE(*CHAR) LEN(8) RSTD(*YES) +
0014.00 DFT(*PRINT) VALUES(* *PRINT) PROMPT(' 出力 ')

【解説】
パラメータ TAFROM は CHOCEPGM として MYLIB/DSPRANGE というプログラムが指定されている。
この MYLIB/DSPRANGE が「から」または「まで」の文字列を返すのである。
それでは MYLIB/DSPRANGE の CLPソースを見てみよう。
【CLPサンプル : DSPRANGE】
0001.00 PGM PARM(&CMDPRM1 &RTNVAR)
0002.00 /*-------------------------------------------------------------------*/
0003.00 /* DSPRANGE : 範囲を示す CHOICE PGM */
0004.00 /* CALLED BY CMD : PRTINQ, PRTRPY */
0005.00 /* */
0006.00 /* KWD に 'FROM' という文字列が含まれていれば ' から ' を */
0007.00 /* 戻し、そうでなければ ' まで ' を戻します。 */
0008.00 /* これによってコマンドのパラメータの後方に ' から ' と ' まで ' */
0009.00 /* を表示することができるようになります。 */
0010.00 /* */
0011.00 /* 2015/04/07 作成 */
0012.00 /*-------------------------------------------------------------------*/
0013.00 DCL VAR(&CMDPRM1) TYPE(*CHAR) LEN(21)
0014.00 DCL VAR(&CMD) TYPE(*CHAR) LEN(10)
0015.00 DCL VAR(&KWD) TYPE(*CHAR) LEN(10)
0016.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0017.00 DCL VAR(&RTNVAR) TYPE(*CHAR) LEN(2000)
0018.00 /*( QCLSCAN のための変数 )*/
0019.00 DCL VAR(&PATLEN) TYPE(*DEC) LEN(3 0) VALUE(4)
0020.00 DCL VAR(&STRPOS) TYPE(*DEC) LEN(3 0) VALUE(1)
0021.00 DCL VAR(&STRLEN) TYPE(*DEC) LEN(3 0) VALUE(10)
0022.00 DCL VAR(&RESULT) TYPE(*DEC) LEN(3 0)
0023.00 DCL VAR(&POS) TYPE(*DEC) LEN(3 0)
0024.00
0025.00 CHGVAR VAR(&CMD) VALUE(%SST(&CMDPRM1 1 10))
0026.00 CHGVAR VAR(&KWD) VALUE(%SST(&CMDPRM1 11 10))
0027.00 CHGVAR VAR(&TYPE) VALUE(%SST(&CMDPRM1 21 1))
0028.00 /*( テキスト )*/
0029.00 IF COND(&TYPE *EQ 'C') THEN(DO)
0030.00 CALL PGM(QCLSCAN) PARM(&KWD &STRLEN &STRPOS +
0031.00 'FROM' &PATLEN ' ' ' ' ' ' &RESULT)
0032.00 IF COND(&RESULT *NE 0) THEN(DO)
0033.00 CHGVAR VAR(&RTNVAR) VALUE(' から ')
0034.00 ENDDO
0035.00 ELSE CMD(DO)
0036.00 CHGVAR VAR(&RTNVAR) VALUE(' まで ')
0037.00 ENDDO
0038.00 RETURN
0039.00 ENDDO
0040.00
0041.00 ENDPGM

【解説】
OS によって パラメータ : &CVMDPARM1 にはキー・ワードのフィールド名 &KWD が入って渡される。
そこで QCLSCAN を使って ‘FROM’ という文字列を検索して見つかれば 「から」という文字列を返して
見つからなければ「まで」という文字列を返すようにしている。
これによって PRTINQ というコマンドをプロンプト表示すると下記のように表示される。

【参考】
一般にコマンドを F4キーを押してプロンプト表示することはよく知られているが
CLP 内の実行でプロンプト表示するには、コマンド名の先頭に文字 ? を付加して
?PRTINQ
のようにして実行すればプロンプト表示が実行される。
このように印刷の範囲指定のために DSPF を作成するよりは、コマンドによってプロンプト表示させたほうが
はるかに簡単でかつスマートな解決となる。
