Foxtable(狐表)用户栏目专家坐堂 → [原创] 一点经验。


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

主题:[原创] 一点经验。

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


加好友 发短信
等级:五尾狐 帖子:1037 积分:7428 威望:0 精华:0 注册:2008/8/31 22:52:00
[原创] 一点经验。  发帖心情 Post By:2009/8/4 18:12:00 [显示全部帖子]

一个 datacolchanged 事件代码执行不正常的问题,搞了我一下午,突然灵机一动:是不是数据填充的 Filler 接收顺序问题造成的啊?一改果然是的!

是这样子的,我用这段代码向“会计科目”表填充数据,

   Dim kmtc As New Filler
   kmtc.SourceTable = DataTables("会计科目查询") '指定数据来源
   kmtc.SourceCols = "sszt,kmdm,kmmc,kmjs,kmnd,sfzxhs" '指定数据来源列
   kmtc.DataTable = DataTables("会计科目") '指定数据接收表
   kmtc.DataCols = "账套,科目代码,科目名称,科目级次,科目年度,专项核算类型" '指定数据接收列
   kmtc.ExcludeExistValue = true
   kmtc.ExcludeNullValue = true
   kmtc.Distinct = true
   kmtc.Fill() '填充数据

然后,我在“会计科目”表的datacolchanged事件中,运用find、select等查找并计算数据。

 
但是,有些行总是不能正常计算,没有结果!有些行又是正确的,系统还提示“未将对象运用到...”.

为什么有的正确有的不正确呢?我查了一下午都没有结果。

最后发现,那些没有正确计算的行的主键值都小一些,我想这涉及到的顺序问题了。

因为,datatabler的方法find、select,是根据已经加载的数据执行的,并不是执行完毕了以后的我看到的table。有些数据还没有填充进来,所以它查找不到正确的结果。

这样我就找到了数据填充的 Filler  了。一看,它没有sort参数,如何干预填充的顺序呢?

经测试,上面的红色部分的顺序,就是填充数据的先后顺序!我只是把  科目代码 和 kmdm  改到前面来了,一切的问题就解决了!

总结:
1、datacolchanged事件的运算,是根据数据改变的顺序,从上到下,从左到右计算的,这个上下左右不是我们看到的table中的顺序,是datatable中的顺序。

2、我一直在想,datacolchanged事件中的代码是如何执行的,现在思考可能是这样子的:每有一个数据变化(不管是行的还是列的),系统都会执行一次这个事件中的所有代码,所以代码中的if  和 select 是少不了的,否则系统太累了。

3、事件中if  和 select 的顺序问题是重要的,要尽量减少重复地运算,这在一个个输入数据时表现不明显,可是在大批数量变化时,效率影响明显。这方面在帮助文件中提到不多。

4、数据填充器的 Filler 的填充顺序,在其他地方也有同样类似的情况,这样的细节问题也是要注意的。

5、在检查代码时,不能只看眼前的代码,要看数据是如何来的,穿行测试一下。

[此贴子已经被作者于2009-8-4 18:34:45编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1037 积分:7428 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/8/4 23:03:00 [显示全部帖子]

直接用for ...find/select ....next   接在充填后计算......

是什么意思啊?

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


加好友 发短信
等级:五尾狐 帖子:1037 积分:7428 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/8/4 23:07:00 [显示全部帖子]

不触发事件,其他列的值怎么计算呢?

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


加好友 发短信
等级:五尾狐 帖子:1037 积分:7428 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/8/4 23:42:00 [显示全部帖子]

填充完毕以后,自动触发了datacolchanged事件,就自动执行事件代码计算其他列的值了。

如果不用事件代码用什么计算??

自定义的函数?
[此贴子已经被作者于2009-8-4 23:43:42编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1037 积分:7428 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/8/5 8:48:00 [显示全部帖子]

比如:我用数据填充器  填充了第一列、第二列。


现在,我想计算第三列,第三列 =  第一列的前四个字符  和  第二列的后二个字符连接起来     ,这如何用
for ......next    来计算? 

不好意思,这可能是个很简单的问题,狐表不像易表那样有刷新列的功能,只有重置列的功能

没有事件代码,能完成上面的简单任务吗?

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


加好友 发短信
等级:五尾狐 帖子:1037 积分:7428 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/8/5 9:11:00 [显示全部帖子]

哦,明白了,就是一行行地计算。

简单的计算可以这样子的,不知复杂一些的如何搞

现在要改过这样子的话,工作量很大!

不过就是10多秒的速度问题嘛

以后有机会再使用这种方法思路!!!
[此贴子已经被作者于2009-8-5 9:14:21编辑过]

 回到顶部