主表和明细表都写成了存储过程,客户端用事务来控制调用两个过程: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;现在是主表存储过程返回错误后,客户端的提示总是:没有活动的事务,搞不懂,为何不结束事务进程了?
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;现在是主表存储过程返回错误后,客户端的提示总是:没有活动的事务,搞不懂,为何不结束事务进程了?
明细表再保存的时候,已经没有事务了,无法再commit或rollback
如果你不希望继续走下去了,可以
if (saveInfo <> '') then
begin
erpDM.adoCon.RollbackTrans;
exit;
end;