请大家来看看,帮忙解决关于计算字段怎样写入数据库的问题!急用!谢谢!(50分)

  • 主题发起人 主题发起人 gunwithlove
  • 开始时间 开始时间
G

gunwithlove

Unregistered / Unconfirmed
GUEST, unregistred user!
高手们,你们好!
现在我有这样一个问题:
我通过dbgrid输入字段A,B的值,再计算字段C=A*B,然后将字段A,B,C写入表table,我用的是
Adoquery,并将C定义为计算字段(在table中C不能为空),在adoquery的oncalfields中
我是这样写的:
mynumber:= ADOQuery3.FieldByName('数量').asinteger
myprice:= ADOQuery3.fieldbyname('单价').asinteger;
adoquery3.FieldByName ('付款金额').asinteger:=mynumber*myprice;
(或写作adoquery3.fieldvalues['付款金额']:=mynumber*myprice;)
然后,再通过adoquery.updatebatch更新table2
程序运行时“付款金额”能被正确计算并显示出来(单步跟踪时它也有值),但是在由adoquery3
提交时出错,系统说“付款金额”的值为空,不能写入库中,可是明明我已经看到了“付款金额”
了。我不知道delphi中对计算字段有何特殊要求,怎么会不能写到数据库呢?(计算字段是readonly吗)
请大家帮忙解决一下,谢谢了!
 
计算字段并不是表结构里真实的字段,当然是不会回进数据表里的。你需要显式地给这个
字段赋值,一般是在 beforePost 事件里进行:
procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet);
begin
adotable1.fieldbyname('a1').asInteger := adotable1.fieldbyname('计算字段').asinteger
end;

 
因为adoquery中的计算字段为“付款金额”,实际表中的字段就是“付款金额”,
我这样写对吗?
adoquery1.fieldvalues['付款金额']:=adoquery1.fieldvalues['付款金额'];
或adoquery1.fieldbyname('付款金额'):=adoquery1.fieldbyname('付款金额')
看上去总觉得有点怪。
 
呵呵,不能这么写。
这个字段既然是实际的字段,就不要做为计算字段在 OnCalc事件中赋值,而应该在
BeforePost 中进行。
如下:
建一个新的计算字段如 Field1,在 OnCalc 中给 Field1 赋值,而在 beforePost 中写:
adotable1.fieldbyname('付款金额').asfloat :=
adotable1.fieldbyname('field1').asfloat
 
你的问题看起来用计算字段有点多余,
计算字段计算完成后又要付值给实际字段,
可在字段的onvalidate事件中进行计算.
 
计算字段是一个虚拟的字段,因此无法与实际字段相对应,以下代码是正确的:
procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet);
begin
adoquery1.fieldbyname('C').asInteger :=
adoquery1.fieldbyname('A').asinteger*adoquery1.fieldbyname('B').asinteger;
end;
 
谢谢大家,问题已经圆满解决了!因为“付款金额”是实际字段,所以
我没将“付款金额”作为计算字段,而是把它作为数据字段。然后,在adoquery的
beforepost和“数量”“单价”的onchange事件中都加上计算程序,就能完成和计算字段完全
相同的功能了。
再次感谢大家的帮助!
特别感谢Crab,Jonseen!
yiyi的方法我理解得不很清楚,您是指将“付款金额”作为计算字段还是数据字段?在“付款金额”
的onvalidate加上计算程序,然后在beforepost中也加上吗?
 
后退
顶部