我的问题是:DBGrid显示为
  A     B      C      (字段名)
  a1    b1     c1
 ....
其中a1和b1是从A表里取,c1是从C表里取。(C表里也有b1字段)
b1是编码,c1是名称。A表和C表由b1来关联。c1只是显示出来看而已。
在我对DBGrid进行编译时(如新增一条记录),
输入不同的b1就将对应的c1,显示出来。我现在的问题是:现在提交保存时,DBGrid不但对A表进行更新,而且也对C表进行更新。
请问有什么办法可以:提交时只更新A表,对C表无操作。

解决方案 »

  1.   

    select A.a1,A,b1, B.c1
    from TABLE1 A left join table2 b on A.b1=B.b1
      

  2.   

    如果你是这样写那一定即会对a表,更改,同时也对c表操作select A.a1,A.a2, C.c1
    from a,c 
    where a.b1=c.b1
      

  3.   

    因为A表里没有c1字段,而且考虑到储存空间问题A表不能再加c1字段了。
    (A表有几十万条记录的)
    我现在不是select语句不会写,是在DBGrid进行更新时不能只对A表更新
    而不更新C表。
      

  4.   

    把C1对应的TColumn的ReadOnly设置为True就可以了
      

  5.   

    我也遇到了这样的问题,使用ADO和使用BDE在这里有很大的区别,我也正在关注好的处理办法。
      

  6.   

    这类问题实际工作中很常见,应用也很广泛,其实不是那么简单,需要在中间层里作些手脚,具体来说要坼分。给你一些建议吧,我是这样做的:先写个函数放在中间层的DataModule里:
    procedure ExecUpdateSQL(UpdateSQL: TADOQuery; DeltaDS: TCustomClientDataSet);
    var
      HaveNewValue: Boolean;
      I: Integer;
      S: string;
      Old: Boolean;
      Field: TField;
    begin
      with UpdateSQL do
      begin
        HaveNewValue := false;
        for I := 0 to Parameters.Count - 1 do
          with Parameters[I] do
          begin
            S := UpperCase(Name);
            Old := Copy(S, 1, 4) = 'OLD_';
            if Old then
              System.Delete(S, 1, 4);
            Field := DeltaDS.FindField(S);
            if Field <> nil then
              if Old then
                Value := Field.OldValue
              else
              begin
                if VarIsEmpty(Field.NewValue) then
                  Value := Field.OldValue
                else
                begin
                  Value := Field.NewValue;
                  HaveNewValue := true;
                end;
              end;
          end;
        if HaveNewValue then
          ExecSQL;
      end;
    end;中间层里放ADOQuery1,DataSetProvider1,ADOQuery2,ADOQuery3,ADOQuery4
    在ADOQuery1里写上:
    select A.a1,A.a2, C.c1
    from a,c 
    where a.b1=c.b1
    看起来是对a和c两个表操作吧,别急,看后面:
    ADOQuery2里写上:
    update a set
       a1= :a1, //这是什么不要跟我说不知道哦
       a2= :a2
    where b1 = :OLD_b1
    ADOQuery3里写上:
    selct a1,a2,b1
    from a
    ADOQuery4里写上:
    select c1,b1
    from c
    然后在DataSetProvider1的BeforeUpdateRecord()事件里写上:
    procedure TxxxxDM.DataSetProvider1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;UpdateKind: TUpdateKind; var Applied: Boolean);
    begin
      ExecUpdateSQL(ADOQuery2, DeltaDS);
      Applied := true;
    end;//哈哈,看似简单吧,实现起来不容易哦,我以前为此走了不少弯路,当你对两个表操作,看起来烦,可是在对多达几十个表的操作中,你就看出来这样做的价值了。个人建议,仅供网友们参考,错误之处,敬请指出。
      

  7.   

    补充一下:
    DataSetProvider1是和ADOQuery1相连的,ADOQuery3、ADOQuery4还要有自己的
    DataSetProvider,ADOQuery2是用来做update的不需要DataSetProvider。