Список как параметр подотчета - PullRequest
1 голос
/ 31 октября 2011

Мне нужно передать моему подотчету список целых чисел, который будет использоваться в качестве параметра для оператора IN в моем запросе, например:

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

Я пробовал использовать различные синтаксис для создания экземпляра списка в моем запросеосновной отчет, но ни один из них не приводит к функциональному отчету;Например:

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

Есть ли решение моей проблемы?

1 Ответ

2 голосов
/ 03 ноября 2011

Я пытался использовать $ X {IN, attributeName, parameterName} с List component.

Основные шаги (имена параметров приведены в примере ниже):

Объявить listParam параметр как java.util.List в основном отчете Объявить quantityParam параметр как java.util.List в subDataset Сделать сопоставление из параметра listParam в параметр quantityParam с помощью конструктора ArrayList Добавить выражение $X{} в запрос subDataset.

Рабочий пример со свойством languageas 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.Я думаю, что это решение может быть применено к подотчету.

...