Когда основной запрос отчета имеет несколько наборов результатов и вложенный отчет как параметр не может создать PDF? - PullRequest
0 голосов
/ 17 октября 2018

В моем отчете JasperReports есть подотчет.При использовании параметра ByteArrayInputStream в главном отчете и в результате запроса основного отчета есть более одной строки. Не удалось создать PDF.Но основной набор результатов запроса отчета имеет только один набор результатов PDF для генерации без каких-либо ошибок

Мой код Java для передачи подотчета:

Map<String, Object> parameters = new HashMap<String, Object>(); 
parameters.put("subreportParameter", subreportinputstream)

Объявление параметра в jrxml :

<parameter name="subreportParameter" class="java.io.ByteArrayInputStream"/>

Вот как я называю подотчет:

 <subreport>
   <reportElement positionType="Float" x="275" y="55" width="240" height="70" uuid="0010fc8e-593e-45ee-af10-952fd8b54ad5" />
   <subreportParameter name="reportid">
      <subreportParameterExpression><![CDATA[$P{reportid}]]></subreportParameterExpression>
   </subreportParameter>
   <subreportParameter name="currencycode">
      <subreportParameterExpression><![CDATA[$P{currencycode}]]></subreportParameterExpression>
   </subreportParameter>
   <subreportParameter name="taxcode">
      <subreportParameterExpression><![CDATA[$P{taxcode}]]></subreportParameterExpression>
   </subreportParameter>
   <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
   <subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[$P{subreportParameter}]]></subreportExpression>
</subreport>

1 Ответ

0 голосов
/ 18 октября 2018

Когда подотчет обрабатывается во второй раз, он пытается загрузить отчет из входного потока $P{subreportParameter}, но этот поток уже был прочитан при первом отображении подотчета, поэтому повторное чтение из него не даст никаких данных.

Самый простой способ исправить это - установить флаг isUsingCache для подотчета:

<subreport isUsingCache="true">
    ...

В качестве альтернативы, вы можете загрузить объект JasperReport самостоятельно из потока, выполнив JRLoader.loadObject(subreportinputstream) и передайте объект JasperReport в качестве параметра отчета вместо потока.

...