同志们看看这段代码: //保存
if Q_Master.State in dsEditModes then
try
FIsSaveing := True;
try
DMCommon.KernelConnObj.StartTransaction;
Q_Master.Post;
Q_Master.CommitUpdates;
PostDetails; //提交细项表
DMCommon.KernelConnObj.Commit;
//恢复主从关系
setDetailDsSource(Source_Master);
GeneralForm.FormModel := gfmView;
GeneralForm.RefreshState;
Result := True;
except
on E: Exception do
begin
DMCommon.KernelConnObj.Rollback;
if not (Q_Master.State in dsEditModes) then
Q_Master.Edit; MessageDlg('保存数据失败:' + #13 + #10 +
E.Message, mtError, [mbOk], 0);
Result := False;
end;
end;
finally
FIsSaveing := False;
end;这段代码是系统提交数据到服务器的代码, Q_Master没有缓存提交,而细项表则是用的缓存提交,也就是在Q_Master.Post后,获取字段id的值,并更新到细项,以构成主从关系, 问题是经常有单的id重合了,一张单的细项跑到其它单上去了,大伙帮看看.采用的ZeosLib+Postgresql
if Q_Master.State in dsEditModes then
try
FIsSaveing := True;
try
DMCommon.KernelConnObj.StartTransaction;
Q_Master.Post;
Q_Master.CommitUpdates;
PostDetails; //提交细项表
DMCommon.KernelConnObj.Commit;
//恢复主从关系
setDetailDsSource(Source_Master);
GeneralForm.FormModel := gfmView;
GeneralForm.RefreshState;
Result := True;
except
on E: Exception do
begin
DMCommon.KernelConnObj.Rollback;
if not (Q_Master.State in dsEditModes) then
Q_Master.Edit; MessageDlg('保存数据失败:' + #13 + #10 +
E.Message, mtError, [mbOk], 0);
Result := False;
end;
end;
finally
FIsSaveing := False;
end;这段代码是系统提交数据到服务器的代码, Q_Master没有缓存提交,而细项表则是用的缓存提交,也就是在Q_Master.Post后,获取字段id的值,并更新到细项,以构成主从关系, 问题是经常有单的id重合了,一张单的细项跑到其它单上去了,大伙帮看看.采用的ZeosLib+Postgresql
如果master ID是主鍵。主從提交時帶事務,不存這個問題,最多就是提交失敗。最好是判斷MASTER POST時 state = dsInsert 的話,重新取一次ID,同時更新從表的ID。