Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. LANSA エディターを使って、プロセス iiiPRO09 内に新規の RDMLX ファンクション iiiFN11 – 社員取得エージェント を作成します。  今回の場合、アウトバウンド処理には生成のサンプル・コードをコピーするよりは、インバウンド・ファンクションのコードをコピーする方が簡単です。

  2. Function Options 行のコードを変更して、キーワード Rcv_List(#EMPS) を追加します。これで、社員リストをファンクションを呼び出したフォームに返すことができるようになります。
    Image Added

  3. 上記の行の後に、リスト EMPS を定義します。フィールドは EMPNO、GIVENAME、SURNAME、SALARY となります。  このリストは Entrys に *MAX が設定された作業リストにしなければいけません。
    Image Added

  4. 上記の行の後にフィールド DEPTMENT と SECTION のグループを定義します。  これを行わないと、このファンクション内にこれらのフィールドへの参照が無いことになり、フィールド DEPTMENT と SECTION を JSON サーバーの送信することができません。
    Image Added

  5. 上の行の次に、リスト EMPS をクリアする行を加えます。
    Image Added

  6. ファンクション iiiFN10 に切り替えて、JSM を開いてサービスをロードするコードの箇所をコピーして、iiiFN11 の上記の行の後に貼り付けます。  そして、HTTPInboundJSONBindService を HTTPOutboundJSONBindService を開いてサービスをロードするコードの箇所をコピーして、iiiFN11 の上記の行の後に貼り付けます。  そして、HTTPInboundJSONBindService を HTTPOutboundJSONBindService に変更します。


  7. ファンクション iiiFN10 に戻り、CHECK サブルーチンをコピーして、iiiFN11 に貼り付けます。その他のコードもすべて貼り付け、このサブルーチンがファンクションの最後になるようにします。


  8. 再びファンクション iiiFN10 に切り替え、サービス IIIEMPLOYEEDEPTSECT をバインドするコードをコピーして、Lord サービスの後に貼り付けます。  TYPE を *OUTBOUND に変更します。
    Image Modified

  9. 上記のコードのすぐ下に JSON オブジェクトを作成するコード (WRITE BINDTRACE(*YES)) と要求を送信するコード (SEND HOST…) を追加します。  URL は HOST と URI に分けなければいけないことに注意してください。
    Image Modified

    Note

    注:この URI が「INT010A が「INT010A - JSONサービス - サーバー側のロジックを定義」で定義した サーバー側のロジックを定義」で定義した Direct サービス IIIEMPLOYEEJSON を実行しています。HOST の値はサーバーとポート番号でなければいけません。

            

  10. 上記 #3 から BIND SERVICE ロジックをコピーし、さきほどのコードの続きに貼り付けます。  そして、IIIEMPLOYEEDEPTSECT そして、IIIEMPLOYEEDEPTSECT IIIEMPLOYEE に変更し、TYPE を *INBOUND に変えます。  このコードにより、応答が受信され、処理が行えるようになります。  今回の場合、処理というのは、リスト処理のみです。  リストだけでなく、簡素な複数のフィールドも存在する場合は、これらのフィールドもこの時点でファンクションのフィールドにバインドされます。


  11. すべての EMPLOYEE フラグメントを見ていき、このフラグメントがこれ以上見つからなくなるまでループするコードを追加して、各フラグメントのデータをリストに加えていきます。  ファンクション iiiFN10 の Begin_Loop の後の 3 行をコピーして、SET 行をコピーして、SET を GET に変更します。


  12. 上記の行の続きに、JSM を閉じて、ファンクションに戻るロジックを加えます。


  13. ファンクション iiiFN11 をコンパイルします。必要に応じて、これを IBM i サーバーにチェックインします。
    コードは以下のようになります。

    FUNCTION OPTIONS(*DIRECT) RCV_LIST(#emps)
    DEF_LIST NAME(#EMPS) FIELDS(#EMPNO #GIVENAME #SURNAME #SALARY) TYPE(*WORKING) ENTRYS(*MAX)

    GROUP_BY NAME(#parms) FIELDS(#deptment #section)
    CLR_LIST NAMED(#emps) 

    *サービスを開く

    USE BUILTIN(JSMX_OPEN) TO_GET(#JSMXSTS #JSMXMSG #JSMXHDLE1)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG) 

    *サービスのロード
    CHANGE FIELD(#JSMXCMD) TO('SERVICE_LOAD SERVICE(HTTPOutboundJSONBindService) SERVICE_CONTENT(*HTTP) TRACE(*YES)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

    *サービスをバインドして、HTTP 要求コンテンツを読み込む
    CHANGE FIELD(#JSMXCMD) TO('BIND SERVICE(IIIEMPLOYEEDEPTSECT) TYPE(*OUTBOUND) BINDTRACE(*YES) SERVICE_EXCHANGE(*FIELD)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

    *Create the JSON object
    #JSMXCMD := 'WRITE BINDTRACE(*YES)'
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

    *要求の送信
    #JSMXCMD := 'SEND HOST(earthd14.lansa.co.uk:80) URI(/cgi-bin/jsmdirect?IIIEMPLOYEEJSON)'
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

    *サービスをバインドして HTTP 応答コンテンツを処理
    CHANGE FIELD(#JSMXCMD) TO('BIND SERVICE(IIIEMPLOYEES) TYPE(*INBOUND) BINDTRACE(*YES) SERVICE_EXCHANGE(*FIELD)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

    *社員の処理
    BEGIN_LOOP
    #JSMXCMD := 'GET FRAGMENT(EMPLOYEE) SERVICE_EXCHANGE(*FIELD)'
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

    LEAVE IF(#JSMXSTS = NOFRAGMENT)

    ADD_ENTRY TO_LIST(#emps)

    END_LOOP

    *サービスのクローズ
    USE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

    *Check ルーチン
    SUBROUTINE NAME(CHECK) PARMS((#JSMXSTS *RECEIVED) (#JSMXMSG *RECEIVED))
    IF COND('#JSMXSTS *NE OK')
    USE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1) TO_GET(#JSMXSTS #JSMXMSG)
    EXIT
    ENDIF
    ENDROUTINE