我有一个BIRT报告,有4个可选参数。 开始日期;结束日期; stringparam和listparam(多值参数)。
我跟着"蓝色"此链接上的代码How do I set a parameter to a list of values in a BIRT report?
如果我将一个或全部值赋给参数,它就可以工作。但是,当我将参数留空时,我得到一个空白报告(结果不正确)。
这是我的疑问:
select f1,f2,f3,f4
where f1 >= ? -- startdate parameter
or f2 <= ? -- endate paramter
or f4 = ? -- stringparam
and ( f3 in (''/*?listparam*/) )
&#13;
我确实在我的Oracle数据库上查询了什么参数传递给我的查询我得到了&#39; NULL&#39;当我将参数值保留为空时,作为VALUE_STRING。
感谢任何帮助。
答案 0 :(得分:0)
听起来你想偶尔在参数中的4个标准中的一到三个中搜索记录。
有几种方法可以做到这一点:
一种方法是使用like,并将默认参数值设置为%即外卡。当参数运行时,它返回所有值。请注意,如果字段包含null,则可能会出现问题。
or f4 like ?
所以你需要使用类似于下面的东西来返回空值。
or (f4 is null
or f4 like ?)
我通常更喜欢使用“All”作为我的默认参数值,正如您在第二个“和”中看到的那样,我们查看参数值是否为All,如果返回的是PRODUCTTYPEM1.CATEGORY的所有值,如果是其他任何内容,则在字段PRODUCTTYPEM1.CATEGORY中查找输入的值。
where PRODUCTTYPEM1.ACTIVE = 't'
and DEVICE2M1.ISTATUS = 'In Use'
and ( 'All' = ?
or PRODUCTTYPEM1.CATEGORY = ?)
为此,您将需要两个参数条目,第一个用于全部,第二个用于除All之外的任何值。
我在报告中只有一个Category参数,如果参数值不是All,则第二个条目第二次查看相同的参数
这种方式有效。 (按要求扩充说明)
打开where语句,以及“使用中”的简单第二个标准
where PRODUCTTYPEM1.ACTIVE = 't'
and DEVICE2M1.ISTATUS = 'In Use'
第三个标准是在括号中设置的两个部分,其中OR语句将两部分分开
and ( 'All' = ?
or PRODUCTTYPEM1.CATEGORY = ?)
如果参数的值为All,则满足语句的第一部分,查询将跳过括号中的所有其他内容。就像你的SQL查询中没有参数一样。
如果参数的值为 NOT all,则不满足语句的第一部分,因此查询将在字段PRODUCTTYPEM1.CATEGORY中查找参数值。
你的最终查询可能看起来像这样,虽然它的问题在于我们的默认日期为“全部”,你可能想要使用某种日期作为默认值,如1900年1月1日。
select f1,f2,f3,f4
where f3 in (''/*?listparam*/)
AND ( 'All' = ?
OR f1 >= ?) -- startdate parameter
AND ( 'All' = ?
OR f2 <= ?) -- endate paramter
AND ( 'All' = ?
OR f4 = ?) -- stringparam