报表开发重点提示3:在报表中实现自定义统计计算
统计框与统计函数可以自动实现数据的统计分析,如求和,求平均,最大值、最小值与记数等。但某些特殊的统计要求并不能由统计框与统计函数的功能直接实现,如对某个字段中的不分满足条件的求和,按特定的运算规则计算统计数据等。这些特殊的要求使用Grid++Report都是可以实现的,下面就对实现这样的要求进行简单说明。
方式一: 采用计算字段方式
定义一个计算字段,给计算字段设上合理的值,然后对计算字段进行统计。
在报表的记录集中定义一个新的字段,这个字段与报表数据源的字段并不存在对应关系,其字段值在报表的 BeforePostRecord? 事件中根据条件求出,在这里称这样的字段为计算字段。假设计算字段的名称为“CalcField”,下面写出大致的 BeforePostRecord 事件程序代码:
void ReportBeforePostRecord()
{
if (#满足条件#)
Report.FieldByName("CalcField").AsFloat = #求出值#;
else
Report.FieldByName("CalcField").AsFloat = 0;
}
将满足统计条件记录的计算字段的值设上相应的数据,而将不满足统计条件记录的计算字段的值设0。应用统计框与统计函数对这个计算字段进行统计,就可以实现对满足条件的部分数据实现统计。
方式二: 在报表事件中自定义统计,最后替换统计框的统计值
这种方式采用在报表事件代码中计算出统计值,最后用计算出统计值替换统计框自动计算出来的值。一般是在报表的 GroupBegin 事件中设定统计初值,在 ProcessRecord 事件中根据条件与统计规则累计统计数据,最后在 GroupEnd 事件中给统计框设上自定义求出的统计值,下面写出大致的程序代码:
void ReportGroupBegin()
{
//变量MyTotal记录统计值,这里首先设初值
MyTotal = 0;
}
void ReportProcessRecord()
{
//这里累计统计,可以按自定义规则运算,可以取各个记录字段的当前值参与运算
MyTotal = MyTotal + ...;
}
void ReportGroupEnd()
{
//将变量MyTotal赋给统计框
MySummaryBox.Value = MyTotal;
}
说明:
- 如果不存在分组,而是对所有记录数据进行一遍统计,应该在 ProcessBegin 事件中设统计初值,在 ProcessEnd 事件中给统计框设上自定义求出的统计值。
- 也可以用参数代替统计框,将自定义统计值赋给参数,参数的值可以用静态框或综合文本框进行展现。
- 例子 Advance\CustomSummary 中是用一个初值加上合计值求余额,所以不用进行自定义统计计算。
我來分享一個我的經驗:用的是方法2,在分組尾,添加一個靜態的文本框,然後給關聯一個參數。
void ReportGroupBegin()
{
//变量MyTotal记录统计值,这里首先设初值
MyTotal = 0;
}
void ReportProcessRecord()
{
//这里累计统计,可以按自定义规则运算,可以取各个记录字段的当前值参与运算
MyTotal = MyTotal + ...;
}
void ReportGroupEnd()
{ //将变量MyTotal赋给參數
Param1.Value = “總數為:”+ MyTotal;
}
------------------- ----------
跟統計框不同的是,這個方法可以自由的輸入一些字符,統計框貌似只能是數字。 我有一個疑問,如果我在ReportGroupEnd()中直接找到靜態文本框,直接賦值的話,這樣每個在每個靜態文本框的值都是一樣的,如果是用統計框,就會不一樣。 這2者有什麽區別嗎?
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· golang自带的死锁检测并非银弹
· 一个适用于 .NET 的开源整洁架构项目模板
· AI Editor 真的被惊到了
· API 风格选对了,文档写好了,项目就成功了一半!
· 【开源】C#上位机必备高效数据转换助手
· .NET 9.0 使用 Vulkan API 编写跨平台图形应用