2015-06-22 4 views
1

У меня есть сценарий, где мне нужно передать значение параметра отчета jasper из списка с помощью индекса.jasper report параметр передачи из индекса списка

У меня есть следующий запрос, выполненный в отчете яшмы со следующими параметрами.

<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); 

, так что я ищу способ передать параметры param1 и param2 в моем отчете Jasper SQL из моего возраста коллекции, что-то вроде 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)} 

можно ли достичь этого?

ответ

0

Я смог взломать это, добавив два дополнительных параметра 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> 
+0

На самом деле вам не нужно создавать 2 параметра, вы можете передать P {age} в дополнительный отчет, который будет перебирать сам по себе и дать результат, в котором вы нуждаетесь. Это действительно будет работать, если изменится длина P {age}, более динамичная. – Arasu