このステップでは、Client XML Employees Responseソリューションに生成されたRDMLXのインバウンド部分を使用して、ファンクションiiiFN09を完了します。
- スタジオで 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)*フラグメント取得 - EMPLOYEELISTCHANGE 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 */*フラグメント取得 - EMPLOYEECHANGE 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)*リスト取得 - EMPLOYEESKILLCHANGE 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 */ - 「* リスト取得 – EMPLOYEESKILLS 」のロジック内の作業リスト名を変更します。キーワード TO_GET は、作業リスト #EMPSKILL を参照する必要があります 挿入されたコードを確認します。
ここでは以下のようにステップ 5 で概要が示されたすべての応答ロジックが含まれています。- 応答サービスにバインド (BIND) します。
- 社員リストのフラグメントを取得 (GET) します。
- ループを使って社員フラグメントを取得 (GET)、リスト EMPLOYEESKILL を取得 (GET) して、スキル作業リストを作成します。
- 社員にスキルがない場合の条件を処理して、このロジックを改良します。「* リスト取得 – EMPLOYEESKILL」のコードブロックの後に、 CONTINUE if JSMXSTS = NOLIST を追加します。このコード・ブロックは以下のようになります。
*リスト取得 - EMPLOYEESKILLCHANGE FIELD(#JSMXCMD) TO('GET LIST(EMPLOYEESKILL)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG #EMPSKILLS)CONTINUE IF(#JSMXSTS *EQ NOLIST) - ファンクションは現時点では、ループの中で各社員フラグメント (EMPNO と FULLNAME) とその社員のスキル・リストを取得します。その後、ファンクション iiiFN07 では、社員のフル名とスキルデータを 2 番目の作業リストに保存する必要があります。そして、このリストは呼び出しフォーム iiiFRM03 に返されます。END_LOOP の前に、#EMPSKILLS リストを読み込み、作業リスト #WL_EMPSKL にエントリーを追加するロジックを追加します。新しいコードは以下のようになります。
SELECTLIST NAMED(#empskills)ADD_ENTRY TO_LIST(#wl_empskl)ENDSELECT - JSM CLOSE の後に RETURN コマンドを追加します。
- スタジオで生成されたコードである、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: ' + #JSMXSTSMESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)#MSGDTA := 'Error Message: ' + #JSMXMSGMESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)USE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1) TO_GET(#JSMXSTS #JSMXMSG)ABORTENDIF*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)*フラグメント設定 - DEPARTMENTREQUESTCHANGE 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)*フラグメント取得 - EMPLOYEELISTCHANGE 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 */*フラグメント取得 - EMPLOYEECHANGE 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)*リスト取得 - EMPLOYEESKILLCHANGE 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)ENDSELECTEND_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: ' + #JSMXSTSMESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)#MSGDTA := 'Error Message: ' + #JSMXMSGMESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)USE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1) TO_GET(#JSMXSTS #JSMXMSG)ABORTENDIF*ENDROUTINE - ファンクション iiiFN07 を保存してコンパイルし、サーバーにチェックインします。