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

Compare with Current View Page History

Version 1 Next »

ステップ 7. iiiFN05 サーバーのデータベース・ロジックと SET 機能をコーディングする

INT006 - 部門リスト照会
このステップでは、部門記述を取得するデータベース・ファイル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コードを作成します。
    a.      リスト #DEPTMEN_W (クライアントから受信した作業リスト) から部門コードを選択 (SELECTLIST) します。
    b.      キー #DEPTMENT を使ってファイル DEPTAB からフィールド #DEPTDESC (部門記述) を取得 (FETCH) します。この FETCH 処理の I/O 状態をチェックします。*OKAY 以外の場合、部門の記述をリテラル '部門が見つかりません' に変更します。
    c.      部門記述の作業リスト #DEPTDES_W にエントリーを追加 (ADD) します。
    d.      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