You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

このステップでは、部門記述を取得するデータベース・ファイルDEPTABにアクセスするRDMLXを作成し、サーバー側SETのRDMLXを作成します。

  1. 作業リスト定義 DEPTMEN_W に習い、フィールド DEPTDESC を含む 2 つ目の作業リスト DEPTDES_W を定義します。これが戻されるリストです。両方のリストをクリアするコードを追加します。コードは以下のようになります。

    * 以下のリストは xmlバインド・マップで使用
    DEF_LIST NAME(#DEPTMEN_W) FIELDS(#DEPTMENT) TYPE(*WORKING)
    DEF_LIST NAME(#DEPTDES_W) FIELDS(#DEPTDESC) TYPE(*WORKING)
    CLR_LIST NAMED(#DEPTMEN_W)
    CLR_LIST NAMED(#DEPTDES_W)

    注: デフォルトでは、作業リストは50エントリーで定義されます。この値はこのアプリケーションに対して適切です。

             
  2. ファンクション iiiFN05 の作業を続けます。受信ロジックの後に以下を追加する必要があります。次のコメント行の前にコードを追加します。
        * Bind service to create HTTP response content
             以下を行うRDMLXコードを作成します。
    1. リスト #DEPTMEN_W (クライアントから受信した作業リスト) から部門コードを選択 (SELECTLIST) します。
    2. キー #DEPTMENT を使ってファイル DEPTAB からフィールド #DEPTDESC (部門記述) を取得 (FETCH) します。この FETCH 処理の I/O 状態をチェックします。*OKAY 以外の場合、部門の記述をリテラル '部門が見つかりません' に変更します。
    3. 部門記述の作業リスト #DEPTDES_W にエントリーを追加 (ADD) します。
    4. ENDSELECT
      RDMLX コードは以下のようになります。

      SELECTLIST NAMED(#DEPTMEN_W)
      ********** 
      FETCH FIELDS(#DEPTDESC) FROM_FILE(DEPTAB) WITH_KEY(#DEPTMENT)
      IF_STATUS IS_NOT(*OKAY)
      #DEPTDESC := '部門が見つかりません'
      ENDIF 
      ADD_ENTRY TO_LIST(#DEPTDES_W)
      ENDSELECT 
      ********** 

  3. 組み込み関数 REVERSE を使用して、#STD_TEXT の内容を逆にする RDMLX を作成します。組み込みファンクション Trim を使用して、テキスト内の先頭または末尾の余白を削除します。
    RDMLX コードは以下のようになります。
    **********テキストを逆にする
    #STD_TEXTS := #STD_TEXTS.Reverse.Trim
    **********

  4. スタジオのプロジェクトで、フォルダ XML リスト応答/Samples/RDMLX を展開し、ファイル SAMPLE_RDMLX_OUTBOUND_HTTP.TXT をダブルクリックしてテスト・エディターで開きます。

  5. 次の赤い丸で囲まれたコードを選択します。


  6. ファンクション iiiFN05 の以下のコードを上記で選択したコードに置換します。
     * サービスをバインドして HTTP 応答コンテンツを作成
    CHANGE FIELD(#JSMXCMD) TO('BIND SERVICE( <<<outbound.class>>> ) TYPE(*OUTBOUND)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)

  7. この追加したコードで、リスト名 DEPARTMENT を DEPTDES_W に置き換えます。完全に一致する単語だけ検索してください。

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

  9. ファンクション iiiFN05 をコンパイルします。IBM i の JSM サーバーを使用している場合は、ファンクションをチェックインして IBM i でコンパイルします。
    完了した RDMLX コードは以下のようになります。

    FUNCTION OPTIONS(*DIRECT)
    *以下のフィールドは xml バインド・マップで使用
    *#DEPTMENT
    *#STD_TEXTS
    *以下のフラグメントは xml バインド・マップで使用
    GROUP_BY NAME(#LISTREQ) FIELDS(#STD_TEXTS)
    *以下のリストは xmlバインド・マップで使用
    DEF_LIST NAME(#DEPTMEN_W) FIELDS(#DEPTMENT) TYPE(*WORKING)
    DEF_LIST NAME(#DEPTDES_W) FIELDS(#DEPTMENT #DEPTDESC) TYPE(*WORKING)
    CLR_LIST NAMED(#DEPTMEN_W)
    CLR_LIST NAMED(#DEPTDES_W)
    *サービスを開く
    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(IIIPRO05_REQUEST) TYPE(*INBOUND) BINDTRACE(*YES)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
    *フラグメントを取得する - DEPARTMENTLISTREQUEST
    CHANGE FIELD(#JSMXCMD) TO('GET FRAGMENT(DEPARTMENTLISTREQUEST) SERVICE_EXCHANGE(*FIELD)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
    *リストを取得する - DEPARTMENT
    CHANGE FIELD(#JSMXCMD) TO('GET LIST(DEPARTMENT)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG #DEPTMEN_W)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
    SELECTLIST NAMED(#DEPTMEN_W)
    *
    FETCH FIELDS(#DEPTDESC) FROM_FILE(DEPTAB) WITH_KEY(#DEPTMENT)
    IF_STATUS IS_NOT(*OKAY)
    CHANGE FIELD(#DEPTDESC) TO('部j門が見つかりません')
    ENDIF
    ADD_ENTRY TO_LIST(#DEPTDES_W)
    ENDSELECT
    *
    *文字列を逆にする
    #STD_TEXTS := #STD_TEXTS.Reverse.Trim
    *
    *<<< Outbound binding logic goes here >>>
    *
    *サービスをバインドして、HTTP 要求コンテンツを作成
    CHANGE FIELD(#JSMXCMD) TO('BIND SERVICE(IIIPRO05_RESPONSE) TYPE(*OUTBOUND)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
    *フラグメントを設定する - DEPARTMENTLISTRESPONSE
    CHANGE FIELD(#JSMXCMD) TO('SET FRAGMENT(DEPARTMENTLISTRESPONSE) SERVICE_EXCHANGE(*FIELD)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG)
    EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMXSTS #JSMXMSG)
    *リストを設定する - DEPARTMENT
    CHANGE FIELD(#JSMXCMD) TO('SET LIST(DEPARTMENT)')
    USE BUILTIN(JSMX_COMMAND) WITH_ARGS(#JSMXHDLE1 #JSMXCMD) TO_GET(#JSMXSTS #JSMXMSG #DEPTDES_W)
    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