主表和明细表都写成了存储过程,客户端用事务来控制调用两个过程:erpDM.adoCon.BeginTrans ;//开始事务
try  
    saveinfo := SaveSALPRO(inttostr(WorkType),'0',PRO001,PRO002,
                          PRO003,trim(edtPRO004.Text),trim(cbxPRO005.Text),PRO006,
                          trim(edtPRO008.Text),'','','');    if (saveInfo <> '') then erpDM.adoCon.RollbackTrans;//保存主表    for I := 1 to advGrid.RowCount - 1 do
    if (trim(advGrid.Cells[1,I])<>'') and (trim(advGrid.Cells[2,I])<>'') then
    begin
      PRR005 := strtofloat(advGrid.Cells[4,I]);
      PRR006 := strtofloat(advGrid.Cells[5,I]);
      //保存明细表
      saveinfo := SaveSALPRR('0','0',0,PRO001,trim(advGrid.Cells[1,I]),
                              trim(advGrid.Cells[2,I]),PRR005,PRR006,
                              trim(advGrid.Cells[3,I]),trim(advGrid.Cells[6,I]),'','','');      if saveInfo <> '' then  break;
    end;
    if (saveInfo = '') then erpDM.adoCon.CommitTrans  else erpDM.adoCon.RollbackTrans;
  except
    erpDM.adoCon.RollbackTrans ;
    saveInfo := '保存失败';
    Raise;
  end;现在是主表存储过程返回错误后,客户端的提示总是:没有活动的事务,搞不懂,为何不结束事务进程了?

解决方案 »

  1.   

    现在是主表存储过程返回错误后,你已经rpDM.adoCon.RollbackTrans,事务结束了
    明细表再保存的时候,已经没有事务了,无法再commit或rollback
      

  2.   

    if (saveInfo <> '') then erpDM.adoCon.RollbackTrans;//保存主表 这一句如果成立,RollbackTrans后事务结束
    如果你不希望继续走下去了,可以
    if (saveInfo <> '') then
    begin
      erpDM.adoCon.RollbackTrans;
      exit;
    end;