各位大俠﹗現請教一個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
從表: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
进行修改,子表设置成批保存的方式,删除最好用一个QUERY写SQL,在主表删除时用事件一起删除,否则可能出现主表删除了子表部分没删除的情况,如果还不清楚和我联系,我给你一个PPROJECT