2014-01-12 32 views
3

我想通过使用BIRT创建报告。我有5个SQL标准作为报告的参数。通常,当我有3个标准时,我正在使用嵌套的if-else为带有JavaScript的WHERE语句。IF-ELSE替代BIRT中使用的多个SQL条件

由于现在我有更多的条件,编写代码变得更加困难,并且检查可能性,尤其是出于调试目的。

例如表格员工的标准,有以下5个标准:年龄,城市,部门,职位和教育。所有标准都是动态的,您可以留空以显示所有内容。

有没有人知道这种方法的替代?

回答

3

有一种神奇的方式来处理这个没有任何脚本,这使得报告更容易维护!我们可以用这种SQL查询:

SELECT * 
FROM mytable 
WHERE (?='' OR city=?) 
AND (?=-1 OR age>?) 
AND (?='' OR department=?) 
AND (?='' OR title=?) 

所以每个标准有两个数据集参数,用“OR”条款,允许忽略一个标准时参数达到特定值,空值或空值随你便。所有这些“OR”子句都用一个常量值来评估,因此查询的性能不会受到影响。

在这个例子中,我们应该有4个报告参数,8个数据集参数(每个报告参数绑定到2个数据集参数)和0个脚本。查看使用此方法的报告的实时示例here

如果还有更多的标准我会推荐使用存储过程,因此我们可以按照每个条件仅使用一个数据集参数来执行相同操作。

整型参数处理

如果我们需要处理“所有”值整数列,例如年龄:我们可以声明报表参数“年龄”为字符串类型和数据集参数“年龄”为整数。然后,在数据集的参数选项卡中使用值表达式而不是“链接到报告参数”。例如,如果我们想要一个强大的输入,同时处理“所有”,“空”和空值这里表达进入:

(params["age"].value=="all" || params["age"].value=="" || params["age"].value==null)?-1:params["age"].value 

样本报告可以下载here(V 4.3.1)

+0

你是对的James,我的错误是我们必须先测试常量值。我编辑了答案。 – Dominique

+2

当我们想要返回所有值时,使用特定的值(例如文本参数的“全部”)或数字的-1可能更容易。使用combobox参数,我们可以通过添加一个虚构项目“all values”来透明地完成此操作。 – Dominique

+0

@dom:如何替换整数值 - 例如age - 以显示'All'作为默认值。因为我使用的是基于数据集的报表参数。 – y2a

1

如果要包含在SQL-WHERE子句中的报表参数将根据某些命名约定命名,例如query_employee_ [表列名称],则可以用通用方式编写Java-Script代码,以便您不会当新记者被添加时必须改变它。

在PARAMS { 每个PARAM如果param.name与query_employee_ { 开始where_clause + = “和” + param.name.substring(后query_employee)+ “== '” + param.value + “'” ; } }

您必须检查参数的类型才能决定是否必须引用参数值。

事件处理程序可以看看如下(以Java实现,但它应该有可能将它移植到JavaScript中,如果你真的需要它是在JavaScript):

public class WhereConditionEventHandler extends DataSetEventAdapter { 

    @Override 
    public void beforeOpen(IDataSetInstance dataSet, 
      IReportContext reportContext) throws ScriptException { 
     super.beforeOpen(dataSet, reportContext); 
     String whereClause = " where 1 = 1 "; 
     SlotHandle prms = reportContext.getDesignHandle().getParameters(); 
     for (int i = 0; i < prms.getCount(); i++) { 
      if (prms.get(i) instanceof ScalarParameterHandle) { 
       ScalarParameterHandle prm = (ScalarParameterHandle) prms.get(i); 
       int n = prm.getName().indexOf("sql_customer_"); 
       if (n > -1) { 
        String prmValue = "" + reportContext.getParameterValue(prm.getName()); 
        if (DesignChoiceConstants.PARAM_TYPE_STRING.equals(prm.getDataType())) { 
         prmValue = "'" + prmValue + "'"; 
        } 
        whereClause += " and " + prm.getName().substring("sql_customer_".length()) + " = " + prmValue; 
       } 
      } 
     } 
     System.out.println("sql: " + whereClause); 
     dataSet.setQueryText(dataSet.getQueryText() + whereClause); 
    } 
} 

顺便说一句,您可以传递未在BIRT报告设计中注册为报告参数的参数。但是BIRT将会把它们放入“params”数组中。

+0

我需要更多的细节,因为我也是JavaScripst的新手。假设我有3个报告参数(rpAge,rpCity,rpTitle),如何在上面的代码中编写where语句? – y2a

+0

非常感谢您向我展示示例代码。 – y2a

2

根据报告要求和听力,您可能会发现这有帮助。

使用文本框PARAMATERS,使defualt值%(这是一个外卡)

SELECT * 
FROM mytable 
WHERE city like ? 
    AND age like ? 
    AND department like ? 
    AND title like ? 

这也使您的用户能够搜索部分名称。如果城市文本框中的值为%ville%,则它将返回城市名称中任何地方的“ville”的所有城市。

+0

感谢您的回复。我没有使用文本框参数,只有列表框由数据集中的字段组成。 – y2a