Foxtable(狐表)用户栏目专家坐堂 → 交叉表代码出错,求助修改


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

主题:交叉表代码出错,求助修改

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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
交叉表代码出错,求助修改  发帖心情 Post By: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)




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


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/4/12 11:25:00 [只看该作者]

1、将你的数据表传上来测试。

2、

Dim drs As List(Of DataRow) = t.DataTable.Select("[单位] <> '合计'","工效_" & "j DESC")


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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2012/4/12 11:30:00 [只看该作者]

谢谢狐爸老师的回复,代码好像还有点问题,请指教,谢谢!!


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


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


加好友 发短信 F6
等级:狐精 帖子:3030 积分:19188 威望:0 精华:2 注册:2008/9/1 7:50:00
  发帖心情 Post By:2012/4/12 11:33:00 [只看该作者]

试一下:

Dim drs As List(Of DataRow) = t.DataTable.Select("[单位] <> '合计'","工效_" & j & " DESC")


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


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By: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
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By: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
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2012/4/12 16:11:00 [只看该作者]

按狐爸老师的要求,做了一个案例,请各位老师指教,谢谢!!

 

 

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


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


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By: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
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2012/4/13 7:50:00 [只看该作者]

谢谢狐爸老师的指教,问题解决了,再次衷心感谢!

 

另外,提一个问题,我在Select语句中用"0.1-0.1 As 名次"添加一个统计列,数据类型显示是高精度的,如何实现微整数或整数类型,还请狐爸老师指教,谢谢!!

 

 

 

 


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


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/4/13 8:02:00 [只看该作者]

select Round(列,2)

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