印刷プログラムの範囲指定は DSPF を作成して行っている開発者も多いと思うが
範囲指定に DSPF を作成していたのでは、
などの問題がある。
印刷指定を画面ファイル(DSPF)ではなくコマンド・プロンプトによって実現できれば
のように利点ばかりが目立つ。
なのに一般にコマンドによる印刷指定がまだまだ普及していないのは
との疑問があるからではないだろうか ?
実はこれらの3つの疑問の答えはすべて NO である。
逆にコマンドであれば
になる。
ここでは印刷の範囲指定コマンドのパラメータの補足説明テキストを
カスタマイズする方法を紹介しよう。
例えば
月次入出庫表 日付 .................. 20150401 から 20150430 まで
のようなコマンド指定画面での「から」および「まで」を
表示する方法を解説する。
印刷用のコマンド・プロンプトではこのように範囲を指定することが多く
そのため「から」「まで」を指定できるようにすることが必要となる。
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ソースを見てみよう。
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 を作成するよりは、コマンドによってプロンプト表示させたほうが
はるかに簡単でかつスマートな解決となる。