表1 ,access数据库,delphi编程表的主键列是:编号 值是自动编号在dbgrid中只更新当前选中行的值,请问该update语句该怎么写?

解决方案 »

  1.   

    dbgrid.datasource.dataset.Edit;
    dbgrid.datasource.dataset.FieldByName(字段名).AsString = '';//自己根据你的字段类型和值来改
    dbgrid.datasource.dataset.Post;
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGridEh, DB, ADODB;type
      TForm1 = class(TForm)
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
        DBGridEh1: TDBGridEh;
        DBNavigator1: TDBNavigator;
        Button1: TButton;
        ADOTable1: TADOTable;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
    adoquery1.Close;
    adoquery1.sql.Clear;
    adoquery1.SQL.add('update 注塑 set t21=Q21*S21/100*I21/1000000');
    adoquery1.SQL.add(',u21=J21/1000*S21/100*(Q21*V21+R21)');
    adoquery1.SQL.add(',ae21=((Q21+R21/V21)*(1-Y21/100)*K21/1000000+(Q21+R21/V21)*Y21/100*X21/1000000+T21+U21)*(1+W21/100)+Z21*AA21+AB21*AC21+AD21');
    adoquery1.ExecSQL;
    adotable1.Active:=false;
    adotable1.Active:=true;
    end;
    end.
    ---------
    是我没说清楚。
    这是源码,我是要实现在一个表中输入各个列值,然后用上面的sql语句计算出一个值。现在是一点Button1就计算出所有的行,我是想只计算当前选中的一行记录。
      

  3.   

    一样的,你不需要用sql语句去实现temp:=adoquery1.fieldbyname('Q21').asinteger; temp就是当前Q21字段的值
    你一个个取出来,算好了再赋值给t21字段.最后post就可以了
      

  4.   

    这么多列呀,用计算字段来edit,post
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject); 
    Var
      Str :String;

    begin
      Str:=dbgrid.datasource.dataset.FieldByName('主键').AsString;  
    adoquery1.Close; 
    adoquery1.sql.Clear; 
    adoquery1.SQL.add('update 注塑 set t21=Q21*S21/100*I21/1000000'); 
    adoquery1.SQL.add(',u21=J21/1000*S21/100*(Q21*V21+R21)'); 
    adoquery1.SQL.add(',ae21=((Q21+R21/V21)*(1-Y21/100)*K21/1000000+(Q21+R21/V21)*Y21/100*X21/1000000+T21+U21)*(1+W21/100)+Z21*AA21+AB21*AC21+AD21'); 
      adoquery1.SQL.add(',where 主键='''++Str'''';
    adoquery1.ExecSQL; 
    adotable1.Active:=false; 
    adotable1.Active:=true; 
    end; 
    end. 
      

  6.   


    procedure TForm1.Button1Click(Sender: TObject); 
    Var
      Str :String
    begin
      Str:=dbgrid.datasource.dataset.FieldByName('主键').AsString; //获取当前记录的唯一主键值
    adoquery1.Close; 
    adoquery1.sql.Clear; 
    adoquery1.SQL.add('update 注塑 set t21=Q21*S21/100*I21/1000000'); 
    adoquery1.SQL.add(',u21=J21/1000*S21/100*(Q21*V21+R21)'); 
    adoquery1.SQL.add(',ae21=((Q21+R21/V21)*(1-Y21/100)*K21/1000000+(Q21+R21/V21)*Y21/100*X21/1000000+T21+U21)*(1+W21/100)+Z21*AA21+AB21*AC21+AD21'); 
     adoquery1.SQL.add(',where 主键='''++Str''''); //条件
    adoquery1.ExecSQL; 
    adotable1.Active:=false; 
    adotable1.Active:=true; 
    end; 
    end. 
      

  7.   

      ADOQUERY.UpdateBatch(arCurrent);
    Option MeaningarCurrent Only the updates for the current row are applied.
    arFiltered Only updates for rows matching the current filter are applied.
    arAll Updates for all rows are applied.
    arAllChapters Update affects all chapters (ADO chapters)Note: To use batch updating, the CursorType property of the dataset component must be either ctKeySet (the default) or ctStatic and the LockType property must be ltBatchOptimistic.
      

  8.   

    你的语句为什么不加where ?
      

  9.   

    {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    Var
      Str :String;
    begin
    Str:=dbgrideh1.datasource.dataset.FieldByName('编号').AsString;
    adoquery1.Close;
    adoquery1.sql.Clear;
    adoquery1.SQL.add('update 注塑 set t21=Q21*S21/100*I21/1000000');
    adoquery1.SQL.add(',u21=J21/1000*S21/100*(Q21*V21+R21)');
    adoquery1.SQL.add(',ae21=((Q21+R21/V21)*(1-Y21/100)*K21/1000000+(Q21+R21/V21)
    *Y21/100*X21/1000000+T21+U21)*(1+W21/100)+Z21*AA21+AB21*AC21+AD21');
    adoquery1.SQL.add('where 编号='''+Str+'''');
    adoquery1.ExecSQL;
    adotable1.Active:=false;
    adotable1.Active:=true;
    end;
    end.---------
    运行后提示‘标准表达式中数据类型不匹配’,编号字段用的是access的自动编号,自动从1开始,然后是2,连续生成数字。不知道哪错了。。
      

  10.   

    adoquery1.SQL.add('where 编号='+Str);