以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  请教设计问题  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=632)

--  作者:cowpoke
--  发布时间:2008/9/20 20:50:00
--  请教设计问题

计划设计一个表,其中有两列为[当月收入]和[当年累计收入],当年累计收入是按当月收入进行累加的,比如说一月份,[当月收入]为2000,那么[当年累计收入]也为2000,2月份[当月收入]为3000,[当年累计收入]就为5000,以此类推.
想请教的问题:1,[当年累计收入]列是以表达式计算还是以代码来计算?
                  2,代码计算和属性事件计算,有哪些区别?
                  3,如以代码来计算,该怎么写呢?与事件的写法应该是一致的吧.
帮助基本上看完一遍,但还是不知从哪下手.烦请高手赐教.

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目2.table

[此贴子已经被作者于2008-9-21 8:00:43编辑过]

--  作者:hbfnmxb
--  发布时间:2008/9/21 1:17:00
--  
应该先设计一个样表,这样说,让人不好懂
--  作者:cowpoke
--  发布时间:2008/9/21 8:02:00
--  
文件已上传.
找了半天,好像函数已不能有条件的进行求和了.
[此贴子已经被作者于2008-9-21 10:06:06编辑过]

--  作者:cowpoke
--  发布时间:2008/9/21 11:37:00
--  
自己顶一下
--  作者:chips
--  发布时间:2008/9/21 12:15:00
--  

我没打开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编辑过]

--  作者:cowpoke
--  发布时间:2008/9/21 12:28:00
--  
谢谢指点.
感觉这个狐表的代码计算好难理解,看似那个sql的命令容易理解一些,真有种滞身在河中的感觉.
真不知老六为何要把表达式的函数设置的如此简单.
[此贴子已经被作者于2008-9-21 12:29:23编辑过]

--  作者:smileboy
--  发布时间:2008/9/21 13:07:00
--  
以下是引用cowpoke在2008-9-21 12:28:00的发言:
谢谢指点.
感觉这个狐表的代码计算好难理解,看似那个sql的命令容易理解一些,真有种滞身在河中的感觉.
真不知老六为何要把表达式的函数设置的如此简单.
[此贴子已经被作者于2008-9-21 12:29:23编辑过]

不是老六,而是微软就这些函数


--  作者:狐仙
--  发布时间:2008/9/21 13:19:00
--  
老六能不能自己写一点函数加上去呢?

不要一动不动就说易表是个特例,不能做一个与易表一样简单的狐表了。

图片点击可在新窗口打开查看
--  作者:cowpoke
--  发布时间:2008/9/21 23:03:00
--  
我也这样想呢,那些代码都可以搞出来,为何就搞不出个函数来呢.就光一个for条件的函数,用代码得一大摞,而函数简单明了.
--  作者:狐狸爸爸
--  发布时间:2008/9/22 8:32:00
--  
以下是引用狐仙在2008-9-21 13:19:00的发言:
老六能不能自己写一点函数加上去呢?

不要一动不动就说易表是个特例,不能做一个与易表一样简单的狐表了。

图片点击可在新窗口打开查看


这个函数谁也加不了,除非不用表达式列,要加函数只能微软加的了。
再说5楼的代码其实并不复杂啊,而且不管那种方案,效率都比易表高多了。