このステップでは、ファンクション 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 ドキュメントに書き込むことを避けることができます。

  1. ファンクション iiiFN14 をコピーし、プロセス iiiPRO11 に RDMLX 対応のファンクション iiiFN15 を作成します。

  2. ファンクションの上にある次の 2 行を削除します。

    #empno := A1009
    #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 subroutine を追加して、この移動させたコードをサブルーチン内に置き換えます。コードは以下のようになります。

    *フッターの追加
    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('社員 PDF レポートが作成されました' + #rep1page.asstring + ' ページ')PDF サービスのアンロード
    #jsmxcmd := SERVICE_UNLOAD
    Use 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

  6. EXECUTE subroutine を追加して、この移動させたコードをサブルーチン内に置き換えます。コードは以下のようになります。

    *ドキュメントを閉じる
    EXECUTE Subroutine(CLOSE)

  7. ファンクション iiiFN15 は、EMPNO、DEPTMENT、SURNAME、STD_FLAG のフィールドを受け取ります。STD_FLAG には、検索要求タイプが含まれます。E=社員番号、D=部門コード、S=苗字、の検索となります。

  8. 既存の社員 1 名のロジックの近くに、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)
    ..........
    ..........
    *フッターの追加
    Execute Subroutine(FOOTER1)PDF 
    *ドキュメントと PDF サービスを閉じる
    Execute Subroutine(CLOSE)
    Endcase

  9. ファンクションの一番上で、フィールドIO$STSをもとにした作業フィールドOUTSTSを定義します。このフィールドを使って、出力が作成され PDF ドキュメントを閉じる必要があるかのコントロールを行います。

  10. 既存のCASE ループは社員 1 名を処理するのみです。この CASE ループで、社員 1 名に対する EXECUTE FOOTER のすぐ下に次の WHEN 条件を追加します。苗字による検索と部門による検索を処理するコード (「INT013 - 付録 C」より提供) をコピーします。

  11. 変更内容を保存します。

  12. 先ほど追加した STD_FLAG = S と STD_FLAG = D の場合のロジックを以下のように確認します。
  13. ファンクション iiiFN15 をコンパイルし、エラーがあれば修正します。

  14. IBM i サーバーでファンクションを実行する場合は、サーバーにチェックインして、コンパイルします。