我用一个dbgride 显示和编辑一个表(aa),其中的一个字段是a1;其它几个表中也有同样的字段a1   如 bb表 cc表等
现在我要在修改aa表的同时更新其它几个表中的a1字段的内容我在更新表aa的保存按钮这样写
with adoqAa do
    try
      if State in [dsEdit,dsInsert] then
      begin
        UpdateOtherTable; //自已写的更新其它表的过程
        Post;
      end;
      UpdateBatch;
    except
      on E: Exception do
      begin
        showmessage('数据提交发生错误!'+E.Message);
        Abort;
      end;
    end;有几个问题:1、如何写UpdateOtherTable这个过程?
2、为什么我在还没有Post 前调用adoqAa.fieldbyname('a1').asstring的值已经是新的了?

解决方案 »

  1.   

    1、建议你在数据库中写触发器;
    2、也可以在dbgrid的oncolexit中写;
    3、也可以在adoquery的afterscroll中写。dbgrid中改数据库不安全,建议你用dbedit等其他数据控件。
      

  2.   

    同意 楼上  cjfzy(他山之石,可以攻玉。) 
    经验之谈!!!!
      

  3.   

    问题一:我觉得那个过程得用循环一条条的更新到bb,cc里。
    问题二:你可以把AdoqAa的LockType属性选择第一项,
    意思是缓存更新,只有你调用了AdoqAa.UpdateBatch方法才会自动更
    新进去。
      

  4.   

    1. 在过程UpdateOtherTable写上
    procedure UpdateOtherTable(str: string);
    var
      Qry: TAdoQuery
    begin
      try 
        Qry := TAdoQuery.Create(nil)
        .......//做一些初如设置。
        with Qry do
        begin
          active := false;
          SQL.clear;
          SQL.Add('update * from  bb where a1="'+ str+'"');
          Active := True;
          ......
          active := false;
          SQL.clear;
          SQL.Add('update * from  CC where a1="'+ str+'"');
          Active := True;
          ......
        end;
      finally  end;
    end;2.使用UpdateBatch的方法可以解决你的第二个问题,做法为设置adoqAa的LockType,然后用代码UpdateBatch方法替换Post,