我没打开FOXTABLE进行测试,只是针对你的问题描述谈谈:
建议收入明细表不要再增加“当月收入、当年累计收入”列,可通过其它方式单独建表后计算。另外,此处不宜用事件解决。因为这2列不是简单地从当前行记录其它字段直接计算而来,而是根据当前表的日期范围累计计算的,不能在事件中(比如DataColChanged事件) 中设置代码一触发而牵动全身,数据量大时,速度就很慢。
有多种方法:
1、手工利用FOXTABLE本身自有功能,直接在表中对日期进行分组,可以增加一个日期分组,分组类型设为“月”,这样每月的累计和总累计都有了,也不用表达式,不用代码,也不用事件处理。
2、利用分组统计表生成器完成统计:在命令窗口可以使用,也可以在菜单和窗体按钮中设置。
Dim b As New GroupTableBuilder("统计表1",DataTables("收入明细表"))
b.Groups.AddDef("日期",DateGroupEnum.Year,"年") '添加日期列用于分组,并用"年"代替原名称
b.Groups.AddDef("日期","月") '添加日期列用于分组,并用"月"代替原名称
b.Totals.AddDef("收入") '添加收入列用于统计
b.Build '生成统计表
MainTable = Tables("统计表1") '打开生成的统计表
3、FOXTABL表达式的聚合函数Sum(求和)功能较弱,没有条件汇总功能,只是可以统计汇总关联子表数据,比如Sum(Child.数量),所以可改用计算代码统计,这样就需要另建立一个表,包含“年份、月份、当月收入、当年累计收入”4个字段列。年份、月份可以手工填入,也可以通过设置按钮等的事件自动填入,在当月收入、当年累计收入中设计算代码进行计算即可。计算代码设为:
e.DataRow("当月收入") = DataTables("收入明细表").Compute("Sum(收入)","[日期] >= #" & Date([年份], [月份],1) & "# and [日期] <= #",& Date([年份], [月份], DaysInMonth([年份], [月份])) & "#")
e.DataRow("当年累计收入") = DataTables("收入明细表").Compute("Sum(收入)","[日期] >= #" & Date([年份], 1,1) & "# and [日期] <= #",& Date([年份], [月份], DaysInMonth([年份], [月份])) & "#")
4、不管是内表还是外部数据源,都可以通过建立SQL查询表得到查询结果。比如:
SELECT Year(日期)AS 年, Month(日期) AS 月, SUM(收入) AS 月收入 FROM {收入明细表} GROUP BY Year(日期), Month(日期)
以上没经过测试,只是提出来供大家研究一下。谢谢!
[此贴子已经被作者于2008-9-21 13:14:35编辑过]