同志们看看这段代码: //保存
  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

解决方案 »

  1.   

    PostDetails 这段代码是怎么写的呀,是不是从表与主表的对应值没有取对呀
      

  2.   

    在MASTER表POST時,更新下DETAIL表的單據編號。
      

  3.   

    PostDetails就是取master表中的id字段的值填充并提交,现在就是怀疑这个id(serial)有并发问题,唉唉...
      

  4.   


    如果master  ID是主鍵。主從提交時帶事務,不存這個問題,最多就是提交失敗。最好是判斷MASTER POST時 state = dsInsert  的話,重新取一次ID,同時更新從表的ID。