Foxtable(狐表)用户栏目专家坐堂 → 大神看过来,帮我优化下这段代码


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

主题:大神看过来,帮我优化下这段代码

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


加好友 发短信
等级:小狐 帖子:384 积分:4174 威望:0 精华:0 注册:2011/12/31 14:28:00
大神看过来,帮我优化下这段代码  发帖心情 Post By:2018/5/15 16:20:00 [只看该作者]

'【根据推荐人,获取完整级层路径】
If e.DataCol.Name = "B001HYZLB_TuiJianRen" Then
    Dim pdr As DataRow = e.DataTable.Find("B001HYZLB_YongHuID")
    Dim str As String = ""
    Do While pdr IsNot Nothing
        str = "/" & pdr("B001HYZLB_YongHuID") & str
        pdr = e.DataTable.Find("B001HYZLB_YongHuID")
    Loop
    e.DataRow("B001HYZLB_CengJiMa") = str & "/" & e.DataRow("B001HYZLB_YongHuID") & "/"
End If

数据1000多条,代码写在DataColChanged中,需要根据推荐关系,获得每个会员的绝对层级路径,重置B001HYZLB_TuiJianRen列时就卡死了,请给优化下,怎么才能提高速度
[此贴子已经被作者于2018/5/15 16:22:40编辑过]

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


加好友 发短信
等级:小狐 帖子:384 积分:4174 威望:0 精华:0 注册:2011/12/31 14:28:00
  发帖心情 Post By:2018/5/15 16:21:00 [只看该作者]

'【根据推荐人,获取完整级层编码】
If e.DataCol.Name = "B001HYZLB_TuiJianRen" Then
    Dim pdr As DataRow = e.DataTable.Find("B001HYZLB_YongHuID")
    Dim str As String = ""
    Do While pdr IsNot Nothing
        str = "/" & pdr("B001HYZLB_YongHuID") & str
        pdr = e.DataTable.Find("B001HYZLB_YongHuID")
    Loop
    e.DataRow("B001HYZLB_CengJiMa") = str & "/" & e.DataRow("B001HYZLB_YongHuID") & "/"
End If
[此贴子已经被作者于2018/5/15 16:23:10编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/5/15 16:46:00 [只看该作者]

加入一个辅助列【是否处理完成】。

 

加入,你重置一个四级的人,那么上级(三级、二级、一级),也是应该得到值的了吧?不需要重复find查找一次。

 

重置列之前,全部行设置成false,处理完成的行设置成true,当遇到【处理完成=true】的时候,不要再往上查找,直接使用其路径。

 

 


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/5/15 16:49:00 [只看该作者]

优化

 


If e.DataCol.Name = "B001HYZLB_TuiJianRen" AndAlso e.DataRow("已经完成") = False Then
    Dim pdr As DataRow = e.DataTable.Find("B001HYZLB_YongHuID = '" & e.DataRow("B001HYZLB_TuiJianRen") & "'")
    Dim dic As new Dictionary(of DataRow, String)
    dic.add(e.DataRow, "")
    Do While pdr IsNot Nothing
        If pdr("已经完成") = True Then
            For Each key As DataRow In dic.Keys
                dic(key)  = pdr("B001HYZLB_CengJiMa") & dic(key)
            Next
        Else
            For Each key As DataRow In dic.Keys
                dic(key)  = "/" & pdr("B001HYZLB_YongHuID") & dic(key)
            Next
            dic.add(pdr, "")
            pdr = e.DataTable.Find("B001HYZLB_YongHuID = '" & pdr("B001HYZLB_TuiJianRen") & "'")
           
        End If
    Loop
    For Each key As DataRow In dic.Keys
        key("B001HYZLB_CengJiMa") =  dic(key) & "/" & key("B001HYZLB_YongHuID") & "/"
        key("已经完成") = True
    Next
End If

[此贴子已经被作者于2018/5/15 17:04:49编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/5/15 16:50:00 [只看该作者]

具体细节自己调试,如果还是无法处理。请上传具体实例测试。


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


加好友 发短信
等级:小狐 帖子:384 积分:4174 威望:0 精华:0 注册:2011/12/31 14:28:00
  发帖心情 Post By:2018/5/15 16:57:00 [只看该作者]

谢谢我再看看

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


加好友 发短信
等级:小狐 帖子:384 积分:4174 威望:0 精华:0 注册:2011/12/31 14:28:00
  发帖心情 Post By:2018/5/15 17:23:00 [只看该作者]

以下是引用有点甜在2018/5/15 16:46:00的发言:

加入一个辅助列【是否处理完成】。

 

加入,你重置一个四级的人,那么上级(三级、二级、一级),也是应该得到值的了吧?不需要重复find查找一次。

 

重置列之前,全部行设置成false,处理完成的行设置成true,当遇到【处理完成=true】的时候,不要再往上查找,直接使用其路径。


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:会员查询系统.foxdb


好像还是不行,麻烦看下例子
提示

 .NET Framework 版本:2.0.50727.8830

Foxtable 版本:2017.3.3.1

错误所在事件:表,B001HYZLB, DataColChanged

详细错误信息:

调用的目标发生了异常。

筛选表达式“B001HYZLB_YongHuID”的计算结果不是布尔值项。

 

[此贴子已经被作者于2018/5/15 17:26:26编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/5/15 18:51:00 [只看该作者]

参考代码

 

If e.DataCol.Name = "B001HYZLB_TuiJianRen" AndAlso e.DataRow("已经完成") = False Then
    Dim pdr As DataRow = e.DataTable.Find("B001HYZLB_Y")
    Dim dic As new Dictionary(of DataRow, String)
    Dim nls As new List(Of String)
    nls.add(e.DataRow("_Identify"))
    dic.add(e.DataRow, "")
    Do While pdr IsNot Nothing AndAlso nls.contains(pdr("_Identify")) = False
        application.Doevents
        output.show(dic.count & " " & pdr("_Identify"))
        If pdr("已经完成") = True Then
            Dim ls As new List(Of DataRow)
            ls.addRange(dic.keys)
            For Each key As DataRow In ls
                dic(key)  = pdr("B001HYZLB_CengJiMa") & dic(key)
            Next
            Exit Do
        Else
            Dim ls As new List(Of DataRow)
            ls.addRange(dic.keys)
            For Each key As DataRow In ls
                dic(key)  = "/" & pdr("B001HYZLB_YongHuID") & dic(key)
            Next
            dic.add(pdr, "")
            nls.add(pdr("_Identify"))
            pdr = e.DataTable.Find("B001HYZLB_Y")
        End If
    Loop
    output.show("----------")
    For Each key As DataRow In dic.Keys
        key("B001HYZLB_CengJiMa") =  dic(key) & "/" & key("B001HYZLB_YongHuID") & "/"
        key("已经完成") = True
    Next
End If


 回到顶部