帳票設計を機能アップ

最近はコロナ禍の影響もありペーパレスが一段と進んでいます。

帳票出力の要望は少なく、もっぱらCSV出力になっていました。その方がデータとして活用もできて文字数の制限も少ないので、開発者もエンドユーザーもWinWinじゃないでしょうか(某総理の口調です)

帳票設計は作ってはいましたが、画面設計を流用してごまかし程度のものでした。

 

先日、私の友人(ASSGの開発協力者です)に「単票のやや込み入ったレイアウトでPDF形式の帳票を作りたい」との相談を受けました。サンプルを見ると罫線とフォントサイズがネックになりそうです。罫線は「DFNLIN]でDDSSRCを生成していましたが、PDF出力のためには「DEVTYPE(*AFPDS)」の指定が必要で、この場合「DFNLIN」は使えず「LINE」指定になります。「LINE」指定の場合は位置の単位はインチかセンチメートルです。帳票設計に[DFNLIN/LINE][INCH/CM]の指定を追加しました。またフォント種類によっては罫線がずれるケースもあるため、上下左右の微調整も追加しました。

 

もう一つのネックがフォントサイズです。私の固定概念では横幅は15CPI、縦は6LPI、フォント種類は固定がオフコンのあるべき姿じゃないでしょうか(しつこいか)

でも今ではフォント資源を使って書体やサイズが変更できます。一番困るのが小さい文字サイズです。デザインシートでは1つのセルを15CPI/6LPIで設定しているのですが、そこに10文字文のエリアを確保しても、小さい文字サイズでは11文字以上入るのです。そこでフィールド設定ウィンドウで、固定情報の場合は代替テキストの設定、フィールド情報の場合は隠し長を設定できるようにしました。

フォント種類については「CDEFNT/IGCCDEFNT」をOVRPRTFで設定するか、またはフィールド属性で設定します。

罠が1つ・・・

機能アップ後のASSGで帳票設計したところ、コンパイルエラーになりました。理由はレコードあたりのコード文字数は5000文字まででした。(なぜ?)

仕方がないので一定行数でレコードを分割することにしました。生成されたPRTSRCを見て、WRITE文を追加するようにしてください。

 

依頼元の友人には、「この帳票のDDSSRCを手作業で書いていたら何日かかるかわからないし、 罫線がずれたら調べるのも至難の業。ASSGがあればチョチョイノチョイで助かるわ」とお褒めの言葉を頂きました。昔流行った言葉を思い出しました。

WYSIWYG What You See Is What You Get 

 それでは

ひとりごと CNTFLDの罠

いつの頃からあるのか分からないのですが、2行以上にまたがる入カフィールドが可能ですね。幾つか制約があって、出カフィールドはダメ(入出力の保護にして回避)、サブファイルはダメですね。

今日知ったのは、前のフィールドとは2桁以上空けないとダメ。マニュアルにちゃんと書いてました。ふつうは属性保持用に1桁だけど、CNTFLDはそれじゃ足りないんですかね。

ASSGでもCNTFLD対応してますが、このチェックはしてません。

自動生成サブルーチン #disp_record_SEARCHについて

#disp_record_SEARCHは検索のサブルーチンです。

画面設計の[検索]のオウンコードをサブルーチンにします。

一例として検索のオウンコードと、生成後のRPGコードを紹介します。

[検索のオウンコード]

=======================================

CALLP SRCTOK
(SRCTOK_TCD:SRCTOK_TNM:SRCTOK_RTN);
IF SRCTOK_RTN = *BLANK; //リターンコード A 1
 %FIELD = SRCTOK_TCD; //得意先コード A 4
 %FIELDN = SRCTOK_TNM; //得意先名 A 32
 %PCN = *ON;
ELSE;
 %PC = *ON;
ENDIF; 

=======================================

[生成後のRPGコード]

=======================================

0215 //--------------------------------------------------------------------
0216 // #DSP04_SEARCH 検索
0217 //--------------------------------------------------------------------
0218 BEGSR #DSP04_SEARCH;
0219  EXSR #DSP04_INITATR;
0220  //
0221  //カーソル位置
0222  WLIN = WSLIN / 256;
0223  WCOL = %REM(WSLIN:256);
0224  //得意先コード検索----------------------------
0225  IF WLIN= 3 AND WCOL >= 21 AND WCOL <= 24;
0226   CALLP SRCTOK
0227   (SRCTOK_TCD:SRCTOK_TNM:SRCTOK_RTN);
0228   IF SRCTOK_RTN = *BLANK; //リターンコード A 1
0229    D4CDTK = SRCTOK_TCD; //得意先コード A 4
0230    D4NMTK = SRCTOK_TNM; //得意先名 A 32
0231    *IN32 = *ON;
0232   ELSE;
0233    *IN31 = *ON;
0234   ENDIF;
0235   LEAVESR;
0236  ENDIF;
0237 ENDSR;

=======================================

置換式については#disp_record_CHECKと同様です。

 自動生成では、カーソル位置の判定が組み込まれます。

0222-0223で検索キーを押したときのカーソル位置を取得します。

0225でフィールド位置を判定し、該当した場合に検索コードを実行します。

 

フィールドの位置を移動して検索ができなくなった、というミスを防ぐことができます。

今回は以上です。

 

自動生成サブルーチン #disp_record_CHECKについて

#disp_record_CHECKは入力チェックのサブルーチンです。

画面設計の[入力チェック]のオウンコードをサブルーチンにします。

一例として入力チェックのオウンコードと、生成後のRPGコードを紹介します。

[入力チェックのオウンコード]

=======================================

//必須チェック
 IF %FIELD = *BLANK;
  MSG = '%ITEMを入力してください';
  EXSR #MSG;
  *IN90 = *ON;
  %PC = *ON;
  %ATR = X'35';
 ENDIF;
//マスタチェック
 %FIELDN = *BLANK;
 IF %FIELD <> *BLANK;
  EXEC SQL SELECT * INTO DS_TKMP FROM TKMP
  WHERE TKCDTK = :%FIELD;
  IF SQLCODE = *ZERO;
   %FIELDN = TKNMTK; //得意先名 文字 32
  ELSE;
   MSG = '%ITEMが得意先マスタに見つかりません';
   EXSR #MSG;
   *IN90 = *ON;
   %PC = *ON;
   %ATR = X'35';
  ENDIF;
 ENDIF; 

=======================================

[生成後のRPGコード]

=======================================

0182 //--------------------------------------------------------------------
0183 // #DSP04_CHECK 入力チェック
0184 //--------------------------------------------------------------------
0185 BEGSR #DSP04_CHECK;
0186  //表示属性初期化
0187  EXSR #DSP04_INITATR;
0188  //
0189  *IN90 = *OFF;
0190  // 得意先コード 入力チェック----------------------------
0191  //必須チェック
0192   IF D4CDTK = *BLANK;
0193    MSG = '得意先コードを入力してください';
0194    EXSR #MSG;
0195    *IN90 = *ON;
0196    *IN31 = *ON;
0197    D4P31 = X'35';
0198   ENDIF;
0199  //マスタチェック
0200   D4NMTK = *BLANK;
0201   IF D4CDTK <> *BLANK;
0202    EXEC SQL SELECT * INTO DS_TKMP FROM TKMP
0203    WHERE TKCDTK = :D4CDTK;
0204    IF SQLCODE = *ZERO;
0205     D4NMTK = TKNMTK; //得意先名 文字 32
0206    ELSE;
0207     MSG = '得意先コードが得意先マスタに見つかりません';
0208     EXSR #MSG;
0209     *IN90 = *ON;
0210     *IN31 = *ON;
0211     D4P31 = X'35';
0212    ENDIF;
0213   ENDIF;
0214 ENDSR;

=======================================

ASSGコードの[%]で始まる置換式が、RPGコードでフィールド名や標識に置換されていることを確認してください。 

 

上記のASSGコードで使用している置換式

 %FIELD:フィールド名

 %FIELDN:次のフィールド名

 %ITEM:項目名称

 %PC:カーソル標識

 %ATR:Pフィールド

同一のASSGコードを異なる画面フィールドに使用しても、正しいフィールド名や標識に置換されます。

さらに共通メモに登録しておけば、短時間で間違いのないコーディングが可能になります。

 

今回は以上です。

 

自動生成サブルーチン disp_record_INITATRについて

disp_record_INITATRは属性初期化のサブルーチンです。

//--------------------------------------------------------------------
// #DSP04_INITATR 属性初期化
//--------------------------------------------------------------------
BEGSR #DSP04_INITATR;
 *IN31 = *OFF; //PC標識 得意先コード
 *IN32 = *OFF; //PC標識 担当者コード
 D4P31 = X'34'; // Pフィールド
 D4P32 = X'34'; // Pフィールド
ENDSR;

 

画面設計の[属性初期化コード]のオウンコードをサブルーチンにします。

オウンコードが無い場合は*PC標識を*OFF、Pフィールドを自動設定(設置値はシステム設定項目)するコードを自動生成します。自動生成を使いたくない場合は自動設定不要を☑します。

 

#disp_record_INITATRをEXSRで呼ぶのは、次画面への遷移、入力チェック、検索、前画面への遷移の4カ所です。

 

※Pフィールドについて

ASSGでは入出力フィールドを入力、エラー、確認などで動的に設定するため、Pフィールドの使用を前提にしています。

動的設定:非保護/保護、反転、桁区切り線、下線、表示色

 

今回は以上です。

 

自動生成サブルーチン #disp_record_INITFLDについて

#disp_record_INITFLDはフィールド初期化のサブルーチンです。

//--------------------------------------------------------------------
// #DSP04_INITFLD フィールド初期化
//--------------------------------------------------------------------
BEGSR #DSP04_INITFLD;
 D4CDTK = *BLANK; // 得意先コード
 D4NMTK = *BLANK; // 得意先名
 D4TNCD = *BLANK; // 担当者コード
 D4TNNM = *BLANK; // 担当者名
ENDSR;

 

画面設計の[フィールド初期化コード]のオウンコードをサブルーチンにします。

オウンコードが無い場合は*BLANK/*ZAROで初期化するコードを自動生成します。

自動生成を使いたくない、例えば別サブルーチンで画面フィールドの設定をしている場合などは、初期クリア不要を☑します。

 

#disp_record_INITFLDをEXSRで呼ぶのは、次画面への遷移前画面への遷移の第一画面の2カ所です。

 

今回は以上です。

 

自動生成サブルーチン #disp_recordについて

#disp_recordは画面入出力を行うサブルーチンです。

0010 //--------------------------------------------------------------------
0011 // #DSP01入出力
0012 //--------------------------------------------------------------------
0013 BEGSR #DSP01;
0014  DPFKEY = @FKEY(1);
0015  WRITE DSPFKEY; //操作説明を表示
0016  EXFMT DSP01; //画面レコードの出入力
0017  EXSR #DSP01_INITATR; //画面表示属性の初期化
0018  SELECT;  
0019   WHEN *IN(03) = *ON;
0020    WSTS = '99';
0021   WHEN *IN(04) = *ON;
0022    EXSR #DSP01_SEARCH;
0023   WHEN *IN(12) = *ON;
0024    EXSR #SCREEN_BACK;
0025   OTHER;
0026    EXSR #DSP01_CHECK;
0027    IF *IN90 = *OFF;
0028     EXSR #DSP02_INITFLD;
0029     EXSR #DSP02_INITATR;
0030     WKI = WKI + 1; 
0031     @WSTS(WKI) = WSTS;
0032      WSTS= '2';
0033    ENDIF;
0034   ENDSL;
0035 ENDSR;

 

0010~0017はシステム設定の入出力Logicで定義しています。開発環境に合わせて設定変更が可能です。

 

0019、0021、0023は画面設計のKEYBORD OWN CODEを書いた場合(=Fキー有効)に挿入され、0020,0022,0024のオウンコード入ります。

 

0025~0033は実行キー処理で、自動的に挿入されるコードです。

0026入力チェック

0027エラーが無ければ(*IN90はエラー代表標識で予約しています)

0028次画面のフィールド初期化

0029次画面の属性初期化

0030~0032次画面への遷移

を行っています。

画面遷移の最終画面は、次画面ではなくファイル更新処理が自動生成されます。

自動生成を使いたくない場合は、画面設計の[ENTER]コードにオウンコードを書きます。

 

今回は以上です。