主表(query):qry_sqlM 对应的updatesql:upd_sqlM
子表(query):qry_sqlD 对应的updatesql:upd_sqlDupd_sqlM的DeleteSQL中为删除当前主表记录的语句
upd_sqlD的DeleteSQL中为删除当前子表记录的语句现想实现在删除主表记录的时候,自动将对应的子表中的数据也同时删除。
我目前的方法为:在运行过程中,动态修改upd_sqlD的DeleteSQL,令其删除所有与要删除的主表对应的子表记录。遇到的问题是主表的记录可以删除,但子表的不能删除,想不出为什么,特来向各位高手讨教。我的代码如下:  
  if delete_checkM() =false then Abort;
  if delete_checkD() =false then Abort;
  
  /*--------------------------------------------------  
  获得子表新的DeleteSQL语句,保存到变量s_del_sql_MD中。
  此处获得的语句,我用了两种方式,语句正确,但均为得到正确结果:
  ·第一种:
   'delete from 子表 where  personID ='''+当前欲删除的人员号码+'''';
  ·第二种:
   'delete from TEMP_D where  YGHVVV = :OLD_YGHVVV '
  ---------------------------------------------------*/
  set_sql_delMD();  //将子表的 DeleteSQL 保存起来
  s_del_old:=upd_sqlD.DeleteSQL.Text;  //修改upd_sqlD的DeleteSQL,并执行删除操作
  upd_sqlD.DeleteSQL.Clear;
  upd_sqlD.DeleteSQL.add(s_del_sql_MD);
  qry_sqlD.Delete;  //删除主表的信息
  qry_sqlM.Delete;  //启用事务   dm_main.db_main.StartTransaction();
   try
      qry_sqlD.ApplyUpdates();
      qry_sqlM.ApplyUpdates();
   except
       on E:exception do begin
          dm_main.db_main.Rollback();
          dbexception(E);
       end;
   end;
   dm_main.db_main.Commit();
   qry_sqlD.CommitUpdates();
   qry_sqlM.CommitUpdates();  //恢复upd_sqlD的DeleteSQL
  upd_sqlD.DeleteSQL.Clear;
  upd_sqlD.DeleteSQL.add(s_del_old);
请大家帮忙看一下,为什么主表的数据被删除了,而子表的数据没有被删除呢?
另:请大家谈一下对updatesql的看法。updatesql比较适合于哪类操作呢?多谢。

解决方案 »

  1.   

    1. 删除主从表记录规范的做法是先删从表记录,再删主表记录
    2. 你是用delete from ...语句来做删除的,直接用一个没有连UpdateSQL的Query来做就好了
      

  2.   

    多谢huawuxin帮忙我曾试过用你说的方法,直接用一个没有连UpdateSQL的Query来做。但是那样的话,就真正的直接从数据库中删除了,与事务脱离了,若删除主表的操作被回滚了,子表的删除操作怎被恢复呢? 
      

  3.   

    现在我已经知道只要在upd_sqlM的onUpdateRecord中处理就可以了。这样在提交成功的时候,会执行写在那里的代码。但现在遇到了新的问题:我写的代码为:procedure Tfrm_master_detail_father.qry_sqlMUpdateRecord(DataSet: TDataSet;
      UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
    begin
      inherited;
        if updatekind=ukdelete then
        begin
            with qry_temp do
            begin
                close;
                sql.clear;
                sql.add('删除子表的语句');
                execsql;
                close;
            end;
        end;
    end;但加上这段代码后,每当提交的时候,不论是新增、修改,还是删除,都提示table is read only.(若不加这段代码,便没有该问题)
    想不明白为什么(在新增或修改的时候,这段代码都不曾被执行过,却依然产生了错误),请大家指点一二。