FastReport VCL/FMX使用教程:Delphi/Lazarus中的两级数据(主-从)报表

2021-11-05 14:48:59 浏览数 (3)

在这篇文章中,想告诉你 FastReport 如此强大的多级报告。他们的结构可以比作一棵树——树干、大树枝、从它们长出的细树枝,等等直到叶子——或者与公司结构进行比较:部门、分部、员工。它们通常被称为主从或主从,由几个表组成。一张表包含主要实体的列表;与第一个表绑定的另一个表包含一个从属实体列表,其中包含对第一个表的引用,指定第二个表中的某个实体从属于第一个表中的哪个实体,依此类推。

FastReport 最多支持六层嵌套(通过使用 Nested 报表对象可能会更多,但这将在后面描述)。在实际应用中,很少需要打印具有大量数据嵌套的报告;通常,1-3 级就足够了。

构建主从报表的示例

让我们考虑创建一个两级报告。它将包含来自 Customer 和 Orders 表的数据。第一个表是客户列表;第二个是客户的订单清单。这些表包含以下类型的数据:

顾客: CustNo Company 1221 Kauai Dive Shoppe 1231 Unisco 1351 Sight Diver

订单: 订单无客户无销售日期 1003 1351 12.04.1988 1023 1221 01.07.1988 1052 1351 06.01.1989 1055 1351 04.02.1989 1062 1981 2060 139 1989

如您所见,第二个表包含所有公司发出的所有订单的列表。要获取特定公司的订单列表,应从表中选择数据,其中字段 CustNo 等于所选公司的编号。使用这些数据构建的报告将如下所示:

1221 考艾岛潜水专柜 1023 1988年7月1日 1123 1993年8月24日 1231 联合船代 1060 1989年2月28日 1351 视觉潜水员 1003 1988年4月12日 1052 1989年6月1日 1055 1989年2月4日

现在我们开始做报告。我们在 Delphi 中创建了一个新项目,并为表单设置了两个 TTable 组件、一个 TDataSource 组件、两个 TfrxDBDataSet 组件和一个 TfrxReport 组件。

8

将数据从基础连接到报表对象

我们设置组件如下: Table1 : DatabaseName = 'DBDEMOS' TableName = 'Customer.db' Table2 : DatabaseName = 'DBDEMOS' TableName = 'Orders.db' DataSource1 : DataSet = Table1 frxDBDataSet1 : DataSet = Table1 UserName = 'Customers' frxDBDataSet2 : DataSet = Table2 UserName = '订单' 在报表设计器中,我们在 Report|Data... 窗口中连接我们的数据源。

将第一级数据(主)和第二级数据(详细信息)带添加到页面。从数据面板(在右侧),我们将表字段拉到各自的波段(主和细节)。它看起来像这样:

注意 - 第一级数据带必须位于上方!如果位于2级数据带以下,FastReport会在开始上报时提示错误。

启动后,我们将看到每个客户的订单列表都是相同的,并且包含订单表中的所有记录。这是因为我们没有打开 Orders 表中的记录过滤。

让我们回到我们的数据源。对于表 2 组件,我们设置 MasterSource = DataSource1 属性。因此,我们设置了主从连接。现在我们必须在下级源中设置记录过滤条件。为此,请调用 Table 2 组件中 MasterFields 属性的编辑器:

我们必须连接两个源中的两个 CustNo 字段。为此,请在上面的列表中选择 CustNo 索引,选择字段并单击添加按钮。一堆字段将被重新定位到较低的窗口中。之后,使用 ОК 按钮关闭编辑器。

当报表启动时,FastReport 将执行以下操作。它将从主表 (Customer) 中选择下一个记录并将过滤器设置为从属表 (Orders)。只有满足条件 Orders.CustNo = Customer.CustNo 的录音才会留在表中。也就是说,对于每个客户,只会显示该客户的订单:

同样,您最多可以构建具有六个数据级别的报告。

0 人点赞