このステップでは、部門記述を取得するデータベース・ファイルDEPTABにアクセスするRDMLXを作成し、サーバー側SETのRDMLXを作成します。
作業リスト定義 DEPTMEN_W に習い、フィールド DEPTDESC を含む 2 つ目の作業リスト DEPTDES_W を定義します。これが戻されるリストです。両方のリストをクリアするコードを追加します。コードは以下のようになります。
* 以下のリストは xmlバインド・マップで使用DEF_LIST NAME(#DEPTMEN_W) FIELDS(#DEPTMENT) TYPE(*WORKING)DEF_LIST NAME(#DEPTDES_W) FIELDS(#DEPTDESC) TYPE(*WORKING)CLR_LIST NAMED(#DEPTMEN_W)CLR_LIST NAMED(#DEPTDES_W)注: デフォルトでは、作業リストは50エントリーで定義されます。この値はこのアプリケーションに対して適切です。
- ファンクション iiiFN05 の作業を続けます。受信ロジックの後に以下を追加する必要があります。次のコメント行の前にコードを追加します。
* Bind service to create HTTP response content
以下を行うRDMLXコードを作成します。- リスト #DEPTMEN_W (クライアントから受信した作業リスト) から部門コードを選択 (SELECTLIST) します。
- キー #DEPTMENT を使ってファイル DEPTAB からフィールド #DEPTDESC (部門記述) を取得 (FETCH) します。この FETCH 処理の I/O 状態をチェックします。*OKAY 以外の場合、部門の記述をリテラル '部門が見つかりません' に変更します。
- 部門記述の作業リスト #DEPTDES_W にエントリーを追加 (ADD) します。
- ENDSELECT
RDMLX コードは以下のようになります。SELECTLIST NAMED(#DEPTMEN_W)**********FETCH FIELDS(#DEPTDESC) FROM_FILE(DEPTAB) WITH_KEY(#DEPTMENT)IF_STATUS IS_NOT(*OKAY)#DEPTDESC := '部門が見つかりません'ENDIFADD_ENTRY TO_LIST(#DEPTDES_W)ENDSELECT**********
- 組み込み関数 REVERSE を使用して、#STD_TEXT の内容を逆にする RDMLX を作成します。組み込みファンクション Trim を使用して、テキスト内の先頭または末尾の余白を削除します。
RDMLX コードは以下のようになります。**********テキストを逆にする#STD_TEXTS := #STD_TEXTS.Reverse.Trim********** - スタジオのプロジェクトで、フォルダ XML リスト応答/Samples/RDMLX を展開し、ファイル SAMPLE_RDMLX_OUTBOUND_HTTP.TXT をダブルクリックしてテスト・エディターで開きます。
- 次の赤い丸で囲まれたコードを選択します。
- ファンクション iiiFN05 の以下のコードを上記で選択したコードに置換します。
* サービスをバインドして HTTP 応答コンテンツを作成CHANGE FIELD(#JSMXCMD) TO('BIND SERVICE( <<<outbound.class>>> ) TYPE(*OUTBOUND)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG) - この追加したコードで、リスト名 DEPARTMENT を DEPTDES_W に置き換えます。完全に一致する単語だけ検索してください。
- CHECK サブルーチンで、エラーが発生した場合はプログラムが終了するように .ENDIF ステートメントに ABORT コマンドを追加します。
- ファンクション iiiFN05 をコンパイルします。IBM i の JSM サーバーを使用している場合は、ファンクションをチェックインして IBM i でコンパイルします。
完了した RDMLX コードは以下のようになります。FUNCTION OPTIONS(*DIRECT)*以下のフィールドは xml バインド・マップで使用*#DEPTMENT*#STD_TEXTS*以下のフラグメントは xml バインド・マップで使用GROUP_BY NAME(#LISTREQ) FIELDS(#STD_TEXTS)*以下のリストは xmlバインド・マップで使用DEF_LIST NAME(#DEPTMEN_W) FIELDS(#DEPTMENT) TYPE(*WORKING)DEF_LIST NAME(#DEPTDES_W) FIELDS(#DEPTMENT #DEPTDESC) TYPE(*WORKING)CLR_LIST NAMED(#DEPTMEN_W)CLR_LIST NAMED(#DEPTDES_W)*サービスを開くUSE BUILTIN(JSMX_OPEN) TO_GET(#JSMXSTS #JSMXMSG #JSMXHDLE1)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*サービスのロードCHANGE FIELD(#JSMXCMD) TO('SERVICE_LOAD SERVICE(HTTPInboundXMLBindService) 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(IIIPRO05_REQUEST) TYPE(*INBOUND) BINDTRACE(*YES)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*フラグメントを取得する - DEPARTMENTLISTREQUESTCHANGE FIELD(#JSMXCMD) TO('GET FRAGMENT(DEPARTMENTLISTREQUEST) SERVICE_EXCHANGE(*FIELD)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*リストを取得する - DEPARTMENTCHANGE FIELD(#JSMXCMD) TO('GET LIST(DEPARTMENT)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG #DEPTMEN_W)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)SELECTLIST NAMED(#DEPTMEN_W)*FETCH FIELDS(#DEPTDESC) FROM_FILE(DEPTAB) WITH_KEY(#DEPTMENT)IF_STATUS IS_NOT(*OKAY)CHANGE FIELD(#DEPTDESC) TO('部j門が見つかりません')ENDIFADD_ENTRY TO_LIST(#DEPTDES_W)ENDSELECT**文字列を逆にする#STD_TEXTS := #STD_TEXTS.Reverse.Trim**<<< Outbound binding logic goes here >>>**サービスをバインドして、HTTP 要求コンテンツを作成CHANGE FIELD(#JSMXCMD) TO('BIND SERVICE(IIIPRO05_RESPONSE) TYPE(*OUTBOUND)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*フラグメントを設定する - DEPARTMENTLISTRESPONSECHANGE FIELD(#JSMXCMD) TO('SET FRAGMENT(DEPARTMENTLISTRESPONSE) SERVICE_EXCHANGE(*FIELD)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*リストを設定する - DEPARTMENTCHANGE FIELD(#JSMXCMD) TO('SET LIST(DEPARTMENT)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG #DEPTDES_W)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)*HTTP 応答コンテンツの送信CHANGE FIELD(#JSMXCMD) TO('SEND')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) 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)*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)ABORTENDIFENDROUTINE
