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

急件,拜託一下,請問有關資料庫的問題

尚未結案
lgm55
一般會員


發表:14
回覆:34
積分:9
註冊:2004-03-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-06 18:59:29 IP:211.76.xxx.xxx 未訂閱
各位大大好:    小弟使用一個DBLookupComboBox,和兩個DBEdit元件連結到資料庫(如圖) 當選擇"單位"時,相對應的"指揮官"和"車數"值,便會自動由資料庫中抓出來 當我要修改現有單位的指揮官或車數值時,只要選該單位, 然後直接在DBEdit元件上修改,資料庫亦會變更... 想請問,如果要修改或新增在資料庫中單位時(也就是要讓該新單位在"單位"中可顯示,或者可說要在資料庫中新增一筆資料),有無不用再增加元件的方法能做到呢,例如直接在DBLookupComboBox中輸入單位,可是DBLookupComboBox好像不能直間鍵入說..有用錯元件嗎?還是要用DBComboBox啊,它可達到前一段敘述之要求嗎? 急件..拜託好心的大大幫忙指導一下...
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-06 22:48:29 IP:61.225.xxx.xxx 未訂閱
引言: 想請問,如果要修改或新增在資料庫中單位時(也就是要讓該新單位在"單位"中可顯示,或者可說要在資料庫中新增一筆資料),有無不用再增加元件的方法能做到呢,例如直接在DBLookupComboBox中輸入單位,可是DBLookupComboBox好像不能直間鍵入說..有用錯元件嗎?還是要用DBComboBox啊,它可達到前一段敘述之要求嗎? 急件..拜託好心的大大幫忙指導一下...
您好 我建議用DBComboBox, 就如您所說的, 可以直接鍵入資料, 或是可以用下拉選資料. 唯一比較麻煩的, 是要在dropdown 事件中寫一小段code 把資料庫的資料放到items.. ~悠遊法國號~ 發表人 - yachanga 於 2004/04/06 22:50:46
lgm55
一般會員


發表:14
回覆:34
積分:9
註冊:2004-03-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-07 16:44:35 IP:211.76.xxx.xxx 未訂閱
yachanga大大您好: 感謝您迅速的回覆小弟 小弟當初就是因為不會將資料庫的資料放到items..才選擇DBLookupComboBox 再則如用Item→Add方式將鍵入資料加在item中,又要怎樣將item內的這筆新增資料加入資料庫"單位"欄位中呢, 可以示範一小段程式或語法嗎 且這樣做起來,是表示在資料庫中該筆新增資料(單位欄)對應的"指揮官"和"車數"欄位同時亦增加一筆空白資料嗎(待輸入),這樣敘述不知大大您是否懂得小弟意思? 且想請問,那跟用CobomBox有什麼不同,是不是這樣那兩個DBEdit元件就不會跟著"單位"資料而變了 小弟是新手,可以麻煩解答下嗎,謝謝您..
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-07 20:10:31 IP:211.74.xxx.xxx 未訂閱
小弟當初就是因為不會將資料庫的資料放到items..才選擇DBLookupComboBox 再則如用Item→Add方式將鍵入資料加在item中,又要怎樣將item內的這筆新增資料加入資料庫"單位"欄位中呢,    可以示範一小段程式或語法嗎 lgm55 小弟沒寫過C builder, 據說和DELPHI不會差太多 以下示範想法 DBCombobox1->Clear; QUERY1->OPEN; WHILE NOT QUERY1->Eof do begin DBComboBox1->Items->Add(QUERY1->FIELDBYNAME('單位欄')->AsString); QUERY1->Next; end; QUERY1->Close; 且這樣做起來,是表示在資料庫中該筆新增資料(單位欄)對應的"指揮官"和"車數"欄位同時亦增加一筆空白資料嗎(待輸入),這樣敘述不知大大您是否懂得小弟意思? 且想請問,那跟用CobomBox有什麼不同,是不是這樣那兩個DBEdit元件就不會跟著"單位"資料而變了 小弟是新手,可以麻煩解答下嗎,謝謝您.. 依您的字義, 您是想說若選的單位已存在,則指揮官和車數資料顯示為所選單位的資料....若選的單位不存在, 則新增一筆控的指揮官和車數嗎?? 您可以試試看在DBComboBox Onchange event 加上Filter 這樣指揮官與車數就會隨著資料轉變 query1->Filter=' 單位=''' DBcomBobox1.text ''''; query1->Filtered=true; ~悠遊法國號~
lgm55
一般會員


發表:14
回覆:34
積分:9
註冊:2004-03-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-08 21:32:52 IP:211.76.xxx.xxx 未訂閱
yachanga大大您好: 感謝您的指導 您提供的第一段程式碼,經小弟參考後改為BCB語法如下: void __fastcall TfrmMain::dbcboUnitDropDown(TObject *Sender) { dbcboUnit->Clear(); Query1->Open(); while(!Query1->Eof) { dbcboUnit->Items->Add(Query1->FieldByName("單位")->AsString); Query1->Next(); } Query1->Close(); }且在Query1的SQL中輸入 select 單位,指揮官,車輛數 from 車輛編裝 確實在下拉選單中已能載入"單位"欄的資料,謝謝您 可是第二段程式碼..恕小弟不才,試不出來ㄝ(還繼續在試) 請問: 您那個qurey1和前一段程式的QUERY1是同一個嗎? 那句query1->Filter=' 單位=''' DBcomBobox1.text '''';不太懂.. 改成Query1->Filter="單位=" dbcboUnit->Text 不知是不是和您的意思相同; 且小弟將那兩個DBEdit的DataSource指向Query1,再將DataField各指向"指揮官"與"車數", 也試著將那兩個DBEdit的DataSource指向一個欄位齊全的Table 都不行,不知是哪裡做錯了,, 可再指導一下嗎..謝謝 發表人 - lgm55 於 2004/04/08 21:48:30
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-08 21:53:25 IP:61.230.xxx.xxx 未訂閱
lgm55 您好: 恭喜您試成功第一個問題    第二個問題 您需要另外一個TQUERY, ex: Query2(Select * from table) 將此三個欄位指向Query2的Datasource 然後在單位這個元件的onChange event 加入Filter 語法  此時你會發現更改 單位的資料, 指揮官和車數都會跟著改變資料    這是基本想法..您可以試試看 若有問題, 可以在一起討論    
引言: yachanga大大您好: 感謝您的指導 您提供的第一段程式碼,經小弟參考後改為BCB語法如下: void __fastcall TfrmMain::dbcboUnitDropDown(TObject *Sender) { dbcboUnit->Clear(); Query1->Open(); while(!Query1->Eof) { dbcboUnit->Items->Add(Query1->FieldByName("單位")->AsString); Query1->Next(); } Query1->Close(); }且在Query1的SQL中輸入 select 單位,指揮官,車輛數 from 車輛編裝 確實在下拉選單中已能載入"單位"欄的資料,謝謝您 可是第二段程式碼..恕小弟不才,試不出來ㄝ(還繼續在試) 請問: 您那個qurey1和前一段程式的QUERY1是同一個嗎? 那句query1->Filter=' 單位=''' DBcomBobox1.text '''';不太懂.. 改成Query1->Filter="單位=" dbcboUnit->Text 不知是不是和您的意思相同; 且小弟將那兩個DBEdit的DataSource指向Query1,再將DataField各指向"指揮官"與"車數", 也試著將那兩個DBEdit的DataSource指向一個欄位齊全的Table 都不行,不知是哪裡做錯了,, 可再指導一下嗎..謝謝 發表人 - lgm55 於 2004/04/08 21:48:30
<>~悠遊法國號~
lgm55
一般會員


發表:14
回覆:34
積分:9
註冊:2004-03-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-09 00:51:27 IP:211.76.xxx.xxx 未訂閱
yachanga大大您好: 小弟已照您的話做 將Query2的SQL輸入 select * from 車輛編裝(Query2已設Active為True) 然後三個元件都指向Query2的DataSource,再輸入以下程式碼 void __fastcall TfrmMain::dbcboUnitChange(TObject *Sender) { Query2->Filter="單位=" dbcboUnit->Text; Query2->Filtered=true; } 可還是不行ㄝ.. 您這行好多點(') query1->Filter=' 單位=''' DBcomBobox1.text ''''; 是不是改成Query2->Filter="單位=" dbcboUnit->Text不對啊.. 不知和您的意思相不相同,可是執行並無錯誤產生.. 傷腦筋..拜託一下囉
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-04-09 09:07:42 IP:210.68.xxx.xxx 未訂閱
Hi lgm55 您好 假設我們要找單位='Unit' Filter="單位='Unit'" 我猜你少了單引號...這是SQL語法, compile 會過. 但是Filter就沒有反應    Query2.Filter="單位='" dblcboUnut->text "'"; Query2.Filtered=true;
引言: yachanga大大您好: 小弟已照您的話做 將Query2的SQL輸入 select * from 車輛編裝(Query2已設Active為True) 然後三個元件都指向Query2的DataSource,再輸入以下程式碼 void __fastcall TfrmMain::dbcboUnitChange(TObject *Sender) { Query2->Filter="單位=" dbcboUnit->Text; Query2->Filtered=true; } 可還是不行ㄝ.. 您這行好多點(') query1->Filter=' 單位=''' DBcomBobox1.text ''''; 是不是改成Query2->Filter="單位=" dbcboUnit->Text不對啊.. 不知和您的意思相不相同,可是執行並無錯誤產生.. 傷腦筋..拜託一下囉
~悠遊法國號~
lgm55
一般會員


發表:14
回覆:34
積分:9
註冊:2004-03-01

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-04-09 22:23:31 IP:211.76.xxx.xxx 未訂閱
yachanga大大您好: 對不起,耽誤您不少時間 小弟改成這樣 void __fastcall TfrmMain::dbcboUnitChange(TObject *Sender) { Query2->Filter="單位='" dbcboUnit->Text "'"; Query2->Filtered=true; } 還是不行,真不知怎麼辦.. 能幫小弟再想想問題會在哪嗎?
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-04-09 23:26:58 IP:61.230.xxx.xxx 未訂閱
Hi lgm55您好: 您客氣了.. 只是您只說"還是不行", 實在很難知道問題所在... 所以才會把解決問題的時間拖長了...    您把問題描述的越清楚, 得到的回應就越清楚... 這裡有很多熱心的高手前輩都很樂意分享經驗喔.....    以下的Code應該可以才對.. 是哪裡不work呢??    
引言: yachanga大大您好: 對不起,耽誤您不少時間 小弟改成這樣 void __fastcall TfrmMain::dbcboUnitChange(TObject *Sender) { Query2->Filter="單位='" dbcboUnit->Text "'"; Query2->Filtered=true; } 還是不行,真不知怎麼辦.. 能幫小弟再想想問題會在哪嗎?
~悠遊法國號~ 發表人 - yachanga 於 2004/04/09 23:30:36
lgm55
一般會員


發表:14
回覆:34
積分:9
註冊:2004-03-01

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-04-10 00:02:00 IP:211.76.xxx.xxx 未訂閱
對不起,小弟再重新整理一次 在Query1的SQL中輸入 select 單位 from 車輛編裝(Query1的Active為false,應沒差吧,因為下面有Open,是嗎?) Query1的DataSource的屬性為空白,然後如下 void __fastcall TfrmMain::dbcboUnitDropDown(TObject *Sender) { dbcboUnit->Clear(); Query1->Open(); while(!Query1->Eof) { dbcboUnit->Items->Add(Query1->FieldByName("單位")->AsString); Query1->Next(); } Query1->Close(); } 以上都OK..... 然後 在Query2的SQL輸入 select * from 車輛編裝(Query2已設Active為True) Query2的DataSource屬性為空白 加入一個TDataSource元件,名稱為DataSource2 DataSource2的DataSet屬性設為Query2 然後指揮官那個DBEdit的DataSource屬性設為DataSource2, DataField選擇"指揮官" 車數那個DBEdit的DataSource屬性設為DataSource2, DataField選擇"車數" 然後單位那個DBComboBox的DataSource屬性設為Query2, DataField沒有設 然後如下 void __fastcall TfrmMain::dbcboUnitChange(TObject *Sender) { Query2->Filter="單位='" dbcboUnit->Text "'"; Query2->Filtered=true; } 以上就是小弟的做法.結果指揮官和車數還是不會隨單位而改變 不知哪裡有問題..
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-04-10 12:25:06 IP:61.230.xxx.xxx 未訂閱
不好意思,耽誤您不少時間  我重新將您的需求實作,發覺用ComBoBox比較方便.. 以下為Delphi Code 經過測試OK,請自行轉為BCB    1. 以您的Code為基礎 2. 將DBComboBox1換成ComBoBox1, Code不變 void __fastcall TfrmMain::cboUnitDropDown(TObject *Sender) { cboUnit->Clear(); Query1->Open(); while(!Query1->Eof) { cboUnit->Items->Add(Query1->FieldByName("單位")->AsString); Query1->Next(); } Query1->Close(); }    void __fastcall TfrmMain::cboUnitChange(TObject *Sender) { Query2->Filter="單位='"+cboUnit->Text+"'"; Query2->Filtered=true; }    3.由於是combobox, 需將資料寫回dataset procedure TFORM1.Query2BeforePost(DataSet: TDataSet); begin   query2.fieldbyName('單位').asString:=combobox1.Text; end;    4. 修正完後,離開車數欄位後自動更新資料庫    procedure TFORM1.DBEdit1Exit(Sender: TObject); begin if (query2.State<>dsedit) or (query2.state<>dsinsert) then  query2.Edit;  query2.Post; end;    這樣子,如果更新時單位資料相同則會update,單位資料新的則是Insert.. 加油!!! 發表人 -
lgm55
一般會員


發表:14
回覆:34
積分:9
註冊:2004-03-01

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-04-10 14:01:07 IP:211.76.xxx.xxx 未訂閱
yachanga大大快別這麼說 幫助小弟並不是您的義務,您肯幫小弟,小弟感激都來不及 況且多學一些東東也是好的 經小弟實作結果: 現在步驟1,2均正常了,謝謝您 步驟3.4仍有些問題如下... 在步驟3中,小弟不清楚:=的意義,改成BCB語法如下,不知對不對 void __fastcall TfrmMain::Query2BeforePost(TDataSet *DataSet) { Query2->FieldByName("單位")->AsString=cboUnit->Text; } 在步驟4中,改成BCB語法如下 void __fastcall TfrmMain::dbedtLeaderExit(TObject *Sender)//指揮官 { Query2->Post(); } //------------------------------------------ void __fastcall TfrmMain::dbedtCarNExit(TObject *Sender)//車數 { Query2->Post(); } 步驟3,4之測試結果如下 新增一筆資料之測試: 當在單位欄鍵入新資料時(可輸入),指揮官與車數欄位均同時被清空,但是無法輸入任料,且離開DBEdit元件時出現錯誤訊息如下: Project ObjectMovePlan.exe raised exception class EDatabaseError with message 'Query2:DataSet not in edit or insert mode'. 修改資料之測試: 當修改指揮官貨車數時,是無法輸入的..且離開DBEdit元件時出現錯誤訊息同上 (總之只要離開DBEdit元件時就出現相同錯誤訊息) 拜託拜託再指導一下,好像就差一步..您辛苦了.. 發表人 - lgm55 於 2004/04/10 16:03:09
lgm55
一般會員


發表:14
回覆:34
積分:9
註冊:2004-03-01

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-04-11 04:41:36 IP:211.76.xxx.xxx 未訂閱
yachanga大大您好: 在您細心費神的教導下,終於一切OK了 就知道您搞的定小弟的問題..謝謝,您辛苦了.. 小弟將您指導過,但尚未於此篇中POST的部份整理出來如下.. if(Query2->State!=dsEdit || Query2->State!=dsInsert) { Query2->Edit(); Query2->Post(); } Query2->Close();//解決單位欄會新增一筆,但是當拉下選單選擇該筆新增單 Query2->Open();// 位時,指揮官和車數都顯示空白之問題 Query2的requestLive屬性設為true 還有..Query2的cachedupdate屬性確認是false (這我兩個屬性就不懂是啥東東了) 至於此段程式碼放置之位置,您的三個方法如下: 1.把OnExit事件的code只放在最後一個動作 例如只在車數或指揮官欄位驅動 2.拉一個panel1,把車數欄位和指揮官欄位 放在此panel1上, 單位欄位不放在此panel1上 ,把code在panel1 onexit 上... 3.另外加一個按鈕..如果不確定哪一個欄位為最後修改欄位 可使用此方法. 小弟評估執行之順暢性,畫面之簡潔及減少忘記按確認鈕之失誤等因素,決定採用第一種方式,但加上一些考量,程式碼如下: void __fastcall TfrmMain::dbedtCarNClick(TObject *Sender) { if(dbedtLeader->Text=="") ShowMessage("請輸入指揮官欄位!!"); } //------------------------------------------------------------------- void __fastcall TfrmMain::dbedtCarNExit(TObject *Sender) { if(Query2->State!=dsEdit || Query2->State!=dsInsert) { Query2->Edit(); Query2->Post(); } Query2->Close(); Query2->Open(); } //------------------------------------------------------------------- void __fastcall TfrmMain::cboUnitEnter(TObject *Sender) { if(dbedtCarN->Text=="" && dbedtLeader->Text!="") ShowMessage("請輸入車數欄位!!"); } 經過測試應該一切都OK啦..真棒.. 再次謝謝您有時還熬夜替小弟解答.. 真是辛苦您了,希望以後還能多多指導囉 祝 好運(還有,您拿手的法國號,可別荒廢哦) 發表人 - lgm55 於 2004/04/11 04:51:41 發表人 - lgm55 於 2004/04/11 10:40:35
系統時間:2024-05-21 1:58:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!