ステップ 6. iiiFN07 クライアントのGET機能をコーディングする
INT008 – 部門&社員クライアント (オプション)
このステップでは、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 で概要が示されたすべての応答ロジックが含まれています。 - 応答サービスにバインド (BIND) します。
- 社員リストのフラグメントを取得 (GET) します。
- ループを使って社員フラグメントを取得 (GET)、リスト EMPLOYEESKILL を取得 (GET) して、スキル作業リストを作成します。
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 を保存してコンパイルし、サーバーにチェックインします。