各位大俠﹗現請教一個ADO方面的問題﹐請指點迷路.問題如下﹕  現做一BOM的MIS﹐有兩個表﹐主从表结构,主表(3字段)和从表(8字段)通过主表的三個字段关联,  主从表都是设的批更新模式.要實現對主從表的增,刪,改,存,取消等基本功能.  經測試﹐主從表的刪除都可實現(如只刪從表某一記錄).(從表的刪除在主表的BeforeDelete中實現)  取消動作也可實現。(以下有部分代碼)  但是:新增﹐修改﹐保存還有問題﹐無法做到.   請問用什么處理方法(有代碼實例更好)?  歡迎有ADO這方面實際經驗的高手與我討論, 我的email: [email protected],不勝感激!!!!  因系統趕工期﹐緊急求助!!!!  請各路大俠指教﹐指點均送分!!!!部分代碼如下﹕(原始拷貝)主表:ADODataSet1
從表:ADODataSet2CursorType: ctKeyset,
CursorLocation: clUseClient,
LockType: ltBatchOptimistic//delete
//--------------------------------------------------------- dele beginvar
 DeleteSucessFlag : boolean;
 //對記錄作刪除標記 F:無刪除動作 T:有刪除﹐或刪除未提交
function DoDelete(myData:TADODataSet):Boolean; //刪除
begin
  Result := False;
  try
    if not myData.IsEmpty then
      myData.Delete; 
    Result := True;
  finally
  end;
end;procedure TfrmBomi01.mideleteClick(Sender: TObject);
begin
  if MessageBox(0,'要刪除當前記錄嗎﹖','確認提示',MB_OKCANCEL) = IDOK  then
    begin
      if ActiveControl = gdBody1 then         //只刪除單身的當前記錄
        begin
          if ADODataSet2.RecordCount > 0 then //單身的記錄數>0
            if DoDelete(ADODataSet2) then
              DeleteSucessFlag := True
            else
              MessageDlg('刪除記錄失敗﹗請取消并稍后再試... ',mtError,[mbYes],0)
          else                                //單身的記錄=0時﹐刪除當前單據﹐即表頭
            if DoDelete(ADODataSet1) then
              DeleteSucessFlag := True
            else
              MessageDlg('刪除記錄失敗﹗請取消并稍后再試... ',mtError,[mbYes],0);
        end
      else                                   //單身的記錄=0,刪除當前表單(表頭+表身)
        if DoDelete(ADODataSet1) then
          DeleteSucessFlag := True
        else
          MessageDlg('刪除記錄失敗﹗請取消并稍后再試... ',mtError,[mbYes],0);
    end;
//--------------------------------------------------------- dele end//cancel
//--------------------------------------------------------- cancel begin
 ...
 if not DataModuleBOM.ADOConnectionMain.InTransaction then
    begin
      DataModuleBOM.ADOConnectionMain.BeginTrans;
      try
        ADODataSet1.CancelBatch;
        ADODataSet2.CancelBatch;
        DataModuleBOM.ADOConnectionMain.RollbackTrans;
      except
      end
  else begin
    Application.MessageBox('服務器忙請稍后再試!','系統提示',MB_OK+mb_iconWarning);
  end;
//--------------------------------------------------------- cancel end

解决方案 »

  1.   

    为什么不在SQL里面做表的关系?
      

  2.   

    在子表的新增过程NEWRECORD增加对主表关联字段的新增修改是,在主表的AFTERSCOLL事件中REQUERY子表,在打开表时用IF NOT 子表。STATE IN [DSINSERT,DSEDIT] THEN 子表。EDIT
    进行修改,子表设置成批保存的方式,删除最好用一个QUERY写SQL,在主表删除时用事件一起删除,否则可能出现主表删除了子表部分没删除的情况,如果还不清楚和我联系,我给你一个PPROJECT