Versions Compared

Key

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

...

INT008 – 部門&社員クライアント (オプション)
このステップでは、Client XML Employees Responseソリューションに生成されたRDMLXのインバウンド部分を使用して、ファンクションiiiFN09を完了します。 1.      スタジオで

  1. スタジオで iii 研修 プロジェクトが開いている状態で、ソリューション/クライアント XML 社員応答/sample/RDMLX フォルダを展開し、SAMPLE_RDMLX_INBOUND_HTTP.TXTより下のコードをファンクション iiiFN07 のコメント* <<< インバウンドのロジックはここ >>>の後にコピーします。

...


  1. *サービスをバインドして、HTTP 要求コンテンツを読み込む

...

  1. CHANGE FIELD(#JSMXCMD) TO('BIND SERVICE(IIIPRO07_RESPONSE) TYPE(*INBOUND) BINDTRACE(*YES)')

...

  1. USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)

...

  1. EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

...

  1. *フラグメント取得 - EMPLOYEELIST

...

  1. CHANGE FIELD(#JSMXCMD) TO('GET FRAGMENT(EMPLOYEELIST) SERVICE_EXCHANGE(*FIELD)')

...

  1. USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)

...

  1. EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

...

  1. *<<< EMPLOYEE

...

  1. のフラグメントのループ・ロジックを入力 >>>
    BEGIN_LOOP /* EMPLOYEE */

...

  1. *フラグメント取得 - EMPLOYEE

...

  1. CHANGE FIELD(#JSMXCMD) TO('GET FRAGMENT(EMPLOYEE) SERVICE_EXCHANGE(*FIELD)')

...

  1. USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)

...

  1. LEAVE IF('#JSMXSTS *EQ NOFRAGMENT')

...

  1. EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

...

  1. *リスト取得 - EMPLOYEESKILL

...

  1. CHANGE FIELD(#JSMXCMD) TO('GET LIST(EMPLOYEESKILL)')

...

  1. USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG #EMPLOYEESKILL)

...

  1. EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
    END_LOOP /* EMPLOYEE */

...


  1. * リスト取得 – EMPLOYEESKILLS 」のロジック内の作業リスト名を変更します。キーワード TO_GET は、作業リスト #EMPSKILL を参照する必要があります

...

  1. 挿入されたコードを確認します。
    ここでは以下のようにステップ 5 で概要が示されたすべての応答ロジックが含まれています。
    • 応答サービスにバインド (BIND) します。
    • 社員リストのフラグメントを取得 (GET) します。
    • ループを使って社員フラグメントを取得 (GET)、リスト EMPLOYEESKILL を取得 (GET) して、スキル作業リストを作成します。

...


  1. 社員にスキルがない場合の条件を処理して、このロジックを改良します。「* リスト取得 – EMPLOYEESKILL」のコードブロックの後に、 CONTINUE if JSMXSTS = NOLIST を追加します。このコード・ブロックは以下のようになります。

...


  1. *リスト取得 - EMPLOYEESKILL

...

  1. CHANGE FIELD(#JSMXCMD) TO('GET LIST(EMPLOYEESKILL)')

...

  1. USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG #EMPSKILLS)
    CONTINUE IF(#JSMXSTS *EQ NOLIST)

...


  1. ファンクションは現時点では、ループの中で各社員フラグメント (EMPNO と FULLNAME) とその社員のスキル・リストを取得します。その後、ファンクション iiiFN07 では、社員のフル名とスキルデータを 2 番目の作業リストに保存する必要があります。そして、このリストは呼び出しフォーム iiiFRM03 に返されます。END_LOOP の前に、#EMPSKILLS リストを読み込み、作業リスト #WL_EMPSKL にエントリーを追加するロジックを追加します。新しいコードは以下のようになります。

    SELECTLIST NAMED(#empskills)
    ADD_ENTRY TO_LIST(#wl_empskl)
    ENDSELECT

...


  1. JSM CLOSE の後に RETURN コマンドを追加します。

...


  1. スタジオで生成されたコードである、CHECK サブルーチンは、ステータスが OK 以外の場合はメニューに戻るだけです。このルーチンを以下のロジックで置き換えます。これで、JSM ステータスと JSM メッセージを含むメッセージが表示されます。これはテストの際などに役立ちます。

...


  1. *Check ルーチン
    SUBROUTINE NAME(CHECK) PARMS((#JSMXSTS *RECEIVED) (#JSMXMSG *RECEIVED))
    DEFINE FIELD(#MSGDTA) TYPE(*CHAR) LENGTH(132)
    *
    IF COND('#JSMXSTS *NE OK')
    #MSGDTA := 'Error Status Code: ' + #JSMXSTS
    MESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)
    #MSGDTA := 'Error Message: ' + #JSMXMSG
    MESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)
    USE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1) TO_GET(#JSMXSTS #JSMXMSG)
    ABORT
    ENDIF
    *
    ENDROUTINE

...


  1. オンラインの『LANSA Integrator ガイド』の演習 INT008 から上記のコードをコピーします。

...

  1. 完成した RDMLX コードは以下のようになります。

    FUNCTION OPTIONS(*DIRECT) RCV_LIST(#wl_empskl)

...

  1. *以下のフィールドは xml バインド・マップで使用

...

  1. *#DEPTMENT

...

  1. *以下のフラグメントは xml バインド・マップで使用
    GROUP_BY NAME(#DEPTREQ) FIELDS(#DEPTMENT)
    DEF_LIST NAME(#wl_empskl) FIELDS(#fullname #skildesc) TYPE(*working) ENTRYS(*max)
    DEF_LIST NAME(#empskills) FIELDS(#skildesc) TYPE(*working) ENTRYS(*max)

...


  1. *サービスを開く

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

...


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

...


  1. *サービスをバインドして、HTTP 要求コンテンツを作成
    CHANGE FIELD(#JSMXCMD) TO('BIND SERVICE(IIIPRO07_REQUEST) TYPE(*OUTBOUND)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

...


  1. *フラグメント設定 - DEPARTMENTREQUEST
    CHANGE FIELD(#JSMXCMD) TO('SET FRAGMENT(DEPARTMENTREQUEST) SERVICE_EXCHANGE(*FIELD)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

...


  1. *コンテンツの書き込み

...


  1. CHANGE FIELD(#JSMXCMD) TO('WRITE INDENT(*YES) BINDTRACE(*YES)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

...


  1. *バインドを閉じる

  1. CHANGE FIELD(#JSMXCMD) TO('CLOSE')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

...


  1. *HTTP 要求コンテンツの送信
    CHANGE FIELD(#JSMXCMD) TO('SEND HOST(earthd14.lansa.co.uk ) URI(/cgi-bin/jsmdirect?iiiFN06_SERVICE)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

...


  1. *<<< インバウンドのロジックはここ >>>

...

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

...


  1. *フラグメント取得 - EMPLOYEELIST
    CHANGE FIELD(#JSMXCMD) TO('GET FRAGMENT(EMPLOYEELIST) SERVICE_EXCHANGE(*FIELD)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

...


  1. *<<< EMPLOYEE

...

  1. のフラグメントのループ・ロジックを入力 >>>

...


  1. BEGIN_LOOP /* EMPLOYEE */

...


  1. *フラグメント取得 - EMPLOYEE
    CHANGE FIELD(#JSMXCMD) TO('GET FRAGMENT(EMPLOYEE) SERVICE_EXCHANGE(*FIELD)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    LEAVE IF('#JSMXSTS *EQ NOFRAGMENT')
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

...


  1. *リスト取得 - EMPLOYEESKILL
    CHANGE FIELD(#JSMXCMD) TO('GET LIST(EMPLOYEESKILL)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG #EMPSKILLS)
    CONTINUE IF(#jsmxsts *EQ nolist)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
    *
    SELECTLIST NAMED(#empskills)
    ADD_ENTRY TO_LIST(#wl_empskl)
    ENDSELECT
    END_LOOP /* EMPLOYEE */

...


  1. *サービスのアンロード

...


  1. USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 'SERVICE_UNLOAD') TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

...


  1. *サービスのクローズ

  1. USE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
    RETURN

...


  1. *Check ルーチン
    SUBROUTINE NAME(CHECK) PARMS((#JSMXSTS *RECEIVED) (#JSMXMSG *RECEIVED))
    DEFINE FIELD(#MSGDTA) TYPE(*CHAR) LENGTH(132)
    *
    IF COND('#JSMXSTS *NE OK')
    #MSGDTA := 'Error Status Code: ' + #JSMXSTS
    MESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)
    #MSGDTA := 'Error Message: ' + #JSMXMSG
    MESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)
    USE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1) TO_GET(#JSMXSTS #JSMXMSG)
    ABORT
    ENDIF
    *
    ENDROUTINE

...


  1. ファンクション iiiFN07 を保存してコンパイルし、サーバーにチェックインします。