我想通过使用BIRT创建报告。我有5个SQL标准作为报告的参数。通常,当我有3个标准时,我正在使用嵌套的if-else为带有JavaScript的WHERE语句。IF-ELSE替代BIRT中使用的多个SQL条件
由于现在我有更多的条件,编写代码变得更加困难,并且检查可能性,尤其是出于调试目的。
例如表格员工的标准,有以下5个标准:年龄,城市,部门,职位和教育。所有标准都是动态的,您可以留空以显示所有内容。
有没有人知道这种方法的替代?
我想通过使用BIRT创建报告。我有5个SQL标准作为报告的参数。通常,当我有3个标准时,我正在使用嵌套的if-else为带有JavaScript的WHERE语句。IF-ELSE替代BIRT中使用的多个SQL条件
由于现在我有更多的条件,编写代码变得更加困难,并且检查可能性,尤其是出于调试目的。
例如表格员工的标准,有以下5个标准:年龄,城市,部门,职位和教育。所有标准都是动态的,您可以留空以显示所有内容。
有没有人知道这种方法的替代?
有一种神奇的方式来处理这个没有任何脚本,这使得报告更容易维护!我们可以用这种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)
如果要包含在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”数组中。
根据报告要求和听力,您可能会发现这有帮助。
使用文本框PARAMATERS,使defualt值%(这是一个外卡)
SELECT *
FROM mytable
WHERE city like ?
AND age like ?
AND department like ?
AND title like ?
这也使您的用户能够搜索部分名称。如果城市文本框中的值为%ville%,则它将返回城市名称中任何地方的“ville”的所有城市。
感谢您的回复。我没有使用文本框参数,只有列表框由数据集中的字段组成。 – y2a
你是对的James,我的错误是我们必须先测试常量值。我编辑了答案。 – Dominique
当我们想要返回所有值时,使用特定的值(例如文本参数的“全部”)或数字的-1可能更容易。使用combobox参数,我们可以通过添加一个虚构项目“all values”来透明地完成此操作。 – Dominique
@dom:如何替换整数值 - 例如age - 以显示'All'作为默认值。因为我使用的是基于数据集的报表参数。 – y2a