Page History
...
- Visual LANSA 開発環境を使用する場合、演習用に指定された区画にサインオンします。
- iiiPRO03 ユーザー エージェント サーバー テスト プロセスという名前で新しい LANSA プロセスを作成します。iii は一意の 3 文字です(同じ名前のプロセスがすでにある場合は、iiiに対して別の文字セットを選択します)。
- プロセス iiiPRO03 に属する iiiFN03 給与修正の受信と処理という名前で RDMLX 対応の新規のファンクションを作成します。iii は一意の 3 文字です。RDMLX チェックボックスはチェックしてください。
- テンプレートのリストからテンプレート JSMXSKEL を選択して、[作成] ボタンをクリックします。
以下の表に示すようにテンプレートの質問に回答します。
質問
回答
コメント
JSMサービスをロードしますか?
HTTPSERVICE
ファンクション iiiFN03 の RDMLX コードを編集します。
このファンクションには 2 つの作業リストが必要です。作業リスト S_RECEIVE を使って、ユーザー・エージェントから送信された CSV ファイルのデータを受け取ることができます。CSV ファイルに他の情報が含まれていますが、このファンクションでは、社員番号と給与のみを使用します。
- 作業リスト S_SEND を使って、このサーバー・ファンクションからユーザー・エージェントに応答を返すことができます。受信リストの更新は許可されていないため、このリストは受信リストとは別のリストにしてください。この場合、ユーザー・エージェントに返されるデータは、社員番号、社員の一部詳細、新しい給与、更新の成功や失敗を示すメッセージを含むテキスト・フィールドになります。
また、エラーを処理するフィールド S_ERROR も定義する必要があります。
RDMLX コードは以下のようになります。
DEF_
...
LIST NAME(#S_RECEIVE)
...
FIELDS(
...
#EMPNO #SALARY)
...
TYPE(*WORKING)
...
DEFINE FIELD(#S_ERROR)
...
TYPE(*CHAR)
...
LENGTH(132)
...
INPUT_ATR(LC)DEF_
...
LIST NAME(#S_SEND) FIELDS(#EMPNO #GIVENAME #SURNAME #SALARY #S_ERROR)TYPE(*WORKING)
SERVICE_LOAD
コマンドを修正します。 KEYWRDコマンドを修正します。 KEYWRD サブルーチンを使用するコードを追加して、SERVICE_LOAD コマンドに以下のキーワードを追加します。
- SERVICE
キーワード
値
SERVICE_CONTENT
'*HTTP'
TRACE
'*YES'
SERVICE_CONTENT(*HTTP) は、HTTPのポストされたコンテンツを受け取る場合に必要です。
TRACETRACE(*YES) は、テストを行う際に役立ちます。実稼働システムへの配布前にトレースを削除する必要があります。
完了したコードは次のようになります。変更された箇所は赤で示されています。完了したコードは次のようになります。変更された箇所は赤で示されています。
* BUILD THE SERVICE LOAD COMMAND#JSMXCMD := 'SERVICE_LOAD'EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD 'SERVICE' 'HTTPSERVICE')EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD 'SERVICE_CONTENT' '*HTTP')EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD 'TRACE' '*YES')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMSTS #JSMMSG)EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXHDLE1)
...
RDMLX ソースの中央付近にあるコメント YOUR OWN LOGIC HERE を探します。
...
[ホーム] リボンの [デザイン] グループで、[テンプレート]
...
ボタンをクリックします。テンプレート BBJSMXCMD を使って CSV ファイルから社員番号と新しい給与を受けとる RDMLX コードを書きます。サービス・リストの名前の入力を求められた場合は、S_RECEIVE と入力します。このテーブルを使用して、テンプレートの質問に回答します。
コマンド
キーワード
値
作業リスト
RECEIVE
HANDLER
InboundSeparatedValue
S_RECEIVE
...
SVMODE
'*USE'
...
ここに示されているように *USE は単一引用符で囲みます。
...
BBJSMXCMDテンプレートの使用の詳細については、「INT002 -
...
FTPサービスの使用」の「ステップ1.
...
基本のJSMファンクションを作成する」を参照してください。
SVMODE が *USE の場合、列見出しを LANSA フィールド名として使用するようサービスに伝えます。
RDMLXRDMLX コードは以下のようになります。
* JSM コマンドの作成#JSMXCMD := RECEIVEEXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD HANDLER InboundSeparatedValue)EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD SVMODE '*USE')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMSTS #JSMMSG #S_RECEIVE)EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXCMD)
...
引き続き YOUR OWN LOGIC SECTION に次のような機能を追加するコードを書いていきます。
...
受信したリスト S_RECEIVE. のすべてのエントリーを選択 ( SELECTLIST) します。
...
EMPNO キーで PSLMST から GIVENAME と SURNAME を取得 (FETCH) します。
...
I/O ステータスを確認します。
...
OK 以外の場合、社員が見つからなかったことを示すエラー・フィールド S_ERROR を変更 (CHANGE) します。
...
それ以外の場合は、PSLMST で SALARY を更新 (UPDATE) します。
...
更新 (UPDATE) の I/O ステータスを確認し、エラー・フィールド S_ERROR を適宜変更 (CHANGE) します。
...
LANSA ユーザー・エージェントに返す作業リスト S_SEND にエントリーを追加します。
...
ENDSELECT
...
コードは以下のようになります。SELECTLIST NAMED(#S_RECEIVE)CHANGE FIELD(#GIVENAME #SURNAME) TO(*NULL)FETCH FIELDS(#SURNAME #GIVENAME) FROM_FILE(PSLMST) WITH_KEY(#EMPNO)IF_STATUS IS_NOT(*OKAY)#S_ERROR := 'Unsuccesful: Employee not found'ELSEUPDATE FIELDS(#SALARY) IN_FILE(PSLMST) IO_ERROR(*NEXT) VAL_ERROR(*NEXT)IF_STATUS IS_NOT(*OKAY)#S_ERROR := 'Unsuccesful: Employee found but update failed'ELSE#S_ERROR := 'Succesful: Salary of employee ' + #EMPNO + 'succesfully updated'ENDIFENDIFADD_ENTRY TO_LIST(#S_SEND)
...
ENDSELECT
...
上記のコードの下に位置を合わせ、BBJSMXCMDテンプレートを使用して、ユーザー・エージェントに応答リストを返すコードを作成します。このリストには、社員の詳細と、成功/失敗を示すメッセージが含まれています。 サービス・リストの名前の入力が求められた場合は、S_SENDと入力します。以下の表を使用して、テンプレートの質問に回答します。
コマンド
キーワード
値
作業リスト
SEND
HANDLER
InboundSeparatedValue
S_SEND
...
コードは以下のようになります。
* JSM コマンドの作成#JSMXCMD := SEND
...
EXECUTE SUBROUTINE(KEYWRD)
...
WITH_PARMS(#JSMXCMD
...
HANDLER InboundSeparatedValue)USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMSTS #JSMMSG #S_SEND)
...
EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXHDLE1)
...
SERVICE_UNLOADコマンドを削除します。
...
JSMX_CLOSEコマンドはそのままにしておいてください。
...
完成したコードは以下のようになります。
FUNCTION OPTIONS(*DIRECT)DEF_LIST NAME(#S_RECEIVE) FIELDS(#EMPNO #SALARY) TYPE(*WORKING)DEFINE FIELD(#S_ERROR) TYPE(*CHAR) LENGTH(132) INPUT_ATR(LC)DEF_LIST NAME(#S_SEND) FIELDS(#EMPNO #GIVENAME #SURNAME #SALARY #S_ERROR) TYPE(*WORKING)**
...
OPEN JSM AND VERIFY STATUSUSE BUILTIN(JSMX_OPEN) TO_GET(#JSMSTS #JSMMSG #JSMXHDLE1)EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXHDLE1)** BUILD THE SERVICE LOAD COMMAND#JSMXCMD := 'SERVICE_LOAD'EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD 'SERVICE' 'HTTPSERVICE')EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD 'SERVICE_CONTENT' '*HTTP')EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD 'TRACE' '*YES')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMSTS #JSMMSG)EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXHDLE1)**
...
YOUR OWN LOGIC HERE*BUILD THE JSM COMMAND#JSMXCMD := RECEIVEEXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD HANDLER InboundSeparatedValue)EXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD SVMODE '*USE')USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMSTS #JSMMSG #S_RECEIVE)EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXCMD)*SELECTLIST NAMED(#S_RECEIVE)CHANGE FIELD(#GIVENAME #SURNAME) TO(*NULL)FETCH FIELDS(#SURNAME #GIVENAME) FROM_FILE(PSLMST) WITH_KEY(#EMPNO)IF_STATUS IS_NOT(*OKAY)#S_ERROR := 'Unsuccesful: Employee not found'ELSEUPDATE FIELDS(#SALARY) IN_FILE(PSLMST) IO_ERROR(*NEXT) VAL_ERROR(*NEXT)IF_STATUS IS_NOT(*OKAY)#S_ERROR := 'Unsuccesful: Employee found but update failed'ELSE#S_ERROR := 'Succesful: Salary of employee ' + #EMPNO + 'succesfully updated'ENDIFENDIFADD_ENTRY TO_LIST(#S_SEND)ENDSELECT**BUILD THE JSM COMMAND#JSMXCMD := SENDEXECUTE SUBROUTINE(KEYWRD) WITH_PARMS(#JSMXCMD HANDLER InboundSeparatedValue)USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMSTS #JSMMSG #S_SEND)EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXHDLE1)**CLOSE JSM AND VERIFY STATUSUSE BUILTIN(JSMX_CLOSE) WITH_ARGS(#JSMXHDLE1) TO_GET(#JSMSTS #JSMMSG)EXECUTE SUBROUTINE(CHECK_STS) WITH_PARMS(#JSMXHDLE1)RETURN**Subroutine to build JSM commands. existing JSM command*SUBROUTINE NAME(KEYWRD) PARMS((#W_CMDX *BOTH) (#W_KEYWRD *RECEIVED) (#W_KEYVAL *RECEIVED))DEFINE FIELD(#W_CMDX) REFFLD(#JSMXCMD)DEFINE FIELD(#W_KEYWRD) REFFLD(#STD_TEXT)DEFINE FIELD(#W_KEYVAL) REFFLD(#STD_TEXTL)#W_CMDX += ' ' + #W_KEYWRD + '(' + #W_KEYVAL + ')'ENDROUTINE**
...
Check the status of the JSM command issued*SUBROUTINE NAME(CHECK_STS) PARMS(#W_HDLE)DEFINE FIELD(#MSGDTA) TYPE(*CHAR) LENGTH(132)DEFINE FIELD(#W_HDLE) TYPE(*CHAR) LENGTH(4)*IF COND('#JSMSTS *NE OK')*#MSGDTA := 'Error Status Code: ' + #JSMSTSMESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)#MSGDTA := 'Error Message: ' + #JSMMSGMESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)ENDIF*ENDROUTINE
...
ファンクション iiiFN03 をコンパイルします。
...
IBM i サーバーで JSM サーバーを使用している場合、プロセスとファンクションを IBM i にチェックインしてコンパイルします。