Rss & SiteMap
Foxtable(狐表) http://www.foxtable.com
一个 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、在检查代码时,不能只看眼前的代码,要看数据是如何来的,穿行测试一下。
是的,哪个列放在开头,就按该列排序. 另外,find、select都可以进行排序的.
我一般不在datacolchanged里设代码,而直接用for ...find/select ....next 接在充填后计算......
对的,对于某个表进行填充,应该填充完后再对某些列进行计算,这样可以大大提升运行效率。