1

我有一个包含几个输入控件的报告,这些输入控件用于填充另一个输入控件。

我的输入控件:

  1. GPI - 具有产品代码的多选输入控件。参数是一个集合。
  2. NAME_LOOKUP - 一个单值文本框,用户可以在其中键入产品名称。参数是一个字符串。
  3. NDC - 根据GPINAME_LOOKUP中输入的内容获取值的药品代码列表。

填充NDC的查询具有以下WHERE子句:

 WHERE (
   REGEXP_LIKE(DESCRIPTION, $P{name_lookup}, 'i')
   OR REGEXP_LIKE(NDC, $P{name_lookup}, 'i')
       )
   OR ($X{IN, GPI, gpi}) 

它按照$X语法设计的方式工作——如果用户没有从列表中选择GPI值,我的NDC输入控件会显示所有药物代码。但是,我只想在实际从GPI输入控件中选择一个值时显示药物代码。

当我尝试

 WHERE (
   REGEXP_LIKE(DESCRIPTION, $P{name_lookup}, 'i')
   OR REGEXP_LIKE(NDC, $P{name_lookup}, 'i')
       )
   OR ($X{IN, GPI, gpi} AND $P{gpi} IS NOT NULL) 

我在JasperReports 服务器中为NDC输入控件获取了无效的列类型。

当我尝试

 WHERE (
   REGEXP_LIKE(DESCRIPTION, $P{name_lookup}, 'i')
   OR REGEXP_LIKE(NDC, $P{name_lookup}, 'i')
       )
   OR ($X{IN, GPI, gpi} AND $P!{gpi} IS NOT NULL) 

我收到一个缺少的表达式错误。

我可以做些什么来将NDC输入控件的结果限制为仅选定的GPI,而不是所有结果?

4

2 回答 2

2

我只是在遇到同样的问题时发现了这一点,我终于使用第二个参数来解决它,该参数包含列表的长度:

<parameter name="potentially_empty_list" class="java.util.Collection"/>
<parameter name="num_of_list_elements" class="java.lang.Integer" isForPrompting="false">
        <defaultValueExpression>
<![CDATA[$P{potentially_empty_list}.size()]]>
</defaultValueExpression>
</parameter>

然后 SQL 查询将是:

[... select etc...]
WHERE $X{IN,mysql_column_name, ist}
AND $P{num_of_list_elements} > 0

对于一个空列表,它将被发送到 mysql 为:

WHERE 0 = 0 #(that's how jasper parses $X{IN..} for an empty collection
AND 0 > 0   # don't match anything :)
于 2013-04-17T11:23:28.677 回答
0

有一个有趣的替代方案,因为 $X{NOTIN, ...} 在空列表的情况下也计算为 0=0。

因此,您可以这样做:

($X{IN, cs.companyid, companyIds} 
  AND NOT 
  ($X{NOTIN, cs.companyid, companyIds}))
于 2016-04-29T13:03:24.250 回答