以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  无法创建新的堆栈防护页面  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=186511)

--  作者:edisontsui
--  发布时间:2023/5/8 11:56:00
--  无法创建新的堆栈防护页面
出入库 datacolchanged 代码:
If e.DataCol.name = "余数" Then
    e.DataRow.save \'必须先保存,后面SQL才能统计到此数据的变化
    Dim max As Integer = DataTables("出入库").Compute("Max(_Identify)", "物料编号 = \'" & e.DataRow("物料编号") & "\'") \'取得同物料的最大识别号
    If e.DataRow("_Identify") = max Then
        If user.Group = "仓库" OrElse user.Group = "组装仓库" OrElse user.Group = "仓库(铝巴)" OrElse user.Group = "品质" OrElse user.Group = "品质工程师" OrElse user.name = "开发者"Then 
            DataTables("物料字典").DataCols("物料编号").RaiseDataColChanged("物料编号 = \'" & e.DataRow("物料编号") & "\'")
        End If
    End If
End If

物料字典 datacolchanged 代码:
If e.DataCol.Name = "物料编号" Then
If e.NewValue IsNot Nothing Then
    Dim dr1 As DataRow = DataTables("出入库").SQLFind("物料编号 = \'" & e.DataRow("物料编号") & "\'", "_Sortkey Desc")
    If dr1 IsNot Nothing Then
        e.DataRow("最后余数1") = dr1("余数") 
    End If 
    Dim dr As DataRow = DataTables("出入库2").SQLFind("物料编号 = \'" & e.DataRow("物料编号") & "\'", "_Sortkey Desc")
    If dr IsNot Nothing Then
        e.DataRow("最后余数2") = dr("余数") 
    End If
end if
end if

上面 出入库 代码执行时,会触发 物料字典 发生|“无法创建新的堆栈防护页面” 提示。请问要怎样修改代码好呢?谢谢。

--  作者:有点蓝
--  发布时间:2023/5/8 12:11:00
--  
事件执行死循环了。2个表的datacolchanged 事件代码全部发上来看看
--  作者:edisontsui
--  发布时间:2023/5/8 12:48:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:临时代码3.rar

请看附页代码。

--  作者:有点蓝
--  发布时间:2023/5/8 13:42:00
--  
嗷,这么多代码,我就没法看了。自己调试吧,就是找:列A触发更改列B,列B触发后又更改列C,列C触发又更改列A,...如此不断循环的调用。这个循环可能是跨表的触发。

考虑把代码全部注释掉,然后一段段启用,看是哪些代码会有影响。

--  作者:edisontsui
--  发布时间:2023/5/8 15:30:00
--  
我确定是1楼的两段代码死循环了,就是不知道从哪里改起。
--  作者:有点蓝
--  发布时间:2023/5/8 15:38:00
--  
肯定不止1楼的的代码,只能说是1楼的代码又导致了其它代码的触发。

这个东西只能自己一个一个去追溯了,比如上面1楼代码更改了"最后余数1"的数据,然后在去看看什么地方会有下面这种根据"最后余数1"触发其它处理的代码,其它处理又触发了其它的列......

If e.DataCol.Name = "最后余数1" Then
或者
case  "最后余数1"