このステップでは、データベース・ファイル DEPTAB にアクセスして部門の記述を取得 (FETCH) する RDMLX を作成します。クライアント要求に応答する、サーバー側の送信 (SEND) RDMLX を作成します。
- ファンクション iiiFN04 を使用し、DEPARTMENTREQUEST フラグメントから GET を実行した後、以下に示されているブロックを削除します。
次に、DEPTDESC フィールドを消去し、DEPTAB ファイルから DEPTMENT キー (部門コード) を使って DEPTDESC フィールド (部門の記述) を取得 (FETCH) する RDMLX コードを作成します。
FETCH 処理の I/O ステータスを確認します。*OKAY 以外の場合、部門の記述をリテラル '部門が見つかりません' に変更します。
RDMLX コードは以下のようになります。#DEPTDESC := *NULLFETCH FIELDS(#DEPTDESC) FROM_FILE(DEPTAB) WITH_KEY(#DEPTMENT) IO_ERROR(*NEXT) VAL_ERROR(*NEXT)IF_STATUS IS_NOT(*OKAY)#DEPTDESC := '部門が見つかりません'ENDIF - 次にアウトバウンド HTTP のコンテンツを作成するコードを追加する必要があります。ソリューション XML 応答用にスタジオで生成された RDMLX から、このコード・フラグメントを取得できます。 XML 応答/samples/RDMLX フォルダを展開し、テキスト・エディターで SAMPLE_RDMLX_OUTBOUND_HTTP.txt を開きます。ファンクション iiiFN04 の以下のコメントの直後に、以下の赤い丸で囲まれたコードをコピーして貼り付けます。
* <<< Outbound binding logic goes here >>>
または
*<<< アウトバウンドのバインド・ロジックはここに記述 >>> - CHECK サブルーチンで、エラーが発生した場合はプログラムが終了するように ABORT コマンドを IF~ENDIF 条件に追加します。
- ファンクションiiiFN04をコンパイルします。
- IBM i の JSM サーバーを使用している場合は、ファンクションを IBM iにチェックインしてコンパイルします。
完了した RDMLX コードは以下のようになります。
FUNCTION OPTIONS(*DIRECT)* 次のフィールドが xml バインド・マップにより使用されます。*#DEPTMENT*次のフラグメントが xml バインド・マップにより使用されます。GROUP_BY NAME(#DEPTREQ) FIELDS(#DEPTMENT)*サービスのオープン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(IIIPRO04_REQUEST) TYPE(*INBOUND) BINDTRACE(*YES)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*フラグメントの取得 - DEPTREQCHANGE FIELD(#JSMXCMD) TO('GET FRAGMENT(DepartmentRequest) SERVICE_EXCHANGE(*FIELD)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*部門記述のための要求を処理#deptdesc := *blanksFETCH FIELDS(#deptdesc) FROM_FILE(deptab) WITH_KEY(#deptment) IO_ERROR(*NEXT) VAL_ERROR(*NEXT)IF_STATUS IS_NOT(*OKAY)#deptdesc := ('部門が見つかりません')ENDIF*<<< アウトバウンドのバインド・ロジックはここに記述 >>>*サービスをバインドして HTTP 要求コンテンツを作成CHANGE FIELD(#JSMXCMD) TO('BIND SERVICE(IIIPRO04_RESPONSE) TYPE(*OUTBOUND)')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)*フラグメントの設定 - DEPARTMENTRESPONSECHANGE FIELD(#JSMXCMD) TO('SET FRAGMENT(DEPARTMENTRESPONSE) 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)*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

