哥们,我这里就不再写代码了!可以试试以下的方法!写一函数,功能:输入数据、单价,输出金额!在Table的BeforePost事件中调用函数。然后再设金额字段的值为该函数的返回值!

解决方案 »

  1.   

    大体如下:具体功能你自己设计
    //先取得两个参数,DBGRID输入数量、单价的值,也可在函数中取得。
    function GetSum(iamount:float;iprice:float):float;
      begin
         result := iamount * iprice;
      end;
      

  2.   

    unit u12;
    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中。请问是什么原因呢?
      

  3.   

    create table tablename (
      price money not null
     ,amount decimal(18,6)
     ,[money] as price*amount )
    不用写函数,数据库自己就搞定了
      

  4.   

    是啊,有这个字段容易处理的多,不过不知道可不可以用触发器,我觉得那样简单些。vfp真的没用过~~~
      

  5.   

    昨天我在VFP的数据词典里想用触发器和默认值
    把金额字段的默认值设为:数量*单价
    把INSERT TRIGGER和UPDATE TRIGGER设为金额=数量*单价
    然后我用APPEND输入数据,不能显示计算值,系统还显示触发失败
      

  6.   

    字段金额设为FKCALCULATED。没有用过VFP,什么叫FKCALCULATED?
    实际上,这个金额字段是多余的。当要显示数据给用户看时,你完全可以
    根据前两个字段,得到金额,在显示给用户看。如果用SQL语句的话,SQL
    语句可以这样写就可以一次将 数量,单价,金额 全部显示出来了:
    SELECT 数量,单价,数量*单价 AS 金额 FROM TableName“在TABLE中加一个附加字段CASH”,你这样不是将问题越搞越复杂了,
    数据库里搞那么多的无用的字段干什么啊。
      

  7.   

    你的问题是把字段jine的FieldKind设成了计算字段(fkCalculated),所以必须响应Table的Oncalcfields事件,这样写:
    procedure TForm1.Table1CalcFields(DataSet: TDataSet);
    begin
     dataset.FieldByName('jine').Asfloat:=getsum(....)end;如果你把字段设成asdata,则可以象你以前一样编写代代码,不过我建议你尽量少用计算字段,因为其效率低,每次打开表格时,其都要根据程序进行计算一遍,如果记录多的华,运行会有延迟,根据你的程序,用普通字段即可,每次提交记录前计算一次即可。
      

  8.   

    你的问题是把字段jine的FieldKind设成了计算字段(fkCalculated),所以必须响应Table的Oncalcfields事件,这样写:
    procedure TForm1.Table1CalcFields(DataSet: TDataSet);
    begin
     dataset.FieldByName('jine').Asfloat:=getsum(....)end;如果你把字段设成asdata,则可以象你以前一样编写代代码,不过我建议你尽量少用计算字段,因为其效率低,每次打开表格时,其都要根据程序进行计算一遍,如果记录多的华,运行会有延迟,根据你的程序,用普通字段即可,每次提交记录前计算一次即可。
      

  9.   

    你的问题是把字段jine的FieldKind设成了计算字段(fkCalculated),所以必须响应Table的Oncalcfields事件,这样写:
    procedure TForm1.Table1CalcFields(DataSet: TDataSet);
    begin
     dataset.FieldByName('jine').Asfloat:=getsum(....)end;如果你把字段设成asdata,则可以象你以前一样编写代代码,不过我建议你尽量少用计算字段,因为其效率低,每次打开表格时,其都要根据程序进行计算一遍,如果记录多的华,运行会有延迟,根据你的程序,用普通字段即可,每次提交记录前计算一次即可。