以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  统计工具中的数据分析有点小问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=12581)

--  作者:reachtone
--  发布时间:2011/9/7 23:31:00
--  统计工具中的数据分析有点小问题

以自带的“多表统计”为例,执行如下代码:

 

Dim b As New SQLGroupTableBuilder("统计表1","订单")
b.C
b.Groups.AddDef("产品ID")
b.Totals.AddExp("22","单价*数量")        \'注意这里生成的列名
b.VerticalTotal = True
b.GroupProportion = True

b.Build

 

问题是:不论将统计列的列名称定义成什么,比如22、33、ab%等任何奇怪的名称,只要没有蓝底白字的那两行代码,都能正确统计;一旦加上这两行代码中的任何一个,则统计肯定出错!事实是,不仅这两行代码,所有与数据分析相关的属性,一旦加入,都会出错。

可能有人会问:干嘛要设置那么奇怪的统计列名称呢?这是实际工作中碰到的,需要根据用户设置的内容来生成统计表。也就是说,列名都不是事先设定的,都是根据用户输入的内容自动生成的。


--  作者:紙上不談兵
--  发布时间:2011/9/8 6:37:00
--  
问题是:狐表的列名不能以数字开头更不能全是数字也不能包括空格和各种符号(下划线除外),但是列标题没有任何限制,只要你愿意,不同的列甚至可以有相同的标题

有些规则一定要遵守的,像22、33、ab%,明显和狐表对着干!即使这些是用户设置的内容,但程式是您设计的,您完全可以把用户设置的内容设置为变为符合规则,如:


Dim b As New SQLGroupTableBuilder("统计表1","订单")
b.C
b.Groups.AddDef("产品ID")
b.Totals.AddExp("ABC","单价*数量",
"ab%")        \'注意这里生成的列名

b.VerticalTotal = True
b.GroupProportion = True

b.Build


除非老大更改程式,否则就像老大说的:以下代码出错是正常的,不出错是意外!

Dim b As New SQLGroupTableBuilder("统计表1","订单")
b.C
b.Groups.AddDef("产品ID")
b.Totals.AddExp("22","单价*数量")        \'注意这里生成的列名

b.Build

[此贴子已经被作者于2011-9-8 6:59:43编辑过]

--  作者:reachtone
--  发布时间:2011/9/8 7:36:00
--  

呵呵,正常建表当然是应该遵循这些规则的。但生成的统计表就会碰到各种复杂的情况。

既然不加参数可以正常统计,说明使用这些列名没问题。

其实,foxtable的统计工具也是通过sql语句完成的。在sql中,只要列标题用[]括起来,标题中有任何特殊的字符都是可以的。这是小问题,老大应该可以轻松解决。


--  作者:狐狸爸爸
--  发布时间:2011/9/8 8:17:00
--  
还是加个字母开头吧,统计结果虽然用SQL完成,但是还是要加工的,符合foxtable的规范很重要。
--  作者:reachtone
--  发布时间:2011/9/8 8:22:00
--  

加个字母也不行,比如有的列是含有%符号的,仍然出错。

关键问题还不在这里,因为我根本不知道用户可能还会输入其它什么内容。所以,最好还是想个彻底的办法解决为好。


--  作者:狐狸爸爸
--  发布时间:2011/9/8 8:25:00
--  

写个代码检测,如果是数字开发,或者包括空格和符号,就给予提示就行。

就像foxtable的重命名列,输入不规范,就会提示。


--  作者:紙上不談兵
--  发布时间:2011/9/8 8:26:00
--  
以下是引用reachtone在2011-9-8 8:22:00的发言:

加个字母也不行,比如有的列是含有%符号的,仍然出错。

关键问题还不在这里,因为我根本不知道用户可能还会输入其它什么内容。所以,最好还是想个彻底的办法解决为好。



Dim b As New SQLGroupTableBuilder("统计表1","订单")
b.C
b.Groups.AddDef("产品ID")
b.Totals.AddExp("ABC","单价*数量",
"ab%")        \'注意这里生成的列名

b.VerticalTotal = True
b.GroupProportion = True

b.Build


这样变通不行吗?名字正规化,用户输入作标题!


--  作者:reachtone
--  发布时间:2011/9/8 8:32:00
--  

这个问题我通过代码是可以解决的,比如列名统一用一个字母加上顺序号,列标题用用户输入的内容。(循环读取的用户设置,列名加上序号就可以了)。

我提出这个问题的目的是,foxtable作为应用软件,可能有的用户并不要编码,遇到这种情况直接统计就出错了。所以还是希望foxtable更完善。

因为直接用户是把它作为应用软件来用的,他才不管这么多呢。。。

 


--  作者:紙上不談兵
--  发布时间:2011/9/8 8:37:00
--  
以下是引用reachtone在2011-9-8 8:32:00的发言:


我提出这个问题的目的是,foxtable作为应用软件,可能有的用户并不要编码,遇到这种情况直接统计就出错了。

----------------------------------------------------------------------------------------------------

不明,如没有编码,怎会出现:b.Totals.AddExp("22","单价*数量") 呢?


--  作者:reachtone
--  发布时间:2011/9/8 8:53:00
--  

这种表很常见吧?

 

项目  2001年  2002年  2003年。。。

aa 。。

bb 。。

cc  。。

dd  。。

ee  。。

 

这种表在foxtable中是没办法建立的,但在外部数据库中没问题。如果用这种外部数据源,然后对年份列分组统计试试?

实际应用中,各种可能的情况太多了。