ステップ2. iiiFN06サーバーのSET機能をコード化する

LANSA Integrator

ステップ2. iiiFN06サーバーのSET機能をコード化する


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

1.   ファンクションiiiFN06を使用し、DEPARTMENTREQUESTフラグメントからGETを実行した後、強調表示されている以下のブロックを削除します。

次に、DEPTDESCフィールドを消去し、DEPTABファイルからDEPTMENTキー(部門コード)でDEPTDESCフィールド(部門名称)を取得するRDMLXコードを作成します。

      FETCH操作のI/Oステータスを確認します。*OKAY以外の場合、部門名称をリテラル'Department not found'に変更します。

      RDMLXコードは以下のように表示されます。

#DEPTDESC := *NULL
FETCH FIELDS(#DEPTDESC) FROM_FILE(DEPTAB) WITH_KEY(#DEPTMENT) IO_ERROR(*NEXT) VAL_ERROR(*NEXT)
IF_STATUS IS_NOT(*OKAY)
#DEPTDESC := 'Department Not Found'
ENDIF
 

2.   アウトバウンドHTTP内容を作成するコードを追加する必要があります。XML応答ソリューション用にスタジオで生成されたRDMLXから、このコード・フラグメントを取得できます。フォルダーXML Response/samples/RDMLXを展開し、テキスト・エディタでSAMPLE_RDMLX_OUTBOUND_HTTP.txtを開きます。ファンクションiiiFN06の以下のコメントの直後に、強調表示されたコードをコピーします。
* <<< Outbound binding logic goes here >>>

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

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

5.   IBM i のJSMサーバーを使用している場合は、ファンクションをIBM i に登録してコンパイルします。

      完了したRDMLXコードは以下のように表示されます。

FUNCTION OPTIONS(*DIRECT)

* The following fields are used by the XMLバインディング map
* #DEPTMENT
* The following fragments are used by the XMLバインディング map
GROUP_BY NAME(#DEPTREQ) FIELDS(#DEPTMENT)
* Open service
USE BUILTIN(JSMX_OPEN) TO_GET(#JSMXSTS #JSMXMSG #JSMXHDLE1)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
* Load service
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)
* Bind service to read HTTP request content
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)
* Get fragment - 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)
* handle request for department description
#deptdesc := *blanks
FETCH FIELDS(#deptdesc) FROM_FILE(deptab) WITH_KEY(#deptment) IO_ERROR(*NEXT) VAL_ERROR(*NEXT)
IF_STATUS IS_NOT(*OKAY)
#deptdesc := ('Department not found')
ENDIF
* <<< Outbound binding logic goes here >>>
* Bind service to create HTTP request content
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)
* Set fragment - 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)
* Write content
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)
* Send HTTP response content
CHANGE FIELD(#JSMXCMD) TO('SEND')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
* Close service
USE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
* Check routine
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