FastReportを使ってデータベースのマスター/詳細データで構成されたレポートの作り方



データベースを利用したレポートを作成する際、顧客毎の購入商品の一覧を見たいなど、マスター/詳細の関係を持った情報を扱うことは多々あります。

このような階層化されたデータをFastReportで扱うには、データバンドを組み合わせることで6階層まで実現できます。

その具体的な手順について解説しました。

ドリームハイブの山本です。

今日は、2つのデータレベルを持つレポート、つまり、マスター/詳細タイプのレポートを作る方法についてお伝えします。

今回使うデータは、dbdemosにあるORDERSとCUSTOMERテーブルを使いたいと思います。

早速なんですが、ORDERSとかを使うために1回、ドロップするんですが、今回、データソースを使って、マスター/詳細をテーブル単位で作るということで、通常、ドラッグアンドドロップして作ったFireDACのコンポーネントってTFDクエリになるんですが、これをテーブルコンポーネントとして使いたいと思います。

コネクションはそのままで構いませんので、FDTableを1個用意し、ここでは、クエリーではなく、単純にCUSTOMERテーブルに対してFDTableが結びつくというような感じで作りたいと思います。

DataSourceを2つ用意します。

そして、DataSource1には、まずCustomerTableを結びつけ、DataSource2のほうは、TFDTableに、これ、最終的に使うのは、オーダーを使いたいので、FDTableをFDTableOrderというようにちょっとしておきましょう。

そして、このデータソース同士を結びつける必要性がありますので、FDTableOrderのほうをまず、これを使うために、まあ、Activeにはまだできないので、このテーブルは、オーダーのテーブルを使いたいので、コネクションオブジェクトがきちんとDBDemosのコネクションに接続されていることを確認したら、TableNameをまず、ORDERSを選択します。

そして、マスターデータがテーブルなので、マスターソースを結びつけたDataSource1に設定し、CustomerTableのほうは、何もしなくてもクエリーが設定されていますので、ActiveをTrueにすると、この時点で、データが取得され、データソースが利用可能になります。

で、FDTableOrderに戻りまして、まだこれ、Activeにできないんですが、DataSource1を選択している状態で、CUSTNOを選択し、これで、DataSource1のCUSTNOに接続するというような状態を作り出すことができました。

また、これだけだとマスターデータのテーブルのフィールドと何を結びつけるのかというのがわかりませんので、IndexNameのほうもCUSTNOというのを選択します。

これによって、CUSTOMERテーブルの中のCUSTNOに応じたデータがFDTableオーダーの中にフィルタリングされるという状態が作れたわけですね。

この状態で、ActiveをTrueにします。

あとは通常のFastReportと同じ作り方になりますので、まずはfrxDBDataSetをCUSTOMERテーブル用のものと、そして、ORDER用のものを用意します。

で、各DataSetは、DataSourceをそれぞれ割り当てます。

そして、frxReportオブジェクトを用意し、ダブルクリックしてデザイナを開きます。

レポートメニューから、データの中で、2つのDataSetを選択するということを行います。

この状態で、まず、2つのデータが、DataSetとして、データツリーの中に表示されていることを確認してください。

この上で、データバンドのうち、マスターデータをfrxDBDataSet1に、そして、詳細データをfrxDBDataSet2として割り当てます。

この状態で、まず、CUSTOMERが設定されているのはDataSet1ですから、CUSTNOと、あとCOMPANYぐらいを用意しておきましょうか。

そして、これに結びついたデータとして、ORDERSテーブルの中の割り当てられたものが正しいことがわかるように、CUSTOMERデータに割り当てられたORDERSテーブルのCUSTNOと、同じく、それに対応するORDERNO、まあ、これが必ず、1つのマスターデータのCUSTNOと、ディテールテーブルのオーダーのCUSTNOが同じ状態に複数のORDERNOが出てくるようになればOKですね。

あとは、データがわかるように、ORDERSのSHIPDATEとかSALESDATEとか、ここら辺をちょっと1個入れておきましょうか。

この状態でプレビューしてみます。

すると、1221というカスタマーナンバーには、1023、1076、1123というふうに、複数のオーダーが出ていることがわかる、こういうレポートが作れました。

同じく、1231というカスタマーに対しては、複数の1060、1073というようなものが注文されていることがわかります。

非常に簡単に、マスター/詳細タイプのレポートを作ることができました。

このように、DataSetをきちんと設定した状態であれば、FastReportというのは、バンドとして、マスターデータと詳細データ、さらに、そこに結びついた細かいドリルダウンしたデータが必要であれば、6階層までバンドを設定し、そこにデータを割り当てていくことで、作り出すことができるというのが見ていただけたと思います。

通常の企業であれば、請求書データであったりだとか、見積書データであったりだとか、マスター/詳細データの形式で、レポートを作ることが多いと思うんですけれども、DataSetをDelphi側で、FastReportには、それを割り当てるだけで簡単に作れるということが、このデモを通してわかっていただければと思います。

今日は、以上です。