以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  大神看过来,帮我优化下这段代码  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=118988)

--  作者:99473593
--  发布时间: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
--  发布时间: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编辑过]

--  作者:有点甜
--  发布时间:2018/5/15 16:46:00
--  

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

 

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

 

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

 

 


--  作者:有点甜
--  发布时间: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编辑过]

--  作者:有点甜
--  发布时间:2018/5/15 16:50:00
--  

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


--  作者:99473593
--  发布时间:2018/5/15 16:57:00
--  
谢谢我再看看
--  作者:99473593
--  发布时间: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编辑过]

--  作者:有点甜
--  发布时间: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