2 つのデータ レベルを持つレポート(マスター/詳細)
これまでに扱ってきたレポートの例では、データ出力を制御するデータ バンドを 1 つ(「第 1 レベル データ」または「マスター データ」)しか使用しませんでした。これは、1 つの DB テーブルからのデータの出力に適していました。FastReport では、1 つのデザイン ページに対し、最大 6 個までのデータ レベルを持つレポートをデザインすることができます。さらに、サブレポート オブジェクトを使用することで、データ レベル数に制限のないレポートを実現できます。サブレポート オブジェクトについては、後で取り上げます。
一般に、ほとんどのレポートで必要とするデータ レベルは 1 ~ 3 で、多数のデータ レベルが必要となるのはまれです。
2 つのデータ レベルがあるレポートをどのようにデザインするか見てみましょう。このレポートは、デモ テーブル Customer および Orders のデータを出力します。最初のテーブルは顧客の一覧で、2 番目のテーブルはそれら顧客による注文の一覧です。テーブルには、次のようなフィールドのデータが含まれています。
Customer:
CustNo Company
1221 Kauai Dive Shoppe
1231 Unisco
1351 Sight Diver
...
Orders:
OrderNo CustNo SaleDate
1003 1351 12.04.1988
1023 1221 01.07.1988
1052 1351 06.01.1989
1055 1351 04.02.1989
1060 1231 28.02.1989
1123 1221 24.08.1993
...
ご覧のように、2 番目のテーブルには、すべての顧客から発行されたすべての注文の一覧が含まれています。Orders テーブルの注文を、それを発注した Customers テーブル内の顧客別に表示するには、両方のテーブルに共通の CustNo フィールドで 2 つのテーブルをリンクします。このデータからのレポート出力は、次のようになります。
1221 Kauai Dive Shoppe
1023 01.07.1988
1123 24.08.1993
1231 Unisco
1060 28.02.1989
1351 Sight Diver
1003 12.04.1988
1052 06.01.1989
1055 04.02.1989
レポートをデザインしてみましょう。Delphi で新しいプロジェクトを作成し、フォーム上に 2 つの TTable
、1 つの TDataSource
、2 つの TfrxDBDataSet
、さらに 1 つの TfrxReport
コンポーネントを置きます。以下に示すようにコンポーネントのプロパティを設定します。
Table1:
DatabaseName = 'DBDEMOS'
TableName = 'Customer.db'
Table2:
DatabaseName = 'DBDEMOS'
TableName = 'Orders.db'
DataSource1:
DataSet = Table1
frxDBDataSet1:
DataSet = Table1
UserName = 'Customers'
frxDBDataSet2:
DataSet = Table2
UserName = 'Orders'
レポート デザイナーでは、[レポート]>[データ]メニューから表示されるダイアログでデータ ソースを有効にします。それから、ページにマスター データ バンドと詳細データ バンドを追加します。
マスター データ バンドは、詳細データ バンドの上に置く必要があることに注意してください。必要に応じて、そこにドラッグします。マスターを詳細の下に置いた場合、FastReport はレポートをプレビューする際にエラー メッセージを生成します。
この時点でレポートをプレビューした場合、注文の一覧は、すべての顧客に同じままであり、Orders テーブルのすべてのレコードが含まれていることがわかります。このようになるのは、Orders テーブルの MasterSource
プロパティを設定していないからです。Delphi フォーム上の、Table2 コンポーネントの MasterSource = DataSource1
を設定します。
これで、「マスター/詳細」の関係が設定されました。次に、リンクするフィールドを選択します。Table2 コンポーネントの MasterFields
プロパティを設定します。
2 つのソースの CustNo フィールドを一緒にリンクする必要があります。これを実行するには、目的のフィールドを選択してから[追加]ボタンをクリックします。フィールドのリンクが下のペインに表示されます。[OK]でエディターを閉じて終了します。
プレビューを作成するときに、FastReport は次のことを行います。
- マスター テーブル(Customer)からレコードが出力された後、詳細テーブル(Orders)にフィルターを設定します。
Orders.CustNo = Customer.CustNo
条件に一致するレコードのみがテーブルに残ります。
つまり、各顧客に対し、現下の顧客に属する注文のみが詳細バンドに表示されるということです。
これは、把握する重要な概念です。データ バンドは、それがマスター タイプであろうと詳細タイプであろうと、出力ページ上のデータの位置(表示される順序と回数)を制御するだけです。バンド内のオブジェクトによって表示されるデータは、そのオブジェクトがリンクされているフィールドと、2 つのテーブルの外部リンクによって決まります。
最終出力は次のようになります。
同様の方法で、最大 6 つまでのデータ レベルを持つレポートを構築することができます。