急件,拜託一下,請問有關資料庫的問題 |
尚未結案
|
lgm55
一般會員 發表:14 回覆:34 積分:9 註冊:2004-03-01 發送簡訊給我 |
各位大大好: 小弟使用一個DBLookupComboBox,和兩個DBEdit元件連結到資料庫(如圖)
當選擇"單位"時,相對應的"指揮官"和"車數"值,便會自動由資料庫中抓出來
當我要修改現有單位的指揮官或車數值時,只要選該單位,
然後直接在DBEdit元件上修改,資料庫亦會變更... 想請問,如果要修改或新增在資料庫中單位時(也就是要讓該新單位在"單位"中可顯示,或者可說要在資料庫中新增一筆資料),有無不用再增加元件的方法能做到呢,例如直接在DBLookupComboBox中輸入單位,可是DBLookupComboBox好像不能直間鍵入說..有用錯元件嗎?還是要用DBComboBox啊,它可達到前一段敘述之要求嗎? 急件..拜託好心的大大幫忙指導一下...
|
yachanga
資深會員 發表:24 回覆:335 積分:296 註冊:2003-09-27 發送簡訊給我 |
引言: 想請問,如果要修改或新增在資料庫中單位時(也就是要讓該新單位在"單位"中可顯示,或者可說要在資料庫中新增一筆資料),有無不用再增加元件的方法能做到呢,例如直接在DBLookupComboBox中輸入單位,可是DBLookupComboBox好像不能直間鍵入說..有用錯元件嗎?還是要用DBComboBox啊,它可達到前一段敘述之要求嗎? 急件..拜託好心的大大幫忙指導一下...您好 我建議用DBComboBox, 就如您所說的, 可以直接鍵入資料, 或是可以用下拉選資料. 唯一比較麻煩的, 是要在dropdown 事件中寫一小段code 把資料庫的資料放到items.. ~悠遊法國號~ 發表人 - yachanga 於 2004/04/06 22:50:46 |
lgm55
一般會員 發表:14 回覆:34 積分:9 註冊:2004-03-01 發送簡訊給我 |
yachanga大大您好:
感謝您迅速的回覆小弟 小弟當初就是因為不會將資料庫的資料放到items..才選擇DBLookupComboBox
再則如用Item→Add方式將鍵入資料加在item中,又要怎樣將item內的這筆新增資料加入資料庫"單位"欄位中呢, 可以示範一小段程式或語法嗎 且這樣做起來,是表示在資料庫中該筆新增資料(單位欄)對應的"指揮官"和"車數"欄位同時亦增加一筆空白資料嗎(待輸入),這樣敘述不知大大您是否懂得小弟意思? 且想請問,那跟用CobomBox有什麼不同,是不是這樣那兩個DBEdit元件就不會跟著"單位"資料而變了 小弟是新手,可以麻煩解答下嗎,謝謝您..
|
yachanga
資深會員 發表:24 回覆:335 積分:296 註冊:2003-09-27 發送簡訊給我 |
小弟當初就是因為不會將資料庫的資料放到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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
yachanga
資深會員 發表:24 回覆:335 積分:296 註冊:2003-09-27 發送簡訊給我 |
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 發送簡訊給我 |
對不起,小弟再重新整理一次
在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 發送簡訊給我 |
不好意思,耽誤您不少時間
我重新將您的需求實作,發覺用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 發送簡訊給我 |
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 發送簡訊給我 |
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
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |