2009-11-20 5 views
10

JavaとiReport(ジャスパー)を使って簡単なレポート作成プログラムを作成しています。ジャスパーのIPアドレスとその場所、現在アイドル状態かどうかを別のシステムで処理しているPCを示すpdfでレポートを作成するはずです)、および現在アタッチされているプロジェクトのリスト(他の場所でも管理されています)。iReportの別のリストに含まれている文字列のリストを印刷するにはどうすればよいですか?

私はこの問題のためにiReportはを使用していて、次のようにダミーコレクション生成クラスを作成しました:

public class PCReports { 

    public static java.util.Collection PC_collection; 
    public static java.util.Collection generateCollection() { 

     PC_collection = new ArrayList<PCLineDTO>(); 
     PCLineDTO line = new PCLineDTO(); 
     line.setIP("192.168.1.1"); 
     line.setLab("location"); 
     line.setActive(true); 
     line.addProjectName("project1"); 
     line.addProjectName("project2"); 
     line.addProjectName("project3"); 
     PC_collection.add(line); 

     line = new PCLineDTO(); 
     line.setIp("192.168.1.2"); 
     line.setLab("location2"); 
     line.setActive(false); 
     line.addProjectName("project1"); 
     line.addProjectName("project2"); 
     PC_collection.add(line); 

     return PC_collection; 
    } 
} 

この場合のあることにエンティティクラス:一部の周りに検索した後

public class PCLineDTO { 
    private String ip; 
    private String lab; 
    private Boolean active; 
    private ArrayList<String> projects; 
} 

インターネット、サブレポートを使用してa way to do something similarが見つかりました。

問題は、このサブレポートにdataSourceとして渡された文字列のコレクションを印刷する方法がわかりません。私は、インターネット上で見つかった例で

は、マスターコレクション内の各項目について、サブレポートは、それぞれのために独自のgetterメソッド-with オブジェクトのコレクションを渡された文字列のコレクションの代わりにattribute-としてここの場合です。そのような場合、彼らは、私は、例えば、使用することができなかったiReportは構文を介して使用するために必要な値をアクセス:

$F{project} 

iReportは、それが受信したオブジェクト内に含まれるgetProject方法を探しているので、しかしこの場合、単純なStringオブジェクトです(getProjectメソッドはそのままです)。

+0

どのJasperReport/iReportバージョンを使用していますか? – medopal

+0

@medopal:ありがたいことに、最新(この時点で3.6.1)。 –

答えて

17

サブレポートまたはサブデータセットを使用します。

「_this」と呼ばれる新しいフィールドを作成する新しいサブレポートに続いてサブレポートに収集データソース

JRBeanCollectionDataSource($F{Projects}) 

を渡すには、正確に、これは私が

をしたい渡されたコレクション内のBeanが値と同じであることを意味します詳細情報については

、ここではクラスのソースコードをチェックしてください。JRAbstractBeanDataSource

:これは、以前のビルドに存在しているかどうかわからないJasperReport 3.0.0イムで利用可能ですs。 希望これはアップデート

を支援します。念proyectsであなたのようにそれを参照する必要があり、複雑なオブジェクトの配列だった、Bozhoが言うように、この機能はJasperReportsの2.0.0

+1

ありがとう、それはうれしかった。ちょっとしたことに、Jasperや他のオープンソースプロジェクトを扱う際には、私はソースコードをプルしてEclipseのライブラリにアタッチする傾向があります。このように、内部を掘り起こすのが簡単です。 幸運 – medopal

+0

私はここで補完的な詳細を見つけました: http://community.jaspersoft.com/questions/533552/solved-problem-passing-datasource-subreport –

3

興味深い。私はあなたがリストを使用し、getName()をProjectクラスで定義するほうがいいと思います。次に、サブレポートで変数 "name"を定義します。このように動作し、プロジェクト期間、チームリードなどの追加情報を簡単に追加できます。

+0

ありがとうございます。私はこれを考慮し、事実が起こった場合、実際にこのように実装するかもしれません。しかし残念なことに(そして間違いなく私のせいで)、プログラムの他の部分はこのストリングのリストを使用していて、使用されている場所を検索して置き換えるという手間がかかり、エラーが起こりやすい作業を回避する方法があるのだろうかと思っていました。 –

0

で実装されているように思える、SVNをチェックしますタイプjava.util.Collectionのフィールドは、medopalが示すのと同じ方法で内側のサブレポートに渡します。 _THISフィールドは入れないでください。

0

_THISを使用せずにこれを詳述する:Java Beanにサブビーンのリストがあり、このサブビーンが複雑なフォーマットを持ち、各サブビーンをカスタム方法で印刷したいとしましょう。

<subDataset name="ListOfSubBeans" uuid="66c86e41-c565-4f18-bccf-1a1b2a567585"> 
    <field name="subBeanField_1" class="java.lang.String"> 
     <fieldDescription><![CDATA[subBeanField_1]]></fieldDescription> 
    </field> 
</subDataset> 

... 

     <componentElement> 
      <reportElement x="780" y="0" width="100" height="30" uuid="f73864b9-46dd-4adb-8dad-a6bd8dfae64e"> 
       <property name="net.sf.jasperreports.export.headertoolbar.table.name" value=""/> 
      </reportElement> 
      <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical"> 
       <datasetRun subDataset="ListOfSubBeans" uuid="a8dd1c2b-3ac0-4ffa-b9d0-08e4890e199a"> 
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfSubBeans})]]></dataSourceExpression> 
       </datasetRun> 
       <jr:listContents height="30" width="100"> 
        <textField> 
         <reportElement x="0" y="0" width="100" height="30" uuid="61700c18-6bb9-45da-a235-b76b9f76a2ea"/> 
         <textFieldExpression><![CDATA[$F{subBeanField_1}]]></textFieldExpression> 
        </textField> 
       </jr:listContents> 
      </jr:list> 
     </componentElement> 

... 

ので、マスターデータセットがマスター豆がリストのメンバ変数を持っていることを宣言した:サブデータ要素は、レポートレベルにあり、componentElement詳細区域にある場合、私は例を引用listOfSubBeans 。このjava.util.Listはjr:listのデータソースに供給され、jr:listのフィールドはListOfSubBeansというサブデータセット(大文字と小文字の区別に注意)を使用して宣言されます。

関連する問題