グループを持つレポート
前の例では、2 つのテーブルからのデータに基づく 2 レベルのレポートを構築しました。FastReport では、同じように見える別のレポートを、今回は結合されたクエリによって取得されるデータセットに基づいて構築することができます。
これを行うには、両方のテーブルから、特定の方法で並べ替えられたデータを返す SQL クエリが必要になります。この例では、テーブルは、両方のテーブルに存在する CustNo フィールドで結合されます。クエリは次のようになります。
select * from customer, orders
where orders.CustNo = customer.CustNo
order by customer.CustNo
"order by" 行は、CustNo フィールドでレコードを並べ替えるために必要です。このクエリは、以下のようなデータセットを返します。
CustNo Company OrderNo SaleDate
1221 Kauai Dive Shoppe 1023 01.07.1988
1221 Kauai Dive Shoppe 1123 24.08.1993
1231 Unisco 1060 28.02.1989
1351 Sight Diver 1003 12.04.1988
1351 Sight Diver 1052 06.01.1989
1351 Sight Diver 1055 04.02.1989
どうすれば、このデータを使用して複数レベルのレポートをデザインできるのでしょうか?FastReport には、特殊なバンドの「グループ ヘッダー」があります。バンドには条件(DB フィールド値または式)が指定されており、その条件の値が変わるたびにバンドが出力されます。次に例を示します。
Delphi で新しいプロジェクトを作成し、フォーム上に TQuery
、TfrxReport
、および TfrxDBDataSet
コンポーネントを置きます。以下に示すように、これらのプロパティを設定します。
Query1:
DatabaseName = 'DBDEMOS'
SQL =
select * from customer, orders
where orders.CustNo = customer.CustNo
order by customer.CustNo
frxDBDataSet1:
DataSet = Query1
UserName = 'Group'
レポート デザイナーを開いて、新しいレポートを作成します。データ ソースをレポートに接続します。その後、グループ ヘッダー バンドをレポートに追加します。グループ ヘッダー バンドのエディターで条件(この場合は、Group.CustNo データ フィールド)を設定します。
また、データ バンドを Group データ ソースにリンクし、次のようにいくつかのオブジェクトを配置します(メモ:グループ ヘッダーは、データ バンドより上にある必要があります)。
レポートをプレビューすると、次のような出力が得られます。
ご覧のように、グループ ヘッダー バンドは、それがリンクされているフィールドの値が変わるときにのみ出力されます。ほかの場合は、グループのデータセットに接続されているデータ バンドが表示されます。
このレポートを、以前に構築したマスター/詳細レポートと比較した場合、注文番号がまったく並べ替えられていないことは一目瞭然です。これは、SQL クエリの 'order by' 句を変更することで簡単に修正できます。
select * from customer, orders
where orders.CustNo = customer.CustNo
order by customer.CustNo, orders.OrderNo
同様に、入れ子になったグループを持つレポートもデザインすることができます。グループの入れ子の深さに制限はありません。グループを使用するレポートは、マスター/詳細タイプのレポートよりも優れている点がいくつかあります。
レポート全体で 1 つのデータセット(クエリ)のみを必要とする
データのグループ化レベルの数は無制限
データの並べ替えが可能
DB リソースのより最適な使用(クエリは、クエリで実行されるフィルタリングによって、出力用として 1 つのデータセットのみを返す)
唯一不利な点は、SQL 言語でクエリを記述する必要があることです。しかし、SQL の基礎知識は、データベースを使って作業するプログラマには義務となっているも同然です。