データベースを利用したレポートを作成する際、顧客毎の購入商品の一覧を見たいなど、マスター/詳細の関係を持った情報を扱うことは多々あります。
このような階層化されたデータを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には、それを割り当てるだけで簡単に作れるということが、このデモを通してわかっていただければと思います。
今日は、以上です。