怎样把计算的值存入表 哥们,我这里就不再写代码了!可以试试以下的方法!写一函数,功能:输入数据、单价,输出金额!在Table的BeforePost事件中调用函数。然后再设金额字段的值为该函数的返回值! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 大体如下:具体功能你自己设计//先取得两个参数,DBGRID输入数量、单价的值,也可在函数中取得。function GetSum(iamount:float;iprice:float):float; begin result := iamount * iprice; end; unit u12;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Db, Grids, DBGrids, DBTables, StdCtrls;type TForm1 = class(TForm) DataSource1: TDataSource; Table1: TTable; DBGrid1: TDBGrid; Table1id: TStringField; Table1quantity: TFloatField; Table1price: TFloatField; Table1jine: TFloatField; Button1: TButton; procedure Table1BeforePost(DataSet: TDataSet); procedure DBGrid1CellClick(Column: TColumn); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;function getsum(iamount:integer;iprice:single):single;implementation{$R *.DFM}function getsum(iamount:integer;iprice:single):single;beginresult:=iamount*iprice;end;procedure TForm1.Table1BeforePost(DataSet: TDataSet);varquantity1:integer;price1:Currency;beginquantity1:=Table1.FieldByName('quantity').asinteger; //数量price1:=Table1.FieldByName('price').asfloat; //单价table1.FieldByName('jine').asfloat:=getsum(quantity1,price1);end;procedure TForm1.DBGrid1CellClick(Column: TColumn);varquantity1:integer;price1:Currency;beginquantity1:=Table1.FieldByName('quantity').asinteger; //数量price1:=Table1.FieldByName('price').asfloat; //单价table1.edit;table1.FieldByName('jine').asfloat:=getsum(quantity1,price1);//jine表示金额dbgrid1.datasource.dataset.post;end;procedure TForm1.Button1Click(Sender: TObject);begindbgrid1.datasource.dataset.append;//增加一条记录end;end.我这样做了后,在DBGRID按下JINE字段时能显示出计算得来的值,但是输入的值和计算值仍然不能存入数据表BIAO中。请问是什么原因呢? create table tablename ( price money not null ,amount decimal(18,6) ,[money] as price*amount )不用写函数,数据库自己就搞定了 是啊,有这个字段容易处理的多,不过不知道可不可以用触发器,我觉得那样简单些。vfp真的没用过~~~ 昨天我在VFP的数据词典里想用触发器和默认值把金额字段的默认值设为:数量*单价把INSERT TRIGGER和UPDATE TRIGGER设为金额=数量*单价然后我用APPEND输入数据,不能显示计算值,系统还显示触发失败 字段金额设为FKCALCULATED。没有用过VFP,什么叫FKCALCULATED?实际上,这个金额字段是多余的。当要显示数据给用户看时,你完全可以根据前两个字段,得到金额,在显示给用户看。如果用SQL语句的话,SQL语句可以这样写就可以一次将 数量,单价,金额 全部显示出来了:SELECT 数量,单价,数量*单价 AS 金额 FROM TableName“在TABLE中加一个附加字段CASH”,你这样不是将问题越搞越复杂了,数据库里搞那么多的无用的字段干什么啊。 你的问题是把字段jine的FieldKind设成了计算字段(fkCalculated),所以必须响应Table的Oncalcfields事件,这样写:procedure TForm1.Table1CalcFields(DataSet: TDataSet);begin dataset.FieldByName('jine').Asfloat:=getsum(....)end;如果你把字段设成asdata,则可以象你以前一样编写代代码,不过我建议你尽量少用计算字段,因为其效率低,每次打开表格时,其都要根据程序进行计算一遍,如果记录多的华,运行会有延迟,根据你的程序,用普通字段即可,每次提交记录前计算一次即可。 你的问题是把字段jine的FieldKind设成了计算字段(fkCalculated),所以必须响应Table的Oncalcfields事件,这样写:procedure TForm1.Table1CalcFields(DataSet: TDataSet);begin dataset.FieldByName('jine').Asfloat:=getsum(....)end;如果你把字段设成asdata,则可以象你以前一样编写代代码,不过我建议你尽量少用计算字段,因为其效率低,每次打开表格时,其都要根据程序进行计算一遍,如果记录多的华,运行会有延迟,根据你的程序,用普通字段即可,每次提交记录前计算一次即可。 你的问题是把字段jine的FieldKind设成了计算字段(fkCalculated),所以必须响应Table的Oncalcfields事件,这样写:procedure TForm1.Table1CalcFields(DataSet: TDataSet);begin dataset.FieldByName('jine').Asfloat:=getsum(....)end;如果你把字段设成asdata,则可以象你以前一样编写代代码,不过我建议你尽量少用计算字段,因为其效率低,每次打开表格时,其都要根据程序进行计算一遍,如果记录多的华,运行会有延迟,根据你的程序,用普通字段即可,每次提交记录前计算一次即可。 求助。。。。。关于sql问题 sql server 2005查询结果 导出为EXCEL sql 又来了200分 sql查询 这样的作业怎么写? @@IDle + @@Cpu_Busy 怎样实现一个字段可以为空,但若不为空的值不能重复 请教:rs.recordcount 返回值为-1 关于SQL server 的问题 sql server7日志不自动归档了?? 请教高手VFP问题。要多少分都行。 如何将本地数据库里的整个库导到远程的服务器数据库中(提供了系统数据源,数据库服务器IP...)?
//先取得两个参数,DBGRID输入数量、单价的值,也可在函数中取得。
function GetSum(iamount:float;iprice:float):float;
begin
result := iamount * iprice;
end;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, Grids, DBGrids, DBTables, StdCtrls;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
DBGrid1: TDBGrid;
Table1id: TStringField;
Table1quantity: TFloatField;
Table1price: TFloatField;
Table1jine: TFloatField;
Button1: TButton;
procedure Table1BeforePost(DataSet: TDataSet);
procedure DBGrid1CellClick(Column: TColumn);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
function getsum(iamount:integer;iprice:single):single;
implementation{$R *.DFM}function getsum(iamount:integer;iprice:single):single;
begin
result:=iamount*iprice;
end;
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
var
quantity1:integer;
price1:Currency;
begin
quantity1:=Table1.FieldByName('quantity').asinteger; //数量
price1:=Table1.FieldByName('price').asfloat; //单价
table1.FieldByName('jine').asfloat:=getsum(quantity1,price1);
end;
procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
quantity1:integer;
price1:Currency;
begin
quantity1:=Table1.FieldByName('quantity').asinteger; //数量
price1:=Table1.FieldByName('price').asfloat; //单价
table1.edit;
table1.FieldByName('jine').asfloat:=getsum(quantity1,price1);//jine表示金额
dbgrid1.datasource.dataset.post;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
dbgrid1.datasource.dataset.append;//增加一条记录
end;
end.
我这样做了后,在DBGRID按下JINE字段时能显示出计算得来的值,但是输入的值和计算值仍然不能存入数据表BIAO中。请问是什么原因呢?
price money not null
,amount decimal(18,6)
,[money] as price*amount )
不用写函数,数据库自己就搞定了
把金额字段的默认值设为:数量*单价
把INSERT TRIGGER和UPDATE TRIGGER设为金额=数量*单价
然后我用APPEND输入数据,不能显示计算值,系统还显示触发失败
实际上,这个金额字段是多余的。当要显示数据给用户看时,你完全可以
根据前两个字段,得到金额,在显示给用户看。如果用SQL语句的话,SQL
语句可以这样写就可以一次将 数量,单价,金额 全部显示出来了:
SELECT 数量,单价,数量*单价 AS 金额 FROM TableName“在TABLE中加一个附加字段CASH”,你这样不是将问题越搞越复杂了,
数据库里搞那么多的无用的字段干什么啊。
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
dataset.FieldByName('jine').Asfloat:=getsum(....)end;如果你把字段设成asdata,则可以象你以前一样编写代代码,不过我建议你尽量少用计算字段,因为其效率低,每次打开表格时,其都要根据程序进行计算一遍,如果记录多的华,运行会有延迟,根据你的程序,用普通字段即可,每次提交记录前计算一次即可。
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
dataset.FieldByName('jine').Asfloat:=getsum(....)end;如果你把字段设成asdata,则可以象你以前一样编写代代码,不过我建议你尽量少用计算字段,因为其效率低,每次打开表格时,其都要根据程序进行计算一遍,如果记录多的华,运行会有延迟,根据你的程序,用普通字段即可,每次提交记录前计算一次即可。
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
dataset.FieldByName('jine').Asfloat:=getsum(....)end;如果你把字段设成asdata,则可以象你以前一样编写代代码,不过我建议你尽量少用计算字段,因为其效率低,每次打开表格时,其都要根据程序进行计算一遍,如果记录多的华,运行会有延迟,根据你的程序,用普通字段即可,每次提交记录前计算一次即可。