Jasper reports JasperReport:如何在表中显示动态列表

Jasper reports JasperReport:如何在表中显示动态列表,jasper-reports,Jasper Reports,我想在表格中显示列表。列表查询的参数基于表项的值。例如: <subDataset name="dsLines" uuid="a47307ff-90a8-476f-afd1-0fd8aa0517d0"> <parameter name="formalId" class="java.lang.String"/> <queryString language="SQL"> <![CDATA[SELECT s.formalid, sl.qt

我想在表格中显示列表。列表查询的参数基于表项的值。例如:

<subDataset name="dsLines" uuid="a47307ff-90a8-476f-afd1-0fd8aa0517d0">
    <parameter name="formalId" class="java.lang.String"/>
    <queryString language="SQL">
    <![CDATA[SELECT s.formalid, sl.qty, sl.subtotal, sl.currency,
                    sl.product_localsku, sl.product_name,
                    sl.product_price,
                    sl.finalprice,
                    sl.promoids 
                    FROM salesorder s LEFT JOIN salesorderline sl
                    ON (s.id = sl.salesorder_id)
                    WHERE s.formalid = $P{formalId}
                    ORDER BY sl.product_localsku]]>
            </queryString>
    <field name="qty" class="java.lang.Integer"/>
    <field name="subtotal" class="java.math.BigDecimal"/>
    <field name="product_localsku" class="java.lang.String"/>
    <field name="product_name" class="java.lang.String"/>
    <field name="product_price" class="java.math.BigDecimal"/>
    <field name="finalprice" class="java.math.BigDecimal"/>
    <field name="promoids" class="java.util.List"/>
</subDataset>

有人知道怎么做吗?

您必须注意的基本想法是,您在查询中使用了$F{promoids}字段,而该字段在当前上下文中不存在。 接下来您必须了解的是,$F{}字段是数据集查询的结果。 最后一件事是,您只能在查询中使用参数$P{}。 如果列表组件基于表中的字段
$F{promoids}
,则在数据集
promodeffortds
中创建一个参数,例如
$P{promoids}
,最后将字段
$F{promoids}
映射到参数
$P{promoids}
,然后在数据集
promotdiscountds
的查询中使用该参数,如下所示

其中id=ANY($p{promoids})


希望这能解决您的问题。

谢谢@Rahul的语法更正,但是如何将语法传递到
$p{productids}
?您能详细说明您的问题吗?
<subDataset name="promoDiscountDs" uuid="f276a182-41da-432e-b611-b5f47bfaed9a">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
        <queryString language="SQL">
            <![CDATA[select name as discount_name,
                     discount_percentage, 
                     discount_amount from promo
                     where id = ANY($F{promoids})]]>
        </queryString>
        <field name="discount_name" class="java.lang.String"/>
        <field name="discount_amount" class="java.lang.String"/>
        <field name="discount_percentage" class="java.lang.String"/>
    </subDataset>
org.postgresql.util.PSQLException: ERROR: syntax error at or near "$"
  Position: 94
    org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2198)
    org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1927)
    org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:561)
    org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:419)
    org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:304)
    com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:404)
    net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:233)
    net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:1087)
    net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:668)
    net.sf.jasperreports.components.list.FillDatasetRun.start(FillDatasetRun.java:162)
    net.sf.jasperreports.components.list.VerticalFillList.prepare(VerticalFillList.java:93)
    net.sf.jasperreports.engine.fill.JRFillComponentElement.prepare(JRFillComponentElement.java:149)
    net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:331)
    net.sf.jasperreports.engine.fill.JRFillFrame.prepare(JRFillFrame.java:217)
    net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:331)
    net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:384)
    net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:358)
    net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2046)
    net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:778)
    net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:288)
    net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:151)
    net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909)
    net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport(JRFillSubreport.java:659)
    net.sf.jasperreports.engine.fill.JRSubreportRunnable.run(JRSubreportRunnable.java:59)
    net.sf.jasperreports.engine.fill.AbstractThreadSubreportRunner.run(AbstractThreadSubreportRunner.java:203)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    java.lang.Thread.run(Thread.java:745)