Foxtable(狐表)用户栏目专家坐堂 → [求助]能否在交叉表的垂直分组列中增加列(已解决)


  共有23492人关注过本帖树形打印复制链接

主题:[求助]能否在交叉表的垂直分组列中增加列(已解决)

帅哥哟,离线,有人找我吗?
ybil
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:521 积分:4910 威望:0 精华:7 注册:2008/9/2 22:22:00
  发帖心情 Post By:2011/7/12 16:48:00 [显示全部帖子]

If e.Form.Controls("ComboBox2").Value Is Nothing Then
    MessageBox.Show("请在右侧选择生成报表的年份","提示")
    Return
End If
'根据年份生成临时表

Dim nf,sql1,sql2,sql3,s1,s2,jgf,rjs,rjjgf,wb,Bs As String
nf = e.Form.Controls("ComboBox2").Value
sql1 = " From(Select 报表年月,日期,单位,Sum(加工费) As 加工费,Sum(投工) As 投工 FROM {日报源表} WHERE Year(日期) = "
sql1+= nf & " Group By 报表年月,日期,单位 ORDER BY 单位,日期,报表年月) Group By 单位"
sql2="Select DISTINCT 报表年月 FROM {日报源表} WHERE Year(日期) = " & nf

Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.CommandText = sql2
dt = cmd.ExecuteReader()

Dim Ls As List(Of String)
Ls =dt.GetUniqueValues("","报表年月")

For n As Integer = 0 To ls.Count-1
    s1 = "sum(iif(报表年月 = " & Ls(n) & ",加工费,Null))"
    jgf = s1 & " as " &  Ls(n) & "_加工费"
    s2 = "avg(iif(报表年月 = " & Ls(n) & ",投工,Null))"
    rjs = s2 & " as " &  Ls(n) & "_月均人数"
    rjjgf= s1 & "/" & s2 & " as " &  Ls(n) & "_人均加工费"
    If n >0 Then
        wb = s1 & "/" & s2 & "/(sum(iif(报表年月 = " & Ls(n-1) & ",加工费,Null))/ avg(iif(报表年月 = " & Ls(n-1) & ",投工,Null))" & ") as " &  Ls(n) & "_环比"
        If n =  ls.Count-1 Then
            wb = wb & ",Sum(加工费) As 合计_加工费,sum(投工) as 合计_年均人数,sum(加工费) as 年人均加工费,Sum(加工费) As 名次"
        End If
    End If
    sql3+ = "," & jgf &  "," & rjs & "," & rjjgf & ","  & wb
Next
sql3="select 单位" & sql3.Replace(",,",",") & sql1

Dim b As New SQLGroupTableBuilder("年度汇总","日报源表")
b.Groups.AddDef("单位") '根据产品分组
b.Totals.AddDef("加工费") '对数量进行统计
b.Build '生成统计表
DataTables("年度汇总").Fill(sql3,True)

For Each dc As DataCol In  DataTables("年度汇总").DataCols
    If dc.name <> "单位" Then
        DataTables("年度汇总").DataCols(dc.Name).SetFormat("0.00")
        bs+="," & dc.name
    End  If
Next
DataTables("年度汇总").DataCols("名次").SetFormat("0")

Dim sum As Double
For Each r As Row In Tables("年度汇总").Rows
    sum =0
    For Each dc As DataCol In DataTables("年度汇总").DataCols
        If dc.name.IndexOf("_月均人数")> -1 Then
            sum+= r(dc.name)
        End If
        If dc.name = "合计_年均人数" Then
            r("合计_年均人数") = sum/ls.Count
            r("年人均加工费") = ls.Count*r("合计_加工费")/sum
            Exit For
        End If
    Next
Next
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
Dim t As Table = Tables("年度汇总")
Dim g As SubtotalGroup
t.SubtotalGroups.Clear()
t.GroupAboveData = False
t.TreeVisible = False
t.SpillNode = True

g = New Subtotalgroup
g.Aggregate = AggregateEnum.Sum
g.GroupOn = "*"
g.TotalOn = bs.Trim(",").Replace(",名次","")
g.Caption = "合计"
t.SubtotalGroups.Add(g)
t.Subtotal()

Dim r1 As Row
With Tables("年度汇总")
    For i As Integer = 0 To .Rows.Count(True) - 1 'Count加上参数True
        r1 = .Rows(i,True) 'Rows也需要加上参数True
        If r1.IsGroup Then '如果是分组行
            For n As Integer = 0 To .Cols.Count -1
                If .cols(n).name.Indexof("人均加工费")> -1 Then
                    r1(.cols(n).name) = r1(.cols(n-2).name)/r1(.cols(n-1).name)
                End If
                
            Next
        End If
    Next
End With

Tables("年度汇总").Cols("单位").TextAlign = TextAlignEnum.Center
Tables("年度汇总").Cols("名次").TextAlign = TextAlignEnum.Center
Tables("年度汇总").AutoSizeCols()
MainTable = Tables("年度汇总") '

 回到顶部
帅哥哟,离线,有人找我吗?
ybil
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:521 积分:4910 威望:0 精华:7 注册:2008/9/2 22:22:00
  发帖心情 Post By:2011/7/12 16:49:00 [显示全部帖子]

注:报表年月改为整数型

 回到顶部
帅哥哟,离线,有人找我吗?
ybil
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:521 积分:4910 威望:0 精华:7 注册:2008/9/2 22:22:00
  发帖心情 Post By:2011/7/12 18:55:00 [显示全部帖子]

原来的思路:

'读取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 投工,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.Totals.AddDef("人均加工费",AggregateEnum.Average,"人均加工费")
b.Totals.AddDef("环比",AggregateEnum.Average,"环比")
b.HorizontalTotal = True
b.VerticalTotal = True
b.Build()

Dim t As Table = Tables("年度汇总")
Dim i As Integer =(Tables("年度汇总").Cols.Count-5)/4

t.DataTable.DataCols.Add("合计_年均人数", Gettype(Double),"[合计_投工]/" & i)
t.DataTable.DataCols.Add("年人均加工费", Gettype(Double),"合计_加工费/合计_年均人数")
t.DataTable.DataCols.Add("名次", Gettype(Integer))
t.Cols.Remove("合计_投工","合计_人均加工费","合计_环比")
For Each r As Row In T.Rows
    For Each dc As DataCol In t.DataTable.DataCols
        If dc.name.IndexOf("人均加工费_")> -1 Then
            r(dc.name) =r(dc.name.Replace("人均",""))/r(dc.name.Replace("人均加工费","投工"))            
            If dc.name = "人均加工费_1" Then
                r("环比_1")=Nothing
            Else
                Dim n1 As Integer = Val(dc.name.split("_")(1))
                r("环比_" & n1)=r(dc.name)/r("人均加工费_" & n1-1)
            End If
        End If
        r("年人均加工费") = r("合计_加工费") /r("合计_年均人数")
    Next
Next

Dim drs As List(Of DataRow) = t.DataTable.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
For Each dc As DataCol In  t.DataTable.DataCols
    If dc.name <> "单位" Then
        t.DataTable.DataCols(dc.Name).SetFormat("0.00")
    End  If
Next
t.DataTable.DataCols("名次").SetFormat("0")
t.Cols("单位").TextAlign = TextAlignEnum.Center
t.Cols("名次").TextAlign = TextAlignEnum.Center
t.AutoSizeCols()
MainTable =t
[此贴子已经被作者于2011-7-12 19:04:10编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
ybil
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:521 积分:4910 威望:0 精华:7 注册:2008/9/2 22:22:00
  发帖心情 Post By:2011/7/12 22:45:00 [显示全部帖子]

'载入当月数据
.......
Dim Filter As String = "报表年月 = " & ym 
.......

年报:

'读取ComboBox2中的年份
Dim nf,s,sql As String 
nf = e.Form.Controls("ComboBox2").Value
If nf Is Nothing Then
    MessageBox.Show("请在右侧选择生成报表的年份","提示")
    Return
End If

'根据年份生成临时表
sql = "Select 报表年月,日期,单位,Sum(加工费) As 加工费,Sum(投工) As 投工,1 as 人均加工费,1 As 环比  FROM {日报源表} WHERE Year(日期) = " & nf & " Group By 报表年月,日期,单位"
'根据临时表生成年度汇总表
Dim b As New CrossTableBuilder("年度汇总",sql)
b.HGroups.AddDef("单位")
b.VGroups.AddDef("报表年月")
b.Totals.AddDef("加工费")
b.Totals.AddDef("投工",AggregateEnum.Average,"月均人数")
b.Totals.AddDef("人均加工费",AggregateEnum.Average,"人均加工费")
b.Totals.AddDef("环比",AggregateEnum.Average,"环比")
b.HorizontalTotal = True
b.VerticalTotal = True
b.Build()

Dim t As Table = Tables("年度汇总")
Dim i As Integer =(Tables("年度汇总").Cols.Count-5)/4

t.StopRedraw
t.DataTable.DataCols.Add("合计_年均人数", Gettype(Double),"[合计_投工]/" & i)
t.DataTable.DataCols.Add("年人均加工费", Gettype(Double),"合计_加工费/合计_年均人数")
t.DataTable.DataCols.Add("名次", Gettype(Integer))
t.Cols.Remove("环比_1","合计_投工","合计_人均加工费","合计_环比")
For Each r As Row In T.Rows
    For Each dc As DataCol In t.DataTable.DataCols
        If dc.name.IndexOf("人均加工费_")> -1 Then
            r(dc.name) =r(dc.name.Replace("人均",""))/r(dc.name.Replace("人均加工费","投工"))            
            If dc.name <> "人均加工费_1" Then                       
                Dim n1 As Integer = Val(dc.name.split("_")(1))
                r("环比_" & n1)=(r(dc.name)-r("人均加工费_" & n1-1))/r("人均加工费_" & n1-1)
            End If
        End If
        r("年人均加工费") = r("合计_加工费") /r("合计_年均人数")
    Next
Next

Dim drs As List(Of DataRow) = t.DataTable.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
For Each dc As DataCol In  t.DataTable.DataCols
    If dc.name <> "单位" AndAlso dc.name <> "名次" Then
        s="0.00" & iif(dc.name.Indexof("环比")>-1,"%","")
        t.DataTable.DataCols(dc.Name).SetFormat(s)
    End  If
Next

t.Cols("单位").TextAlign = TextAlignEnum.Center
t.Cols("名次").TextAlign = TextAlignEnum.Center
t.AutoSizeCols()
t.ResumeRedraw
MainTable =t
[此贴子已经被作者于2011-7-13 12:33:08编辑过]

 回到顶部