全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:907
推到 Plurk!
推到 Facebook!

關於資料庫設計的多重選項

尚未結案
sun740911
一般會員


發表:4
回覆:3
積分:1
註冊:2004-11-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-18 21:06:40 IP:219.80.xxx.xxx 未訂閱
可以幫我一個忙嗎 就是我圖片上現在有"編號" "名稱" "單價" "數量" "安全存量"這五個可以勾選的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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-18 23:45:57 IP:59.104.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-19 00:25:00 IP:218.170.xxx.xxx 未訂閱
vb 6 ????
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-19 02:46:12 IP:61.71.xxx.xxx 未訂閱
提供你一段如何控制多組選擇的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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-19 13:41:26 IP:210.62.xxx.xxx 未訂閱
我是用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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-20 13:03:49 IP:219.81.xxx.xxx 未訂閱
有高手可以幫我回答嗎.. 我做專題卡在這裡了.. 老師都在忙不能約時間..好想哭阿=_="
海星
高階會員


發表:41
回覆:217
積分:106
註冊:2003-01-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-22 17:24:26 IP:220.130.xxx.xxx 未訂閱
你的一堆條件最後面是以 ".... 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-23 21:13:27 IP:219.81.xxx.xxx 未訂閱
謝謝你我成功了 只是我換成用DataGrid了.. 用ListBox還是試不出來....QQ 感謝~有問題我在發問巴!!^^
系統時間:2024-05-18 15:33:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!