如何抓取欄位名稱?? |
答題得分者是:kadee
|
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
Is this what you meant?
ADOQuery1.FieldByName('Creator').AsString or ADOQuery1.FieldValue['Creator'] ===================引 用 lasterliu 文 章=================== 各位大大: 小弟碰到一個問題,就是如何抓取欄位名稱? ADOQuery1.SQL.Add('Select Creater as 創立者 from test'); 小弟想抓取此欄位的原來名稱(Creater)來進行條件判斷,但卻不知該如何寫。 PS 小弟是要抓取Creater這原來的名稱,而不是創立者這中文名稱喔!!謝謝。 不好意思,PO錯位置了。 |
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
Stallion大大:
不好意思,小弟描述不夠清楚,小弟要的不是這個,因為這程式是一個泛用的查詢,所以沒有辦法指定欄位名稱。 ADOQuery1.FieldByName('Creator').AsString--->欄位的名稱是不能指定的。 小弟原本是寫一個迴圈將ADOQuery1.Fields[i].FieldName中所有欄位名稱傳輸至ComboBox中, 但現在因為查詢時會發生錯誤(會顯示出無效的資料行名稱),因此現在想加上原來欄位的名稱和中文名稱,不知是否可行。 小弟想要的結果為:Creater 創立者 這種組合,但卻不知如何抓取Creater這欄位名稱,怎麼抓都是創立者, 麻煩大大再看一次,看有方法可以解決嗎?麻煩您了,謝謝。
編輯記錄
lasterliu 重新編輯於 2008-12-15 16:01:13, 註解 無‧
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
ADOQuery1.SQL.Add('Select creater, Creater as 創立者 from test'); // 多選一個欄位 抓取此欄位的原來名稱(Creater)來進行條件判斷 adoquery1.fieldbyname('creater').asstring 不知是否切題
===================引 用 lasterliu 文 章=================== 各位大大: 小弟碰到一個問題,就是如何抓取欄位名稱? ADOQuery1.SQL.Add('Select Creater as 創立者 from test'); 小弟想抓取此欄位的原來名稱(Creater)來進行條件判斷,但卻不知該如何寫。 PS 小弟是要抓取Creater這原來的名稱,而不是創立者這中文名稱喔!!謝謝。
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
kadee
高階會員 發表:11 回覆:141 積分:165 註冊:2002-03-20 發送簡訊給我 |
ADOQuery1.SQL.Add('Select Creater as "創立者-Creater" from test');
如此抓進來的欄位名稱就會是 [創立者-Creater] 之後你在自己把 [創立者-Creater] 切成 [創立者]和[Creater] HTH, kadee / www.bigredinf.net ===================引 用 lasterliu 文 章=================== 各位大大: 小弟碰到一個問題,就是如何抓取欄位名稱? ADOQuery1.SQL.Add('Select Creater as 創立者 from test'); 小弟想抓取此欄位的原來名稱(Creater)來進行條件判斷,但卻不知該如何寫。 PS 小弟是要抓取Creater這原來的名稱,而不是創立者這中文名稱喔!!謝謝。
------
Kadee/BigRed Ent. www.tw165.com |
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
st33chen大大您好:
謝謝您的答覆,但這依然不是小弟要的答案。 這程式是開發給各個查詢都可使用,所以裡面不會有確切的欄位名稱,因為資料表中的欄位不會都相同。 小弟在此再描述一下程式大概內容,不好意思,因為無法貼上原內容,所以有描述不好或不詳細的地方,敬請包含。 1、將程式名稱與查詢的條件式寫至DB中。 2、程式一開始會依USER選擇的程式名稱,去抓取DB中查詢條件式欄位的內容並進行執行。 3、將欄位名稱全部傳至第二個FORM的ComboBox中。(這裡因為要顯示中文好讓USER容易選擇,所以在DB的查詢條件式中,都會將各個欄位別名) 4、讓USER自己選取欲下的條件式與排序進行查詢(ADOQuery1.Field[ComboBox1.ItemIndex].AsString)。 而小弟的問題則再第三與四點,別名的中文只是想讓USER好判別選擇,但實際在進行查詢時,希望能用原來的欄位名稱,才不會有誤。 如:Name 姓名 = '王小明' ---> 選取加入 ---> 則條件式是希望能加入 Name = '王小明' ---> 這是小弟想要的結果。 但目前為止,小弟若在DB中給予別名後,將不知該如何抓取原有的欄位名稱(也就是例如中的Name此欄位),只知道抓取中文的欄位名稱(也就是姓名)。 目前錯誤結果:姓名 = '王小明' ---> 選取加入 ---> 姓名 = '王小明' ---> 這會導致錯誤(無效的資料行名稱) 而大大指導小弟的方法,ADOQuery1.FieldByName('Creater').AsString中的Creater不能寫在程式中,如此此查詢程式就寫死了。 因此想詢問各位大大是否有方法可以抓取原有欄位名稱與別名,謝謝。 |
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
您好,
這題可以有很多解法, 我想到的方法是 : 3、將欄位名稱全部傳至第二個FORM的ComboBox中。(這裡因為要顯示中文好讓USER容易選擇,所以在DB的查詢條件式中,都會將各個欄位別名), 在這個同時, 把 (英文)欄位名稱 依 別名 放入 combobox 的順序 存入一個 stringlist (假設為 mylist). 4、讓USER自己選取欲下的條件式與排序進行查詢(ADOQuery1.Field[ComboBox1.ItemIndex].AsString)。 當使用者選 combobox 時, 要組成 sql 的(英文)欄位名稱由 mylist.strings[combobox.itemindex] 提供. 參考一下. ===================引 用 lasterliu 文 章=================== st33chen大大您好: 謝謝您的答覆,但這依然不是小弟要的答案。 這程式是開發給各個查詢都可使用,所以裡面不會有確切的欄位名稱,因為資料表中的欄位不會都相同。 小弟在此再描述一下程式大概內容,不好意思,因為無法貼上原內容,所以有描述不好或不詳細的地方,敬請包含。 1、將程式名稱與查詢的條件式寫至DB中。 2、程式一開始會依USER選擇的程式名稱,去抓取DB中查詢條件式欄位的內容並進行執行。 3、將欄位名稱全部傳至第二個FORM的ComboBox中。(這裡因為要顯示中文好讓USER容易選擇,所以在DB的查詢條件式中,都會將各個欄位別名) 4、讓USER自己選取欲下的條件式與排序進行查詢(ADOQuery1.Field[ComboBox1.ItemIndex].AsString)。 而小弟的問題則再第三與四點,別名的中文只是想讓USER好判別選擇,但實際在進行查詢時,希望能用原來的欄位名稱,才不會有誤。 如:Name 姓名 = '王小明' ---> 選取加入 ---> 則條件式是希望能加入 Name = '王小明' ---> 這是小弟想要的結果。 但目前為止,小弟若在DB中給予別名後,將不知該如何抓取原有的欄位名稱(也就是例如中的Name此欄位),只知道抓取中文的欄位名稱(也就是姓名)。 目前錯誤結果:姓名 = '王小明' ---> 選取加入 ---> 姓名 = '王小明' ---> 這會導致錯誤(無效的資料行名稱) 而大大指導小弟的方法,ADOQuery1.FieldByName('Creater').AsString中的Creater不能寫在程式中,如此此查詢程式就寫死了。 因此想詢問各位大大是否有方法可以抓取原有欄位名稱與別名,謝謝。
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-12-15 23:06:51, 註解 無‧
|
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
st33chen大大您好:
小弟不太明白您的意思,當我將條件式寫在DB中(如:Select Name as 姓名,Age as 年紀 from employees), 當存放至ComboBox時,裡面的資料會是中文(姓名與年紀。小弟只會用這語法ADOQuery1.Field[ComboBox1.ItemIndex].AsString), 而大大說可再傳送另一英文資料(Name與Age)至StringList中,小弟不明白這裏要怎麼做到,因為小弟會的語法只能傳送中文。 還是說大大的意思是叫小弟另外寫同樣的一段條件式,但這段條件式不給予別名,再將欄位資料傳至StringList中。 若有說錯的地方,敬請見諒,謝謝大大撥空幫忙。 |
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
我對您的問題的理解是 : 1、將程式名稱與查詢的條件式寫至DB中。 DB 的某個 TABLE 存 PROG_NAME SQL_TEXT -------------------- -------------------------------------------------------------------- PROGA Select Name as 姓名,Age as 年紀 from employees <---- 您的例子 PROGB SELECT NAME AS 品名, QTY AS 數量 FROM PRODUCTS <---- 我加的例子 ... 2、程式一開始會依USER選擇的程式名稱,去抓取DB中查詢條件式欄位的內容並進行執行。 使用者選擇 PROGA, 您會抓到 Select Name as 姓名,Age as 年紀 from employees, 假設放在 SSTR; 把他放入SQL並執行 : ADOQUERY1.SQL.TEXT := SSTR; ADOQUERY1.OPEN; 3、將欄位名稱全部傳至第二個FORM的ComboBox中。(這裡因為要顯示中文好讓USER容易選擇,所以在DB的查詢條件式中,都會將各個欄位別名) 您的意思是 (3-1) : FORM2.COMBOBOX.CLEAR; FOR II := 0 TO ADOQUERY1.FIELDS[II].COUNT-1 DO BEGIN FORM2.COMBOBOX.ITEMS.ADD(ADOQUERY1.FIELDS[II].FIELDNAME); END; 所以 FORM2.COMBOBOX 的內容 姓名 年紀 還是 (3-2) : FORM2.COMBOBOX.CLEAR; WHILE NOT ADOQUERY1.EOF DO BEGIN FORM2.COMBOBOX.ITEMS.ADD(ADOQUERY1.FIELDS[0].ASSTRING ' ' ADOQUERY1.FIELDS[1].ASSTRING); QUERY1.NEXT; END; 所以 FORM2.COMBOBOX 的內容 陳誰扁 20 馬應久 21 謝常停 19 ... 4、讓USER自己選取欲下的條件式與排序進行查詢(ADOQuery1.Field[ComboBox1.ItemIndex].AsString)。 如果是 3-1,
假設 使用者 選 姓名, 您用一個 EDIT1 讓使用者輸入他要查什麼姓名, 然後建構查詢 SQL : ADOQUERY1.SQL.TEXT := 'SELECT * FROM ... WHERE 姓名=''' EDIT1.TEXT ''''; 您希望改成 ADOQUERY1.SQL.TEXT := 'SELECT * FROM ... WHERE NAME=''' EDIT1.TEXT ''''; 如果是 3-2 假設 使用者選到 ABC 30 您要結構另一個 SQL 去做另一個查詢 II := POS(' ', COMBOBOX.TEXT); ADOQUERY2.SQL.TEXT := 'SELECT * FROM ... WHERE 姓名=''' COPY(COMBOBOX.TEXT,1,II-1) ''' AND 年紀=''' COPY(COMBOBOX.TEXT,II 1,100) ''''; 您希望改成 ADOQUERY2.SQL.TEXT := 'SELECT * FROM ... WHERE NAME=''' COPY(COMBOBOX.TEXT,1,II-1) ''' AND AGE=''' COPY(COMBOBOX.TEXT,II 1,100) ''''; 如果不是, 請依這個例子的樣子, 虛擬個例子具体說明您的問題 說不定您可以用 DBLOOKUPCOMBOBOX 來做, 不必自己處理呢. ===================引 用 lasterliu 文 章=================== st33chen大大您好: 小弟不太明白您的意思,當我將條件式寫在DB中(如:Select Name as 姓名,Age as 年紀 from employees), 當存放至ComboBox時,裡面的資料會是中文(姓名與年紀。小弟只會用這語法ADOQuery1.Field[ComboBox1.ItemIndex].AsString), 而大大說可再傳送另一英文資料(Name與Age)至StringList中,小弟不明白這裏要怎麼做到,因為小弟會的語法只能傳送中文。 還是說大大的意思是叫小弟另外寫同樣的一段條件式,但這段條件式不給予別名,再將欄位資料傳至StringList中。 若有說錯的地方,敬請見諒,謝謝大大撥空幫忙。
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
st33chen大大:
謝謝您的回覆,看到內容超感動的,超詳細的,再次感謝您。 我程式的內容跟大大描述的差不多,第一、二點沒問題,第三點小弟程式是3-1,第四點也如大大所說的結果跟小弟想改的結果一模一樣。 3-1 FORM2.COMBOBOX.CLEAR; FOR II := 0 TO ADOQUERY1.FIELDS[II].COUNT-1 DO BEGIN FORM2.COMBOBOX.ITEMS.ADD(ADOQUERY1.FIELDS[II].FIELDNAME); END; 所以 FORM2.COMBOBOX 的內容 姓名 年紀 ========> 小弟原先想法是想將其改為 Age 年紀,然後再建構查詢SQL時進行判斷,但是問題卡在不會抓Age這英文的欄位名稱, 怎麼試都是抓到年紀的欄位名稱。 Age 年紀 ---> Copy(ComboBox.Items[ComboBox.ItemIndex],1,Pos(' ',ComboBox.Items[ComboBox.ItemIndex])) ---> Age 假設 使用者 選 姓名, 您用一個 EDIT1 讓使用者輸入他要查什麼姓名, 然後建構查詢 SQL : ADOQUERY1.SQL.TEXT := 'SELECT * FROM ... WHERE 姓名=''' EDIT1.TEXT ''''; 您希望改成 ADOQUERY1.SQL.TEXT := 'SELECT * FROM ... WHERE NAME=''' EDIT1.TEXT ''''; 謝謝 ===================引 用 st33chen 文 章=================== 我對您的問題的理解是 : ? 1、將程式名稱與查詢的條件式寫至DB中。 DB 的某個 TABLE 存 PROG_NAME SQL_TEXT -------------------- -------------------------------------------------------------------- PROGA Select Name as 姓名,Age as 年紀 from employees <---- 您的例子 PROGB SELECT NAME AS 品名, QTY AS 數量 FROM PRODUCTS <---- 我加的例子 ... 2、程式一開始會依USER選擇的程式名稱,去抓取DB中查詢條件式欄位的內容並進行執行。 使用者選擇 PROGA, 您會抓到 Select Name as 姓名,Age as 年紀 from employees, 假設放在 SSTR; 把他放入SQL並執行 : ADOQUERY1.SQL.TEXT := SSTR; ADOQUERY1.OPEN; 3、將欄位名稱全部傳至第二個FORM的ComboBox中。(這裡因為要顯示中文好讓USER容易選擇,所以在DB的查詢條件式中,都會將各個欄位別名) 您的意思是 (3-1) : FORM2.COMBOBOX.CLEAR; FOR II := 0 TO ADOQUERY1.FIELDS[II].COUNT-1 DO BEGIN FORM2.COMBOBOX.ITEMS.ADD(ADOQUERY1.FIELDS[II].FIELDNAME); END; 所以 FORM2.COMBOBOX 的內容 姓名 年紀 還是 (3-2) : FORM2.COMBOBOX.CLEAR; WHILE NOT ADOQUERY1.EOF DO BEGIN FORM2.COMBOBOX.ITEMS.ADD(ADOQUERY1.FIELDS[0].ASSTRING ' ' ADOQUERY1.FIELDS[1].ASSTRING); QUERY1.NEXT; END; 所以 FORM2.COMBOBOX 的內容 陳誰扁 20 馬應久 21 謝常停 19 ... 4、讓USER自己選取欲下的條件式與排序進行查詢(ADOQuery1.Field[ComboBox1.ItemIndex].AsString)。 ? 如果是 3-1,
假設 使用者 選 姓名, 您用一個 EDIT1 讓使用者輸入他要查什麼姓名, 然後建構查詢 SQL : ADOQUERY1.SQL.TEXT := 'SELECT * FROM ... WHERE 姓名=''' EDIT1.TEXT ''''; 您希望改成 ADOQUERY1.SQL.TEXT := 'SELECT * FROM ... WHERE NAME=''' EDIT1.TEXT ''''; 如果是 3-2 假設 使用者選到 ABC 30 您要結構另一個 SQL 去做另一個查詢 II := POS(' ', COMBOBOX.TEXT); ADOQUERY2.SQL.TEXT := 'SELECT * FROM ... WHERE 姓名=''' COPY(COMBOBOX.TEXT,1,II-1) ''' AND 年紀=''' COPY(COMBOBOX.TEXT,II 1,100) ''''; 您希望改成 ADOQUERY2.SQL.TEXT := 'SELECT * FROM ... WHERE NAME=''' COPY(COMBOBOX.TEXT,1,II-1) ''' AND AGE=''' COPY(COMBOBOX.TEXT,II 1,100) ''''; 如果不是, 請依這個例子的樣子, 虛擬個例子具体說明您的問題 說不定您可以用 DBLOOKUPCOMBOBOX 來做, 不必自己處理呢. ===================引 用 lasterliu 文 章=================== st33chen大大您好: 小弟不太明白您的意思,當我將條件式寫在DB中(如:Select Name as 姓名,Age as 年紀 from employees), 當存放至ComboBox時,裡面的資料會是中文(姓名與年紀。小弟只會用這語法ADOQuery1.Field[ComboBox1.ItemIndex].AsString), 而大大說可再傳送另一英文資料(Name與Age)至StringList中,小弟不明白這裏要怎麼做到,因為小弟會的語法只能傳送中文。 還是說大大的意思是叫小弟另外寫同樣的一段條件式,但這段條件式不給予別名,再將欄位資料傳至StringList中。 若有說錯的地方,敬請見諒,謝謝大大撥空幫忙。 |
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
如果是 3-1 的話, 我的解法是
1、將程式名稱與查詢的條件式寫至DB中。 DB 的某個 TABLE 存 PROG_NAME SQL_TEXT -------------------- -------------------------------------------------------------------- PROGA Select Name as 姓名_name, Age as 年紀_age from employees <---- 借用 kadee 大大的方法 PROGB Select Name as 品名, QTY AS 數量, name, qty FROM PRODUCTS <---- 我的方法, 後來覺得 kadee 的方法比較好 ... 3、將欄位名稱全部傳至第二個FORM的ComboBox中。(這裡因為要顯示中文好讓USER容易選擇,所以在DB的查詢條件式中,都會將各個欄位別名) 用 var mylist : tstringlist; 或是新增一個 combobox2, 但 visible 設為 false, 讓使用者看不到.(這裡用後法) FORM2.COMBOBOX.CLEAR; FORM2.COMBOBOX2.CLEAR; FOR II := 0 TO ADOQUERY1.FIELDS[II].COUNT-1 DO BEGIN ASTR := ADOQUERY1.FIELDS[II].FIELDNAME; // ASTR, JJ 為新增變數 JJ := POS('_', ASTR); FORM2.COMBOBOX.ITEMS.ADD(COPY(ASTR,1,JJ-1)); FORM2.COMBOBOX2.ITEMS.ADD(COPY(ASTR,JJ 1,100)); END; 所以 FORM2.COMBOBOX 的內容 姓名 年紀 FORM2.COMBOBOX2 的內容 name age 4、讓USER自己選取欲下的條件式與排序進行查詢(ADOQuery1.Field[ComboBox1.ItemIndex].AsString)。 假設 使用者 選 姓名, 您用一個 EDIT1 讓使用者輸入他要查什麼姓名, 然後建構查詢 SQL : ADOQUERY1.SQL.TEXT := 'SELECT * FROM ... WHERE ' combobox2.items[combobox1.itemindex] ' =''' EDIT1.TEXT ''''; 也可以 combobox 的 o n c h a n g e 事件加 combobox2.itemindex := combobox.itemindex; 那就 ADOQUERY1.SQL.TEXT := 'SELECT * FROM ... WHERE ' combobox2.text ' =''' EDIT1.TEXT ''''; 以上是我憑想像寫的, 沒有實測. 參考一下. 不過我想問您, kadee 大 的解法很好啊, 您為什麼不用呢? 引伸 kadee 大的做法 1. 的部份和上述一樣 3. 的部份, 未加處理, 所以 FORM2.COMBOBOX 的內容 姓名_name 年紀_age 4. 的部份 ii := pos('_', combobox.text); ADOQUERY1.SQL.TEXT := 'SELECT * FROM ... WHERE ' copy(combobox.text,ii 1,100) ' =''' EDIT1.TEXT ''''; 差別就只在使用者看到 combobox 的內容不一樣而已. 看來, kadee 大比較早理解您的問題所在哦.
======================================================================= 等一下, 我想到了 TQUERY 的 TSTRINGFIELD 有個 ORIGIN 屬性好像可以用哦. 如果可以, 那就不必寫這麼多廢話了, 您也試一下吧. ======================================================================= origin 應該可以用, 如下, 不過好像(寫程式的功夫)差別不大 1. 的部份不用改, 就用您原本的 3. 的部份 用 var mylist : tstringlist; 或是新增一個 combobox2, 但 visible 設為 false, 讓使用者看不到.(這裡用後法) FORM2.COMBOBOX.CLEAR; FORM2.COMBOBOX2.CLEAR; FOR II := 0 TO ADOQUERY1.FIELDS[II].COUNT-1 DO BEGIN FORM2.COMBOBOX.ITEMS.ADD(ADOQUERY1.FIELDS[II].FIELDNAME); ASTR := ADOQUERY1.FIELDS[II].ORIGIN; // ASTR, JJ 為新增變數 JJ := POS('.', ASTR); FORM2.COMBOBOX2.ITEMS.ADD(COPY(ASTR,JJ 1,100)); END; 所以 FORM2.COMBOBOX 的內容 姓名 年紀 FORM2.COMBOBOX2 的內容 name age 4. 的部份, 同上述. ============================================ 再多癈話一段, 如果您的 1. DB 的某個 TABLE 存 PROG_NAME SQL_TEXT -------------------- -------------------------------------------------------------------- 改成 PROG_NAME TABLENAME FLDNAME FLDNAMEC ---------------------- -------------------- --------------- ----------------- PROGA EMPLOYEE NAME 姓名 PROGA EMPLOYEE AGE 年紀 ..... 這種結構, 那可能就可以用 DBLOOKUPCOMBOBOX 來處理, 好像可以簡化程式. 參考一下
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
kadee
高階會員 發表:11 回覆:141 積分:165 註冊:2002-03-20 發送簡訊給我 |
哈哈,因為我剛剛用這種方法解決一個類似的小問題。
謝謝你,把這部份作法寫的更詳細。 有時候,我比較希望只點出重點,讓發問者自己想一下, 會比較有成就感。 Kadee / www.bigredinf.net ===================引 用 st33chen 文 章=================== 如果是 3-1 的話, 我的解法是 1、將程式名稱與查詢的條件式寫至DB中。 DB 的某個 TABLE 存 PROG_NAME SQL_TEXT -------------------- -------------------------------------------------------------------- PROGA Select Name as 姓名_name, Age as 年紀_age from employees <---- 借用 kadee 大大的方法 PROGB Select Name as 品名, QTY AS 數量, name, qty FROM PRODUCTS <---- 我的方法, 後來覺得 kadee 的方法比較好 ... 3、將欄位名稱全部傳至第二個FORM的ComboBox中。(這裡因為要顯示中文好讓USER容易選擇,所以在DB的查詢條件式中,都會將各個欄位別名) 用 var mylist : tstringlist; 或是新增一個 combobox2, 但 visible 設為 false, 讓使用者看不到.(這裡用後法) FORM2.COMBOBOX.CLEAR; FORM2.COMBOBOX2.CLEAR; FOR II := 0 TO ADOQUERY1.FIELDS[II].COUNT-1 DO BEGIN ASTR := ADOQUERY1.FIELDS[II].FIELDNAME; // ASTR, JJ 為新增變數 JJ := POS('_', ASTR); FORM2.COMBOBOX.ITEMS.ADD(COPY(ASTR,1,JJ-1)); FORM2.COMBOBOX2.ITEMS.ADD(COPY(ASTR,JJ 1,100)); END; 所以 FORM2.COMBOBOX 的內容 姓名 年紀 FORM2.COMBOBOX2 的內容 name age 4、讓USER自己選取欲下的條件式與排序進行查詢(ADOQuery1.Field[ComboBox1.ItemIndex].AsString)。 假設 使用者 選 姓名, 您用一個 EDIT1 讓使用者輸入他要查什麼姓名, 然後建構查詢 SQL : ADOQUERY1.SQL.TEXT := 'SELECT * FROM ... WHERE ' combobox2.items[combobox1.itemindex] ' =''' EDIT1.TEXT ''''; 也可以 combobox 的 o n c h a n g e 事件加 combobox2.itemindex := combobox.itemindex; 那就 ADOQUERY1.SQL.TEXT := 'SELECT * FROM ... WHERE ' combobox2.text ' =''' EDIT1.TEXT ''''; 以上是我憑想像寫的, 沒有實測. 參考一下. 不過我想問您, kadee 大 的解法很好啊, 您為什麼不用呢? 引伸 kadee 大的做法 1. 的部份和上述一樣 3. 的部份, 未加處理, 所以 FORM2.COMBOBOX 的內容 姓名_name 年紀_age 4. 的部份 ii := pos('_', combobox.text); ADOQUERY1.SQL.TEXT := 'SELECT * FROM ... WHERE ' copy(combobox.text,ii 1,100) ' =''' EDIT1.TEXT ''''; 差別就只在使用者看到 combobox 的內容不一樣而已. 看來, kadee 大比較早理解您的問題所在哦.
.....
------
Kadee/BigRed Ent. www.tw165.com |
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
謝謝kadee與st33chen大大的答覆,小弟決定使用 Select Name as 姓名_name, Age as 年紀_age from employees 這個方法,不過只傳至一個ComboBox中,擷取資料時將會把第一個底線後面的資料全擷取下來進行查詢。
PS kadee大大的回答當時有符合小弟的答案,但若是照kadee大大所說的(也是小弟目前所要採納的方法),小弟需要改的欄位資料會有很多,之前都是寫 Select Name as 姓名, Age as 年紀 from employees ---->Select Name as 姓名_name, Age as 年紀_age from employees , 所以才會繼續詢問是否有可以直接取出原欄位資料的方法。 st33chen大大,小弟有試了 ORIGIN 這屬性,但是都無顯示任何東西,看了HELP內容,推測是否要使用BDE元件才能使用這屬性。 感謝兩位大大的幫忙,謝謝。 |
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
雖然已結案, 還是想討論一下我的另一個想法
那就是 直接分析 您 步驟1. 的語句, 這樣就不必改 這些語句的語法 例如 : Select Name as 姓名, Age as 年紀 from employees 保留原來的樣子 1. 抓出 SELECT 和 FROM 之間的子字串加一個',', 假設放在 ASTR 2. 做一個 WHILE LOOP, 只要 ' AS ' 存在於 ASTR 中 3. 抓出 ' AS ' 前的子字串放入 COMBOBOX2 // 這是英文欄位名, 或 一個 TSTRINGLIST 也可以 4. 抓出 ' AS ' 後至 ',' 之間的子字串 放入 COMBOBOX // 這是給使用者看的欄位中文譯名 5. 修正 ASTR, 拿掉已處理的部份 6. 結束 WHILE 接下來就是前面提過的步驟4 再參考一下 LO
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |