このステップでは、ファンクションiiiFN16をコピーし、これを拡張して社員番号、部門または社員姓によって選択された1人または複数の社員のPDFドキュメントが出力できるようにします。
RDMLXファンクションiiiFN17はRDMLファンクション「iiiFN18 - 社員用PDF出力をテストする」により呼び出されます。このiiiFN18はSTD_FLAG、EMPNO、DEPTMENT、SURNAMEを入力して、この値を交換(EXCHANGE)してファンクションiiiFN17を呼び出します。
対話式のファンクションiiiFN18はPSLMSTでEMPNOの妥当性チェックを行うことを念頭に入れておいてください。ですからEMPNOを渡してファンクションiiiFN17が呼び出されると、PDFドキュメントを出力し、このドキュメントは閉じられなければなりません。
DEPTMENTやSURNAMEを渡してファンクションiiiFN17が呼び出して1ページまたは複数ページのPDFドキュメントを作成する場合、出力がないこともあります。条件付きでPDFドキュメントを閉じることで、空のPDFドキュメントに書き込むことを防ぐことができます。
1. ファンクションiiiFN16をコピーし、プロセスiiiPRO10にRDMLX 対応のファンクションiiiFN17を作成します。
2. ファンクションの一番上の以下の2行を削除します。
#empno := A0090
#rep1page := 1
3. * Add Footers のコメント行を探します。 サブ・ルーチン FOOTER 作成し、フッターを追加するロジックを移動させます。コードは以下のようになります。
Subroutine Name(FOOTER)
Clr_list #FOOTER1
Add_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
4. 実行(EXECUTE)サブルーチンを追加し、上記で移動させたコードをサブルーチンに置き換えます。コードは次のようになります。
* Add Footers
EXECUTE Subroutine(FOOTER)
5. * Close document のコメントを探します。CLOSEサブルーチンを作成し、以下のコードをその中に移動させます。
Subroutine Name(CLOSE)
#jsmxcmd := CLOSE
Use Builtin(JSMX_COMMAND) With_Args(#JSMXHDLE1 #JSMXCMD) To_Get(#JSMSTS #JSMMSG)
Execute Subroutine(CHECK_STS) With_Parms(#JSMXHDLE1)
#rep1page -= 1
Message Msgtxt('Employees PDF Report produced with ' + #rep1page.asstring + ' pages')
* Unload PDF Service
#jsmxcmd := SERVICE_UNLOAD
Use Builtin(JSMX_COMMAND) With_Args(#JSMXHDLE1 #JSMXCMD) To_Get(#JSMSTS #JSMMSG)
Execute Subroutine(CHECK_STS) With_Parms(#JSMXHDLE1)
* Close the JSM
Use Builtin(JSMX_CLOSE) With_Args(#jsmxhdle1) To_Get(#JSMSTS #JSMMSG)
Execute Subroutine(CHECK_STS) With_Parms(#JSMXHDLE1)
Endroutine
6. 実行(EXECUTE)サブルーチンを追加し、上記で移動させたコードをサブルーチンに置き換えます。コードは次のようになります。
* Close document
EXECUTE Subroutine(CLOSE)
7. ファンクションiiiFN17は、EMPNO、DEPTMENT、 SURNAME、およびSTD_FLAGのフィールドを受け取ります。STD_FLAGには、検索要求タイプが含まれます。E=社員番号、D=部門コード、S=社員姓、の検索となります。
8. 既存の単一の社員ロジックの周りに、STD_FLAGのcaseループを追加します。例えば次のようになります。
Case Of_Field(#STD_FLAG)
* Search for single employee number
When (= E)
* Add Logo
Change 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)
. . . . . . . . . .
. . . . . . . . . .
* Add Footer
Execute Subroutine(FOOTER1)
* Close the PDF Document and the PDF Service
Execute Subroutine(CLOSE)
Endcase
新しいコードは太字で表示されています。
9. ファンクションの一番上で、フィールドIO$STSをもとにした作業フィールド OUTSTSを定義します。このフィールドは、出力が作成されたことでPDFドキュメントを閉じるかどうかを制御します。
10. 「INT013 - 付録C」に示されているコードをコピーして、先ほど追加したCASEループのロジックを社員姓による検索と部門による検索にも展開します。
11. 変更を保存します。
12. STD_FLAG = SとSTD_FLAG = Dの場合の追加したばかりのロジックを確認します。
13. ファンクションiiiFN17をコンパイルして、エラーがあった場合は修正します。
14. IBM i サーバーでファンクションを実行する場合は、サーバーにチェックインしてコンパイルします。