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


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

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

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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2011/7/12 14:34:00 [显示全部帖子]

在表结构的标题列,有(报表年月)的值,垂直分组列就是依据报表年月的值来分组。对新增列重新设置列标题,如果选择2011年,列标题应为:201101_人均加工费、201101_环比……,如果选择2010年,列标题应为:201001_人均加工费、201001_环比……,因此,需要提取报表年月的值,用来对新增列重新设置列标题,现在的问题是如何来提取报表年月的值。不知这样解释能否理解?谢谢狐爸老师!!

 

 


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

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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2011/7/12 15:22:00 [显示全部帖子]

谢谢狐爸老师,给了很好的思路,需要一点时间来消化。再次感谢狐爸老师的热情帮助,谢谢!!

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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2011/7/12 19:16:00 [显示全部帖子]

非常感谢ybil老师的帮助,其代码让我大开眼界,效果也是我所期望的,看来要到这一步,自己还有很长的路要走,真是自己有幸碰到了大师,好感动!!

 

 


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

 


 


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

对照两张表,感觉动态生成的环比列还存在一点瑕疵,应该作一些调整,效果可能会更好,因为自己是生手,不知从何下手,也只能冒胆请ybil老师帮助改一下代码,再次衷心感谢!!


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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2011/7/12 19:25:00 [显示全部帖子]

另外,动态载入数据的代码是在(报表年月)字符型的基础上完成的,我将数据类型改成整数型后,运行出错,无从下手,也一并提请老师,望请指教!!

 

'载入当月数据
If e.Form.Controls("ComboBox1").Value Is Nothing Then
    MessageBox.Show("请在右侧选择报表年月","提示")
    Return
End If
Dim ym As String = e.Form.Controls("ComboBox1").Value
Dim Filter As String = "报表年月 = '" & ym &  "'"
If user.Group = "填报" Then
   filter = filter & " And 单位 = '"  & user.name & "'"
End If
DataTables("日报源表").LoadFilter = filter
DataTables("日报源表").Load
'打开表返回最末行
With Tables("日报源表")
    .Position = .Rows.Count - 1
End With
'排序
Tables("日报源表").Sort = "单位,日期,报表年月"
Tables("日报源表").AutoSizeCols()


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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2011/7/13 8:50:00 [显示全部帖子]

谢谢ybil老师的热情帮助,所有问题都得到了圆满解决。对这段代码,我还需要好好消化,对ybil老师的无私帮助,再次表示衷心地感谢!!祝愿狐表论坛的明天更加灿烂辉煌。

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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2011/7/20 0:43:00 [显示全部帖子]

根据ybil老师的代码,解决了在交叉表的垂直分组列中增加列的难题,并用外部数据源access文件顺利通过,全部达到预想效果。但是将外部数据源调整到SQL Server2005时,在运行此段代码时,出现错误提示(如下图),不知问题出在那里,希望各位老师帮助看看问题所在,不胜感谢!!

 附加说明:在运行三个月的数据时代码运行正常,并有结果,只是环比数据为0或1,但是运行十二个月的数据时出错。

 


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

 

具体代码如下:

 

'年度汇总表
'读取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,"SCGL")
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
Tables("年度汇总").Cols.Frozen = 1 '冻结一列

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

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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2011/7/20 11:37:00 [显示全部帖子]

谢谢狐爸老师的指教。

调试代码的结果是,循环MessageBox.Show(9)的过程中出错,同时发现,在SQL Server2005的环境下,运行三个月的数据,虽然代码没有出错,但是环比的数据为 0 或 1 ,估计问题就在这一段代码里。

另外,代码中: r("环比_" & n1)=(r(dc.name)-r("人均加工费_" & n1-1))/r("人均加工费_" & n1-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("人均加工费","投工"))
            'MessageBox.Show(2)
           
            If dc.name <> "人均加工费_1" Then
                'MessageBox.Show(3)
               
                Dim n1 As Integer = Val(dc.name.split("_")(1))
                'MessageBox.Show(4)
               
                r("环比_" & n1)=(r(dc.name)-r("人均加工费_" & n1-1))/r("人均加工费_" & n1-1)
                'MessageBox.Show(5)
               
            End If
            'MessageBox.Show(6)
           
        End If
        'MessageBox.Show(7)
       
        r("年人均加工费") = r("合计_加工费") /r("合计_年均人数")
        'MessageBox.Show(8)
       
    Next
    MessageBox.Show(9)
   
Next
MessageBox.Show(10)


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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2011/7/20 13:07:00 [显示全部帖子]

狐爸老师,我把此段代码中的(Integer)全部改成了(Long),也不起作用,与上面的情况一样。


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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2011/7/20 13:22:00 [显示全部帖子]

hhbb老师的回帖界面好像有问题!!

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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2011/7/20 16:52:00 [显示全部帖子]

应该是哪一条代码与SQL Server环境不兼容,因为用access文件作为外部数据源就没有问题。

 回到顶部
总数 25 上一页 1 2 3 下一页