以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助]查询与赋值并存的问题 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=120135) |
||||
-- 作者:chnfo -- 发布时间:2018/6/7 19:13:00 -- [求助]查询与赋值并存的问题 我有一个项目,其中通过一个表构建了树,当选中树的节点后,在确定按钮中设置事件,让勾选的节点在表中的”temp“表达式列(逻辑型)中赋true 树节点即使有10000行,得到list(of datarow),非常快,也就是0.4秒左右。 但遍历这个list,使dr("Temp") = true,居然就宕机了。即使加了systemready = false也不行,再加StopRedraw也不行 后来试验把所有的表的表达式全部清除,效率就提高很多,总用时也就是5秒左右(但重置表达式就要用掉3秒左右,实际上赋true的用时很少)。而且这个表的数据列中并没有与Temp有关的任何事件 想请教:这会是什么问题?
[此贴子已经被作者于2018/6/7 19:15:47编辑过]
|
||||
-- 作者:有点甜 -- 发布时间:2018/6/7 20:24:00 -- 如果temp参与表达式运算,那慢是肯定的。跨表引用、跨表统计的表达式很耗时的。
如果确实是表达式列的问题,那就把表达式列改成数据列或者临时的数据列。 |
||||
-- 作者:chnfo -- 发布时间:2018/6/7 22:21:00 -- 因为本身在设计的时候,就是考虑到有时候要判断它是否会勾选上,为了避免在很多地方去增加临时列的麻烦,所以直接增加了一个表达式列,但没有任何计算公式 而且检查过所有的表事件的代码,在表事件中都没有temp被引用,或者被用于计算的地方。 只有在窗口事件中,才会有与temp有关的事件。但都不涉及到引用或计算 太怪异了 而且在赋值之前,都增加了一个datatables("X").datacols("Temp").expression = ""
[此贴子已经被作者于2018/6/7 22:22:51编辑过]
|
||||
-- 作者:有点甜 -- 发布时间:2018/6/7 22:25:00 -- 做个例子上来测试。 |
||||
-- 作者:chnfo -- 发布时间:2018/6/8 12:58:00 -- 随机生成A、B、AB表。A和A关联、B和AB关联 三个表的Temp本身没有表达式、没有计算式。
然后随机从A表中取一些行来赋值,获得行的集合很快,但赋值超级慢 从AB表中随机取一些行来赋值,赋值秒完成。 小结:是不是主表的临时逻辑列赋值就会很慢? 但是如果把所有表的表达式列全部清空之后,赋值又速度很快,一般40000行数据全部赋true,也只需要7秒左右,但如果项目的表比较多、数据行数量大、表达式(主要是引用表达式)较多的话,表达式重置公式时间会很长。
[此贴子已经被作者于2018/6/8 13:04:30编辑过]
|
||||
-- 作者:chnfo -- 发布时间:2018/6/8 13:00:00 -- 上面只是一个例子的说明,而实际上可能AB表又是另一个表C的主表。当出现这种情况的时候,Temp列赋值的速度应当也快不了。尤其是当表C的数据行多的时候 |
||||
-- 作者:有点甜 -- 发布时间:2018/6/8 14:35:00 -- 赋值后,会触发计算表达式的。没办法,必须清空表达式
http://www.foxtable.com/webhelp/scr/1935.htm
|
||||
-- 作者:chnfo -- 发布时间:2018/6/8 14:57:00 -- 结果是这样的 A表增加10000行耗时: 3.3651925秒 B表增加400行耗时: 3.5462028秒 AB表清空计算式耗时: 3.548203秒 AB表增加40000行耗时: 9.9075667秒 AB表填充40000行数据耗时: 42.4884302秒 AB表重置计算式耗时: 42.5414332秒 从A表随机获需要赋Temp的行耗时: 42.5434334秒 A表的Temp表达式清空耗时: 42.5444334秒 A表的Temp赋值耗时: 204.0006682秒 瓶颈就在这里,A表的Temp列赋值耗时太长 从AB表随机获需要赋Temp的行耗时: 204.0086686秒 AB表的Temp表达式清空耗时: 204.0116688秒 AB表的Temp赋值耗时: 205.676764秒 AB表数据量比A表大了一倍,但是给Temp列赋值时间只有1.6秒 从B表随机获需要赋Temp的行耗时: 205.676764秒 B表的Temp表达式清空耗时: 205.676764秒 B表的Temp赋值耗时: 206.1047885秒 B表数据量虽然很少,但它是AB表的主表,所以耗时也有0.4秒,如果B表的数据量跟A表一样的话,估计耗时一样 问题是:Temp列根本不参与任何计算,仅仅只是显示而已 ,会导致重新计算? |
||||
-- 作者:chnfo -- 发布时间:2018/6/8 15:03:00 -- 表中的Temp列,本身就没有表达式,也不参与任何计算,只是随机从表中取出一些行来,给Temp列赋值而已啊。 这也会导致重新计算? 如果有一列V=A*P,给A赋值,会导致重新计算V。但V本身并不参与任何列的计算呀 是不是不应当用datatables("A").datacols("Temp").expression = "" 而应当用datatables("A").replacefor("Temp","false","")
[此贴子已经被作者于2018/6/8 15:09:36编辑过]
|
||||
-- 作者:有点甜 -- 发布时间:2018/6/8 15:06:00 -- 任何修改都会触发表达式重新计算。 |