以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]RaiseDataColChanged的问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=26209)

--  作者:chnfo
--  发布时间:2012/11/27 11:05:00
--  [求助]RaiseDataColChanged的问题
材料库存问题 。

有一个入库表,及它的关联表入库表.入库明细。入库表的金额=其明细的金额合计(不用表达式计算)
入库表.入库明细的datacolchanged中有计算明细金额及重置入库表的代码
select case e.datacol.name
case "数量",“单价”
        e.datarow("金额") = e.datarow("数量")*e.datarow("单价")
        DataTables("入库表").DataCols("编号").RaiseDataColChanged()
end select


设计一个选择材料目录的模式窗口,批量向入库表.入库明细中添加数据。
现在批量添加数据已经完成,问题出在计算入库明细的金额、以及入库表的金额合计上。

从窗口选择了材料并输入了材料的入库数量、单价之后,点添加按钮,关闭窗口,在入库表.入库明细的界面上,材料是加上了,但金额并不执行计算,手工去选择“数量”或“单价”列,重置,才会计算明细金额及入库表的金额合计

于是去窗口中的BeforeClose事件中,增加代码
Tables(" 入库表.入库明细 ").Cols("数量").DataCol.RaiseDataColChanged()

这样,倒是可以在关闭窗口之后,金额自动计算了。

新问题出现:即使我这次只增加了一种材料,点了窗口的关闭按钮,总有那么六七秒钟,界面呈假死状态,把这段代码放到窗口的AfterClose事件中,仍然一样。

请教:是本身重置就需要这么长时间,还是在哪里的应用出了问题?



--  作者:狐狸爸爸
--  发布时间:2012/11/27 11:47:00
--  

关于卡死,是你这个代码的问题

 

 

select case e.datacol.name
    case "数量",“单价”
         e.datarow("金额") = e.datarow("数量")*e.datarow("单价")
         DataTables("入库表").DataCols("编号").RaiseDataColChanged()
end select
 
应该改为:
 
select case e.datacol.name
    case "数量",“单价”
         e.datarow("金额") = e.datarow("数量")*e.datarow("单价")
         Dim pr As DataRow = e.Datarow.GetParentRow("入库表")
         if pr Isnot Nothing then
              DataTables("入库表").DataCols("编号").RaiseDataColChanged(pr)
         End if
end select
 

--  作者:chnfo
--  发布时间:2012/11/27 14:43:00
--  
这个我明白。

但是我的入库表总共才只有7行而已,即使不用下面这个判断,应当也会执行很快的吧。
Dim pr As DataRow = e.Datarow.GetParentRow("入库表")
         if pr Isnot Nothing then
              DataTables("入库表").DataCols("编号").RaiseDataColChanged(pr)
         End if

难道是帮助里提到的,循环重置的问题?
[此贴子已经被作者于2012-11-27 14:56:08编辑过]

--  作者:lin_hailun
--  发布时间:2012/11/27 15:06:00
--  
 贴出 入库表 的代码,可能是循环调用导致假死了。

--  作者:chnfo
--  发布时间:2012/11/27 15:27:00
--  
正如狐爸所言。

select case e.datacol.name
    case "数量",“单价”
         e.datarow("金额") = e.datarow("数量")*e.datarow("单价")
         DataTables("入库表").DataCols("编号").RaiseDataColChanged()
end select

这一段里面,从功能上来讲,应当是实现了。
但重置入库表时,是重置了所有的表,而每一行数据的重置,都可能会导致入库表重新重置。从而导致重复计算。
如果只重置与关联表相关的行,速度上就会快很多。

实际测试,从窗口中添加20行数据,界面数据刷新瞬时完成,应当不会超过一秒,我感觉足够快了。
[此贴子已经被作者于2012-11-27 15:28:13编辑过]