コマンド

26. 印刷指定をコマンドでカッコ良く実現しよう

印刷プログラムの範囲指定は 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(' 出力 ') 
【解説】

パラメータ TAFROMCHOCEPGM として 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 を作成するよりは、コマンドによってプロンプト表示させたほうが
はるかに簡単でかつスマートな解決となる。