群组与聚合
# 组和聚合
# 1. 组示例
在之前的示例中,我们使用Basic_CommonDataType
与Basic_CommonData
来构建主-从数据集报表,如果我们仅用Basic_CommonData
来实现相似的功能,可以使用群组首数据段。
在设计器页面中插入群组首与主数据两个数据段,设计方式如下。
注意,在填写的时候B使用的SQL语句要添加Order By
对FTypeID
进行排序,在输出的时候将所有分类下的数据集字段自动归类。
# 2. 其他组功能
让我们看一下当报表调用新页面时如何输出组:
查看报表发现在查看的时候可能会不清楚第二页顶部的信息是属于哪一个分组。 FastReport允许在新页面上输出组头。为此,请使用对象检查器或上下文菜单为“组标题”区域启用ReprintOnNewPage
属性。这将改变报表,如下所示:
还有另一种方法可以避免在页面边界处破坏组。这是为对象检查器或上下文菜单中的组头启用KeepTogether
属性。然后,如果整个组不适合输出页面上的可用空间,则将其作为整体移动到新页面。在我们的示例中,出现如下:
某些页面上可能会留下大量空白,但如果可能,该组将在一页上显示完整。
StartNewPage
组标题属性允许在不同页面上输出组。它可能会导致纸张的浪费,但在某些情况下可能会有用。
# 3. 重置页码
群组首区域具有ResetPageNumbers
属性,允许我们在打印组时重置页码。它是为了什么?
下面是一个示例:您创建了一个报表,该报表将客户名称放在数据段中的组头和客户订单中。现在,您需要打印报表并将其发送给所有客户,每个客户只需获得引用它们的报表页面。遗憾的是,报表中的页码编号是连续的,因此获得编号为50到52的页面的客户会询问“前49页在哪里?”。为了避免这种情况,您必须使用自己的顺序为每个客户的页面编号。在报表内,每个组的页面编号为1。
请注意:如果将ResetPageNumbers
设置为True
,则还应将StartNewPage
设置为True
,以便每个组都将在新页面上启动。要打印页码或总页数,应使用[Page]
和[TotalPages]
系统变量,而不是[Page#]
和[TotalPages#]
。
# 4. 交互式分组
群组首有一个名为DrillDown
的属性。如果将其设置为True
,则该组将变为交互式。这意味着您可以单击预览窗口中的组标题,组将展开(显示组中的所有记录)或折叠(仅显示标题,如果ShowFooterIfDrillDown
为True
,则显示页脚)。
以下是具有一个扩展标头的此类组的示例:
# 5. 行号
让我们使用我们的示例来说明如何对组中的行进行编号。为此,我们将两个包含系统变量[Line]
的文本对象添加到我们的两个段(可以从右侧“数据树”窗格的“变量”选项卡中拖放来完成)。
在预览报表时,我们可以看到两个数据集现在都有自己的行号:
要连续编号第二级数据行,请在数据段上的文本对象中使用[Line#]
变量而不是[Line]
。结果将如下所示:
# 6. 聚合函数
在大多数情况下,组报表需要显示一些摘要信息(例如:“组的总数”,“组元素的数量”等)。 FastReport提供聚合函数,用于计算某些数据范围内的聚合值。聚合函数是:
名称 | 说明 |
---|---|
SUM | 返回表达式的总和 |
MIN | 返回表达式的最小值 |
MAX | 返回表达式的最大值 |
AVG | 返回表达式的平均值 |
COUNT | 返回数据范围中的行数 |
所有聚合函数(COUNT除外)的语法类似于SUM函数的语法:
SUM(expression, band, flags)
SUM(expression, band)
SUM(expression)
2
3
参数说明:
expression
:要计算的表达式band
:执行机端的数据段的名称flags
:一个位字段,取值说明如下:1
:包含计算中不可见的段。2
:累计聚合作为运行总计(当前数据跨度重置时不要重置聚合)。3
:(前两个选项都是)。
表达式是唯一的必需参数,其他两个是可选的。尽管如此,为了避免出错,建议始终给出数据段参数。
“COUNT”聚合函数具有以下语法:
COUNT(band, flags)
COUNT(band)
2
其中参数与上述含义相同。
所有聚合函数都有一个通用规则:聚合只能在数据段上计算,并且只能在该段的页脚中使用,该页脚可以是以下之一:尾,页尾,群组尾,列尾或报表页尾(摘要段)。
聚合函数如何工作?我们将使用前面的示例来查看此内容。让我们在报表中添加一些新元素:
在组页脚中放置一文本对象,其中包含上面显示的聚合SUM。它将显示给定客户下达的所有订单的总和。使用计算器,我们可以检查结果是否正确。
聚合函数的工作方式如下:在输出报表之前,FastReport会扫描文本对象内容以查找任何聚合函数。找到的聚合链接到其参数中的数据段(在我们的示例中,“SUM”链接到“MasterData1”段)。在报表输出期间(显示数据段时),计算链接到它的聚合的值。在我们的例子中,B.FInterID
字段值被累积。一旦输出显示聚合的组页脚,聚合值将重置为零,并为下一组重复循环,依此类推。
聚合函数中可选“Flags”参数的用途是什么?报表可能隐藏了部分或全部数据段。但是,我们可能需要计算所有数据段的聚合,无论是否可见。在我们的示例中,将数据段的Visible
属性设置为false
,以防止其显示。为了使这个隐藏的数据段包含在计算中,我们必须在函数调用中设置第三个可选参数,如下图所示,即:
[SUM(<B."FInterID">,MasterData1,1)]
这会生成一个分组统计的报表。
当Flags
参数值设置为2时,聚合值在显示后不会立即重置:聚合成为每个连续输出的“运行”计算。让我们修改函数调用,如下所示:
[SUM(<B."FInterID">,MasterData1,3)]
值3
是1
和2
的位组合,这意味着我们需要包括不可见的段,而不需要在每个组之后重置总数。因此,我们有:
# 7. 页面和报表总计
通常,我们需要显示页面或整个报表的摘要总计。我们也可以在这种情况下使用聚合函数。我们将通过对我们的示例进行一些更改来显示:
正如您所看到的,我们添加了一个“报表(报告)摘要”数据段,其中包含文本对象,其中聚合SUM指向“报表(报告)摘要”区域和“页尾”区域。这就是所需要的:
# 8. 插入聚合函数
到目前为止,我们已将聚合函数手动插入文本对象。现在我们将看看插入聚合函数的其他方法。
首先,我们可以使用“系统文本”对象来输出聚合。事实上,这个对象类似于“Text”对象,它有自己 的特殊编辑器,可以更轻松地指定系统变量或聚合函数:
选择一个函数类型,然后选择一个数据段(在其上计算聚合),最后选择一个字段或要计算其值的表达式。如果需要,您还可以设置计算不可见band数目
和执行总数
标记。
第二种方法是使用文本对象并单击其编辑器中的/按钮:这将打开类似于“系统文本”对象编辑器的对话框。单击“确定”按钮时,会将对聚合函数的调用插入到对象的文本中。