このステップでは、データベース・ファイル DEPTAB にアクセスして部門の記述を取得 (FETCH) する RDMLX を作成します。クライアント要求に応答する、サーバー側の送信 (SEND) RDMLX を作成します。

  1. ファンクション iiiFN04 を使用し、DEPARTMENTREQUEST フラグメントから GET を実行した後、以下に示されているブロックを削除します。
    次に、DEPTDESC フィールドを消去し、DEPTAB ファイルから DEPTMENT キー (部門コード) を使って DEPTDESC フィールド (部門の記述) を取得 (FETCH) する RDMLX コードを作成します。
    FETCH 処理の I/O ステータスを確認します。*OKAY 以外の場合、部門の記述をリテラル '部門が見つかりません' に変更します。
    RDMLX コードは以下のようになります。

    #DEPTDESC := *NULL
    FETCH FIELDS(#DEPTDESC) FROM_FILE(DEPTAB) WITH_KEY(#DEPTMENT) IO_ERROR(*NEXT) VAL_ERROR(*NEXT)
    IF_STATUS IS_NOT(*OKAY)
    #DEPTDESC := '部門が見つかりません'
    ENDIF



  2. 次にアウトバウンド HTTP のコンテンツを作成するコードを追加する必要があります。ソリューション XML 応答用にスタジオで生成された RDMLX から、このコード・フラグメントを取得できます。 XML 応答/samples/RDMLX フォルダを展開し、テキスト・エディターで SAMPLE_RDMLX_OUTBOUND_HTTP.txt を開きます。ファンクション iiiFN04 の以下のコメントの直後に、以下の赤い丸で囲まれたコードをコピーして貼り付けます。
    * <<< Outbound binding logic goes here >>>
    または
    *<<< アウトバウンドのバインド・ロジックはここに記述 >>>




  3. CHECK サブルーチンで、エラーが発生した場合はプログラムが終了するように ABORT コマンドを IF~ENDIF 条件に追加します。

  4. ファンクションiiiFN04をコンパイルします。

  5. 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)
*フラグメントの取得 - DEPTREQ
CHANGE 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 := *blanks
FETCH 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)
*フラグメントの設定 - DEPARTMENTRESPONSE
CHANGE 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)
ABORT
ENDIF
ENDROUTINE

  • No labels