このステップでは、Client XML Employees Responseソリューションに生成されたRDMLXのインバウンド部分を使用して、ファンクションiiiFN09を完了します。

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

    *サービスをバインドして、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)
    *フラグメント取得 - 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)
    *<<< EMPLOYEE のフラグメントのループ・ロジックを入力 >>>
    BEGIN_LOOP /* EMPLOYEE */
    *フラグメント取得 - 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)
    *リスト取得 - EMPLOYEESKILL
    CHANGE FIELD(#JSMXCMD) TO('GET LIST(EMPLOYEESKILL)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG #EMPLOYEESKILL)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
    END_LOOP /* EMPLOYEE */

  2. 「* リスト取得 – EMPLOYEESKILLS 」のロジック内の作業リスト名を変更します。キーワード TO_GET は、作業リスト #EMPSKILL を参照する必要があります 挿入されたコードを確認します。
    ここでは以下のようにステップ 5 で概要が示されたすべての応答ロジックが含まれています。
  3. 社員にスキルがない場合の条件を処理して、このロジックを改良します。「* リスト取得 – EMPLOYEESKILL」のコードブロックの後に、 CONTINUE if JSMXSTS = NOLIST を追加します。このコード・ブロックは以下のようになります。

    *リスト取得 - 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)

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

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

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

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

    *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

    オンラインの『LANSA Integrator ガイド』の演習 INT008 から上記のコードをコピーします。
    完成した RDMLX コードは以下のようになります。

    FUNCTION OPTIONS(*DIRECT) RCV_LIST(#wl_empskl)
    *以下のフィールドは xml バインド・マップで使用
    *#DEPTMENT
    *以下のフラグメントは 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)

    *サービスを開く
    USE BUILTIN(JSMX_OPEN) TO_GET(#JSMXSTS #JSMXMSG #JSMXHDLE1)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

    *サービスのロード
    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)

    *サービスをバインドして、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)

    *フラグメント設定 - 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)

    *コンテンツの書き込み
    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)

    *バインドを閉じる
    CHANGE FIELD(#JSMXCMD) TO('CLOSE')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

    *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)

    *<<< インバウンドのロジックはここ >>>
    *サービスをバインドして、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)

    *フラグメント取得 - 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)

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

    *フラグメント取得 - 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)

    *リスト取得 - 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 */

    *サービスのアンロード
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 'SERVICE_UNLOAD') TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

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

    *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

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