以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [原创] 一点经验。  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=3805)

--  作者:wcs
--  发布时间: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
--  发布时间:2009/8/4 20:33:00
--  

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


--  作者:wcs
--  发布时间:2009/8/4 23:03:00
--  
直接用for ...find/select ....next   接在充填后计算......

是什么意思啊?
--  作者:wcs
--  发布时间:2009/8/4 23:07:00
--  
不触发事件,其他列的值怎么计算呢?
--  作者:mr725
--  发布时间:2009/8/4 23:32:00
--  
充填完毕后,立刻计算呀,还要触发什么事件呢。
--  作者:wcs
--  发布时间:2009/8/4 23:42:00
--  
填充完毕以后,自动触发了datacolchanged事件,就自动执行事件代码计算其他列的值了。

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

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

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


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


--  作者:wcs
--  发布时间:2009/8/5 8:48:00
--  
比如:我用数据填充器  填充了第一列、第二列。


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

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

没有事件代码,能完成上面的简单任务吗?
--  作者:狐狸爸爸
--  发布时间: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