ひとりごと Acrobat Readerが遅い!
この数日、ASSGに「プロシージャー」機能を追加している。
知識が乏しいのでRPG解説書などを読んでいるが、AcrobatReaderの動作が緩慢で思考が途切れます。
下記URLの対応でかなり改善しました。
帳票設計を機能アップ
最近はコロナ禍の影響もありペーパレスが一段と進んでいます。
帳票出力の要望は少なく、もっぱら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カ所です。
今回は以上です。