列为子报表参数 [英] List as subreport parameter

查看:41
本文介绍了列为子报表参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将一个整数列表传递给我的子报表,该整数列表将用作查询中IN语句的参数,如下所示:

I need to pass to my subreport a list of integers which will be used as parameter for a IN statement in my query like this:

SELECT * FROM my_tables WHERE $X{IN, table.id || '', PARAMETER_LIST}

我尝试了各种语法来实例化主报告中的列表,但没有一个导致 功能报告;例如:

I have tried various syntax to instance a list on my master report but none of them lead to a functional report ; eg :

<subreportParameter name="PARAMETER_LIST">
    <subreportParameterExpression><![CDATA[[1,2]]]></subreportParameterExpression>
</subreportParameter>

我的问题有解决方案吗?

Is there a solution to my problem?

推荐答案

我尝试将$ X {IN,attributeName,parameterName}与List component一起使用.

I've tried to use $X{IN, attributeName, parameterName} with List component.

主要步骤(参数名称来自下面的示例):

  • 在主报表中将listParam参数声明为java.util.List
  • quantityParam参数声明为subDataset中的java.util.List
  • ArrayList构造函数的帮助下,将listParam参数映射到quantityParam参数
  • subDataset查询中添加$X{}表达式.

    The main steps (parameters names are from the sample below):

  • Declare listParam parameter as java.util.List in main report
  • Declare quantityParam parameter as java.util.List in subDataset
  • Make mapping from listParam parameter to quantityParam parameter with help of ArrayList constructor
  • Add $X{} expression to subDataset query.

    具有language属性为Java的工作示例:

    The working sample with language property as Java:

    <jasperReport ...>
        ...
        <subDataset name="dataset1">
            <parameter name="ProductId" class="java.lang.Integer"/>
            <parameter name="quantity" class="java.util.List"/>
            <queryString>
                <![CDATA[SELECT
         POSITIONS."DOCUMENTID" AS POSITIONS_DOCUMENTID,
         POSITIONS."POSITIONNO" AS POSITIONS_POSITIONNO,
         POSITIONS."PRODUCTID" AS POSITIONS_PRODUCTID,
         POSITIONS."QUANTITY" AS POSITIONS_QUANTITY,
         POSITIONS."PRICE" AS POSITIONS_PRICE
    FROM
         "PUBLIC"."POSITIONS" POSITIONS WHERE PRODUCTID=$P{ProductId} AND $X{IN, QUANTITY, quantityParam}]]>
            </queryString>
            <field name="POSITIONS_DOCUMENTID" class="java.lang.Integer"/>
            <field name="POSITIONS_POSITIONNO" class="java.lang.Integer"/>
            <field name="POSITIONS_PRODUCTID" class="java.lang.Integer"/>
            <field name="POSITIONS_QUANTITY" class="java.lang.Integer"/>
            <field name="POSITIONS_PRICE" class="java.math.BigDecimal"/>
        </subDataset>
        <parameter name="listParam" class="java.util.List" isForPrompting="false">
            <defaultValueExpression><![CDATA[Arrays.asList("1", "2")]]></defaultValueExpression>
        </parameter>
        <queryString>
            <![CDATA[SELECT
         PRODUCT."ID" AS PRODUCT_ID,
         PRODUCT."NAME" AS PRODUCT_NAME,
         PRODUCT."COST" AS PRODUCT_COST
    FROM
         "PUBLIC"."PRODUCT" PRODUCT]]>
        </queryString>
        <field name="PRODUCT_ID" class="java.lang.Integer"/>
        <field name="PRODUCT_NAME" class="java.lang.String"/>
        <field name="PRODUCT_COST" class="java.math.BigDecimal"/>
        ...
        <detail>
                 ...
                <componentElement>
                    <reportElement x="200" y="2" width="313" height="29"/>
                    <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
                        <datasetRun subDataset="dataset1">
                            <datasetParameter name="ProductId">
                                <datasetParameterExpression><![CDATA[$F{PRODUCT_ID}]]></datasetParameterExpression>
                            </datasetParameter>
                            <datasetParameter name="quantityParam">
                                <datasetParameterExpression><![CDATA[new ArrayList($P{listParam})]]></datasetParameterExpression>
                            </datasetParameter>
                            <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
                        </datasetRun>
                        <jr:listContents height="29" width="313">
                            <textField>
                                <reportElement x="0" y="0" width="100" height="20"/>
                                <textElement/>
                                <textFieldExpression><![CDATA[$F{POSITIONS_QUANTITY}]]></textFieldExpression>
                            </textField>
                            <textField>
                                <reportElement x="100" y="0" width="100" height="20"/>
                                <textElement/>
                                <textFieldExpression><![CDATA[$F{POSITIONS_PRICE}]]></textFieldExpression>
                            </textField>
                        </jr:listContents>
                    </jr:list>
                </componentElement>
            </band>
        </detail>
        ...
    </jasperReport>
    

    该示例还适用于报表的language属性为groovy.
    我认为该解决方案可以应用于子报表.

    The sample is also works with report's language property as groovy.
    I think that this solution can be applied to subreport.

    这篇关于列为子报表参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆