Search Results for

    Show / Hide Table of Contents

    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 つまでのデータ レベルを持つレポートを構築することができます。

    Back to top © Copyright Fast Reports Inc.