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


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

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

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


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

狐爸老师:您提供的代码,在案例中运行正常,但是用到局域网的项目中,运行四个月的数据没有问题,但是运行一年的数据,还是会出现上面第一个问题的错误对话框,问题可能出在哪里,请指教,谢谢!!

 


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

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


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

x/0就会出错。

所以凡是有除法的,你都得判断除数是否是0:

 

For Each r As Row In t.Rows
   r("合计_工效") = r("合计_加工费")/r("合计_投工")
Next

 

应该改为:

 

For Each r As Row In t.Rows

    If r("合计_投工") > 0
        r("合计_工效") = r("合计_加工费")/r("合计_投工")

    End If
Next


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


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

奇怪了,对上述代码修改后,还是出现同样的错误提示,还请狐爸老师帮助分析一下,谢谢!!

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


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

你其他地方不还是有除法计算吗?一样的修改即可。

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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2012/4/13 10:59: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,"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
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
    If r("合计_投工") > 0 Then
        r("合计_工效") = r("合计_加工费")/r("合计_投工")
    End If
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
For Each dc As DataCol In  t.DataTable.DataCols
    If dc.name <> "单位" AndAlso dc.name <> "厂家" Then
        s="0" & iif(dc.name.Indexof("加工费")>-1,"0.00",iif(dc.name.Indexof("工效")>-1,"0.00",""))
        t.DataTable.DataCols(dc.Name).SetFormat(s)
    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)
Tables("分月厂家工效").Cols.Frozen = 6
DataTables("分月厂家工效").SysStyles("Frozen").BackColor = Color.LightCyan
DataTables("分月厂家工效").SysStyles("CurrentRow").BackColor = Color.Blue
DataTables("分月厂家工效").SysStyles("CurrentRow").ForeColor = Color.White


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


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

1、升级你的foxtable。

2、如果还是不行,做个简单的例子说话。


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7236 积分:40591 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/4/13 11:42:00 [只看该作者]

0不能做被除数,小学老师就教了,所以计算机上也是不允许的!

 

当您的所有行里面有一个空白行,也会出现r("合计_投工")和r("投工_" & j)等于0的情况,您的问题或许出现在这里,前两行改一下:

Dim ny As String = Forms("数据载入").Controls("ComboBox1").Text

if ny is nothing then

      MessageBox.Show("录入的有效信息不完整!")

    Return

else
    Dim nf As String = Left(ny,4)

end if


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7236 积分:40591 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/4/13 11:46:00 [只看该作者]

这里的i有可能成为负数,

 

Dim i As Integer =(Tables("分月厂家工效").Cols.Count-6)/4

不知道您为何要减去6

当Cols.Count小于6时也会报错

[此贴子已经被作者于2012-4-13 11:46:40编辑过]

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


加好友 发短信 一级勋章
等级:超级版主 帖子:7236 积分:40591 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/4/13 11:56:00 [只看该作者]

这里同样会有错误要一直错下去:

 

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

应该改为:

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

if drs1.Count > 0
    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)("合计_名次") = 1 '设置名次
        End If
    Next

end if


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7236 积分:40591 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/4/13 12:11:00 [只看该作者]

哦,我错了,这里没问题,删除之!

[此贴子已经被作者于2012-4-13 12:14:05编辑过]

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