ステップ6. iiiFN09クライアントのGET機能をコード化する
このステップでは、Client XML Employees Responseソリューションに生成されたRDMLXのインバウンド部分を使用して、ファンクションiiiFN09を完了します。
1. スタジオでiii Trainingプロジェクトが開いている状態で、solutions/Client XML Employees Response/sample/RDMLXフォルダーを展開し、SAMPLE_RDMLX_INBOUND_HTTP.TXTの以下のコードをファンクションiiiFN09のコメント* <<< Inbound binding logic goes here >>>の後にコピーします。
* Bind service to read HTTP request content
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)
* Get fragment - 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)
* <<< Enter the
fragment loop logic for EMPLOYEE >>>
BEGIN_LOOP /* EMPLOYEE */
*
Get fragment - 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)
* Get
list - 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. * Get
list - EMPLOYEESKILLSロジックで作業リスト名を変更します。TO_GETキーワードは、作業リスト#EMPSKILLを参照する必要があります(ファンクションの上部でリストをDEF_LIST NAME(#empskill) FIELDS(#skildesc)
TYPE(*working)
ENTRYS(9999)として定義します)。
挿入されたコードを確認します。この中には、ステップ5などで概要が示されたすべての応答ロジックが含まれている点に注意してください。
· 応答サービスにバインド(BIND)します。
· 社員リストのフラグメントを取得(GET)します。
· ループして社員フラグメントを取得(GET)し、社員スキル・リストを取得(GET)してスキル作業リストを作成します。
3. このロジックを改良するには、社員にスキルがない場合の条件を処理します。JSMXSTS = NOLISTの場合はCONTINUEを追加し、コードの* Get List - EMPLOYEESKILLブロックをその後に続けます。このコード・ブロックは以下のようになります。
* Get list - EMPLOYEESKILL
CHANGE FIELD(#JSMXCMD)
TO('GET LIST(EMPLOYEESKILL)')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1
#JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG #EMPLOYEESKILL)
CONTINUE IF('#JSMXSTS *EQ NOLIST')
4. ファンクションは、現在、各社員フラグメント(EMPNOとFULLNAME)、およびその社員のスキル・リストをループして取得します。ファンクションiiiFN09はフル名とスキルを2番目の作業リストに保存する必要があります。このリストは、呼び出し表示ファンクションiiiFN10に返されます。END_LOOPの前に、#EMPSKILLリストを読み込み作業リスト#WL_EMPSKLにエントリーを追加するロジックを追加します。コードは以下のようになります。
SELECTLIST NAMED(#empskill)
ADD_ENTRY TO_LIST(#wl_empskl)
ENDSELECT
5. CLOSEの後にRETURNコマンドを追加します。
6. スタジオで生成されたコードのCHECKサブルーチンは、ステータスがOK以外の場合はメニューに返すだけです。ルーチンを以下のロジックで置き換えます。これにより、JSMステータスとJSMメッセージを含むメッセージが表示されます。これはテスト目的の場合に役立ちます。
* Check routine
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
完了したRDMLXコードは以下のように表示されます。
FUNCTION OPTIONS(*DIRECT) RCV_LIST(#wl_empskl)
* 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)
DEF_LIST NAME(#empskill) FIELDS(#skildesc) TYPE(*working)
ENTRYS(9999)
DEF_LIST NAME(#WL_EMPSKL) FIELDS(#FULLNAME #SKILDESC)
TYPE(*WORKING) ENTRYS(9999)
* 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(HTTPOutboundXMLBindService) TRACE(*YES)')
USE
BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS
#JSMXMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
* Bind
service to create HTTP request content
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)
* Set fragment -
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)
* 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 request
content
CHANGE FIELD(#JSMXCMD) TO('SEND HOST(10.44.10.236:80)
URI(/cgi-bin/jsmdirect?IIIFN08_SERVICE)')
USE BUILTIN(JSMX_COMMAND)
WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE
SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
* <<< Inbound
binding logic goes here >>>
* Bind service to read HTTP request
content
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)
* Get fragment -
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)
* <<< Enter the fragment loop logic
for EMPLOYEE >>>
BEGIN_LOOP /* EMPLOYEE */
* Get fragment -
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)
* Get
list - EMPLOYEESKILL
CHANGE FIELD(#JSMXCMD) TO('GET
LIST(EMPLOYEESKILL)')
USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1
#JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG #EMPSKILL)
CONTINUE IF('#JSMXSTS *EQ NOLIST')
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS
#JSMXMSG)
SELECTLIST NAMED(#empskill)
ADD_ENTRY
TO_LIST(#wl_empskl)
ENDSELECT
END_LOOP /* EMPLOYEE */
* Close
binding
CHANGE FIELD(#JSMXCMD) TO('CLOSE')
USE BUILTIN(JSMX_COMMAND)
WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
EXECUTE
SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)* Unload service
USE
BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 'SERVICE_UNLOAD') 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)
RETURN
* Check routine
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
6. ファンクションを保存してコンパイルし、サーバーに登録します。