以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  AddNew()竟然也会有问题!  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=5729)

--  作者:bjljb
--  发布时间:2010/1/6 21:17:00
--  AddNew()竟然也会有问题!
在我设计的项目中,在一个按钮中包含有类似如下两行简单的代码:
r = .AddNew()
r("序号") = .Count
之前运行一直没有问题,后来更新到1229版本并数次修改DataColChanged、AfterLoad等事件代码之后,出现了一个莫名其妙的问题:
当满足新增行的条件时,点击该按钮,在对应的Table中看不到新增行,光标仍然停留在最末行,查看后台数据库却分明已经新增了一个空行,但其“序号”列并没有被赋新值。
这个问题并不是每次都出现,有的时候多次点击按钮之后又可以在Table中看到新增行,这严重影响了用户的正常操作,因为不能确定到底哪一次点击能够成功。

为了解决这个问题,我想尽了各种办法:
开始怀疑是版本问题,就用之前的版本反复测试,最终都被否定;
又怀疑是窗口AfterLoad事件代码的问题,经反复调试未果;
DataColChanged事件代码也没有找到任何有效线索……
浪费了两天时间,头都快要爆炸了,我干脆不去想它了!

冷静了一晚上之后,我决定用最原始的办法:不去管任何程序逻辑问题,逐行添加监控断点吧。
终于,在任何人都认为不可能出现问题的地方出问题了:就在这两行代码中间!
也就是说:AddNew()确实被执行了,后台数据库中新增的行就是它执行的结果,按理说这时新增的行在Table中应该是可见的,并且我没有进行任何隐藏、筛选、排序等操作,紧随其后的r("序号") = .Count应该能够被正确执行。
但现在的问题是:r刚刚被赋值为Tables("表名").AddNew(),但由于新增的行在Table中并没有出现,r("序号")现在不知道该怎么办了,无法被赋值为Tables("表名").Count,就任其空着,不了了之了!

这个问题我实在无法让其重现,也不便把项目文件上传,因为还牵扯到若干个几十万行的外部数据表,所以就啰里啰嗦地在这里叙述了一大堆,希望能引起老六的重视。

找到了原因,问题也就不难解决了。最终的解决方案是:
r = .AddNew()
.ApplyFilter = False \'无奈之举,这应该是Foxtable的一个Bug
r("序号") = .Count
[此贴子已经被作者于2010-1-6 21:34:30编辑过]

--  作者:ssqq
--  发布时间:2010/1/6 22:38:00
--  
不错,问题还是解决了,建议先用回老版本,用新版本测试运行项目各种细节功能没有问题,然后在用新版本.
--  作者:czy
--  发布时间:2010/1/6 22:49:00
--  
如果关闭ApplyFilter有效,你的数据是不是有筛选过?
--  作者:bjljb
--  发布时间:2010/1/7 0:18:00
--  
以下是引用czy在2010-1-6 22:49:00的发言:
如果关闭ApplyFilter有效,你的数据是不是有筛选过?

我试过,只要去掉这一句,问题就会再现。
代码所在的窗口属于父表,只在窗口的AfterLoad事件中对其后台DataTable进行过动态加载,用的是LoadFilter和Load方法,目的是只加载和当前登录用户有关的数据;窗口打开之后就是数据录入过程,再也不会用到筛选。
另外一张关联子表要经常用到Filter方法,比如上述最后一行代码之后就会对子表进行筛选,目的是只显示和父表当前行相关的那些数据行。

我曾经试图在窗口中添加关联子表,但不知道为什么会影响到Tab顺序,导致按回车键之后不能按我预设的顺序跳转,所以只好放弃,改用普通Table。

[此贴子已经被作者于2010-1-7 9:26:34编辑过]

--  作者:blackzhu
--  发布时间:2010/1/7 7:38:00
--  
 不应该的.你还是将完整的代码贴上让大家看看.你那个新增行是针对主表还是关联表?
--  作者:bjljb
--  发布时间:2010/1/7 9:35:00
--  
我也是觉得不应该发生这样的情况!

其他代码都反复调试过了,只有这一处有AddNew(),并且确定没有相关的筛选动作。

--  作者:kylin
--  发布时间:2010/1/7 9:43:00
--  

确实如此,当Table放在窗口当中就会不同步显示,应该说是Bug