このステップでは、ユーザー・エージェントからデータを受け取って処理し、ユーザー・エージェントにデータを返すLANSA RDMLXサーバー・ファンクションを作成します。 

  1. Visual LANSA 開発環境を使用する場合、演習用に指定された区画にサインオンします。

  2. iiiPRO03 ユーザー エージェント サーバー テスト プロセスという名前で新しい LANSA プロセスを作成します。iii は一意の 3 文字です(同じ名前のプロセスがすでにある場合は、iiiに対して別の文字セットを選択します)。

  3. プロセス iiiPRO03 に属する iiiFN03 給与修正の受信と処理という名前で RDMLX 対応の新規のファンクションを作成します。iii は一意の 3 文字です。RDMLX チェックボックスはチェックしてください。 

  4. テンプレートのリストからテンプレート JSMXSKEL を選択して、[作成] ボタンをクリックします。 

  5. 以下の表に示すようにテンプレートの質問に回答します。

    質問

    回答

    コメント

    JSMサービスをロードしますか?

    HTTPSERVICE



  6. ファンクション 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) 


  7. SERVICE_LOAD コマンドを修正します。  KEYWRD サブルーチンを使用するコードを追加して、SERVICE_LOAD コマンドに以下のキーワードを追加します。

    キーワード

    SERVICE_CONTENT

    '*HTTP'

    TRACE

    '*YES'

    SERVICE_CONTENT(*HTTP) は、HTTPのポストされたコンテンツを受け取る場合に必要です。
    TRACE(*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)
     

  8.  RDMLX ソースの中央付近にあるコメント YOUR OWN LOGIC HERE を探します。
    [ホーム] リボンの [デザイン] グループで、[テンプレート] ボタンをクリックします。テンプレート BBJSMXCMD を使って CSV ファイルから社員番号と新しい給与を受けとる RDMLX コードを書きます。サービス・リストの名前の入力を求められた場合は、S_RECEIVE と入力します。このテーブルを使用して、テンプレートの質問に回答します。

    コマンド

    キーワード

    作業リスト

    RECEIVE


    HANDLER

    InboundSeparatedValue

    S_RECEIVE


    SVMODE

    '*USE'

    ここに示されているように *USE は単一引用符で囲みます。
    BBJSMXCMDテンプレートの使用の詳細については、「INT003 - FTPサービスの使用」の「ステップ1. 基本のJSMファンクションを作成する」を参照してください。

    SVMODE が *USE の場合、列見出しを LANSA フィールド名として使用するようサービスに伝えます。

    RDMLX コードは以下のようになります。

     * JSM コマンドの作成
    #JSMXCMD := RECEIVE
    EXECUTE 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) 
     

  9. 引き続き YOUR OWN LOGIC SECTION に次のような機能を追加するコードを書いていきます。

  10. 上記のコードの下に位置を合わせ、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)
     

  11. 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 STATUS
    USE 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 := RECEIVE
    EXECUTE 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'
    ELSE
    UPDATE 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'
    ENDIF
    ENDIF
    ADD_ENTRY TO_LIST(#S_SEND)
    ENDSELECT
    *

    *BUILD THE JSM COMMAND
    #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)
    *

    *CLOSE JSM AND VERIFY STATUS
    USE 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: ' + #JSMSTS
    MESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)
    #MSGDTA := 'Error Message: ' + #JSMMSG
    MESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)
    ENDIF
    *
    ENDROUTINE
     

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

  13. IBM i サーバーで JSM サーバーを使用している場合、プロセスとファンクションを IBM i にチェックインしてコンパイルします。