ADODATASET的COMMANDTEXT用多个表联接数据时,删除或更新时,会同时更新多个表中的数据。例如,假设入库单明细表,将明细表和物料编码表联接起来(需要品名规格)作为物料入库单的子数据集,用GRID显示。当从GRID中删除一行数据时,入库单明细表和物料编码表会同时删除该物料编码对应的数据。这很明显是不合理的,因为我不想删除物料编码中的该物料,我该怎么处理?不象BDE的QUERY要用UPDATESQL

解决方案 »

  1.   

    个人认为多表更新最好采用sql直接操作数据库
      

  2.   

    adoconnection1.begintrans
    try
      with adoquery do
      begin
        close;
        sql.clear;
        sql.text:=yoursql//你的sql
        execsql;
      end;
      committrans
    except
      rollbacktrans
    end;
      

  3.   

    谢谢楼上的
    不过例子太笼统了
    没有针对我提到的情况
    我需要GRID的数据是多表联接的情况,而且想在表中直接操作。我想一个入库单多项明细一次保存,不必每一项来保存!而最主要的还是多表联接问题没解决
      

  4.   

    用SQL语句岂不是入库单每一项明细资料都要来一次
      

  5.   

    这个问题目前只有通过SQL方法来完成,没有别的更好办法,而且很多数据库并不支持多表关联更新,就是SQL2000在很多情况下都有问题
    更新时有很多处理方法,例如:
    你可以将某些不需要更新的字段设置为只读
    但是在很多情况下会出现无法找到更新列的情况,而且这种错误在不同版本的MDAC中错误提示又不一样,有的根本就没有提示就直接全部给你更新了!
    至于删除时只有用SQL方法,否则你会死的很惨!而且想你举的入库操作的例子,在实际操作中必须使用事务处理,因为她牵扯到很多表的更新,我怀疑你是不是第一次写进销存模式的软件!
    象你的例子:var
      ADOQ: TADOQuery;
    begin
      ADOQ:=TADOQuery.Create(Self);
      try
        ADOQ.Connection:=ADOConnetion1;
        with ADOQ.SQL do
        begin
          Clear;
          Add('DELETE 入库表 WHERE 条件');
          Add('UPDATE 库存表 WHERE 条件');
          //....其它需要修改的东西
        end;
        if not ADOConnection1.InTrans then ADOConnection1.BeginTrans;
        ADOQ.ExecSQL;
        ADOConnection1.CommitTrans;
      finally
      end;
    end;
      

  6.   

    最后
      finally
        ADOQ.Close;
        ADOQ.Free;
      end;呵呵,忘了填释放就回复了!
      

  7.   

    呵呵,除了直接发送SQL语句外,还有一个办法就是用sql server 2000的视图,先把你要联合查询的语句写成视图,然后在视图上写触发器,instead of update delete insert ,在前台的处理就是一般的缓存更新处理一样简单.