線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1336
推到 Plurk!
推到 Facebook!

仍未解決之ADO Master and Detial 問題

尚未結案
problemman
一般會員


發表:7
回覆:25
積分:16
註冊:2003-04-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-15 11:15:46 IP:203.198.xxx.xxx 未訂閱
請問各大佬: 我的ADO pogram 上有個DBGrid1(Master)和DBGrid2(Detail),當我在DBGrid1(Master) 上輸入一個record但post,之後在DBGrid2(Detail)上輸入一個record,但當我按post時,這個record在DBGrid2就不見了,之後我在DBGrid1(Master)按post,也見不到Detail那隻record. 之後我要將DBGrid1(Master)'s pointer 移去其他record,然後移回剛才新增之Master Record,才可見回剛才新增之Detail record。 但我測試過,如果我在新增Detail record之前,把Master Record 先post,然後再新增Detail record,就沒有問題。 但我在BDE是可以Master 未post,但Detail也可以加record, 究竟有什麼方法可解決< >< > 發表人 -
JamesLiang
初階會員


發表:54
回覆:78
積分:31
註冊:2003-02-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-15 12:58:28 IP:67.124.xxx.xxx 未訂閱
你可使用updatebatch的方式,但依我的經驗master最好先post,detail在於多筆輸入後按save鍵作updatebatch(arAll)的方式.祝好
problemman
一般會員


發表:7
回覆:25
積分:16
註冊:2003-04-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-15 14:14:05 IP:203.198.xxx.xxx 未訂閱
但我不想用Batch mode,而且我試過用Batch mode,情形都是一樣 怎樣做? 發表人 -
JamesLiang
初階會員


發表:54
回覆:78
積分:31
註冊:2003-02-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-15 22:51:27 IP:63.201.xxx.xxx 未訂閱
1.進入detail時先查核master是否為dsinsert狀態(if master.dataset.state :- dsInsert then master.Post;) 2.於設計階段將detail的dataset object property cursor type set成ctkeyset,locktype is itbatchoptimistic,command text is cmdtext 3.FORM 設一個 button 於click 時updatebatch(arAll)
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-16 01:04:32 IP:211.76.xxx.xxx 未訂閱
引言: 請問各大佬: 我的ADO pogram 上有個DBGrid1(Master)和DBGrid2(Detail),當我在DBGrid1(Master) 上輸入一個record但post,之後在DBGrid2(Detail)上輸入一個record,但當我按post時,這個record在DBGrid2就不見了,之後我在DBGrid1(Master)按post,也見不到Detail那隻record. 之後我要將DBGrid1(Master)'s pointer 移去其他record,然後移回剛才新增之Master Record,才可見回剛才新增之Detail record。 但我測試過,如果我在新增Detail record之前,把Master Record 先post,然後再新增Detail record,就沒有問題。 但我在BDE是可以Master 未post,但Detail也可以加record, 究竟有什麼方法可解決< >< > 發表人 - >< face="Verdana, Arial, Helvetica"> 在Detail Post前 if Master.State in [dsInsert,dsEdit] then // 先做Master.Post Master.Post else 新增一筆和detail關聯的Master記錄 發表人 - cmj 於 2003/04/16 01:07:18
problemman
一般會員


發表:7
回覆:25
積分:16
註冊:2003-04-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-16 10:06:03 IP:203.198.xxx.xxx 未訂閱
即是否話,ADO不能在master 未post,而detail 加record,是嗎? 但BDE可以的,但我想用ADO,怎樣辦才可以像BDE一樣? 《觸不到問題人》 來無影,去無踪, 問題總是一羅羅。 發表人 - problemman 於 2003/04/16 10:08:34
wlj_sh
一般會員


發表:1
回覆:3
積分:0
註冊:2003-04-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-21 15:27:57 IP:218.79.xxx.xxx 未訂閱
在DETAIL表BEFORE INSERT 时INSERT MASTER表中的记录,然后修改MASTER表中的记录就行
problemman
一般會員


發表:7
回覆:25
積分:16
註冊:2003-04-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-22 10:43:03 IP:203.198.xxx.xxx 未訂閱
引言: 在DETAIL表BEFORE INSERT 时INSERT MASTER表中的记录,然后修改MASTER表中的记录就行
wlj_sh兄: 但Master都是在"新增"狀態下,怎可再insert? 你的意思是否說, 1. 在Detail的before insert中先將Master先post 2. 再edit Master資料 3. 再新增Detail 是嗎? 但是我的意思是說 1. 在Master在新增狀態下(但未post) 2. 再新增detail 3. 把detail Post 4. 再post Master 這樣得嗎?............但BDE是得的........ADO得嗎? 如果不知我說什麼,請看我最初發問的問題(在最頂的問題) 謝謝 《觸不到問題人》 來無影,去無踪, 問題總是一羅羅。
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-24 16:40:29 IP:211.21.xxx.xxx 未訂閱
引言: 請問各大佬: 我的ADO pogram 上有個DBGrid1(Master)和DBGrid2(Detail),當我在DBGrid1(Master) 上輸入一個record但post,之後在DBGrid2(Detail)上輸入一個record,但當我按post時,這個record在DBGrid2就不見了,之後我在DBGrid1(Master)按post,也見不到Detail那隻record. 之後我要將DBGrid1(Master)'s pointer 移去其他record,然後移回剛才新增之Master Record,才可見回剛才新增之Detail record。 但我測試過,如果我在新增Detail record之前,把Master Record 先post,然後再新增Detail record,就沒有問題。 但我在BDE是可以Master 未post,但Detail也可以加record, 究竟有什麼方法可解決< >< > 發表人 - >< face="Verdana, Arial, Helvetica"> problemman兄: 您的問題我已經在http://delphi.ktop.com.tw/topic.php?TOPIC_ID=28683建議了一種作法,以下是我的第二個作法,也是目前我所使用的方法: 這個作法是因為我的單號(也就是Master與Detail連結的欄位)是在當user按存檔鈕時才給定,一開始新增Master及Detail的單號都是空白,結果我使用了第一種方法(ClientDateSet DataSetProvider)的方式,又回到一開始的問題也就是Detail會不見了。(若是用ClientDateSet DataSetProvider的方式,一開始新增Master就給定單號那Detail就不會消失) 解決方法: 也就是Master與Detail的連結,自已做。 一般而言,我們都會將Datail的TADOQuery的DataSource指向Master的TADOQuery(若是TADOTable則是將MasterSource指向Master的TADOQuery),就是這個地方再搞怪,拿掉關連,自已用程式控制,不交給ADO幫我們作關連,舉個例子: ADOqryMaster:SQL:Select * From SellM ADOqryDetail:SQL:Select * From SellD Where Sell_No = :Sell_No or 0 = :Switch
procedure TForm1.ADOqryMasterAfterScroll(DataSet: TDataSet);
begin
  if DataSet.State in [dsInsert, dsEdit] then
  begin
    ADOqryDetail.Close;
    ADOqryDetail.Parameters.ParamByName.FieldByName('Switch').Value := 1;    
    ADOqryDetail.Parameters.ParamByName.FieldByName('Sell_No').Value := DataSet.FieldByName('Sell_No').AsString;
    ADOqryDetail.Open;    
  end
  else
  beign
    ADOqryDetail.Close;
    ADOqryDetail.Parameters.ParamByName.FieldByName('Switch').Value := 1;    
    ADOqryDetail.Open;    
  end
end;
//另外再刪除後已必須將Detail重新Close、Open
procedure TForm1.ADOqryMasterAfterDelete(DataSet: TDataSet);
begin
  ADOqryDetail.Close;
  ADOqryDetail.Parameters.ParamByName.FieldByName('Switch').Value := 1;    
  ADOqryDetail.Parameters.ParamByName.FieldByName('Sell_No').Value := DataSet.FieldByName('Sell_No').AsString;
  ADOqryDetail.Open;    
end;
補充:您必須使用UpdateBatch模式,即是將Lock Type設為ltBatchOptimistic 這樣應該就可以,您可以試試看... ~小弟淺見,參考看看~ 發表人 - channel 於 2003/04/24 16:45:59
------
~小弟淺見,參考看看~
系統時間:2024-07-01 9:24:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!