ステップ4. ファンクションiiiFN17の作成 - 社員用PDF出力を作成する
このステップでは、ファンクション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の場合の追加したばかりのロジックを確認します。
- ページ番号REP1PAGE は、それぞれの社員の出力後に増えます。
- OUTSTS は、空のPDFドキュメントが書き込まれることを避けるために、PDFドキュメントのCLOSEの制御に使用されます。1人もしくは複数の社員用に出力が作成された場合、OUTSTSにOKが設定されます。代わりに、出力の社員が存在しない場合は「社員詳細が見つかりません」というテキストを含むページを書きこむことも可能です。
- PDF XMLテンプレートには、FOOTER1コンテントに<page orientation="landscape"/>が含まれます。これにより、次の社員の出力用の新しいページが開始されます。
13. ファンクションiiiFN17をコンパイルして、エラーがあった場合は修正します。
14. IBM i サーバーでファンクションを実行する場合は、サーバーにチェックインしてコンパイルします。