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

如何只顯示單一欄位的值,並新增此欄位到一張新的table?

答題得分者是:herbert2
leien
一般會員


發表:3
回覆:5
積分:1
註冊:2008-10-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-02 14:56:41 IP:59.113.xxx.xxx 訂閱
我用的是BCB6.0

請問大家該如何從一張table中

篩選出我要的範圍,並且只顯示我篩選的那一欄的資料?

如欄位 ID 我篩選條件為 100 < ID <1000

則將ID這一欄的結果輸出到DBGrid上

並且我想用一個按鈕 insert

可以將此篩選結果新增這一欄位到DBGrid2

按鈕的部份我會,想請教大家,在只顯示單一欄位及新增欄位到新table中的寫法該怎麼寫..
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-02 23:54:04 IP:211.72.xxx.xxx 訂閱
只顯示我篩選的那一欄的資料:
SELECT ID FROM WHERE ID BETWEEN 101 AND 999;
(即 101 <= ID <= 999)
則 DBGrid1 便只會有 ID 一個欄位.

DBGrid1->DataSource = DataSource1
DataSource1->DataSet = Query1 (或 Table1)
Query1->SQL = "SELECT ....." 句

可以將此篩選結果新增這一欄位到DBGrid2:
要新增至另一個 Table 並不須要經過 TDBGrid, 直接用 SQL 指令便可解決.
例如: 只有一個欄位, ColumnName 可以是任意, 但 Type 宜與 ID 同, 則:
INSERT INTO
SELECT ID FROM WHERE ID BETWEEN 101 AND 999;

TDBGrid 是個 Display Data 與 Edit 的人機界面元件,
它不是 Table, 故不可以新增、修改、刪除.
新增、修改、刪除的對象是 TDataSet (TQuery 或 TTable 等) 而非 TDBGrid.

===================引 用 leien 文 章===================
請問大家該如何從一張table中
篩選出我要的範圍,並且只顯示我篩選的那一欄的資料?
如欄位 ID 我篩選條件為 100 < ID <1000
則將ID這一欄的結果輸出到DBGrid上

並且我想用一個按鈕 insert
可以將此篩選結果新增這一欄位到DBGrid2
按鈕的部份我會,想請教大家,在只顯示單一欄位及新增欄位到新table中的寫法該怎麼寫..
編輯記錄
herbert2 重新編輯於 2008-11-03 00:03:45, 註解 無‧
leien
一般會員


發表:3
回覆:5
積分:1
註冊:2008-10-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-12 13:22:39 IP:218.173.xxx.xxx 訂閱
謝謝你的回答,經由測試後已經成功顯示一個欄位,
但在插入的部份有問題
我想要將篩選出的這一個欄位資料
插入到一個新的table中(但我需要動態的建立這張table,因為這只是我暫存篩選結果用的table,我希望程式關掉後此table就消失)
而這張table可以不斷的被插入篩選後的單一欄位資料.即當第二次插入時,第一次所插入的欄位仍在,第二次所插入的欄位
會顯示在第二欄上,

以下是我的程式碼,這一段是只測試插入的部份,尚未做到不斷插入

SQLQuery2->Close();
SQLQuery2->SQL->Clear();

SQLQuery2->SQL->Add("INSERT INTO SELECT pk FROM WHERE pk BETWEEN 80 AND 82");

SQLQuery2->Prepared;
SQLQuery2->Open(); // Query1->Active=true;
DataSetProvider2->Constraints= true;
ClientDataSet2->Active = false;
ClientDataSet2->Active = true;
DataSource2->AutoEdit = true ;
上面的程式碼compile出來會有語法的錯誤,pk是此欄位的名稱
若改指定table的話一樣會錯,如下:
SQLQuery2->SQL->Add("INSERT INTO SELECT pk FROM tableName WHERE pk BETWEEN 80 AND 82");
不知道該怎麼處理呢?
另外我有個問題是,若我想從query1所對應的DBGrid1所篩選出的資料中,
挑出單一欄位insert到query2,並顯示在DBGrid2,那我該怎麼寫呢?
目前是連插入的寫法都還未成功.
以下是另一個寫法,一樣有錯
//建立一個新table
SQLQuery2->SQL->Add("create table temp(pk)");
//將table2所篩選出的單一欄位資料插入到temp table
SQLQuery2->SQL->Add("insert into temp(pk) select pk from table2 where pk between 80 AND 82");
//顯示temp table到DBGrid2上
SQLQuery2->SQL->Add("select * from temp where pk between 80 AND 82");
都是錯在insert的那一行指令,不知道哪裡有錯

===================引 用 herbert2 文 章===================
只顯示我篩選的那一欄的資料:
SELECT ID FROM WHERE ID BETWEEN 101 AND 999;
(即 101 <= ID <= 999)
則 DBGrid1 便只會有 ID 一個欄位.

DBGrid1->DataSource = DataSource1
DataSource1->DataSet = Query1 (或 Table1)
Query1->SQL = "SELECT ....." 句

可以將此篩選結果新增這一欄位到DBGrid2:
要新增至另一個 Table 並不須要經過 TDBGrid, 直接用 SQL 指令便可解決.
例如: 只有一個欄位, ColumnName 可以是任意, 但 Type 宜與 ID 同, 則:
INSERT INTO
SELECT ID FROM WHERE ID BETWEEN 101 AND 999;

TDBGrid 是個 Display Data 與 Edit 的人機界面元件,
它不是 Table, 故不可以新增、修改、刪除.
新增、修改、刪除的對象是 TDataSet (TQuery 或 TTable 等) 而非 TDBGrid.

編輯記錄
leien 重新編輯於 2008-11-12 13:35:01, 註解 無‧
leien 重新編輯於 2008-11-12 13:46:55, 註解 無‧
leien 重新編輯於 2008-11-12 13:47:24, 註解 無‧
christie
資深會員


發表:28
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-12 13:51:10 IP:122.117.xxx.xxx 未訂閱
Hi:您用什麼資料庫?
===================引 用 leien 文 章===================
謝謝你的回答,經由測試後已經成功顯示一個欄位,
但在插入的部份有問題
我想要將篩選出的這一個欄位資料
插入到一個新的table中(但我需要動態的建立這張table,因為這只是我暫存篩選結果用的table,我希望程式關掉後此table就消失)
而這張table可以不斷的被插入篩選後的單一欄位資料.即當第二次插入時,第一次所插入的欄位仍在,第二次所插入的欄位
會顯示在第二欄上,

以下是我的程式碼,這一段是只測試插入的部份,尚未做到不斷插入

. . .
------
What do we live for if not to make life less difficult for each other?
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-12 14:07:27 IP:211.72.xxx.xxx 訂閱
Sorry! 補更正 SQL 指令被 KTop 編輯器隱藏掉的要您自行指定的 <TableName>.
INSERT INTO TableName_Temp>
SELECT ID FROM <TableName_Active> WHERE ID BETWEEN 101 AND 999;

<TableName_Temp> 須已存在, 您才可以填入資料.

各資料庫開臨時檔的作法不同, 您提供的資訊不足, 暫無法回答!

再次提醒您, DBGrid 只是『顯示與編輯資料的人機介面』, 不是 DataSet,
永遠不能夠對 DBGrid 篩選資料, 而是要由 Query 從 Server 的 Table 篩選資料.

要把資料錄顯示在 DBGrid2, 就要把資料錄 SELECT 進 DBGrid2 資料來源的 Query2.

===================引 用 leien 文 章===================
另外我有個問題是,若我想從query1所對應的DBGrid1所篩選出的資料中,
挑出單一欄位insert到query2,並顯示在DBGrid2,那我該怎麼寫呢?


以下是另一個寫法,一樣有錯
//建立一個新table
SQLQuery2->SQL->Add("create table temp(pk)");
//將table2所篩選出的單一欄位資料插入到temp table
SQLQuery2->SQL->Add("insert into temp(pk) select pk from table2 where pk between 80 AND 82");
//顯示temp table到DBGrid2上
SQLQuery2->SQL->Add("select * from temp where pk between 80 AND 82");
都是錯在insert的那一行指令,不知道哪裡有錯
編輯記錄
herbert2 重新編輯於 2008-11-12 14:10:14, 註解 無‧
herbert2 重新編輯於 2008-11-12 14:12:48, 註解 無‧
herbert2 重新編輯於 2008-11-12 14:16:18, 註解 無‧
leien
一般會員


發表:3
回覆:5
積分:1
註冊:2008-10-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-12 15:17:47 IP:218.173.xxx.xxx 訂閱
你好 : 

我的資料庫是MySQL 5.0 而BCB是6.0



===================引 用 christie 文 章===================
Hi:您用什麼資料庫?
===================引 用 leien 文 章===================
謝謝你的回答,經由測試後已經成功顯示一個欄位,
但在插入的部份有問題
我想要將篩選出的這一個欄位資料
插入到一個新的table中(但我需要動態的建立這張table,因為這只是我暫存篩選結果用的table,我希望程式關掉後此table就消失)
而這張table可以不斷的被插入篩選後的單一欄位資料.即當第二次插入時,第一次所插入的欄位仍在,第二次所插入的欄位
會顯示在第二欄上,

以下是我的程式碼,這一段是只測試插入的部份,尚未做到不斷插入

. . .
leien
一般會員


發表:3
回覆:5
積分:1
註冊:2008-10-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-12 15:25:02 IP:218.173.xxx.xxx 訂閱
謝謝你再次解答,關於您強調的  "  DBGrid 只是『顯示與編輯資料的人機介面』"
這一個概念的確讓我有豁然開朗的感覺,
如我所說,我的確需要開臨時table來用,不知道您需要我提供什麼樣的資訊呢?

我晚上才能再回覆!

===================引 用 herbert2 文 章===================
Sorry! 補更正 SQL 指令被 KTop 編輯器隱藏掉的要您自行指定的 <TableName>.
INSERT INTO TableName_Temp>
SELECT ID FROM <TableName_Active> WHERE ID BETWEEN 101 AND 999;

<TableName_Temp> 須已存在, 您才可以填入資料.

各資料庫開臨時檔的作法不同, 您提供的資訊不足, 暫無法回答!

再次提醒您, DBGrid 只是『顯示與編輯資料的人機介面』, 不是 DataSet,
永遠不能夠對 DBGrid 篩選資料, 而是要由 Query 從 Server 的 Table 篩選資料.

要把資料錄顯示在 DBGrid2, 就要把資料錄 SELECT 進 DBGrid2 資料來源的 Query2.

===================引 用 leien 文 章===================
另外我有個問題是,若我想從query1所對應的DBGrid1所篩選出的資料中,
挑出單一欄位insert到query2,並顯示在DBGrid2,那我該怎麼寫呢?


以下是另一個寫法,一樣有錯
//建立一個新table
SQLQuery2->SQL->Add("create table temp(pk)");
//將table2所篩選出的單一欄位資料插入到temp table
SQLQuery2->SQL->Add("insert into temp(pk) select pk from table2 where pk between 80 AND 82");
//顯示temp table到DBGrid2上
SQLQuery2->SQL->Add("select * from temp where pk between 80 AND 82");
都是錯在insert的那一行指令,不知道哪裡有錯
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-12 17:01:59 IP:211.72.xxx.xxx 訂閱
據小弟的瞭解, MySQL 5.0 並無您想要的 Temp Table (Oracle 則有, 但也要先 Create).
解決方法:
(1) Create Temp Table (要自行訂好規則, 以避免多人使用時的衝突).
(2) Run your action.
(3) Close Query (Temp Table)
(4) Drop Temp Table.
leien
一般會員


發表:3
回覆:5
積分:1
註冊:2008-10-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-11-12 19:37:54 IP:218.173.xxx.xxx 訂閱
嗯..目前我的想法也是這樣,等我實際測試後看看

===================引 用 herbert2 文 章===================
據小弟的瞭解, MySQL 5.0 並無您想要的 Temp Table (Oracle 則有, 但也要先 Create).
解決方法:
(1) Create Temp Table (要自行訂好規則, 以避免多人使用時的衝突).
(2) Run your action.
(3) Close Query (Temp Table)
(4) Drop Temp Table.
系統時間:2017-10-19 9:36:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!