2011-02-24 22 views

回答

3

找到您的報表,然後設置在那裏的DataFactory:

對於帶狀子報告:

report.getReportHeader().getSubReport(0).setDataFactory(..);

對於內嵌子報告:

 
SubReport report = (SubReport) report.getReportHeader().getElement(0); 
report.setDataFactory(..); 

但是,通常你在報告中定義datafactories設計師,然後只是使用它們。或者,您可以在主報告上設置數據系統,並將其繼承到子報告。如果您在報告中需要多種類型的數據,則使用「CompoundDataFactory」。

確保您的報告具有不同的查詢名稱,否則可能會遇到麻煩。

0

如果您在MasterReport上調用setDataFactory(DataFactory),應該可以隱式訪問子報表。我以這種方式使用它與類型爲表的數據源和由應用程序預先計算的數據。在這種情況下,Pentaho基本上只用作渲染引擎。

0

我發現Thomas Morgner的建議(上面)是正確的,只有一個警告。他的例子假定SubReport存在於ReportHeader中。

在我的情況下,SubReports深深地嵌套在報告的其他部分,所以我編寫了一些代碼來查找所有SubReports。也許有更好的方法來找到這個,但這是我做的,如果爲我工作。如果有人知道枚舉所有SubReports的更簡單方法,請告訴我!

private Set<CompoundDataFactory> getCompoundDataFactoriesFromMasterAndSubreports() { 

    Set<CompoundDataFactory> CompoundDataFactories = new HashSet<CompoundDataFactory>(); 
    CompoundDataFactories.add(compoundDataFactory); // Master report 

    Set<SubReport> subReports = getSubReports(); 
    for (SubReport subReport : subReports) { 
     if (subReport.getDataFactory() instanceof CompoundDataFactory) { 
      CompoundDataFactories.add((CompoundDataFactory)subReport.getDataFactory()); 
     } 
    } 

    return CompoundDataFactories; 
} 

private Set<SubReport> getSubReports() { 
    Set<SubReport> subReports = new HashSet<SubReport>(); 
    recurseToFindAllSubReports(masterReport,subReports); 
    return subReports; 
} 

private void recurseToFindAllSubReports(Section section, Set<SubReport> subReports) { 
    int elementCount = section.getElementCount(); 
    for (int i=0; i<elementCount ; i++) { 
     Element e = section.getElement(i); 
     if (e instanceof RootLevelBand) { 
      SubReport[] subs = ((RootLevelBand)e).getSubReports(); 
      for(SubReport s : subs) { 
       subReports.add(s); 
      } 
     } 
     if (e instanceof Section) { 
      recurseToFindAllSubReports((Section)e, subReports); 
     } 
    } 
} 
相關問題