2015-04-29 2 views
0

У меня есть основной отчет с 2 подзаголовками. Я использую собственный источник данных для получения содержимого отчета. Но только один субрепортаж отображается, когда основной отчет просматривается в студии jasper (в зависимости от того, какой из подзаголовков на первом месте).Несколько подчиненных в основном отчете, используя тот же источник данных

Для примера. выводится только report1.jrxml. Если я удалю этот подчиненный отчет, тогда отображается report2.jrxml.

main.jrxml

<detail> 
    <band height="250"> 
     <subreport runToBottom="true"> 
      <reportElement positionType="Float" x="0" y="130" width="1960" height="120" uuid="89a9f872-756e-4c82-922d-537cfde30cca"/> 
      <dataSourceExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></dataSourceExpression> 
      <subreportExpression><![CDATA["report1.jrxml"]]></subreportExpression> 
     </subreport> 
    </band> 
    <band height="250"> 
     <subreport runToBottom="true"> 
      <reportElement positionType="Float" x="0" y="90" width="1960" height="120" uuid="892c0849-9532-48cb-94c0-f2e87528232a"/> 
      <dataSourceExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></dataSourceExpression> 
      <subreportExpression><![CDATA["report2.jrxml"]]></subreportExpression> 
     </subreport> 
    </band> 
</detail> 

Я попробовал следующее:

  1. Размещение подотчетов в различных диапазонах подробно.
  2. Установка «Тип позиции» на «Поплавок».
  3. Свойство «Run To Bottom» для «True».

ответ

3

Проблема была с попыткой использовать же источник данных для нескольких подотчетов. Источники данных исчерпаны для первого вложенного отчета, и поэтому для последующих вспомогательных отчетов данных нет.

Решение:

Вы должны перемотать источник данных с помощью JRRewindableDataSource

Благодаря lucianc Community answer

Обобщая на задачах:

Создать оболочку RewindableDSWrapper, что перематывает данные s а также делегирует все призывы к нему.

package com.jasper.api; 

import net.sf.jasperreports.engine.JRException; 
import net.sf.jasperreports.engine.JRField; 
import net.sf.jasperreports.engine.JRRewindableDataSource; 

public class RewindableDSWrapper implements JRRewindableDataSource { 

    private final JRRewindableDataSource ds; 

    public RewindableDSWrapper(JRRewindableDataSource ds) { 

    this.ds = ds; 

    try { 
     this.ds.moveFirst(); 
    } catch (JRException e) { 
     e.printStackTrace(); 
    } 

    } 

    public boolean next() throws JRException { 

    return ds.next(); 

    } 

    public Object getFieldValue(JRField jrField) throws JRException { 

    return ds.getFieldValue(jrField); 

    } 

    public void moveFirst() throws JRException { 

    ds.moveFirst(); 

    } 

} 

В вашем пользовательском классе источника данных реализован интерфейс JRRewindableDataSource.

public void moveFirst() throws JRException { 
    // provide logic for rewinding datasource 
} 

В файле jrxml, если источник данных является обычай один, то

<dataSourceExpression><![CDATA[new com.jasper.api.RewindableDSWrapper((JRRewindableDataSource)$P{REPORT_DATA_SOURCE})]]></dataSourceExpression> 

разыгрывании REPORT_DATA_SOURCE к JRRewindableDataSource, как компилятор будет пытаться бросить его JRDataSource.

Также добавьте файл jar, содержащий класс RewindableDSWrapper, в classpath в вашей студии.

Смежные вопросы