BIRT 2.2动态模式名​​称

时间:2009-03-02 19:15:07

标签: sql db2 birt params

是否可以在BIRT查询中使模式名称动态化。

我试过了:

SELECT CURRENT DATE AS DATE, 
(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'
      END) AS DAYOFWEEK
FROM **?**.COBOL_CALENDAR
 WHERE SERVICE_DATE = CURRENT DATE"

这会产生以下错误: 以下项目有错误:

ReportDesign (id = 1): 
+ Cannot get the result set metadata.
SQL statement does not return a ResultSet object.
SQL error #1: [IBM][CLI Driver][DB2] SQL0104N  An unexpected token "?" was found following "".  Expected tokens may include:  "( TABLE FINAL <IDENTIFIER> XMLTABLE".  SQLSTATE=42601

但是?似乎只适用于where子句。

我需要将模式作为参数传递并动态使用,因为它根据dev / cat / prod进行更改

有没有办法生成birt xml的sql outsite并以某种方式注入?

我在这个问题上做了更多的搜索并找到了这个解决方案

<method name="beforeOpen"><![CDATA[this.queryText = "SELECT CURRENT DATE AS DATE, "+
"(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'"+
"      END) AS DAYOFWEEK"+
"FROM "+params["SCHEMA"]+".COBOL_CALENDAR"+
" WHERE SERVICE_DATE = CURRENT DATE";]]></method>

但是,无论在此问题上有多少示例,以这种方式注入sql只会产生以下错误。

ReportDesign (id = 1): 
+ Cannot get the result set metadata.
SQL statement does not return a ResultSet object.
SQL error #1: [IBM][CLI Driver][DB2] SQL0104N  An unexpected token "SCHEMANAME" was found following "".  Expected tokens may include:  ", FROM INTO".  SQLSTATE=42601

我甚至尝试了reportContext.getParameterValue("SCHEMANAME")路线,结果相同。

2 个答案:

答案 0 :(得分:2)

ARRRGH这是空间的愚蠢问题!

“END)AS DAYOFWEEK”+ “FROM”+ params [“SCHEMA”] +“。COBOL_CALENDAR”+

在FROM前面添加一个空格修复它。

bangs在液晶显示屏上显示。

答案 1 :(得分:0)

看起来您已编辑了报告的XML-Source。以下是在SQL-Query中替换任意字符串的更加图形化的方法:

按以下方式编写查询:

SELECT CURRENT DATE AS DATE, 
(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'
      END) AS DAYOFWEEK
FROM dev.COBOL_CALENDAR
 WHERE SERVICE_DATE = CURRENT DATE

如果dev是有效架构,您现在可以选择元数据集,并且仍然可以使用报表参数替换它。

然后单击您的数据集并选择“脚本”选项卡。在这里选择“beforeOpen”并输入替换ccript:

this.queryText = this.queryText.replace("dev", params["SCHEMA"].value);

这样,在执行查询之前,将查询文本中的字符串dev替换为SCHEMA参数的值。您可以替换您想要的每个字符串(linke **?**,但是首先使用有效的模式,您可以在设计阶段使用元数据集。 enter image description here

相关问题