このステップでは、ファンクション iiiFN14 をコピーし、社員番号、部門または苗字によって選択された、1 人または複数の社員の PDF ドキュメントが出力できるように拡張します。
この新しい RDMLX ファンクション iiiFN15 は、フォーム 「iiiFRM08 – 社員 PDF 出力をテスト」によって呼び出されますが、このファンクションによってユーザーは STD_FLAG、EMPNO、DEPTMENT、SURNAME を入力でき、これらの値を交換 (ECHANGE) してファンクション iiiFN15 が呼び出されます。
フォーム iiiFRM08 において実際に検討すべき事項としては、PSLMST (社員マスター) で EMPNO (社員番号) の妥当性を検査することが挙げられるでしょう。ファンクション iiiFN15, が呼び出された時に EMPNO (社員番号) を渡される場合、社員番号は常に有効な状態ですので、 iiiFN15 ではPDF ドキュメントを常に出力して、このドキュメントを閉じる必要があります。
ファンクション iiiFN15 が呼び出された時に DEPTMENT (部門番号) または SURNAME (苗字) が渡されて、1 件以上の PDF ドキュメントを作成する場合、出力が無い可能性もあります。条件付きで PDF ドキュメントを閉じることで、空の PDF ドキュメントに書き込むことを避けることができます。
- ファンクション iiiFN14 をコピーし、プロセス iiiPRO11 に RDMLX 対応のファンクション iiiFN15 を作成します。
- ファンクションの上にある次の 2 行を削除します。
#empno := A1009#rep1page := 1 - コメント行 * Add Footers (フッターの追加) を探します。サブ・ルーチン FOOTER を作成し、その中に以下のコードを移動させます。
コードは以下のようになっているはずです。Subroutine Name(FOOTER)Clr_list #FOOTER1Add_entry #FOOTER1#jsmxcmd := 'ADD CONTENT(FOOTER1)'Use Builtin(JSMX_COMMAND) With_Args(#JSMXHDLE1 #JSMXCMD #FOOTER1) To_Get(#JSMSTS #JSMMSG)Execute Subroutine(CHECK_STS) With_Parms(#JSMXHDLE1)Endroutine - EXECUTE subroutine を追加して、この移動させたコードをサブルーチン内に置き換えます。コードは以下のようになります。
*フッターの追加EXECUTE Subroutine(FOOTER) - コメント行* Close document (ドキュメントを閉じる) を探します。サブ・ルーチン CLOSE を作成し、以下のコードをその中に移動させます。
Subroutine Name(CLOSE)#jsmxcmd := CLOSEUse Builtin(JSMX_COMMAND) With_Args(#JSMXHDLE1 #JSMXCMD) To_Get(#JSMSTS #JSMMSG)Execute Subroutine(CHECK_STS) With_Parms(#JSMXHDLE1)#rep1page -= 1Message Msgtxt('社員 PDF レポートが作成されました' + #rep1page.asstring + ' ページ')PDF サービスのアンロード#jsmxcmd := SERVICE_UNLOADUse Builtin(JSMX_COMMAND) With_Args(#JSMXHDLE1 #JSMXCMD) To_Get(#JSMSTS #JSMMSG)Execute Subroutine(CHECK_STS) With_Parms(#JSMXHDLE1)JSM を閉じるUse Builtin(JSMX_CLOSE) With_Args(#jsmxhdle1) To_Get(#JSMSTS #JSMMSG)Execute Subroutine(CHECK_STS) With_Parms(#JSMXHDLE1)Endroutine - EXECUTE subroutine を追加して、この移動させたコードをサブルーチン内に置き換えます。コードは以下のようになります。
*ドキュメントを閉じるEXECUTE Subroutine(CLOSE) - ファンクション iiiFN15 は、EMPNO、DEPTMENT、SURNAME、STD_FLAG のフィールドを受け取ります。STD_FLAG には、検索要求タイプが含まれます。E=社員番号、D=部門コード、S=苗字、の検索となります。
- 既存の社員 1 名のロジックの近くに、STD_FLAG の case ループを追加します。赤で示されている箇所が新しく追加するコードです。
例:Case Of_Field(#STD_FLAG)Search for single employee numberWhen (= E)Add LogoChange Field(#JSMXCMD) To('ADD CONTENT(LOGO) ')Use Builtin(JSMX_COMMAND) With_Args(#JSMXHDLE1 #JSMXCMD) To_Get(#JSMSTS #JSMMSG)Execute Subroutine(CHECK_STS) With_Parms(#JSMXHDLE1)....................*フッターの追加Execute Subroutine(FOOTER1)PDF*ドキュメントと PDF サービスを閉じるExecute Subroutine(CLOSE)Endcase - ファンクションの一番上で、フィールドIO$STSをもとにした作業フィールドOUTSTSを定義します。このフィールドを使って、出力が作成され PDF ドキュメントを閉じる必要があるかのコントロールを行います。
- 既存のCASE ループは社員 1 名を処理するのみです。この CASE ループで、社員 1 名に対する EXECUTE FOOTER のすぐ下に次の WHEN 条件を追加します。苗字による検索と部門による検索を処理するコード (「INT013 - 付録 C」より提供) をコピーします。
- 変更内容を保存します。
- 先ほど追加した STD_FLAG = S と STD_FLAG = D の場合のロジックを以下のように確認します。
- ページ番号 REP1PAGE は、各社員の出力後に増えます。
- OUTSTS を使って、PDF ドキュメントの CLOSE をコントロールし、空の PDF ドキュメントが書き込まれることを避けます。OUTSTS は、1 名以上の社員の出力が生成された時に OK が設定されます。この代わりに、社員が出力されなかった場合に「社員詳細が見つかりませんでした」というテキストを含むページを書きこむことも可能です。
- PDF XML テンプレートの FOOTER1 コンテントには <page orientation="landscape"/> が含まれます。これにより、次の社員の出力用の新しいページが開始されます。
- ロケールの日付形式が MMDDYY ではない場合、 'MMDDYY' のソースコードを探して、この値を 'DDMMYY' に変更します。
- ファンクション iiiFN15 をコンパイルし、エラーがあれば修正します。
- IBM i サーバーでファンクションを実行する場合は、サーバーにチェックインして、コンパイルします。