做到:table中第三列=第一列+第二列 决绝给分 ( 积分: 100 )

  • 主题发起人 主题发起人 zhengjp
  • 开始时间 开始时间
Z

zhengjp

Unregistered / Unconfirmed
GUEST, unregistred user!
table中第三列=第一列+第二列,在dbgrideh中自动计算,怎么来实现!也就是在dbgrideh中输入完第一列和第二列时,第三列的值就马上计算出。。拜托各位了。。。决绝给分。。
 
procedure TForm1.Table1AfterPost(DataSet: TDataSet);
begin
if Table1.Fields[2].Value=
Table1.Fields[0].Value+Table1.Fields[1].Value
then exit;
Table1.Edit;
Table1.Fields[2].Value:=
Table1.Fields[0].Value+Table1.Fields[1].Value;
Table1.Post;
//其中Value也可根据需要由AsInteger或AsString代替
end;
 
OnCalcFields事件里面写。。注意空值的转换。。
 
在onBeforePost事件写吧
begin
if (输入合法) then
Field[2].value:= f(field[0].value,field[1].value);
end;

f是,类数学中的函数 z=f(x,y),
 
在dbgrideh中输入完第一列和第二列时,第三列的值就马上计算出啊。能不能给点详细的说明。。谢谢了
 
procedure TForm1.Table1AfterPost(DataSet: TDataSet);
begin//定位变化马上计算
if Table1.Fields[2].Value=
Table1.Fields[0].Value+Table1.Fields[1].Value
then exit;//避免重复计算
//Table1是dbgrideh的数据连接的数据源,
Table1.Edit;
Table1.Fields[2].Value:=
Table1.Fields[0].Value+Table1.Fields[1].Value;
Table1.Post;
//其中Value也可根据需要由AsInteger或AsString代替
end;
 
procedure qryTemp.OnCalcFields(#$%#$%$#%$#);
begin
with TADOQuery(Sender) do
FieldByName('Column3').AsInteger := StrToIntDef(FieldByName('Column2').AsString, 0) + StrToIntDef(FieldByName('Column1').AsString, 0);
end;

//随手写的。。。
 
如:procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet);
begin
adoquery1.FieldByName('c3').AsInteger:= adoquery1.FieldByName('c1').AsInteger+adoquery1.FieldByName('c2').AsInteger
end;
不可以。没有变化!假设表有c1,c2,c3列,都为integer
 
计算字段就是专门干这个事情的,在你的table上点右键添加一个计算字段,然后在table控件的OnCalcFields事件里写入处理方法即可。
好像 delphi 自带的例子里就有,网上一查“计算字段”也能查出大片资料
 
在DBGRID的ColumnUpdateData事件里写
adoquery1.fieldbyname('3').asfloat=adoquery1.fieldbyname('1')*strtofloat(text);
 
在字段的字段1,字段2Onchange事件里
DataSet['字段3']:=DataSet.FieldByName('字段1').asintegger+DataSet.FieldByName('字段2').asinteger
 
计算字段不 就解决了....
 
表有:c1,c2,c3;c3=c1+c2,在dbgrid中输入c1和c2时。c3的值会自动出现,
各位能否说明白点。以上各种方都用过!不行。。。一开始我也是这样做的。要是可以也不会在这里提问了。。谢谢
 
这个问题在SQL里处理就非常简单:
SELECT F1,F2,F1+F2 AS F3 FROM TABLENAME
 
1、你到底用的是“table”还是“adoquery1”?
2。“在dbgrid中输入c1和c2时。c3的值会自动出现”,我认为不可能实现。
“在dbgrid中输入c1和c2时”只要位置不变,数据还没有提交到数据库,“c3的值会自动出现”怎么可能?例如EXCEL还要求把焦点置于其它单元格后才计算。
 
shaodc:说得对。
如果:c3是计算字段的话,用以上的方法可以实现!
procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet);
begin
adoquery1.FieldByName('c3').AsInteger:= adoquery1.FieldByName('c1').AsInteger+adoquery1.FieldByName('c2').AsInteger;
end;
如果c3是数据库表中的字段的话,在dbgrideh中就不可以实现了?
如果不用计算字段而要实现几个字段的计算结果添入某个字段,听说可用OnFilterRecord代替 ,但实现不了~
 
方法挺多啊,挨个试后,记得告诉其他人啊,呵呵
 
ddzhouqian:什么方法。。。说清些,朋友
 
我认为在Table1的OnBeforePost事件中写计算比较好
我做过这方面的考勤系统
 
在OnBeforePost事件中写,能不能在dbggrideh中把结果马上显示出来。。。
大家给点清楚的话明啊。。。
 
后退
顶部