2011/03/29

[BIRT] BIRT 的 Runtime Connection 設定 (proxool)

BIRT(Business Intelligence and Reporting Tools) 這套 Java 的報表套件其實還蠻好用的. 不過報表設計工具只有整合在 Eclipse.
有用過這一套的人大概都知道, 設計完一個報表後會產生一個 .rptdesign 的檔案.
而一般在程式中呼叫此報表檔, 並繫結資料的程式碼大致如下:
IReportRunnable design = this.birtReportEngine.openReportDesign("test_report.rptdesign");
IRunAndRenderTask task = this.birtReportEngine
                .createRunAndRenderTask(design);
// set report parameters
task.setParameterValue("startTime", "2010-09-01");
task.setParameterValue("endTime", "2010-12-01");
// set output format
HTMLRenderOption options = new HTMLRenderOption();
options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
options.setOutputStream(response.getOutputStream());
task.setRenderOption(options);
// run the report
task.run();
task.close();
這樣的套用方式, 會直接使用 .rptdesign 檔中的連線設定, 而檔案中的連線設定是放在 <data-sources> 裡:
(將 .rptdesign 用記事本之類的文字編輯器打開可以看到如下的設定)
<data-sources>
  <oda-data-source extensionID="org.eclipse.birt.report.data.oda.jdbc" name="ReportDS" id="21">
    <list-property name="privateDriverProperties">
      <ex-property>
        <name>contentBidiFormatStr</name>
        <value>ILYNN</value>
      </ex-property>
      <ex-property>
        <name>metadataBidiFormatStr</name>
        <value>ILYNN</value>
      </ex-property>
    </list-property>
    <property name="odaDriverClass">net.sourceforge.jtds.jdbc.Driver</property>
    <property name="odaURL">jdbc:jtds:sqlserver://testdb:1433/ReportDB</property>
    <property name="odaUser">reporter</property>
    <encrypted-property name="odaPassword" encryptionID="base64">xxxxxxx</encrypted-property>
  </oda-data-source>
</data-sources>

一般來說, 開發環境的連線設定跟正式環境應該是不一樣的. 而且資料庫的存取帳號大概也只有 DBA 知道. 除非 DBA 已經跟開發者講好帳密等連線資訊, 不然這樣的報表檔案一套用下去大概在連線上就先掛了.
所以我大略整理以下兩種方式, 讓報表在 Runtime 時可以設定新的連線資訊.

  • 如果連線資訊是放在參數檔或某個特定的 class 中, 可以用以下的設定方式將既有的連線資訊蓋掉:
    IReportRunnable design = this.birtReportEngine.openReportDesign("test_report.rptdesign");
    IDataSource ds = design.getDesignInstance().getDataSource("ReportDS");
    ds.setPrivateDriverProperty("odaDriverClass",
        "net.sourceforge.jtds.jdbc.Driver");
    ds.setPrivateDriverProperty("odaURL",
        "jdbc:jtds:sqlserver://192.168.1.3/ReportDB");
    ds.setPrivateDriverProperty("odaUser", "reportAcc");
    ds.setPrivateDriverProperty("odaPassword", "productionpw");
    // 以下省略...
    以上的連線值都可以從別的來源取得並設定.
  • 如果系統本身就已經有使用 3rd 的 connection pool 套件, 讓報表取用 connection pool 中的 connection 物件來使用應該是較佳的做法.
    以下是我用 proxool 的設定方式( proxool 的設定方式都略過了)
    IReportRunnable design = this.birtReportEngine.openReportDesign("test_report.rptdesign");
    IRunAndRenderTask task = this.birtReportEngine
                    .createRunAndRenderTask(design);
    // set report parameters
    task.setParameterValue("startTime", "2010-09-01");
    task.setParameterValue("endTime", "2010-12-01");
    // set output format
    HTMLRenderOption options = new HTMLRenderOption();
    options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
    options.setOutputStream(response.getOutputStream());
    task.getAppContext().put("OdaJDBCDriverPassInConnection", DriverManager.getConnection("proxool.reportdb"));
    task.setRenderOption(options);
    // run the report
    task.run();
    task.close();
    只要簡單地將 Connection 物件設定至 task 的 "OdaJDBCDriverPassInConnection" 裡就可以讓報表從這個連線去撈取資料並進行繫結.

有關 ODA 的說明, 可以從這邊開始:
http://wiki.eclipse.org/Use_Case_-_Consuming_ODA_Data_Sources

沒有留言: