線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4185
推到 Plurk!
推到 Facebook!

如何抓取欄位名稱??

答題得分者是:kadee
lasterliu
一般會員


發表:38
回覆:57
積分:19
註冊:2007-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-15 15:22:46 IP:60.251.xxx.xxx 訂閱
各位大大:
小弟碰到一個問題,就是如何抓取欄位名稱?

ADOQuery1.SQL.Add('Select Creater as 創立者 from test');

小弟想抓取此欄位的原來名稱(Creater)來進行條件判斷,但卻不知該如何寫。
PS 小弟是要抓取Creater這原來的名稱,而不是創立者這中文名稱喔!!謝謝。
編輯記錄
lasterliu 重新編輯於 2008-12-15 15:59:26, 註解 無‧
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-15 15:33:49 IP:75.35.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-15 15:59:10 IP:60.251.xxx.xxx 訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-15 17:11:03 IP:220.136.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-15 21:07:56 IP:59.127.xxx.xxx 訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-15 22:12:15 IP:123.192.xxx.xxx 訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-15 22:16:17 IP:123.192.xxx.xxx 訂閱
Kadee大大:
謝謝您的回覆,這方法有符合小弟的需求,都沒想到可以這樣變通^^。
但小弟還是想詢問一下是否有方法或函式可以直接抓取原有欄位的名稱?謝謝各位大大。
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-12-15 23:04:38 IP:122.116.xxx.xxx 未訂閱
您好,
這題可以有很多解法, 我想到的方法是 :

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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-12-16 09:34:13 IP:60.251.xxx.xxx 訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-12-16 12:00:48 IP:220.136.xxx.xxx 未訂閱
我對您的問題的理解是 :
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-12-16 15:03:16 IP:60.251.xxx.xxx 訂閱
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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-12-16 16:07:28 IP:122.116.xxx.xxx 未訂閱
如果是 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 (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-12-16 16:19:49, 註解 無‧
st33chen 重新編輯於 2008-12-16 18:00:50, 註解 無‧
st33chen 重新編輯於 2008-12-18 08:38:17, 註解 無‧
st33chen 重新編輯於 2008-12-18 08:41:43, 註解 無‧
kadee
高階會員


發表:11
回覆:141
積分:165
註冊:2002-03-20

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-12-17 12:43:58 IP:59.127.xxx.xxx 訂閱
哈哈,因為我剛剛用這種方法解決一個類似的小問題。
謝謝你,把這部份作法寫的更詳細。
有時候,我比較希望只點出重點,讓發問者自己想一下,
會比較有成就感。


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-12-17 15:54:14 IP:60.251.xxx.xxx 訂閱
謝謝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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-12-18 08:41:01 IP:122.116.xxx.xxx 未訂閱
雖然已結案, 還是想討論一下我的另一個想法
那就是 直接分析 您 步驟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 (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
系統時間:2024-05-06 7:22:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!