Foxtable(狐表)用户栏目专家坐堂 → [求助]代码优化问题,请求指教


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

主题:[求助]代码优化问题,请求指教

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


加好友 发短信
等级:四尾狐 帖子:995 积分:6712 威望:0 精华:0 注册:2015/1/12 22:12:00
[求助]代码优化问题,请求指教  发帖心情 Post By:2016/12/5 14:03:00 [只看该作者]

'目的:判断tb中是否包含tbltaizhang的记录且tb中字段【春检年度】=cmb年度.Text,关键字段是【台账号】
'若包含,则用tbltaizhang中的字段值去修改tb中的相同字段值,若不包含,则在tb中增加相应记并赋值。
'tbltaizhang中有5000条记录,下面代码执行需要耗时500秒左右,请老师们看看该如何优化

Dim time1 As Date = Functions.Execute("SQLTIME")
e.Form.Controls("Label1").Text = "正在增加行,请稍后..."
Application.DoEvents()


Dim tb As Table = e.Form.Controls("Table1").Table
Dim tbltaizhang As Table = e.Form.Controls("Table2").Table
tb.StopRedraw
Dim cmb年度 As WinForm.ComboBox = e.Form.Controls("cmb年度")
Dim mydate As  Date = Functions.Execute("SQLTIME")
For Each ydr As  Row In tbltaizhang.Rows
    Dim wz As Integer = tb.FindRow("[台账号] = '" & ydr("台账号") & "' And [春检年度] = '" & cmb年度.Text & "'")
    If wz >= 0 Then
        tb.Position = wz
    Else
        Dim dr As Row = tb.AddNew()
    End If
    tb.Current("部门编号")= ydr("部门编号")
    tb.Current("部门")= ydr("部门")
    tb.Current("春检年度")= e.Form.Controls("cmb年度").text
    tb.Current("台账号")= ydr("台账号")
    tb.Current("台账号old")= ydr("台账号old")
    tb.Current("地点")= ydr("地点")
    tb.Current("台账名称")= ydr("台账名称")
    tb.Current("录入人")= _UserTag
    tb.Current("录入终端")= _UserPCip
    tb.Current("录入日期")= mydate
Next
tb.ResumeRedraw
Dim time2 As Date = Functions.Execute("SQLTIME")
e.Form.Controls("Label1").Text = "耗时:" & Format((time2-time1).TotalSeconds,"0.0000") & "秒"

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


加好友 发短信
等级:四尾狐 帖子:995 积分:6712 威望:0 精华:0 注册:2015/1/12 22:12:00
  发帖心情 Post By:2016/12/5 14:39:00 [只看该作者]

请老师看看代码有什么问题?

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


加好友 发短信
等级:超级版主 帖子:110558 积分:562680 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/12/5 14:57:00 [只看该作者]

效率的问题可以参考:http://www.foxtable.com/webhelp/scr/2225.htm

具体上例子测试

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2016/12/5 15:02:00 [只看该作者]

 Dim time1 As Date = Functions.Execute("SQLTIME")
e.Form.Controls("Label1").Text = "正在增加行,请稍后..."
Application.DoEvents()
Dim tb As Table = e.Form.Controls("Table1").Table
Dim tbltaizhang As Table = e.Form.Controls("Table2").Table
tb.StopRedraw
Dim cmb年度 As WinForm.ComboBox = e.Form.Controls("cmb年度")
Dim mydate As  Date = Functions.Execute("SQLTIME")
Dim nlist As new List(Of Row)
Dim dic As new Dictionary(Of Row, Integer)
For Each ydr As  Row In tbltaizhang.Rows
    Dim wz As Integer = tb.FindRow("[台账号] = '" & ydr("台账号") & "' And [春检年度] = '" & cmb年度.Text & "'")
    If wz >= 0 Then
        dic.add(ydr, wz)
    Else
        nlist.Add(ydr)
    End If
Next
For Each ydr As Row In nlist
    Dim nr As Row = tb.AddNew
    nr("部门编号")= ydr("部门编号")
    nr("部门")= ydr("部门")
    nr("春检年度")= e.Form.Controls("cmb年度").text
    nr("台账号")= ydr("台账号")
    nr("台账号old")= ydr("台账号old")
    nr("地点")= ydr("地点")
    nr("台账名称")= ydr("台账名称")
    nr("录入人")= _UserTag
    nr("录入终端")= _UserPCip
    nr("录入日期")= mydate
next
For Each ydr As Row In dic.Keys
    Dim nr As Row = tb.rows(dic(ydr))
    nr("部门编号")= ydr("部门编号")
    nr("部门")= ydr("部门")
    nr("春检年度")= e.Form.Controls("cmb年度").text
    nr("台账号")= ydr("台账号")
    nr("台账号old")= ydr("台账号old")
    nr("地点")= ydr("地点")
    nr("台账名称")= ydr("台账名称")
    nr("录入人")= _UserTag
    nr("录入终端")= _UserPCip
    nr("录入日期")= mydate
next
tb.ResumeRedraw
Dim time2 As Date = Functions.Execute("SQLTIME")
e.Form.Controls("Label1").Text = "耗时:" & Format((time2-time1).TotalSeconds,"0.0000") & "秒"

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2016/12/5 15:03:00 [只看该作者]

不要一边插一遍赋值。

 

http://www.foxtable.com/webhelp/scr/2225.htm

 


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


加好友 发短信
等级:四尾狐 帖子:995 积分:6712 威望:0 精华:0 注册:2015/1/12 22:12:00
  发帖心情 Post By:2016/12/5 15:26:00 [只看该作者]

谢谢老师:现在执行比较快了,若全部是新增,需要8秒,全部修改,需要3秒

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


加好友 发短信
等级:四尾狐 帖子:995 积分:6712 威望:0 精华:0 注册:2015/1/12 22:12:00
  发帖心情 Post By:2016/12/8 9:28:00 [只看该作者]

【有点色】老师:
        前面的代码是在table层面上进行操作,要在datatable上进行操作,代码该如何修改?因为Table和DataTable的Find方法不一样,字典操作的一块代码不会写,请老师指教一下。

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


加好友 发短信
等级:超级版主 帖子:110558 积分:562680 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/12/8 9:38:00 [只看该作者]

Dim tb As dataTable = e.Form.Controls("Table1").Table.datatable
......
Dim nlist As new List(Of dataRow)
......
Dim dic As new Dictionary(Of dataRow, Integer)

For Each ydr As  Row In tbltaizhang.Rows
    Dim wz As Integer = tb.FindRow("[台账号] = '" & ydr("台账号") & "' And [春检年度] = '" & cmb年度.Text & "'")
    If wz >= 0 Then
        dic.add(ydr.datarow, wz)
    Else
        nlist.Add(ydr.datarow)
    End If
Next

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


加好友 发短信
等级:四尾狐 帖子:995 积分:6712 威望:0 精华:0 注册:2015/1/12 22:12:00
  发帖心情 Post By:2016/12/8 9:52:00 [只看该作者]

错误提示:Findrow不是DataTable的成员 

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


加好友 发短信
等级:四尾狐 帖子:995 积分:6712 威望:0 精华:0 注册:2015/1/12 22:12:00
  发帖心情 Post By:2016/12/8 9:54:00 [只看该作者]

tb和tbltaizhang都是Datatable

 回到顶部
总数 14 1 2 下一页