DBgrid中的3列有计算关系,要求实时显示结果,怎么写代码实现
DBgrid中的3列有计算关系,要求实时显示结果,如何写代码实现?
我的DBGRID现有3列有计算关系:A*B=C,我想在A或B内输入时自动计算显示C,在C输入时又能自动计算显示A
现在我在DataSet的字段A和C的onchange()中写了计算代码,但是会引起循环计算;
如果写在dataset的onbeforepost()中也不行,因为用户要求实时显示,不能最后计算。
如何实现好呢?
------解决方案--------------------
写在DBGrid1KeyPress事件中,先判断当前输入是哪一列,然后进行相应计算
------解决方案--------------------
判断一下就行了,要是输入 A B列就按 A*B计算,要是输入C A 或B 就按 c/A 或B算,就这样,你可以这样判断 ,只要列的数据不为空时才会计算
------解决方案--------------------
A会改变C,C又会改变A; 沒有控制条件不论怎么写都会循环,设计本身就有问题?
例1*2=2; C=2时改变A=2 那么2*2=4; 即C=4,C变了是不是A又要改变呢,无限下去...
------解决方案--------------------
如果是用AOD的话就用onFieldChangeComplete事件:判断一下被修改的是哪个字段,如果是所指定的字段就修改其它关联字段就可以了。
------解决方案--------------------
dataset.FieldbyName('A').OnValidate := datasetAValidate;
dataset.FieldbyName('B').OnValidate := datasetAValidate;
dataset.FieldbyName('C').OnValidate := datasetCValidate;
在show的事件里面写名类似这样的代码。tb_datasetAValidate这是一个过程,在过程里面可以写C栏位的计算方式,但是在这个里面要先把dataset.FieldbyName('C').OnValidate := nil,最后再加上dataset.FieldbyName('C').OnValidate := datasetCValidate;
以免造成循环,在datasetCValidate里面就写A栏的计算方式,同样要把A的dataset.FieldbyName('A').OnValidate :=nil,最后再加上dataset.FieldbyName('A').OnValidate := datasetAValidate;
不知道我这样写你是否看得明白。。。
我的DBGRID现有3列有计算关系:A*B=C,我想在A或B内输入时自动计算显示C,在C输入时又能自动计算显示A
现在我在DataSet的字段A和C的onchange()中写了计算代码,但是会引起循环计算;
如果写在dataset的onbeforepost()中也不行,因为用户要求实时显示,不能最后计算。
如何实现好呢?
------解决方案--------------------
写在DBGrid1KeyPress事件中,先判断当前输入是哪一列,然后进行相应计算
------解决方案--------------------
判断一下就行了,要是输入 A B列就按 A*B计算,要是输入C A 或B 就按 c/A 或B算,就这样,你可以这样判断 ,只要列的数据不为空时才会计算
------解决方案--------------------
A会改变C,C又会改变A; 沒有控制条件不论怎么写都会循环,设计本身就有问题?
例1*2=2; C=2时改变A=2 那么2*2=4; 即C=4,C变了是不是A又要改变呢,无限下去...
------解决方案--------------------
如果是用AOD的话就用onFieldChangeComplete事件:判断一下被修改的是哪个字段,如果是所指定的字段就修改其它关联字段就可以了。
------解决方案--------------------
dataset.FieldbyName('A').OnValidate := datasetAValidate;
dataset.FieldbyName('B').OnValidate := datasetAValidate;
dataset.FieldbyName('C').OnValidate := datasetCValidate;
在show的事件里面写名类似这样的代码。tb_datasetAValidate这是一个过程,在过程里面可以写C栏位的计算方式,但是在这个里面要先把dataset.FieldbyName('C').OnValidate := nil,最后再加上dataset.FieldbyName('C').OnValidate := datasetCValidate;
以免造成循环,在datasetCValidate里面就写A栏的计算方式,同样要把A的dataset.FieldbyName('A').OnValidate :=nil,最后再加上dataset.FieldbyName('A').OnValidate := datasetAValidate;
不知道我这样写你是否看得明白。。。