我想用BIRT创建一个报告。我有5个SQL标准作为报告的参数。通常,当我有三个标准时,我使用嵌套的if-else作为带javascript的WHERE语句。
因为现在我有更多的条件,所以编写代码和检查可能性变得更加困难,特别是为了调试目的。
例如,员工的标准,有以下五个标准:年龄,城市,部门,职称和教育程度。所有标准都是动态的,您可以将其保留为空白以显示所有内容。
有人知道这种方法的替代方法吗?
发布于 2014-01-12 09:13:54
有一个神奇的方法来处理这个没有任何脚本,这使报告更容易维护!我们可以使用这种SQL查询:
SELECT *
FROM mytable
WHERE (?='' OR city=? )
AND (?=-1 OR age>? )
AND (?='' OR department=? )
AND (?='' OR title=? )
因此,每个条件都有两个dataset参数,其中有一个" or“子句,允许在参数获得特定值、空值或空值时忽略一个条件。所有这些"OR“子句都是用常值计算的,因此查询的性能不会受到影响。
在本例中,我们应该有4个报表参数、8个数据集参数(每个报表参数绑定到2个数据集参数)和0脚本。请参见使用此方法这里的报表示例。
如果有更多的条件,我建议使用存储过程,因此,我们可以这样做,只有一个数据集参数的每个标准。
整数参数处理
如果我们需要处理一个整数列的"all“值,例如age:我们可以将报表参数"age”声明为字符串类型,而dataset参数"age“则声明为整数。然后,在dataset的参数选项卡中,使用值表达式而不是“链接到报表参数”。例如,如果我们喜欢同时处理"all“"null”和空值的健壮输入,这里是要输入的表达式:
(params["age"].value=="all" || params["age"].value=="" || params["age"].value==null)?-1:params["age"].value
示例报告可以下载这里 (v4.3.1)
发布于 2014-01-13 06:27:14
根据报告的要求和听众,你可能会发现这是有帮助的。
使用文本框参数并使defualt值%(这是一个外卡)
SELECT *
FROM mytable
WHERE city like ?
AND age like ?
AND department like ?
AND title like ?
这还允许用户搜索部分名称。如果城市文本框中的值为%ville%,它将返回城市名称中任何地方都有"ville“的所有城市。
发布于 2014-01-12 05:12:36
如果要包含在SQL子句中的报表参数将按照某些命名约定命名,例如query_employee_table列名,则可以以通用方式编写Java代码,以便在添加新记者时不必对其进行更改。
对于params中的每个param,{ if param.name以query_employee_ { where_clause +=和“+ param.name.substring(after 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“数组中。
https://stackoverflow.com/questions/21073182
复制相似问题