【问题标题】:jasper report passing parameter from list indexjasper 报告从列表索引传递参数
【发布时间】:2015-06-23 15:52:15
【问题描述】:

我遇到了一个场景,我需要使用索引从列表中传递 jasper 报告参数值。

我在 jasper 报告中执行了以下查询,并定义了以下参数。

    <parameter name="clientServiceIds" class="java.util.Collection"/>
        <parameter name="trafficPeriod" class="java.util.Collection"/>
        <parameter name="transactionType" class="java.util.Collection"/>
        <parameter name="transactionStatus" class="java.util.Collection"/>
        <parameter name="roamingPartners" class="java.util.Collection"/>
        <parameter name="ages" class="java.util.Collection"/>

        SELECT
          CLIENT_CODE,
          PARTNER_ORG,
            PARTNER_CODE,
          SERVICE_TYPE,
          TP_ID,
          TRAFFIC_PERIOD,
          SETTLEMENT_TYPE,
          SDR_NET,
          TRAN_CURR_NET,
          TRAN_CURRENCY_ID,
          DUE_DATE,
          TRANSACTION_TYPE,
          STATUS,
          NOTE_ID,
          AGE
        FROM vw_transaction_search
        WHERE $X{IN, client_service_id, clientServiceIds}
        AND $X{IN, PARTNER_SERVICE_ID, roamingPartners}
        AND $X{IN, traffic_period, trafficPeriod}
        AND $X{IN, transaction_type, transactionType}
        AND $X{IN, status_id, transactionStatus}
        AND AGE BETWEEN $P{param1} AND $P{param2}

这里的年龄是我要传递给报告的列表,其中包含索引 0 和索引 1 处的两个值。所有参数 (paramValueMap) 我来自无法修改的外部系统,

JasperFillManager.fillReport(jasperReport, paramValueMap, connection);

所以我正在寻找一种方法在我的集合年龄的 Jasper 报告 SQL 中传递参数 param1 和 param2,例如 param1=ages.get(0) 和 param2=ages.get(1),因此 SQL 将像

...AND $X{IN, status_id, transactionStatus}
AGE BETWEEN $P{ages.get(0)} AND $P{ages.get(1)}

有没有什么办法可以做到这一点?

【问题讨论】:

    标签: jasper-reports dynamic-jasper


    【解决方案1】:

    我能够通过添加两个额外的参数 age1 和 age2 并将值传递给列表中添加的参数来解决这个问题,这里是详细信息。

    <parameter name="trafficPeriod" class="java.util.Collection"/>
        <parameter name="transactionType" class="java.util.Collection"/>
        <parameter name="transactionStatus" class="java.util.Collection"/>
        <parameter name="roamingPartners" class="java.util.Collection"/>
        <parameter name="age" class="java.util.List" isForPrompting="false"/>
        <parameter name="age1" class="java.lang.Integer" isForPrompting="false">
            <defaultValueExpression><![CDATA[$P{age}.get(0)]]></defaultValueExpression>
        </parameter>
        <parameter name="age2" class="java.lang.Integer" isForPrompting="false">
            <defaultValueExpression><![CDATA[$P{age}.get(1)]]></defaultValueExpression>
        </parameter>
        <queryString>
            <![CDATA[SELECT
      CLIENT_CODE,
      PARTNER_ORG,
        PARTNER_CODE,
      SERVICE_TYPE,
      TP_ID,
      TRAFFIC_PERIOD,
      SETTLEMENT_TYPE,
      SDR_NET,
      TRAN_CURR_NET,
      TRAN_CURRENCY_ID,
      DUE_DATE,
      TRANSACTION_TYPE,
      STATUS,
      NOTE_ID,
      AGE
    FROM vw_transaction_search
    WHERE $X{IN, client_service_id, clientServiceIds}
    AND $X{IN, PARTNER_SERVICE_ID, roamingPartners}
    AND $X{IN, traffic_period, trafficPeriod}
    AND $X{IN, transaction_type, transactionType}
    AND $X{IN, status_id, transactionStatus}
    AND AGE BETWEEN $P{age1} AND $P{age2}
    ORDER BY client_code,
      partner_code,
      traffic_period,
      age]]>
        </queryString>
    

    【讨论】:

    • 您实际上不需要创建 2 个参数,您可以将 P{age} 传递给一个子报表,该报表将自行迭代并给出您需要的结果。如果 P{age} 的长度发生变化,这实际上会起作用,更加动态。
    猜你喜欢
    • 2013-02-02
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多