忽略多选输入控件的空值?

时间:2012-10-17 14:13:45

标签: jasper-reports jasperserver

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

我的输入控件:

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

    我在 NDC 输入控件的 JasperReports Server 中获得了无效的列类型。

    当我尝试

     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 ,而不是所有结果?

2 个答案:

答案 0 :(得分: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 :)

答案 1 :(得分:0)

有一个有趣的选择,因为$ X {NOTIN,...}在空列表的情况下也会计算为0 = 0.

因此你可以这样做:

($X{IN, cs.companyid, companyIds} 
  AND NOT 
  ($X{NOTIN, cs.companyid, companyIds}))