以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  组合多个统计结果  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=10461)

--  作者:kylin
--  发布时间:2011/6/7 14:58:00
--  组合多个统计结果

“组合多个统计结果”是6月7日的一个非常酷的统计方案,使用起来超速,呵呵

 

但是发现一个不足,就是分组只支持一个字段,这难免有些遗憾,希望老六进一步提供过字段的分组,呵呵

 

比如:

Dim bd1 As New GroupTableBuilder("统计表1",DataTables("cg"))
Dim dt1 As fxDataSource

bd1.Groups.AddDef("发票年,发票月,类别,明细分类,规格型号")
bd1.Totals.AddDef("数量","进货_数量") \'对数量进行统计
bd1.Totals.AddDef("不含税金额","进货_金额") \'对金额进行统计
dt1 = bd1.BuildDataSource()

 

Dim bd2 As New GroupTableBuilder("统计表2",DataTables("xs"))
Dim dt2  As fxDataSource
bd2.Groups.AddDef("发票年,发票月,类别,明细分类,规格型号")
bd2.Totals.AddDef("数量","销售_数量") \'对数量进行统计
bd2.Totals.AddDef("销售收入","销售_金额") \'对金额进行统计
dt2 = bd2.BuildDataSource()

 

dt1.Combine("发票年,发票月,类别,明细分类,规格型号",dt2,"发票年,发票月,类别,明细分类,规格型号") \'将销售统计数据组合到进货统计数据

 

Tables("窗口3_Table1").DataSource = dt1 \'将统计结果绑定到Table
With DataTables("窗口3_Table1").DataCols  \'用表达式列计算库存数据
    .Add("库存_数量",Gettype(Integer), "IsNull([进货_数量],0) - ISNULL([销售_数量],0)")
    .Add("库存_金额",Gettype(Double), "[库存_数量] /[进货_数量] * [进货_金额]")
End With

 

会出现错误提示:“原数据表不存在名为"发票年,发票月,类别,明细分类,规格型号"的列”,这个错误提示说明了目前的合并分组只支持一个字段而不支持多个字段

 

起码在“年月--型号”这样的分组需求的时候就不能直接进行统计处理


--  作者:狐狸爸爸
--  发布时间:2011/6/7 15:13:00
--  

呵呵,下次改进


--  作者:rcsy001
--  发布时间:2011/6/7 15:44:00
--  

顶!


--  作者:zhaotao
--  发布时间:2011/6/7 21:41:00
--  
实在有点遗憾!
--  作者:狐狸爸爸
--  发布时间:2011/6/7 22:47:00
--  

刚刚改进,下次更新可以用了:

 

 

Dim bd1 As New GroupTableBuilder("统计表1",DataTables("进货单"))

Dim dt1 As fxDataSource

bd1.Groups.AddDef("品名") \'根据品名分组

bd1.Groups.AddDef("型号") \'根据型号分组

bd1.Totals.AddDef("数量","进货_数量") \'对数量进行统计

bd1.Totals.AddDef("金额","进货_金额") \'对金额进行统计

dt1 = bd1.BuildDataSource()

 

Dim bd2 As New GroupTableBuilder("统计表2",DataTables("销售单"))

Dim dt2  As fxDataSource

bd2.Groups.AddDef("品名") \'根据品名分组

bd2.Groups.AddDef("型号") \'根据型号分组

bd2.Totals.AddDef("数量","销售_数量") \'对数量进行统计

bd2.Totals.AddDef("金额","销售_金额") \'对金额进行统计

dt2 = bd2.BuildDataSource()

 

Dim bd3 As New GroupTableBuilder("统计表3",DataTables("退货单"))

Dim dt3 As fxDataSource

bd3.Groups.AddDef("品名") \'根据品名分组

bd3.Groups.AddDef("型号") \'根据型号分组

bd3.Totals.AddDef("数量","退货_数量") \'对数量进行统计

bd3.Totals.AddDef("金额","退货_金额") \'对金额进行统计

dt3 = bd3.BuildDataSource()

 

Dim nms As String() = {"品名","型号"} \'指定连接列

dt1.Combine(nms,dt2,nms) \'将销售统计数据组合到进货统计数据

dt1.Combine(nms,dt3,nms) \'将退货统计数据组合到进货统计数据

Tables("窗口1_Table1").DataSource = dt1 \'将统计结果绑定到Table

With DataTables("窗口1_Table1").DataCols  \'用表达式列计算库存数据

    .Add("库存_数量",Gettype(Integer), "IsNull([进货_数量],0) - ISNULL([销售_数量],0) - ISNULL([退货_数量],0)")

    .Add("库存_金额",Gettype(Double), "[库存_数量] /[进货_数量] * [进货_金额]")

End With


--  作者:reachtone
--  发布时间:2011/6/8 2:01:00
--  
以下是引用狐狸爸爸在2011-6-7 22:47:00的发言:

刚刚改进,下次更新可以用了:

 

 

Dim bd1 As New GroupTableBuilder("统计表1",DataTables("进货单"))

Dim dt1 As fxDataSource

bd1.Groups.AddDef("品名") \'根据品名分组

bd1.Groups.AddDef("型号") \'根据型号分组

bd1.Totals.AddDef("数量","进货_数量") \'对数量进行统计

bd1.Totals.AddDef("金额","进货_金额") \'对金额进行统计

dt1 = bd1.BuildDataSource()

 

Dim bd2 As New GroupTableBuilder("统计表2",DataTables("销售单"))

Dim dt2  As fxDataSource

bd2.Groups.AddDef("品名") \'根据品名分组

bd2.Groups.AddDef("型号") \'根据型号分组

bd2.Totals.AddDef("数量","销售_数量") \'对数量进行统计

bd2.Totals.AddDef("金额","销售_金额") \'对金额进行统计

dt2 = bd2.BuildDataSource()

 

Dim bd3 As New GroupTableBuilder("统计表3",DataTables("退货单"))

Dim dt3 As fxDataSource

bd3.Groups.AddDef("品名") \'根据品名分组

bd3.Groups.AddDef("型号") \'根据型号分组

bd3.Totals.AddDef("数量","退货_数量") \'对数量进行统计

bd3.Totals.AddDef("金额","退货_金额") \'对金额进行统计

dt3 = bd3.BuildDataSource()

 

Dim nms As String() = {"品名","型号"} \'指定连接列

dt1.Combine(nms,dt2,nms) \'将销售统计数据组合到进货统计数据

dt1.Combine(nms,dt3,nms) \'将退货统计数据组合到进货统计数据

Tables("窗口1_Table1").DataSource = dt1 \'将统计结果绑定到Table

With DataTables("窗口1_Table1").DataCols  \'用表达式列计算库存数据

    .Add("库存_数量",Gettype(Integer), "IsNull([进货_数量],0) - ISNULL([销售_数量],0) - ISNULL([退货_数量],0)")

    .Add("库存_金额",Gettype(Double), "[库存_数量] /[进货_数量] * [进货_金额]")

End With

这个一定要顶,非常牛!GroupTableBuilder和CrossTableBuilder可以对临时的DataTable进行统计,而这些临时的datatable是可以用sql语句直接生成的,这就意味着统计的对象不仅可以是库中的现成表,也可以是查询表;再加上这个组合功能,就更强大了!

如果纯粹用sql语句来写,多个join肯定会搞到头昏。。


--  作者:reachtone
--  发布时间:2011/6/8 2:21:00
--  

不过,对于类似于这样的统计表,好像还是只能用sql语句实现:


图片点击可在新窗口打开查看此主题相关图片如下:snap1.jpg
图片点击可在新窗口打开查看

针对现有的统计工具,能否考虑再完善以下功能:

1、关于同比和环比。

目前分组统计工具可以实现,但必须要按照年/月(季周等)分组。这样生成的统计结果往往并不是我们所真正需要的。比如,我仅想得到2011年5月份的同比和环比数据,统计范围就必须包含2010年5月份和2011年4月份的原始数据,这样分组统计的结果中就同时有了其它2个月的数据(这2个月的数据并不是我们想要的)。同时,统计表中还有了两个不想看到的列:年、月。

2、增加累计。这个和“截至”不同,一般是从年初到当前的累计。


--  作者:狐狸爸爸
--  发布时间:2011/6/8 8:02:00
--  

按年月分组统计,截至就变成自年初累计了。

上图的统计结果,估计是没有办法直接生成的了,只能先统计指定日期范围内的数据,用代码删除多余月份的和多余的列。


--  作者:aloby
--  发布时间:2011/6/8 8:09:00
--  

什么功能?可以发个例子吗?


--  作者:kylin
--  发布时间:2011/6/8 8:49:00
--  
超牛的一个改进,兴奋中。。。