關於資料庫設計的多重選項 |
尚未結案
|
sun740911
一般會員 發表:4 回覆:3 積分:1 註冊:2004-11-18 發送簡訊給我 |
可以幫我一個忙嗎
就是我圖片上現在有"編號" "名稱" "單價" "數量" "安全存量"這五個可以勾選的CheckBox,這五個可以單、複選
然後面後的那個是TextBox(打的條件)
有三個是ComboBox(裡面有 < , = , > 三個選項)
我想要按(查詢)時 我所選的條件 就可以印在ListBox中
我寫的程式是這樣子: List1.Clear
Dim S, i, criteria, ret, a, b, c, d, e
a = "商品編號 = " & Text9
b = "商品名稱 ='" & Text18 & "'"
c = "單價 " & Combo5 & Text17
d = "數量 " & Combo4 & Text16
e = "安全存量 " & Combo3 & Text15 S = ""
For i = 0 To Adodc4.Recordset.Fields.Count - 1
S = S & Adodc4.Recordset.Fields(i).Name & ", "
Next
List1.AddItem S criteria = a
ret = FindFirst(Adodc4.Recordset, criteria)
While ret
S = ""
For i = 0 To Adodc4.Recordset.Fields.Count - 1
S = S & Adodc4.Recordset(i) & ", "
Next
List1.AddItem S
ret = FindNext(Adodc4.Recordset, criteria)
Wend 我勾選一個條件的時候就能成功,可是如果要二個以上的話 就顯示不出來了
有人知怎樣把條件加起來嗎..??
|
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
Delphi語法我不大熟,不過應該跟BCB差不多. 我之前程式的的寫法是在 OnClick 事件上寫
if ( Check1->Checked == true ) S1 = "...SQL語法"; else S1 = "";最後一行寫 SQLString = S S1 S2 S3 S4 .. Send (其中 S = "select xxoo from table1 where "; S1 = CheckBox1 的條件 例如: S1 = "Name = '" Edit1->Text "' and" S2...S5 同上說明 Send = " order by xxoo "; ) 這樣你能理解吧? 就是先在 Class 裡面放 5個 String, 還有SQL語法的頭和尾 各一個. 然後不管哪一個CheckBox 的狀況改變了,就重新組合 SQLString 這個就好了. 沒有打勾的的,就設 Sn = ""; 然後一樣全部相加這樣就好了. 試看看吧.. 發表人 - 海星 於 2004/11/18 23:53:17 |
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
提供你一段如何控制多組選擇的sql組合法, 希望對你有幫助
有關 if 的條件式你應可以舉一反三, 而且不管有幾組, 都依法設定
procedure TForm_RepPos21.btn_FilterClick(Sender: TObject); var flt1, flt2: string; fltall: string; begin flt1:= ''; flt2:= ''; fltall:= ''; // 門市 if cbxDept.Text<>'' then flt1:= 'DEPTNO=''' cbxDept.Text ''''; // 銷貨日期 if (trim(eDate1.Text)<>'') and (trim(eDate2.Text)='') then flt2:= 'FORMDATE>=''' eDate1.Text '''' else if (trim(eDate1.Text)='') and (trim(eDate2.Text)<>'') then flt2:= 'FORMDATE<=''' eDate2.Text '''' else if (trim(eDate1.Text)<>'') and (trim(eDate2.Text)<>'') then flt2:= '(FORMDATE>=''' eDate1.Text ''') and ' '(FORMDATE<=''' eDate2.Text ''')'; // 分析條件 if flt1 <> '' then fltall:= flt1; if flt2 <> '' then begin if fltall= '' then fltall:= flt2 else fltall:= '(' fltall ') and (' flt2 ')'; end; if fltall<>'' then Query1.SQL.Text:= 'select * from DP000 where ' fltall else Query1.SQL.Text:= 'select * from DP000' end; |
sun740911
一般會員 發表:4 回覆:3 積分:1 註冊:2004-11-18 發送簡訊給我 |
我是用vb6做的,我修改了一下程式: List1.Clear
Dim s1, s2, s3, s4, s5, S, i, criteria, ret, SQL, AddString
SQL = "Select * From 材質管理 Where "
If Check2.Value Then
s1 = "商品編號 = '" & Text9 & "' and "
Else
s1 = ""
End If If Check1.Value Then
s2 = "商品名稱 = '" & Text18 & "' and "
Else
s2 = ""
End If If Check3.Value Then
s3 = "單價 " & Combo5 & "'" & Text17 & "' and "
Else
s3 = ""
End If If Check4.Value Then
s4 = "數量 " & Combo4 & "'" & Text16 & "' and "
Else
s4 = ""
End If If Check5.Value Then
s5 = "安全存量 " & Combo3 & "'" & Text15 & "'"
Else
s5 = ""
End If AddString = SQL + s1 + s2 + s3 + s4 + s5 S = ""
For i = 0 To Adodc4.Recordset.Fields.Count - 1
S = S & Adodc4.Recordset.Fields(i).Name & ", "
Next
List1.AddItem S
criteria = AddString
ret = FindFirst(Adodc4.Recordset, criteria)
↑↑↑這裡的ret=false 我改不成功..
While ret
S = ""
For i = 0 To Adodc4.Recordset.Fields.Count - 1
S = S & Adodc4.Recordset(i) & ", "
Next
List1.AddItem S
ret = FindNext(Adodc4.Recordset, criteria)
Wend < >< > 發表人 - sun740911 於 2004/11/19 15:46:36
|
sun740911
一般會員 發表:4 回覆:3 積分:1 註冊:2004-11-18 發送簡訊給我 |
|
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
你的一堆條件最後面是以 ".... and ..." 做結尾, 這樣的 SQL 語法一定是錯誤的,要檢查一下一堆篩選條件最後是否還有" and "存在, 這個and要去除. 我之前給你的寫法是正確的,我直接貼出我之前寫的的程式碼和畫面給你看,
我的程式也是跟你一樣都是可以任意選擇你要的篩選條件。
以下是 BCB C++ 的語法,你自己去模仿改成 VB版
void __fastcall TZForm::BitBtn1Click(TObject *Sender) { String S1, S2, S3, S4, S5, S6, S7, S8, S9; String SQL, SS, SEnd; String SDate, EDate; int YY, MM; SS = "select Serving.*, Firm.Company from Serving ,Firm where Serving.IDCompany = Firm.ID "; if( CheckBox1->Checked == true ) S1 = "and OkDate is Null "; else S1 = ""; if( CheckBox2->Checked == true ) S2 = "and ReturnDate is not NULL "; else S2 = ""; if( CheckBox3->Checked == true ) S3 = "and NewMachine = '1' "; else S3 = ""; if( CheckBox4->Checked == true ) S4 = "and Revise = '1' "; else S4 = ""; if( CheckBox5->Checked == true ) S5 = "and Serving.Zone = '" + ComboBoxZone->Text + "' "; else S5 = ""; if( CheckBox6->Checked == true ) { if(Edit7->Text.IsEmpty() ) { ShowMessage("處理人員欄位尚未填入"); Edit7->SetFocus(); return; } else S6 = "and FixMan = '" + Edit7->Text + "' "; } else S6 = ""; if( CheckBox7->Checked == true ) { if(Edit2->Text.IsEmpty() ) { ShowMessage("客戶名稱欄位尚未填入"); Edit2->SetFocus(); return; } else S7 = "and Firm.Company = '" + Edit2->Text + "' "; } else S7 = ""; if( CheckBox8->Checked == true ) { YY = StrToInt(YearEdit->Text); MM = StrToInt(ComboBox1->Text); SDate = YearEdit->Text + "/" + ComboBox1->Text + "/1"; if( ComboBox1->Text == "12" ) EDate = IntToStr(YY+1) + "/1/1"; else EDate = IntToStr(YY) + "/" + IntToStr(MM+1) + "/1"; S8 = "and OkDate >= '" + SDate + "' and OkDate < '" + EDate + "' "; } else S8 = ""; if( CheckBox9->Checked == true ) S9 = "and PlanDate = '" + DateToStr( DateTimePicker1->Date) + "' "; else S9 = ""; SEnd = " order by OkDate DESC, PlanDate, Firm.Address "; SQL = SS + S1 + S2 + S3 + S4 + S5 + S6 + S7 + S8 + S9 +SEnd; DM->QServing->Close(); DM->QServing->SQL->Clear(); DM->QServing->SQL->Add( SQL ); DM->QServing->Open(); if( !DM->QServing->RecordCount ) { ShowMessage("找不到符合條件的資料。"); } }以下是上面程式碼的實際執行畫面,範例是篩選特定地區和2004年11月已結案 的資料出來。 |
sun740911
一般會員 發表:4 回覆:3 積分:1 註冊:2004-11-18 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |