以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]能否在交叉表的垂直分组列中增加列(已解决)  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=11157)

--  作者:yyzlxc
--  发布时间:2011/7/10 17:36:00
--  [求助]能否在交叉表的垂直分组列中增加列(已解决)

项目中用代码生成交叉统计(表年度汇总),想在垂直分组列中再增加二列,分别为人均加工费(加工费/月均人数)和其环比,代码应如何修改?请各位老师指教。谢谢!!


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

 


 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:生产日报b.zip

 

附上代码如下:

\'读取ComboBox2中的年份
If e.Form.Controls("ComboBox2").Value Is Nothing Then
    MessageBox.Show("请在右侧选择生成报表的年份","提示")
    Return
End If
\'根据年份生成临时表
Dim nf As String = e.Form.Controls("ComboBox2").Value
Dim sql As String = "Select 报表年月,日期,单位,Sum(加工费) As 加工费,Sum(投工) As 投工 FROM {日报源表} WHERE Year(日期) = \'" & nf &  "\' Group By 报表年月,日期,单位 ORDER BY 单位,日期,报表年月"
\'根据临时表生成年度汇总表
Dim b As New CrossTableBuilder("年度汇总",sql)
b.HGroups.AddDef("单位")
b.VGroups.AddDef("报表年月")
b.Totals.AddDef("加工费")
b.Totals.AddDef("投工",AggregateEnum.Average,"月均人数")
b.HorizontalTotal = True
b.VerticalTotal = True
b.Build()
\'MainTable = Tables("年度汇总")
Dim r As Table = Tables("年度汇总")
Dim i As Integer =Tables("年度汇总").Cols.Count
i=(i-3)/2
r.DataTable.DataCols.Add("合计_年均人数", Gettype(Double),"[合计_投工]/"& i)
Tables("年度汇总").Cols.Remove("合计_投工")\'隐藏列
MainTable = r \'打开生成的按月汇总表

Dim k1 As String ="加工费_"
Dim k2 As String ="投工_"
For j As Integer = 1 To i   
    DataTables("年度汇总").DataCols( k1 & j ).SetFormat("0.00")
    DataTables("年度汇总").DataCols( k2 & j ).SetFormat("0.00")
Next

r.DataTable.DataCols.Add("年人均加工费", Gettype(Double),"iif(合计_年均人数=0,null,合计_加工费/合计_年均人数)")
DataTables("年度汇总").DataCols("合计_加工费").SetFormat("0.00")
DataTables("年度汇总").DataCols("合计_年均人数").SetFormat("0.00")
DataTables("年度汇总").DataCols("年人均加工费").SetFormat("0.00")
\'动态增加列
DataTables("年度汇总").DataCols.Add("名次", Gettype(Byte))
\'根据代码生成的汇总表对年人均加工费进行排名
\'获得该报表的全部行
Dim drs As List(Of DataRow) = DataTables("年度汇总").Select("[单位] <> \'合计\'","年人均加工费 DESC")
For n As Integer = 0 To drs.Count - 1 \'遍历所有行
    If n > 0 AndAlso drs(n)("年人均加工费") = drs(n-1)("年人均加工费") Then \'如果年人均加工费和上一行相同
        drs(n)("名次") = drs(n-1)("名次") \'则排名等于上一行
    Else
        drs(n)("名次") = n + 1 \'设置名次
    End If
Next
Tables("年度汇总").Cols("单位").TextAlign = TextAlignEnum.Center
Tables("年度汇总").Cols("名次").TextAlign = TextAlignEnum.Center
Tables("年度汇总").AutoSizeCols()

 

[此贴子已经被作者于2011-7-28 18:54:01编辑过]

--  作者:狐狸爸爸
--  发布时间:2011/7/11 7:11:00
--  

Dim sql As String = "Select 报表年月,日期,单位,Sum(加工费) As 加工费,Sum(投工) As 投工,Sum(加工费)/Sum(投工) As 人均加工费 FROM {日报源表} WHERE Year(日期) = \'" & nf & "\' Group By 报表年月,日期,单位 ORDER BY 单位,日期,报表年月"

 

剩下的你应该可以自己处理了。

[此贴子已经被作者于2011-7-11 7:11:31编辑过]

--  作者:yyzlxc
--  发布时间:2011/7/11 9:11:00
--  

谢谢狐爸老师的指教,根据您的提示,已经在垂直分组中成功地增加了一列,但存在一点瑕疵,就是人均加工费的合计行的值应该是平均值,如何来实现?

其次,式中的Sum(加工费)/Sum(投工) As 人均加工费的计算结果与实际值有误差,原因是Sum(投工)不等于月均人数,如何用式中的b.Totals.AddDef("投工",AggregateEnum.Average,"月均人数")的值来替换Sum(投工)

另外,在垂直分组列中,有没有办法对某一列(比如人均加工费)进行环比,这是统计分析的一个重要手段,还请狐爸老师费神,给予指教,再次感谢!!

 

 


图片点击可在新窗口打开查看此主题相关图片如下:a.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2011-7-11 9:31:35编辑过]

--  作者:狐狸爸爸
--  发布时间:2011/7/11 9:18:00
--  

看看这些内容能否帮助你:
 
http://help.foxtable.com/topics/1594.htm


http://help.foxtable.com/topics/1911.htm


http://help.foxtable.com/topics/1964.htm


 
单单某列环比是不可以的,你可以分成两个或多个统计,然后将多个统计结果组合在一起:

http://help.foxtable.com/topics/2305.htm


 


--  作者:yyzlxc
--  发布时间:2011/7/11 10:01:00
--  
请狐爸老师看一下3楼新增的内容,谢谢!!
--  作者:狐狸爸爸
--  发布时间:2011/7/11 10:05:00
--  
我也没有办法,先得到基本统计结果,然后自己编码增加列和计算统计结果。
--  作者:yyzlxc
--  发布时间:2011/7/11 10:23:00
--  
谢谢狐爸老师。我先试做一个方案,再请狐爸老师指教!!
--  作者:yyzlxc
--  发布时间:2011/7/12 8:39:00
--  

其中一段代码作调整后,生成表如下:

 

 


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

--  作者:yyzlxc
--  发布时间:2011/7/12 8:45:00
--  

 

 

 

 



此主题相关图片如下:a.png
按此在新窗口浏览图片

--  作者:狐狸爸爸
--  发布时间:2011/7/12 8:46:00
--  
先查看表结构,看看到底是否有名为j的列。