Foxtable(狐表)用户栏目专家坐堂 → BOM嵌套检查的内部函数死循环。


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

主题:BOM嵌套检查的内部函数死循环。

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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
BOM嵌套检查的内部函数死循环。  发帖心情 Post By:2013/7/8 0:37:00 [显示全部帖子]

各位大师:

下面为BOm嵌套检查的内部函数,下面红色部份不注释掉就会死循环退出。
Dim pc As String = args(0)
Dim fpc As String = args(1)
Dim dt As DataTable = args(2)
Dim tbl As Table = args(3)
Dim drs As List(of DataRow)
drs = dt.Select("键 = '" & fpc & "'")
If drs.count > 0 Then
    For Each dr As DataRow In drs
        fpc = dr("父键")
        If pc = fpc Then
            '新增嵌套或父子相同的键
            Dim dr1 As DataRow = tbl.DataTable.addnew()
            dr1("_Identify") = dr("_Identify")
            dr1("键") = dr("键")
            dr1("标题") = dr("标题")
            dr1("父键") = dr("父键")
        Else
            Functions.Execute("findfather",pc,fpc,dt,tbl)
        End If
    Next
End If

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:bom嵌套检查死循环.foxdb


请教大家是哪里条件没有设置好还是其他?谢谢!
[此贴子已经被作者于2013-7-8 0:37:49编辑过]

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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2013/7/8 10:16:00 [显示全部帖子]

就是找不到才提问求助啊,我在表中已经故意录入了会嵌套的键值了。请高手直接指点一下吧。

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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2013/7/8 14:18:00 [显示全部帖子]

谢谢BIN,但是我的逻辑好象没有错啊?
第一步是从表A中提取唯一的键值出来生成一个临时表dt2(为了让相同的键只执行一次循环),然后遍历这个dt2中的键先取出来第一个键值pc,然后查找其父键是否有相同的值存在,在此值的向上所有层没有循环完成这个pc是不会改变的。
第二步到原表A中去筛选出键=pc的记录出来生成集合drs,然后用pc和此集合中的每个父键比较,如果相等说明是嵌套父子相同在窗口中新增行将其记录下来。
第三步,如果pc不等于父健则再往上循环在表A中查找键等于父键的记录生成集合再用其父键值与原pc比较看是否相同,直到drs.count > 0 不成立为止。

Dim pc As String = args(0)  '传此值进来的目的就是保持pc在没有循环完之前一直不变,用它来和父键比较。
Dim fpc As String = args(1) ’传此值进来的目的就是用来在原表A中查找键等于它的记录(第6行)。
Dim dt As DataTable = args(2)
Dim tbl As Table = args(3)
Dim drs As List(of DataRow)
drs = dt.Select("键 = '" & fpc & "'")  ‘在原表A中查找键等于父键的记录,实际上就是用第一个键pc的父级作为键(子级)再来查找其父级。
If drs.count > 0 Then  ‘如果还找得到,说明还没有循环完(这个集合实际上是pc的父键的集合)
  msgbox(1)  '如果加上这行测试死循环就是这里一直显示1
    For Each dr As DataRow In drs
        fpc = dr("父键")  ‘用新的集合中的父键更新原来的父键()
        If pc = fpc Then  '这里pc没有变,但是fpc已经不是传入来的那个了?如果相同说明嵌套,不相同才执行下一次循环。
            '新增嵌套或父子相同的键
            Dim dr1 As DataRow = tbl.DataTable.addnew()
            dr1("_Identify") = dr("_Identify")
            dr1("键") = dr("键")
            dr1("标题") = dr("标题")
            dr1("父键") = dr("父键")
        Else
            Functions.Execute("findfather",pc,fpc,dt,tbl) '将不变的pc和新的fpc传递给下一次循环。
        End If
    Next
End If
或者能否直接将我例子中不正确的改过来。谢谢!

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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2013/7/8 15:23:00 [显示全部帖子]

还是不理解,比如下表

键   父键
pc   A1
A1   A
A1   B
第一次循环时得到pc的父键A1因为不等于pc,所以把pc,A1传递给下一个循环执行,此时用A1作为键查找实际上得到如下的集合
A1  A
A1  B
再遍历这个集合中的每一行,fpc=dr("父键") 实际上将fpc变为A了,然后再用pc 与A是否相等来作判断,如果不相等则又进行下一次循环用A作为键来查找得到其父键的集合,直到新的集合没有为止。

你怎么不是死循环呢.  举个例子 键为FPC的行有10个. 你循环第一次.取第一行的父键和PC做对比.不等于  又执行这个函数.

下一次循环时是用“取第一行的父键” 作为键来查找得到新的集合了。怎么还可能是原来fpc的那十行呢?




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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2013/7/8 17:14:00 [显示全部帖子]

就是要检查bom里面的父子嵌套情况啊,因为在输入bom时如果用户录入父子嵌套的编码查看BOM时就会导致死循环退出程序。一方面是想做个检查窗口出现这种情况后用户可以把嵌套的行找出来人为修改或删除掉就可以了。

第二方面就是只有把这个搞懂了才能用同样的方式写代码在用户录入BOM的编码时进行事前验证避免出现嵌套的情况啊。

我把例子都传上去了,那个例子我故意录入了嵌套的键值,设计窗体来进行检查,但现在执行检查就会死循环,退出程序,想请大师们帮忙看一下,或直接修改为正确的

但大师们好象都不直接给出答案,只给点提示让我们自己来弄。

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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2013/7/8 17:27:00 [显示全部帖子]

因为客户有几千种产品的BOm,现在从excel中分批导入,如果导入的资料中的父件子件出现嵌套的情况,打开系统后点击BOM目录树就死循环退出程序了。所以才想要做个检查的窗体。

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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2013/7/8 17:39:00 [显示全部帖子]

就是这种情况

键   父键
pc   A1
A1   A
A1   B
B     pc
即目录树的任何一个分支节点其向上或向下的分支节点上不能再出现相同的节点啊,这样就会死循环。




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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2013/7/8 17:44:00 [显示全部帖子]

对啊,就是15楼BIN说的情况啊,那是我故意录入成这样的,现在就是表中出现了这种情况,要做个窗体把嵌套的行找出来显示在窗体表中人为修改为不嵌套后保存就可以了。但我的那个检查窗体没有实现这个功能却死循环了。

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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2013/7/8 18:04:00 [显示全部帖子]

我的目的就是要通过这个BOM检查窗体把那些有嵌套的行显示在窗体表中来修改啊。

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


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2013/7/10 12:03:00 [显示全部帖子]

谢谢狐爸,好象可以了。

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