Developerの内部仕様
前ページの画面仕様をDeveloperにて実現する場合、次のような作業が必要となります。
- ウィンドウ、キャンバスを定義
- データブロックを定義(ヘッダ部、明細部)
- 明細部のデータブロックに対して、テーブル[HINMK_TBL]を結びつける
- 明細部に項目(HINMK_CD、HINMK_NM)を定義
- ヘッダ部のデータブロックに項目(検索ボタン)を定義
- 検索ボタン押下時に、明細部へ遷移するように定義(WHEN-BUTTON-PRESSEDトリガーに go_block('明細部')と書く)
- 明細部に遷移時、execute_queryを実行するように定義(WHEN-NEW-BLOCK-INSTANCEトリガーに execute_queryと書く)
ロジックと呼べるものはほとんどなく、プロパティの設定で実装可能なのが特徴です。
Curl+ORBで実装する場合
Curl+ORBで実装する場合は、サーバ側とクライアント側の各々での定義が必要です。データアクセスをサーバ側(Java)で、画面コントロールをクライアント側(Curl)で実装します。Developerはデータアクセスロジックと画面コントロールロジックが融合して実装されていることが多いため、移行する場合はまず「データアクセスロジック」と「画面コントロールロジック」に分割する必要があります。
サーバ側
サーバ側はJavaで実装します。検索ボタン押下時の処理として、サービスクラスに以下のロジックを定義します。
- JDBCを用いて、Oracle DBに対してSQLを実行
- 実行した結果をデータクラスに設定
クライアント側
クライアント側はCurlで実装します。
- RecordGrid(名細部)とボタン(検索部)を定義
- 検索ボタンに対して、ボタン押下時にサーバ側のサービスクラスを実行するように定義
- サーバ側から返却された結果をRecordGridに定義
Curl Developer Centerに掲載されている「Curl ORB for Java」の関連記事も併せて参照ください。
サーバ側の実装
まず、サーバ側の実装を見て行きましょう。実際に定義するプログラムは「HinmkLst.java」「Hinmk.java」の2つです。
HinmkLst.java
サービスクラスです。品目一覧画面をコントロールするための[HinmkLst]クラスを定義し、検索ボタン押下時の処理として、[kensaku]メソッドを定義します。JDBCを用いて、Oracle DBに対してSQLを実行し、結果をデータクラス(Hinmk)に設定します。クライアントにCurlを使っていることを意識させない、一般的なJavaでのDBアクセスロジックと同様です。
package sample; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import com.curlap.orb.security.RemoteService; /** * HttpSession sample */ @RemoteService public class HinmkLst { public ArrayList<Hinmk> kensaku(String pi_cd) throws Exception{ //クライアントには、配列(ArrayList)型で返却する。 ArrayList<Hinmk> hinmklist = new ArrayList<Hinmk>(); try { /* 初期処理 */ // Oracle JDBC Driverのロード Class.forName("oracle.jdbc.driver.OracleDriver"); // Oracle に接続 Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@dbhosts:1521:instancename", "user", "user"); // ステートメントを作成 Statement stmt = conn.createStatement(); /* 主処理 */ /////SQLを実行する ResultSet rs = stmt.executeQuery("SELECT hinmk_cd,hinmk_nm FROM hinmk_tbl"); //取得結果をセット rs.next(); while(rs.next()) { Hinmk hinmk = new Hinmk(); //データクラスの生成 hinmk.setHinmk_cd(rs.getString("hinmk_cd")); //HINMK_CDの値を設定 hinmk.setHinmk_nm(rs.getString("hinmk_nm")); //HINMK_NMの値を設定 hinmklist.add(hinmk); //1行分のデータとして配列へ設定する。 } /* 終了処理 */ rs.close(); stmt.close(); ///////////////////////////////////////////////////////////////////////////////////////////// conn.close(); }catch(Exception wl_excp) { throw new Exception(wl_excp) ; } return hinmklist; } public Object echo(Object v) { return v; } }
Hinmk.java
テーブル[HINMK_TBL]を格納するためのデータクラスです。
package sample; /** * データクラス(HINMK_TBLの結果を格納する) */ public class Hinmk implements java.io.Serializable { private static final long serialVersionUID = -5592465168071966675L; /* フィールド */ private String hinmk_cd; //HINMK_CD private String hinmk_nm; //HINMK_NM /* ゲッター・セッター */ public String getHinmk_cd() { return hinmk_cd; } public void setHinmk_cd(String hinmk_cd) { this.hinmk_cd = hinmk_cd; } public String getHinmk_nm() { return hinmk_nm; } public void setHinmk_nm(String hinmk_nm) { this.hinmk_nm = hinmk_nm; } }
サーバサイドで作成するロジックは以上です。