Foxtable(狐表)用户栏目专家坐堂 → 工料总计划进度计算每月工料计划,目标达到,但速度还是很慢


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

主题:工料总计划进度计算每月工料计划,目标达到,但速度还是很慢

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


加好友 发短信
等级:童狐 帖子:250 积分:1813 威望:0 精华:0 注册:2012/6/28 13:53:00
工料总计划进度计算每月工料计划,目标达到,但速度还是很慢  发帖心情 Post By:2017/12/12 13:03:00 [显示全部帖子]

这是工料总计划进度计算每月工料计划,目标达到,但速度还是很慢,有没有更快的计算代码,实在不行,能不能只计算当前鼠标选择的项目,这样当我数据量非常大的时候,也能保证计算不至于崩溃?
DataTables("工料月计划").DataRows.Clear
MainTable = Tables("工料月计划")
For Each r As DataRow In DataTables("工料总计划").Select("计划开始 is not null")
    Dim sd As Date = r("计划开始")
    Dim ed As Date = r("计划完成")
    Dim count As Double = r("计划数量")
'    Dim count As Double = r("计划金额")
    Dim sp As TimeSpan = ed-sd
    Dim avg As Double = count / (sp.TotalDays+1)
    Dim i As Double = 0
    Dim sum As Double = 0
    Do While sd <= ed
        If sd.Day = 1 OrElse sd = ed Then
            Dim dr As DataRow = DataTables("工料月计划").AddNew
            dr("项目ID") = r("项目ID")
            dr("工料ID") = r("工料ID")
            dr("清单明细ID") = r("清单明细ID")
            dr("月份") = format(sd.AddDays(-1), "yyyyMM")
            If sd = ed Then
                dr("月计划数量") = count-sum
'                dr("月计划金额") = count-sum
            Else
                dr("月计划数量") = i*avg
'                dr("月计划金额") = i*avg
                sum += i*avg
            End If
            i = 1
        Else
            i += 1
        End If
        sd = sd.AddDays(1)
    Loop
Next


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


加好友 发短信
等级:童狐 帖子:250 积分:1813 威望:0 精华:0 注册:2012/6/28 13:53:00
  发帖心情 Post By:2017/12/12 14:09:00 [显示全部帖子]

如下
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:成本测算 - 171129 - 副本.rar


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


加好友 发短信
等级:童狐 帖子:250 积分:1813 威望:0 精华:0 注册:2012/6/28 13:53:00
  发帖心情 Post By:2017/12/12 15:08:00 [显示全部帖子]

是指在批量操作之前触发datacolchanged?,还是触发其他事件?

[此贴子已经被作者于2017/12/12 15:24:50编辑过]

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


加好友 发短信
等级:童狐 帖子:250 积分:1813 威望:0 精华:0 注册:2012/6/28 13:53:00
  发帖心情 Post By:2017/12/13 14:18:00 [显示全部帖子]

月计划的工料一类、工料二类、工料名称、工料单位、计划单价、项目名称如何体现出来?

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


加好友 发短信
等级:童狐 帖子:250 积分:1813 威望:0 精华:0 注册:2012/6/28 13:53:00
  发帖心情 Post By:2017/12/13 15:11:00 [显示全部帖子]

 我搞错了?

For Each r As DataRow In drs

    Dim fdr as DataRow = DataTables("工料总计划").find("工料ID")
    Dim sd As Date = r("
计划开始")

 


.NET Framework 版本:2.0.50727.8669
Foxtable 版本:2017.10.26.1
错误所在事件:窗口,EXCEL报表,Button1,Click
详细错误信息:
筛选表达式“工料ID”的计算结果不是布尔值项。

 

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


加好友 发短信
等级:童狐 帖子:250 积分:1813 威望:0 精华:0 注册:2012/6/28 13:53:00
  发帖心情 Post By:2017/12/13 18:02:00 [显示全部帖子]

还是不行,请老师指点!

systemready = False
DataTables("工料月计划").StopRedraw
DataTables("工料月计划").DataRows.Clear
MainTable = Tables("工料月计划")
Dim drs = DataTables("工料总计划").Select("计划开始 is not null")
Dim idx As Integer = 0
For Each r As DataRow In drs
    Dim fdr As DataRow = DataTables("工料总计划").find("工料ID = '" & r("工料id") & "' and 项目ID= '" & r("项目id") & "'")
    Dim sd As Date = r("计划开始")
    Dim ed As Date = r("计划完成")
    Dim count As Double = r("计划数量")
    '    Dim count As Double = r("计划金额")
    Dim sp As TimeSpan = ed-sd
    Dim avg As Double = count / (sp.TotalDays+1)
    Dim i As Double = 0
    Dim sum As Double = 0
    Do While sd <= ed
        If sd.Day = 1 OrElse sd = ed Then
            Dim dr As DataRow = DataTables("工料月计划").AddNew
            dr("项目ID") = r("项目ID")
            dr("工料ID") = r("工料ID")
            dr("清单明细ID") = r("清单明细ID")
            dr("月份") = format(sd.AddDays(-1), "yyyyMM")
            If sd = ed Then
                dr("月计划数量") = count-sum
                '                dr("月计划金额") = count-sum
            Else
                dr("月计划数量") = i*avg
                '                dr("月计划金额") = i*avg
                sum += i*avg
            End If
            i = 1
        Else
            i += 1
        End If
        sd = sd.AddDays(1)
    Loop
    idx += 1
    Dim v As Integer = idx / drs.count * 100
    StatusBar.ProgressBar.Visible =True
    StatusBar.ProgressBar.Value = v
    StatusBar.Message2= v & "%"
Next
DataTables("工料月计划").ResumeRedraw
systemready = True

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


加好友 发短信
等级:童狐 帖子:250 积分:1813 威望:0 精华:0 注册:2012/6/28 13:53:00
  发帖心情 Post By:2017/12/14 21:19:00 [显示全部帖子]

我在窗口按钮事件中加入下面代码,鼠标停留在哪个表里,这个表就会在计算后增加几千行,好不好修改?

e.Form.Controls("Label1").Text = "正在计算,请稍后..."
Application.DoEvents()
CurrentTable.AddNew(10000)
e.Form.Controls("Label1").Text = "计算完成."



systemready = False
DataTables("工料月计划").StopRedraw
DataTables("工料月计划").DataRows.Clear
MainTable = Tables("工料月计划")
Dim drs = DataTables("工料总计划").Select("计划开始 is not null")
Dim idx As Integer = 0
For Each r As DataRow In drs

    Dim fdr As DataRow = DataTables("工料总计划").find("工料ID = '" & r("工料id") & "' and 项目ID= '" & r("项目id") & "'")
    Dim sd As Date = r("计划开始")
    Dim ed As Date = r("计划完成")
    Dim count As Double = r("计划数量")
    '    Dim count As Double = r("计划金额")
    Dim sp As TimeSpan = ed-sd
    Dim avg As Double = count / (sp.TotalDays+1)
    Dim i As Double = 0
    Dim sum As Double = 0
    Do While sd <= ed
        If sd.Day = 1 OrElse sd = ed Then
            Dim dr As DataRow = DataTables("工料月计划").AddNew
            dr("项目ID") = r("项目ID")
            dr("工料ID") = r("工料ID")
            dr("清单明细ID") = r("清单明细ID")
            dr("工料一类") = r("工料一类")
            dr("工料二类") = r("工料二类")
            dr("工料名称") = r("工料名称")
            dr("工料单位") = r("工料单位")
            dr("计划单价") = r("计划单价")
 '           dr("项目名称") = r("项目名称")

            dr("月份") = format(sd.AddDays(-1), "yyyyMM")
            If sd = ed Then
                dr("月计划数量") = count-sum
                '                dr("月计划金额") = count-sum
            Else
                dr("月计划数量") = i*avg
                '                dr("月计划金额") = i*avg
                sum += i*avg
            End If
            i = 1
        Else
            i += 1
        End If
        sd = sd.AddDays(1)
    Loop
    idx += 1
    Dim v As Integer = idx / drs.count * 100
    StatusBar.ProgressBar.Visible =True
    StatusBar.ProgressBar.Value = v
    StatusBar.Message2= v & "%"
Next
DataTables("工料月计划").ResumeRedraw
systemready = True

 回到顶部