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


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

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

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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望: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编辑过]

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2009/8/4 20:33:00 [只看该作者]

是的,哪个列放在开头,就按该列排序.   另外,find、select都可以进行排序的.
我一般不在datacolchanged里设代码,而直接用for ...find/select ....next   接在充填后计算......


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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/8/4 23:03:00 [只看该作者]

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

是什么意思啊?

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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/8/4 23:07:00 [只看该作者]

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

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2009/8/4 23:32:00 [只看该作者]

充填完毕后,立刻计算呀,还要触发什么事件呢。

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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/8/4 23:42:00 [只看该作者]

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

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

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

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2009/8/4 23:47:00 [只看该作者]

  Dim kmtc As New Filler
  ......
  ......
   kmtc.Fill() '填充数据
接着:
   for
      代码计算。。。。
   next  
这样应该可以计算的呀~ 

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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33957 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2009/8/5 1:22:00 [只看该作者]

以下是引用mr725在2009-8-4 23:47:00的发言:
  Dim kmtc As New Filler
  ......
  ......
   kmtc.Fill() '填充数据
接着:
   for
      代码计算。。。。
   next  
这样应该可以计算的呀~ 


对的,对于某个表进行填充,应该填充完后再对某些列进行计算,这样可以大大提升运行效率。


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


加好友 发短信
等级:五尾狐 帖子:1039 积分:7450 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/8/5 8:48:00 [只看该作者]

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


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

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

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

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/8/5 9:00:00 [只看该作者]

for each dr as datarow in Datatables("某表").DataRows
    dr("a") = Left(dr("b"),4) + Right(dr("c"),2)
Next

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