2009-03-21 33 views

答えて

3

サブレポート内にサブレポートを生成するためのコードは、実際には必要ありません。これは、動的コンポーネントを持たないレポート(詳細バンドには何もありません)で行うことができます。もちろん、得られたレポートは興味深いものにあまり役に立たないでしょう。

これよりも面白いレポートが必要な場合は、レポートやサブレポートのデータを提供する必要があります。その時点で、コードはデータがどこから来ているかによって異なります。あなたがしようとしていることについてより多くの情報を提供できる場合は、おそらくもっと助けになるかもしれません。

サブレポートに動的コンテンツがある場合は、JRDataSourceを実装するオブジェクトへのアクセス権を渡す必要があります。

たとえば、私は最近、複数の「句」を含む1ページのレポートを作成しました。私の人生をもっとシンプルにするために、私は句をMapに格納し、次のコードを使ってJRDataSourceオブジェクトを派生させました。 JRDataSourceオブジェクトは、メインレポートのフィールドとして渡されました。

private static class ListMapDataSource implements JRRewindableDataSource { 

    private Map currentMap = null; 
    private int currentRow; 
    private int numberOfMoveFirsts = 0; 
    private List<Map<String, ? extends Object>> rowList; 

    ListMapDataSource(List<Map<String, ? extends Object>> rowList) { 
     this.rowList = rowList; 
     moveFirst(); 
    } 

    ListMapDataSource(Map<String, ? extends Object> singleRow) { 
     this.rowList = new ArrayList<Map<String, ? extends Object>>(1); 
     this.rowList.add(singleRow); 
     moveFirst(); 
    } 

    public boolean next() throws JRException { 
     if (currentRow >= rowList.size() - 1) { 
      return false; 
     } 

     currentRow++; 
     currentMap = rowList.get(currentRow); 

     return true; 
    } 

    public Object getFieldValue(JRField jrField) throws JRException { 
     String name = jrField.getName(); 
     Class valueClass = jrField.getValueClass(); 

     if (JasperReport.class.isAssignableFrom(valueClass)) { 
     } 

     return currentMap.get(name); 
    } 

    public void moveFirst() { 
     numberOfMoveFirsts++; 

     if (numberOfMoveFirsts > 10) { 
      System.out.println("Exceeded 10 moveFirst() calls. Aborting."); 
      System.exit(1); 
     } 

     currentRow = - 1; 
     currentMap = null; 
    } 
} 
関連する問題