Foxtable(狐表)用户栏目专家坐堂 → 为什么卡了无法计算


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

主题:为什么卡了无法计算

帅哥,在线噢!
有点蓝
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110569 积分:562735 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/15 17:00:00 [显示全部帖子]

代码,例子说明

如果数据多计算复杂,需要较长时间计算是正常的,等咯

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110569 积分:562735 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/15 17:41:00 [显示全部帖子]

开发者密码?

 回到顶部
帅哥,在线噢!
有点蓝
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110569 积分:562735 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/17 15:28:00 [显示全部帖子]

还是单引号的问题,
......
Dim drs As List(Of DataRow) = DataTables("冲压车间工资表").Select("日期=#" & ary(0) & "# and 产品名称='" & ary(1).Replace("'","''")  & "' and 生产形式='" & ary(2).Replace("'","''") & "'")
......
Dim fdr As DataRow = DataTables("价格表").find("产品名称 = '" & dr("产品名称").Replace("'","''") & "' and 工序 = '" & dr("生产工序").Replace("'","''") & "'")
......


 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110569 积分:562735 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/18 23:38:00 [显示全部帖子]

回15楼,没完全看懂你的计算逻辑,麻烦用文字完整描述一下

 回到顶部
帅哥,在线噢!
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110569 积分:562735 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/19 9:36:00 [显示全部帖子]

1、首先,下面这2段代码就没有必要放到for循环里了,完全没有必要,提取到循环外面

    Dim t As Table = Tables("冲压车间工资表")
    For i As Integer = 1 To t.rows.count-1
        If t.rows(i).isnull("产品名称") AndAlso t.rows(i).IsNull("日期") = False AndAlso t.rows(i)("生产形式") <> "个人" Then
            t.rows(i)("产品名称") =t.rows(i-1)("产品名称")
        End If
    Next   

备注1列如果进程用到,直接在主表增加这个列好了,没有必要当作临时列增加
If DataTables("冲压车间工资表").DataCols.Contains("备注1") = False Then
    DataTables("冲压车间工资表").DataCols.add("备注1", Gettype(String))
End If

2、其次可以在上面第一段代码增加姓名为空的处理,如
For i As Integer = 1 To t.rows.count-1
    tr = t.rows(i)
    If tr.isnull("产品名称") AndAlso tr.IsNull("日期") = False AndAlso tr.("生产形式") <> "个人" Then
        tr.("产品名称") =t.rows(i-1)("产品名称")
    End If
    If tr.IsNull("姓名") Then
        tr.("姓名") =t.rows(i-1)("姓名")
    End If
Next

3、中间的3个for 循环调换一下位置,可以减少为2个for
    For Each dr As DataRow In drs
        'Dim fdr As DataRow = DataTables("价格表").find("产品名称 = '" & dr("产品名称") & "' and 工序 = '" & dr("生产工序") & "'")
        Dim fdr As DataRow = DataTables("价格表").find("产品名称 = '" & dr("产品名称").Replace("'","''") & "' and 工序 = '" & dr("生产工序").Replace("'","''") & "'")
        If fdr IsNot Nothing
            dr("单价") = fdr("单价")
            sum += dr("数量") * dr("单价")
        End If
    Next
    
    For Each dr As DataRow In drs
        Dim str As String = dr("姓名")
        If ls.Contains(str) = False Then
            count += 1
            ls.add(str)
            dr("备注1") = Nothing 'dr("备注1").replace("重复", Nothing)
            dr("分配后金额") = format(sum/count, "0.00")
        Else
            dr("备注1") = "重复" ' & dr("备注1").replace("重复", Nothing)
            dr("分配后金额") = Nothing
        End If
    Next

至于其它的逻辑,没有看懂
[此贴子已经被作者于2016/10/19 9:42:47编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110569 积分:562735 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/19 9:37:00 [显示全部帖子]

修改后的完整代码,自己测试能不能用

'pause = True
Dim t As Table = Tables("冲压车间工资表")
Dim tr As Row
For i As Integer = 1 To t.rows.count-1
    tr = t.rows(i)
    If tr.isnull("产品名称") AndAlso tr.IsNull("日期") = False AndAlso tr.("生产形式") <> "个人" Then
        tr.("产品名称") =t.rows(i-1)("产品名称")
    End If
    If tr.IsNull("姓名") Then
        tr.("姓名") =t.rows(i-1)("姓名")
    End If
Next

If DataTables("冲压车间工资表").DataCols.Contains("备注1") = False Then
    DataTables("冲压车间工资表").DataCols.add("备注1", Gettype(String))
End If

For Each ary() As String In DataTables("冲压车间工资表").GetValues("日期|产品名称|生产形式", "日期 is not null and 生产形式 <> '个人'")
    'Dim drs As List(Of DataRow) = DataTables("冲压车间工资表").Select("日期=#" & ary(0) & "# and 产品名称='" & ary(1)  & "' and 生产形式='" & ary(2) & "'")
    Dim drs As List(Of DataRow) = DataTables("冲压车间工资表").Select("日期=#" & ary(0) & "# and 产品名称='" & ary(1).Replace("'","''")  & "' and 生产形式='" & ary(2).Replace("'","''") & "'")
    
    Dim sum As Double = 0
    Dim count As Integer = 0
    Dim ls As new List(Of String)
    
    For Each dr As DataRow In drs
        'Dim fdr As DataRow = DataTables("价格表").find("产品名称 = '" & dr("产品名称") & "' and 工序 = '" & dr("生产工序") & "'")
        Dim fdr As DataRow = DataTables("价格表").find("产品名称 = '" & dr("产品名称").Replace("'","''") & "' and 工序 = '" & dr("生产工序").Replace("'","''") & "'")
        If fdr IsNot Nothing
            dr("单价") = fdr("单价")
            sum += dr("数量") * dr("单价")
        End If
    Next
    
    For Each dr As DataRow In drs
        Dim str As String = dr("姓名")
        If ls.Contains(str) = False Then
            count += 1
            ls.add(str)
            dr("备注1") = Nothing 'dr("备注1").replace("重复", Nothing)
            dr("分配后金额") = format(sum/count, "0.00")
        Else
            dr("备注1") = "重复" ' & dr("备注1").replace("重复", Nothing)
            dr("分配后金额") = Nothing
        End If
    Next
Next
For Each dr As DataRow In DataTables("冲压车间工资表").Select("生产形式 = '个人'")
    dr("分配后金额") = dr("数量") * dr("单价")
Next

For Each ary As String() In DataTables("冲压车间工资表").GetValues("日期|姓名", "日期 is not null")
    Dim sum As Double = DataTables("冲压车间工资表").compute("sum(上班工时)", "日期=#" & ary(0) & "# and 姓名='" & ary(1) & "'")
    Dim drs1 As List(Of DataRow) = DataTables("冲压车间工资表").Select("日期=#" & ary(0) & "# and 姓名='" & ary(1) & "'")
    Dim ls As new List(Of String)
    For i As Integer = 0 To drs1.count-1
        Dim dr = drs1(i)
        If i = 0 Then
            dr("备注1") = dr("备注1").replace("重复", Nothing)
            If sum > = 8 Then
                dr("上班天数") = 1
            ElseIf sum > = 6 Then
                dr("上班天数") =format(sum/8, "0.00")
            ElseIf sum > = 4 And sum < 6 Then
                dr("上班天数") = 0.5
            ElseIf sum > = 2 And sum < 4 Then
                dr("上班天数") =format(sum/8, "0.00")
            Else
                dr("上班天数") = 0
            End If
        Else
            dr("备注1") = "重复" & dr("备注1").replace("重复", Nothing)
        End If
    Next
Next

Tables("冲压车间工资表").filter = ""
Tables("冲压车间工资表").Sort = "日期,产品名称,生产形式"
Tables("冲压车间工资表").Filter = "日期 is null"
[此贴子已经被作者于2016/10/19 9:41:51编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110569 积分:562735 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/19 10:49:00 [显示全部帖子]

是否打印和是不是临时列没有必然关系吧。输出什么列是可以指定的

 回到顶部