目標の帳票

出力する帳票イメージ

発注書
発注日:20XX年YY月ZZ日
発注先:ほげほげ商店

No 商品名 単価 発注数 合計
1 うまし棒 10 100 1000
2 ぐりぐり君 100 50 5000
3 やっちゃんイカ 9,999 10 99,990
合計 105,990

<<現ページ数>> / <<総ページ数>>

JavaBean とテスト用クラス作る

  • learning.bean パッケージ以下にそれぞれJavaBeanを作成
    • 1行毎のレコードBean
public class Record {
    /** 行番号 */
    private int rowNo;
    /** 商品名 */
    private String name;
    /** 単価 */
    private BigDecimal price;
    /** 発注数 */
    private BigDecimal quantity;
    // getter/setter 省略
    /**
     * 合計金額を取得する
     * @return
     *      単価 * 発注数
     */
    public BigDecimal getAmount() {
        return this.price.multiply(this.quantity);
    }
}
    • 帳票全体のBean
public class SampleReportBean {
    /** 発注日 */
    private Timestamp orderDate;
    /** 発注先 */
    private String ordered;
    /** レコード */
    private List<Record> records = new ArrayList<Record>();
    /** 合計額 */
    private BigDecimal totalAmount = new BigDecimal(0);
    // getter/setter 省略
    /**
     * 行レコードを追加する<br>
     * 追加時に合計額も加算する
     */
    public void addRecord(Record record) {
        records.add(record);
        BigDecimal amount = record.getAmount();
        this.totalAmount = this.totalAmount.add(amount);
    }

    /**
     * サブレポート用のListを JRDataSource に変換して取得する
     *
     * @return
     *            サブレポートのListをJasperReportsで使用するDataSourceにキャスト
     */
    public JRDataSource getRecordsAsDataSource() {
        return new JRBeanCollectionDataSource(this.records);
    }
}
  • learning パッケージに帳票出力のテストクラスを作成
public class SampleReportFactory {

    /**
     * サブレポート(行単位でレコードを出力する)用のテストメソッド
     */
    public static List<Record> createRecords() {
        List<Record> records = new ArrayList<Record>();
        for (int i = 0; i < 10; i++) {
            Record r = new Record();
            int rowNo = i + 1;
            r.setRowNo(rowNo);
            r.setName("商品名" + rowNo);
            r.setPrice(new BigDecimal(rowNo * 10));
            r.setQuantity(new BigDecimal(rowNo));
            records.add(r);
        }
        return records;
    }

    /**
     * 帳票全体のテストメソッド
     */
    public static List<SampleReportBean> createSampleReport01_01() {
        SampleReportBean bean = new SampleReportBean();
        bean.setOrderDate(new Timestamp(System.currentTimeMillis()));
        bean.setOrdered("ほげほげ商店");

        {
            Record r = new Record();
            r.setRowNo(1);
            r.setName("うまし棒");
            r.setPrice(new BigDecimal(10));
            r.setQuantity(new BigDecimal(100));
            bean.addRecord(r);
        }
        {
            Record r = new Record();
            r.setRowNo(2);
            r.setName("ぐりぐり君");
            r.setPrice(new BigDecimal(100));
            r.setQuantity(new BigDecimal(50));
            bean.addRecord(r);
        }
        {
            Record r = new Record();
            r.setRowNo(3);
            r.setName("やっちゃんイカ");
            r.setPrice(new BigDecimal(9999));
            r.setQuantity(new BigDecimal(10));
            bean.addRecord(r);
        }

        return Arrays.asList(bean);
    }

iReport でテンプレート作成

全体のテンプレートを作成
サブレポートを作成
  • 一旦全体のテンプレートの作成は放置してサブレポートを作る
    • 「サブレポート」についてはggてくだしあ

  • 「Subreport」をドラッグ&ドロップで「Detail1」へ

  • 「Create a new report」をチェックし「次へ」

  • 「Blank A4」を選択して「次へ」

  • 「Connections / Data Source」をとりあえず「Empty datasource」を選択して「次へ」
    • 失敗した本当は先にDataSourceを先に用意しとけばよかったかも...

  • 初期状態で「次へ」

  • 初期状態で「次へ」

  • サブレポートの名前を適当に入力し、「Store the directory name in a parameter」を選択した状態で「次へ」
    • Report Name
      • Record (とした)

  • 「Use the same connection used to fill the master report」を選択して「完了」
  • Let's try 帳票 - メモで備忘録なアレ で使用した「Report query」を使って「learning.bean.Record」クラスをfieldとして読み込む
  • こんな感じでサブレポートを作成


補足:

  • 「Detail1」に出力する項目を順番に並べる
    • 左から「$F{rowNo}」「$F{name}」「$F{price}」「$F{quantity}」「$F{amount}」
      • 「$F{price}」「$F{quantity}」「$F{amount}」はドラッグ&ドロップでテンプレートに置いたら、プロパティ>「Pattern」で「#,###,###,##0」とかやっとくと帳票出力時に3桁区切りでカンマ入れてくれる
  • 「Details1」以外のBandは右クリック>「Delete Band」で削除しとく


サブレポートでけた!

全体のテンプレートを作成に戻る...


補足:

  • ページ番号については iReport 側で定数っぽく宣言できるのでそれを使用する
    • ただし注意が必要!
    • $V{PAGE_NUMBER}の「Evaluation Time」によって出力される値が異なる
      • Now:現在ページ数
      • Report:総ページ数
      • このへんの事は全然理解出来てません ^q^
  • サブレポートへ値を渡す設定する
  • サブレポートを選択してプロパティの中から以下の様に設定
    • Connection type
      • Use a datasource expression
    • Data Source Expression
      • $F{recordsAsDataSource}
  • Let's try 帳票 〜続き〜 - メモで備忘録なアレ でもやったようにデータベースにコンセントささってるようなアイコンを押下
    • サブレポートでもやってるよね!
  • 帳票出力用のメソッド「learning.SampleReportFactory#createSampleReport01_01()」を指定
  • Preview」ボタン押下

帳票イメージに近いよね!でけた!