以文本方式查看主题
- Foxtable(狐表) (http://foxtable.com/bbs/index.asp)
-- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2)
---- 交叉表代码出错,求助修改 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=18410)
|
-- 作者:yyzlxc
-- 发布时间:2012/4/12 11:16:00
-- 交叉表代码出错,求助修改
一段按钮代码,形成交叉表,用于汇总分析投工工效,现在碰到两个问题,请各位老师帮助指教,谢谢!!
一、代码运行四个月的数据时,运行正常,但是运行一年的数据时,出现错误提示如下,应该如何修改代码。
此主题相关图片如下:o.png

二,在运行对每个月的工效排名的代码时,出现错误提示如下,其中黄色标注的代码应该如何修改。
此主题相关图片如下:n.png

具体的按钮代码如下:
Dim ny As String = Forms("数据载入").Controls("ComboBox1").Text Dim nf As String = Left(ny,4) Dim sql,s As String \'根据年份生成临时表 sql = "Select 报表年月,单位,厂家,Sum(加工费) As 加工费, Sum(投工) As 投工,Sum(人均) As 工效,0.1-0.1 As 名次 FROM {日报源表} WHERE Left(报表年月,4) = "& nf &" Group By 报表年月,单位,厂家 " \'根据临时表生成分月厂家工效表 Dim b As New CrossTableBuilder("分月厂家工效",sql,"SCGL") b.HGroups.AddDef("单位") b.HGroups.AddDef("厂家") b.VGroups.AddDef("报表年月") b.Totals.AddDef("加工费") b.Totals.AddDef("投工") b.Totals.AddDef("工效") b.Totals.AddDef("名次") b.HorizontalTotal = True b.VerticalTotal = True b.Build() MainTable = Tables("分月厂家工效") \'打开生成的统计表 Dim t As Table = Tables("分月厂家工效") Dim i As Integer =(Tables("分月厂家工效").Cols.Count-6)/4 For Each r As Row In t.Rows For j As Byte = 1 To i If r("投工_" & j) <> 0 Then r("工效_" & j) = r("加工费_" & j)/r("投工_" & j) End If \' If r("投工_" & j) <> 0 Then \' Dim drs As List(Of DataRow) = t.DataTable.Select("[单位] <> \'合计\'",""工效_" & j DESC") \' For n As Byte = 0 To drs.Count - 1 \'遍历所有行 \' If n > 0 AndAlso drs(n)("工效_" & j) = drs(n-1)("工效_" & j) Then \'如果"工效_" & j和上一行相同 \' drs(n)("名次" & j) = drs(n-1)("名次" & j) \'则排名等于上一行 \' Else \' drs(n)("名次" & j) = n + 1 \'设置名次 \' End If \' Next \' End If Next Next For Each r As Row In t.Rows r("合计_工效") = r("合计_加工费")/r("合计_投工") Next Dim drs As List(Of DataRow) = t.DataTable.Select("[单位] <> \'合计\'","合计_工效 DESC") For n As Byte = 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 t.Cols("单位").TextAlign = TextAlignEnum.Center t.Cols("合计_名次").TextAlign = TextAlignEnum.Center t.AutoSizeCols() MainTable =t CurrentTable.Cols("合计_加工费").Move(2) CurrentTable.Cols("合计_投工").Move(3) CurrentTable.Cols("合计_工效").Move(4) CurrentTable.Cols("合计_名次").Move(5)
|
-- 作者:狐狸爸爸
-- 发布时间:2012/4/12 11:25:00
--
1、将你的数据表传上来测试。
2、
Dim drs As List(Of DataRow) = t.DataTable.Select("[单位] <> \'合计\'","工效_" & "j DESC")
|
-- 作者:yyzlxc
-- 发布时间:2012/4/12 11:30:00
--
谢谢狐爸老师的回复,代码好像还有点问题,请指教,谢谢!!
此主题相关图片如下:p.png

|
-- 作者:kylin
-- 发布时间:2012/4/12 11:33:00
--
试一下:
Dim drs As List(Of DataRow) = t.DataTable.Select("[单位] <> \'合计\'","工效_" & j & " DESC")
|
-- 作者:狐狸爸爸
-- 发布时间:2012/4/12 11:35:00
--
你有两个地方有:
Dim drs As List(Of DataRow) = t.DataTable.Select("[单位] <> \'合计\'",""工效_" & j DESC")
Dim drs As List(Of DataRow) = t.DataTable.Select("[单位] <> \'合计\'","合计_工效 DESC")
将另一个改为:
Dim drs1 As List(Of DataRow) = t.DataTable.Select("[单位] <> \'合计\'","合计_工效 DESC")
相应的引用这个drs的代码,也改一下。
|
-- 作者:yyzlxc
-- 发布时间:2012/4/12 12:26:00
--
谢谢狐爸老师和kylin老师的回复,drs1变量改好后,但是两个方案都运行出错,还请各位老师指教,谢谢!!
狐爸老师的:
Dim drs As List(Of DataRow) = t.DataTable.Select("[单位] <> \'合计\'","工效_" & "j DESC")
此主题相关图片如下:q.png

kylin老师的:
Dim drs As List(Of DataRow) = t.DataTable.Select("[单位] <> \'合计\'","工效_" & j & " DESC")
此主题相关图片如下:r.png

|
-- 作者:yyzlxc
-- 发布时间:2012/4/12 16:11:00
--
按狐爸老师的要求,做了一个案例,请各位老师指教,谢谢!!
|
-- 作者:狐狸爸爸
-- 发布时间:2012/4/12 16:23:00
--
提示错误提示都告诉你原因了的:
\'载入当月数据 Dim ny As String = Forms("生产工效").Controls("ComboBox1").Text Dim nf As String = Left(ny,4) Dim sql,s As String \'根据年份生成临时表 sql = "Select 报表年月,单位,厂家,Sum(加工费) As 加工费, Sum(投工) As 投工,Sum(人均) As 工效,0.1-0.1 As 名次 FROM {日报表} WHERE Left(报表年月,4) = "& nf &" Group By 报表年月,单位,厂家 " \'根据临时表生成分月厂家工效表 Dim b As New CrossTableBuilder("分月厂家工效",sql,"sc") b.HGroups.AddDef("单位") b.HGroups.AddDef("厂家") b.VGroups.AddDef("报表年月") b.Totals.AddDef("加工费") b.Totals.AddDef("投工") b.Totals.AddDef("工效") b.Totals.AddDef("名次") b.HorizontalTotal = True b.VerticalTotal = True b.Build() MainTable = Tables("分月厂家工效") \'打开生成的统计表 Dim t As Table = Tables("分月厂家工效") Dim i As Integer =(Tables("分月厂家工效").Cols.Count-6)/4 messagebox.show(i) For Each r As Row In t.Rows For j As Byte = 1 To i If r("投工_" & j) <> 0 Then r("工效_" & j) = r("加工费_" & j)/r("投工_" & j) End If If r("投工_" & j) <> 0 Then Dim drs As List(Of DataRow) = t.DataTable.Select("[单位] <> \'合计\'","工效_" & j & " DESC") For n As Byte = 0 To drs.Count - 1 \'遍历所有行 If n > 0 AndAlso drs(n)("工效_" & j) = drs(n-1)("工效_" & j) Then \'如果"工效_" & j和上一行相同 drs(n)("名次_" & j) = drs(n-1)("名次_" & j) \'则排名等于上一行 Else drs(n)("名次_" & j) = n + 1 \'设置名次 End If Next End If Next Next For Each r As Row In t.Rows r("合计_工效") = r("合计_加工费")/r("合计_投工") Next Dim drs1 As List(Of DataRow) = t.DataTable.Select("[单位] <> \'合计\'","合计_工效 DESC") For n As Byte = 0 To drs1.Count - 1 \'遍历所有行 If n > 0 AndAlso drs1(n)("合计_工效") = drs1(n-1)("合计_工效") Then \'如果"合计_工效"和上一行相同 drs1(n)("合计_名次") = drs1(n-1)("合计_名次") \'则排名等于上一行 Else drs1(n)("合计_名次") = n + 1 \'设置名次 End If Next t.Cols("单位").TextAlign = TextAlignEnum.Center t.Cols("合计_名次").TextAlign = TextAlignEnum.Center t.AutoSizeCols() MainTable =t CurrentTable.Cols("合计_加工费").Move(2) CurrentTable.Cols("合计_投工").Move(3) CurrentTable.Cols("合计_工效").Move(4) CurrentTable.Cols("合计_名次").Move(5)
|
-- 作者:yyzlxc
-- 发布时间:2012/4/13 7:50:00
--
谢谢狐爸老师的指教,问题解决了,再次衷心感谢!
另外,提一个问题,我在Select语句中用"0.1-0.1 As 名次"添加一个统计列,数据类型显示是高精度的,如何实现微整数或整数类型,还请狐爸老师指教,谢谢!!
|
-- 作者:狐狸爸爸
-- 发布时间:2012/4/13 8:02:00
--
select Round(列,2)
|