以文本方式查看主题
- Foxtable(狐表) (http://foxtable.com/bbs/index.asp)
-- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2)
---- 无故退出 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=127672)
|
-- 作者:manyifuwu
-- 发布时间:2018/11/19 18:43:00
-- 无故退出
客户资料DataColChanged:
Select Case e.DataCol.Name Case "注意事项","已做次数","剩余次数","总次数","执行日期","合同状态" Dim Filter As String = "[编号] = \'" & e.DataRow("编号") & "\' And 锁定 = 0" DataTables("派工").ReplaceFor(e.DataCol.Name,e.NewValue,Filter) DataTables("派工").save DataTables("派工").SQLReplaceFor(e.DataCol.Name,e.NewValue,Filter) \'Dim drs As List(Of DataRow) = DataTables("派工").Select(Filter) \'For Each dr As DataRow In drs \'dr(e.DataCol.Name) = e.NewValue \'Next \'DataTables("派工").save If Forms("派工").opened Dim r As Row = Tables("派工_Table1").Current r.DataRow.Load() End If End Select
Select Case e.DataCol.Name Case"编号" Dim Filter As String = "[编号] = \'" & e.DataRow("编号") & "\'" DataTables("派工").save e.DataRow("已做次数") = DataTables("派工").sqlCompute("Sum(次数)", Filter) e.DataRow("已派单数") = DataTables("派工").sqlCompute("Sum(派工数量)", Filter) End Select
派工 DataColChanged:
Select Case e.DataCol.Name Case "次数","编号","派工数量","工号" Tables("派工_Table1").Save() Tables("派工").Save() Dim Filter As String = "[编号] = \'" & e.DataRow("编号") & "\'" DataTables("客户资料").DataCols("编号").RaiseDataColChanged(filter) End Select Select Case e.DataCol.Name Case "编号","服务" Dim dr As DataRow = e.DataRow Dim pr As DataRow If dr.IsNull("编号") OrElse dr.IsNull("服务") Then dr("计分金额") = Nothing Else Dim filter As String filter = "编号 = \'" & dr("编号") & "\'" pr = DataTables("客户资料").SQLFind(filter) If pr IsNot Nothing Then dr("计分金额") = pr(e.DataRow("服务")) End If End If End Select
是不是代码有问题。会无故退出。
|
-- 作者:有点蓝
-- 发布时间:2018/11/19 20:13:00
--
应该还有其他表事件的代码,然后互相之间形成了环状的引用赋值,导致死循环了
|
-- 作者:manyifuwu
-- 发布时间:2018/11/19 22:00:00
--
比如派工主表 DataColChanged::和sql派工表 DataColChanged:都有一样的代码,是不是这样不对?
|
-- 作者:有点蓝
-- 发布时间:2018/11/19 22:37:00
--
不是。
就是可能出现:表A第一列触发给表B第一列赋值,表B第一列触发给表C第一列赋值,表C第一列触发给表A第一列赋值,然后表A第一列触发又给表B第一列赋值..........这样不断赋值形成死循环
|
-- 作者:有点甜
-- 发布时间:2018/11/20 9:28:00
--
你试试赋值的时候,加上systemready
http://www.foxtable.com/webhelp/scr/2218.htm
|
-- 作者:manyifuwu
-- 发布时间:2018/11/22 12:25:00
--
A电脑修改,其他电脑登录的无故退出,好像是下面的代码造成。
If e.OldRange.RowSel <> e.NewRange.RowSel \'如果选择的是不同的行 If e.OldRange.RowSel >= 0 AndAlso e.OldRange.Rowsel < e.Table.Rows.Count Then \'而且原来选择的是一个有效的数据行 Dim r As Row = e.Table.Rows(e.OldRange.Rowsel) \'获得原来选择的行 Dim p As String If r.DataRow.RowState = DataRowState.Added Then p = "A#" r.Save() Dim msg As String = p & e.Table.DataTable.Name & "#" & r("_Identify") For Each bd As QQBuddy In QQClient.Buddies If bd.Online Then QQClient.Send(bd.name, msg) End If Next Else If r.DataRow.RowState = DataRowState.Modified Then p = "U#" r.Save()\'一定要在保存后合成信息,因为新增行的主键在保存后才生成 Dim msg As String = p & e.Table.DataTable.Name & "#" & r("_Identify") For Each bd As QQBuddy In QQClient.Buddies If bd.Online Then QQClient.Send(bd.name, msg) End If Next End If End If End If
我注释了,即时同步的代码后,就没有无故退出了。
是什么原因呢?
|
-- 作者:有点甜
-- 发布时间:2018/11/22 12:31:00
--
1、看你 ReceivedMessage 写了什么代码,贴出来看看;
2、6楼的代码,加入 msgbox(e.OldRange.RowSel & " " & e.OldRange.RowSel) 看弹出什么,是否死循环了。
3、也有可能是你datacolchanged、currentChanged死循环导致的。
|
-- 作者:manyifuwu
-- 发布时间:2018/11/22 12:34:00
--
ReceivedMessage
代码
\'Dim msg As String = e.Message \'If msg.StartsWith("U#") Then \'表示修改了某行 \'Dim pts() As String = msg.Split("#") \'If pts.Length = 3 Then \'Dim dr As DataRow = DataTables(pts(1)).Find("[_Identify] = " & pts(2)) \'If dr IsNot Nothing Then \'dr.Load() \'重新加载此行 \'End If \'End If \'ElseIf msg.StartsWith("A#") Then \'表示增加了行 \'Dim pts() As String = msg.Split("#") \'If pts.Length = 3 Then \'Dim temp As String = DataTables(pts(1)).LoadFilter \'\'DataTables(pts(1)).RemoveFor("[_Identify] = " & pts(2)) \'移除可能存在的行(注释了的) \'Dim dr As DataRow = DataTables(pts(1)).Find("[_Identify] = " & pts(2)) \'If dr IsNot Nothing Then \'dr.Load() \'重新加载此行 \'Else \'DataTables(pts(1)).AppendLoad("[_Identify] = " & pts(2)) \'追载新增加的行 \'End If \'DataTables(pts(1)).LoadFilter = temp \'End If \'ElseIf msg.StartsWith("D#") Then \'表示删除了行 \'Dim pts() As String = msg.Split("#") \'If pts.Length = 3 Then \'DataTables(pts(1)).RemoveFor("[_Identify] = " & pts(2)) \'移除行 \'End If \'End If \'Dim msg As String = e.Message \'If msg.StartsWith("U#") Then \'表示修改了某行 \'Dim pts() As String = msg.Split("#") \'If pts.Length = 3 Then \'Dim dr As DataRow = DataTables(pts(1)).Find("[_Identify] = " & pts(2)) \'If dr IsNot Nothing Then \'dr.Load() \'重新加载此行 \'End If \'End If \'ElseIf msg.StartsWith("A#") Then \'表示增加了行 \'Dim pts() As String = msg.Split("#") \'If pts.Length = 3 Then \'DataTables(pts(1)).AppendLoad("[_Identify] = " & pts(2)) \'追载新增加的行. \'End If \'ElseIf msg.StartsWith("D#") Then \'表示删除了行 \'Dim pts() As String = msg.Split("#") \'If pts.Length = 3 Then \'DataTables(pts(1)).RemoveFor("[_Identify] = " & pts(2)) \'移除行 \'End If \'End If
[此贴子已经被作者于2018/11/22 12:34:32编辑过]
|
-- 作者:有点甜
-- 发布时间:2018/11/22 12:35:00
--
6楼的代码,加入 msgbox(e.OldRange.RowSel & " " & e.OldRange.RowSel) 看弹出什么,是否死循环了。
也有可能是你datacolchanged、currentChanged死循环导致的。
如果自己无法调试,做个实例发上来测试。
|