活動式的查詢選單 |
答題得分者是:christie
|
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
各位大大:
小弟現在碰到一個問題,想詢問各位大大一下,是否有什麼想法或好主意。 小弟現在在製作一個查詢程式, 但是查詢的欄位可以讓client自己從所有欄位任一挑一個來輸入進行查詢, 而結果顯示的欄位也是由client挑選。 因此想請問各位大大,對於這問題各位大大有什麼想法或作法呢? 小弟是想詢問方向跟如何設計,沒有想偷懶完全詢問別人,所以煩請有設計過的大大或有任何創新主意的大大,都可提出您寶貴的想法。 天馬行空也可以,只要創新即ok,謝謝~~^^ |
christie
資深會員 發表:30 回覆:299 積分:475 註冊:2005-03-25 發送簡訊給我 |
EX:
查詢的欄位可以讓client自己從所有欄位任一挑一個來輸入進行查詢. Order by 的欄位可以讓user 自己挑. QryFrm_U.dfm [code delphi] object QryFrm: TQryFrm Left = 3 Top = 110 Width = 870 Height = 640 Caption = 'QryFrm' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object GB2: TGroupBox Left = 144 Top = 16 Width = 393 Height = 529 Caption = '訂購-進階查詢' Color = clInfoBk ParentColor = False TabOrder = 0 Visible = False object SpeedButton11: TSpeedButton Left = 168 Top = 95 Width = 81 Height = 40 Caption = '清除(&L)' Glyph.Data = { 76010000424D7601000000000000760000002800000020000000100000000100 04000000000000010000130B0000130B00001000000000000000000000000000 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000 FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF0033333333B333 333B33FF33337F3333F73BB3777BB7777BB3377FFFF77FFFF77333B000000000 0B3333777777777777333330FFFFFFFF07333337F33333337F333330FFFFFFFF 07333337F33333337F333330FFFFFFFF07333337F33333337F333330FFFFFFFF 07333FF7F33333337FFFBBB0FFFFFFFF0BB37777F3333333777F3BB0FFFFFFFF 0BBB3777F3333FFF77773330FFFF000003333337F333777773333330FFFF0FF0 33333337F3337F37F3333330FFFF0F0B33333337F3337F77FF333330FFFF003B B3333337FFFF77377FF333B000000333BB33337777777F3377FF3BB3333BB333 3BB33773333773333773B333333B3333333B7333333733333337} NumGlyphs = 2 end object Label47: TLabel Left = 18 Top = 360 Width = 72 Height = 13 Caption = '設定排序欄位' end object SpeedButton13: TSpeedButton Left = 187 Top = 397 Width = 23 Height = 22 Glyph.Data = { F6000000424DF600000000000000760000002800000010000000100000000100 04000000000080000000C40E0000C40E00001000000000000000000000000000 80000080000000808000800000008000800080800000C0C0C000808080000000 FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00DDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD0DDDDDDDDDDDDDDD00DDDD DDDDDDDDDD000DDDDDDDDDDDDD0000DDDDDDDDDDDD00000DDDDDDDDDDD000000 DDDDDDDDDD00000DDDDDDDDDDD0000DDDDDDDDDDDD000DDDDDDDDDDDDD00DDDD DDDDDDDDDD0DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD} end object SpeedButton14: TSpeedButton Left = 187 Top = 431 Width = 23 Height = 22 Glyph.Data = { F6000000424DF600000000000000760000002800000010000000100000000100 04000000000080000000C40E0000C40E00001000000000000000000000000000 80000080000000808000800000008000800080800000C0C0C000808080000000 FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00DDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD0DDDDDDDDDDDDDD00DD DDDDDDDDDDD000DDDDDDDDDDDD0000DDDDDDDDDDD00000DDDDDDDDDD000000DD DDDDDDDDD00000DDDDDDDDDDDD0000DDDDDDDDDDDDD000DDDDDDDDDDDDDD00DD DDDDDDDDDDDDD0DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD} end object SpeedButton12: TSpeedButton Left = 260 Top = 95 Width = 113 Height = 40 Caption = '加入(&A)' Glyph.Data = { 76010000424D7601000000000000760000002800000020000000100000000100 04000000000000010000120B0000120B00001000000000000000000000000000 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000 FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333033333 33333333373F33333333333330B03333333333337F7F33333333333330F03333 333333337F7FF3333333333330B00333333333337F773FF33333333330F0F003 333333337F7F773F3333333330B0B0B0333333337F7F7F7F3333333300F0F0F0 333333377F73737F33333330B0BFBFB03333337F7F33337F33333330F0FBFBF0 3333337F7333337F33333330BFBFBFB033333373F3333373333333330BFBFB03 33333337FFFFF7FF3333333300000000333333377777777F333333330EEEEEE0 33333337FFFFFF7FF3333333000000000333333777777777F33333330000000B 03333337777777F7F33333330000000003333337777777773333} NumGlyphs = 2 end object CB_1: TComboBox Left = 16 Top = 56 Width = 145 Height = 21 ItemHeight = 13 TabOrder = 0 Text = 'C_04 訂購單編號' Items.Strings = ( 'C_01 請購單編號' 'C_02 請購單位代碼' 'C_03 請購單位名稱' 'C_04 訂購單編號' 'C_05 訂購日期' 'C_06 料號' 'C_07 名稱' 'C_08 規格' 'C_09 採購單位 unit' 'C_11 單價' 'C_10 數量' 'C_12 供應商代號' 'C_13 供應商名稱' 'C_14 供應商地址' 'C_15 供應商 TEL' 'C_16 供應商 FAX' 'C_17 已驗收註記_Y/_N' 'C_18 已交貨量(unit訂購單位)' 'C_19 預訂交貨日' 'C_20 User ID' 'C_21 設定Fax完成註記' 'C_22 From Msg' 'C_23 To Msg / CHK07 作收件號' 'C_24 品名包裝' 'C_25 交易條件' 'C_26 換算比率' 'C_27 總 價' 'C_28 聯採註記' 'C_29 付款天數' 'C_30 物流商號碼' 'C_31 發票商名' 'C_32 發票日' 'C_33 發票號碼') end object CB_opr: TComboBox Left = 160 Top = 56 Width = 73 Height = 21 ItemHeight = 13 TabOrder = 1 Items.Strings = ( '=' '>' '<' '>=' '<=' '<>' 'LIKE') end object Edt_1: TEdit Left = 232 Top = 56 Width = 153 Height = 21 CharCase = ecUpperCase TabOrder = 2 end object RG1: TRadioGroup Left = 16 Top = 88 Width = 145 Height = 49 Caption = '條件關係' Columns = 2 Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -16 Font.Name = 'Courier' Font.Style = [] ItemIndex = 0 Items.Strings = ( 'AND' 'OR') ParentFont = False TabOrder = 3 end object Memo1: TMemo Left = 16 Top = 151 Width = 359 Height = 194 Color = 13816474 TabOrder = 4 end object ListBox1: TListBox Left = 16 Top = 382 Width = 169 Height = 97 ItemHeight = 13 Items.Strings = ( 'C_01 請購單編號' 'C_02 請購單位代碼' 'C_03 請購單位名稱' 'C_04 訂購單編號' 'C_05 訂購日期' 'C_06 料號' 'C_07 名稱' 'C_08 規格' 'C_09 採購單位 unit' 'C_11 單價' 'C_10 數量' 'C_12 供應商代號' 'C_13 供應商名稱' 'C_14 供應商地址' 'C_15 供應商 TEL' 'C_16 供應商 FAX' 'C_17 已驗收註記' 'C_18 已交貨量(unit訂購單位)' 'C_19 預訂交貨日' 'C_20 User ID' 'C_21 設定Fax完成註記' 'C_22 From Msg' 'C_23 To Msg / CHK07 作收件號' 'C_24 品名包裝' 'C_25 交易條件' 'C_26 換算比率' 'C_27 總 價' 'C_28 聯採註記' 'C_29 付款天數' 'C_30 物流商號碼' 'C_31 發票商名' 'C_32 發票日' 'C_33 發票號碼') TabOrder = 5 end object ListBox2: TListBox Left = 216 Top = 382 Width = 161 Height = 97 ItemHeight = 13 TabOrder = 6 end object BitBtn6: TBitBtn Left = 56 Top = 486 Width = 97 Height = 33 Caption = '確定(&O)' TabOrder = 7 Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF000000000000FF 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF FF00FFFF00FF000000008000000000000000FF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00000000800000FF0000800000 0000000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF 00000000800000FF00FFFFFF00FF00008000000000000000FF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FF00000000800000FF00FFFFFF00FF00FFFFFF00 FF00008000000000000000FF00FFFF00FFFF00FFFF00FFFF00FF000000008000 00FF00FFFFFF00FF0000800000FF00FFFFFF00FF00008000000000000000FF00 FFFF00FFFF00FFFF00FF00000000FF00FFFFFF00FF0000800000000000000000 FF00FFFFFF00FF00008000000000000000FF00FFFF00FFFF00FF00000000FF00 00FF00008000000000FF00FFFF00FF00000000FF00FFFFFF00FF000080000000 00000000FF00FFFF00FFFF00FF000000000000000000FF00FFFF00FFFF00FFFF 00FF00000000FF00FFFFFF00FF00008000000000000000FF00FFFF00FFFF00FF FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00000000FF00FFFFFF00FF 00008000000000000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF 00FFFF00FFFF00FF00000000FF00FFFFFF00FF00008000000000FF00FFFF00FF FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00000000FF 00FFFFFF00FF00000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF 00FFFF00FFFF00FFFF00FFFF00FF000000000000000000FF00FFFF00FFFF00FF FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF} end object BitBtn7: TBitBtn Left = 224 Top = 486 Width = 97 Height = 33 Caption = '取消(&C)' TabOrder = 8 Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF 000000000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000 00000000FF00FFFF00FFFF00FF000000000080000000000000FF00FFFF00FFFF 00FFFF00FFFF00FFFF00FF000000000080000000000000FF00FF0000000000FF 0000FF000080000000000000FF00FFFF00FFFF00FFFF00FF0000000000800000 FF0000FF0000000000000000000000FFFFFFFF0000FF000080000000000000FF 00FFFF00FF0000000000800000FFFFFFFF0000FF000080000000FF00FF000000 0000FFFFFFFF0000FF0000800000000000000000000000800000FFFFFFFF0000 FF000080000000FF00FFFF00FFFF00FF0000000000FFFFFFFF0000FF00008000 00000000800000FFFFFFFF0000FF000080000000FF00FFFF00FFFF00FFFF00FF FF00FF0000000000FFFFFFFF0000FF0000800000FFFFFFFF0000FF0000800000 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000000000FFFFFFFF00 00FFFFFFFF0000FF000080000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF FF00FFFF00FF0000000000800000FFFFFFFF0000FF000080000000000000FF00 FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000000000800000FFFFFFFF00 00FFFFFFFF0000FF000080000000000000FF00FFFF00FFFF00FFFF00FFFF00FF 0000000000800000FFFFFFFF0000FF0000800000FFFFFFFF0000FF0000800000 00000000FF00FFFF00FFFF00FF0000000000800000FFFFFFFF0000FF00008000 00000000000000FFFFFFFF0000FF000080000000000000FF00FF000000000080 0000FFFFFFFF0000FF000080000000FF00FFFF00FF0000000000FFFFFFFF0000 FF0000800000000000000000000000FFFFFFFF0000FF000080000000FF00FFFF 00FFFF00FFFF00FF0000000000FFFFFFFF0000FF000080000000FF00FF000000 0000FF000080000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000000000 FF0000FF000000FF00FFFF00FFFF00FF000000000000FF00FFFF00FFFF00FFFF 00FFFF00FFFF00FFFF00FFFF00FF000000000000FF00FFFF00FF} end end end [/code] QryFrm_U.pas [code delphi] unit QryFrm_U; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls; type TQryFrm = class(TForm) GB2: TGroupBox; SpeedButton11: TSpeedButton; Label47: TLabel; SpeedButton13: TSpeedButton; SpeedButton14: TSpeedButton; SpeedButton12: TSpeedButton; CB_1: TComboBox; CB_opr: TComboBox; Edt_1: TEdit; RG1: TRadioGroup; Memo1: TMemo; ListBox1: TListBox; ListBox2: TListBox; BitBtn6: TBitBtn; BitBtn7: TBitBtn; private { Private declarations } public { Public declarations } end; var QryFrm: TQryFrm; implementation {$R *.dfm} end. [/code] ===================引 用 lasterliu 文 章=================== 各位大大: 小弟現在碰到一個問題,想詢問各位大大一下,是否有什麼想法或好主意。 小弟現在在製作一個查詢程式, 但是查詢的欄位可以讓client自己從所有欄位任一挑一個來輸入進行查詢, 而結果顯示的欄位也是由client挑選。 因此想請問各位大大,對於這問題各位大大有什麼想法或作法呢? 小弟是想詢問方向跟如何設計,沒有想偷懶完全詢問別人,所以煩請有設計過的大大或有任何創新主意的大大,都可提出您寶貴的想法。 天馬行空也可以,只要創新即ok,謝謝~~^^
------
What do we live for if not to make life less difficult for each other? |
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
版主,不好意思,我不知道該怎麼去改標題,下次我會想個有意義的標題地。
christie大大,謝謝您的回答。 小弟再請問您,就是若像大大這樣設計,但我須要有一個欄位輸入值,那麼我須要針對我選到不同欄位,而給予不同的格式嗎? 如: 元件 例子 ComboBox1 ---> 選擇欄位 訂單日期 ComboBox2 ---> 選擇符號 = Edit OR MaskEdit?? ---> 輸入查詢值 是全空白還是____/__/__有此格式給其輸入 若是需針對不同欄位給予不同格式可能就會有點麻煩。 因為BOSS最終目的是希望小弟能做出一個盡量以最少修改(盡量只需改對應不同資料表,給予不同欄位即可), 即可變成別的查詢程式。 小弟若有回答錯的地方或天真的地方,煩請大大指教~~謝謝。
編輯記錄
lasterliu 重新編輯於 2008-09-17 21:03:19, 註解 無‧
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
你們公司太理想化了,想要畢其功於一役,只是好玩而已,但深入一點想,根本是不太可能的任務。
之前,有人是用動態產生Sql的方式,於是畫面象工程師設計程式的畫面一樣,但一點也不Friendly 想像一下,美國各軍種的戰鬥機還分F-是驅逐機、A-是攻擊機、C-是運輸機...他們也想發展一種通用的東東 因此答案在上面,還是得照企業邏輯來分析您的專案,然後區分成幾個大項目,再發展通用查尋器。 若要天馬行空,個人的想法是: 先發展一個萬用型的表單產生器(EXE,DLL皆可),以後使用者有新需求時可以設計存成參數檔或Template(INI,txt皆可)(如果您有用過FastReport,QrstalReport可以存成FR3之類的參數檔),總而言之,就是做一個可變動的查詢引擎加一個設計查詢畫面的程式。
------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2008-09-18 06:11:25, 註解 無‧
|
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
|
christie
資深會員 發表:30 回覆:299 積分:475 註冊:2005-03-25 發送簡訊給我 |
之前的程式碼
請參考 { 97.9.18 產生動態查詢句 ********************************************** } procedure TFINV200.BitBtn6Click(Sender: TObject);//[確定鍵] var s:string; j :word; begin if memo1.Lines.Count=0 then begin MessageBox(handle,'Sorry, 請輸入查詢條件!',pchar(caption),MB_Iconwarning); CB_1.SetFocus; Abort end; GB2.Visible:=False; QTab.CLOSE; QTab.SQL.Text:='select * from CHK' glo_f ' where'; QTab.SQL.AddStrings(Memo1.Lines); gl_SQLstr:=QTab.SQL.Text;//97.3.5 //這一段是order by 的處理 s:=''; if ListBox2.Items.Count>0 then begin for j:=0 to ListBox2.Items.Count-1 do begin s:=s copy(ListBox2.Items[j],1,4); if ansiContainsText(ListBox2.Items[j],'desc') then s:=s ' desc'; s:=s ','; end; s:=ansireplacestr( s, #13#10,' '); j:=length(s); s:=copy(s,1, j -1); end; // 97.2.26 if Length(s)>=4 then begin Qtab.SQL.Add('order by'); Qtab.SQL.Add( s ); end; QTab.Open; DBGrid2.Visible:=True; if Qtab.IsEmpty then begin MessageBox(handle,'範圍內無資料!',PChar(caption),MB_Iconwarning); Abort end; Label97.Caption:=int2str(QTab.RecordCount) '筆'; if QTab.RecordCount = 1 then begin GB1.Visible:=False; gb_flag:=' ' end end; procedure TFINV200.BitBtn7Click(Sender: TObject);//[取消鍵]cancel begin GB2.Visible:=False; end; procedure TFINV200.SpeedButton13Click(Sender: TObject); //[ > ]order by selection begin if ListBox1.Itemindex<0 then MessageDlg('請 挑 選 排 序 欄 位!',mtinformation,[mbOk],0) else ListBox2.Items.Add(ListBox1.Items[ListBox1.Itemindex]) end; procedure TFINV200.SpeedButton14Click(Sender: TObject); //[ < ] begin ListBox2.Items.Delete(Listbox2.ItemIndex); end; procedure TFINV200.SpeedButton11Click(Sender: TObject);//Clear MEmo1 begin Memo1.Lines.Clear end; procedure TFINV200.ListBox2DblClick(Sender: TObject);//遞增 改 遞減(單向)97.2.26 begin if not ansicontainstext(Listbox2.Items[listbox2.ItemIndex],'desc') then listbox2.Items[listbox2.ItemIndex]:=listbox2.Items[listbox2.ItemIndex] 'desc' end; procedure TFINV200.Save2Click(Sender: TObject); //可以將查詢條件存檔 begin if SaveDialog1.Execute then Memo1.Lines.SaveToFile(SaveDialog1.Filename) // 97.2.26 end; procedure TFINV200.LoadfromClick(Sender: TObject); //叫出 查詢條件 begin if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.Filename) // 97.2.26 end; procedure TFINV200.SpeedButton12Click(Sender: TObject);//[加入鍵] Add var str:string; c_no:string; s:string; OP:string; op_r_str:string; wcstr:string;// % opr:string; // > < like m_str:string;//sql 備註字串 begin if Memo1.Lines.Count=0 then op:='' else if RG1.ItemIndex=0 then op:=' AND ' else if RG1.ItemIndex=1 then op:=' OR '; c_no:=copy(cb_1.Text,1,4); m_str:=copy(cb_1.Text,6,Length(cb_1.Text)-5); //97.2.25 if cb_opr.Text='LIKE' then begin op_r_str:=Edt_1.text '%'; //wcstr opr:=' LIKE '; end else begin op_r_str:=edt_1.text; opr:= cb_opr.Text; end; s:=namx.Values[c_no]; // 以 Field_Name 取出 該欄位的型態(Number, Varchar2...) if s[1]='N' then // NUMBER str:=op '(' c_no opr op_r_str ')' else str:=op '(' c_no opr QuotedStr(op_r_str) ')'; Memo1.Lines.Add(str format(' /* %s */',[m_str])) end;
------
What do we live for if not to make life less difficult for each other? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |