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

如何合併兩個Table

答題得分者是:P.D.
superrakce
一般會員


發表:24
回覆:35
積分:11
註冊:2006-10-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-02-03 09:57:56 IP:114.33.xxx.xxx 訂閱
1. 有兩個資料表,必須取出在利用程式處理欄位值,然後合併且會過瀘掉重複的資料
如果用兩個adoquery 取得兩個資料集,那我在欄位處理完後,該如何在本機將資料合併?

2.自建adotable 一定要有 connectionstring 嗎?
我只是想要自建個資料表塞值
var at :TADOTable;
af: TWideStringField;
begin
at := TADOTable.Create(owner);
af := TWideStringField.Create(at);
af.Name := 'ad1';
at.Fields.Add(af);
at.Active := true;


編輯記錄
superrakce 重新編輯於 2012-02-02 18:58:23, 註解 無‧
superrakce 重新編輯於 2012-02-02 19:36:11, 註解 無‧
P.D.
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-02-04 01:07:40 IP:118.169.xxx.xxx 未訂閱
你問了一個好大的問題, 
那也只能大方向來說
兩個資料表是異質性還是同質性(也就是我們常說是同一資料檔內的兩份表, 還是不同資料檔的兩份表)
如果要考慮這樣合併, 通常會利用第3組資料表(TEMPDB) 來做為中間介面,
把第一份表複製到第3份表, 然後與第2份表比對, 相同的就不要再加進來
這是最簡單的想法,
當然如果是同資料檔, 則可以利用SQL語法來過濾兩表中具有相同記錄的, 然後再做處理(還是要第3份表來暫存),
但至少可以減少用迴圈方式, 省很多時間

===================引 用 superrakce 文 章===================
1. 有兩個資料表,必須取出在利用程式處理欄位值,然後合併且會過瀘掉重複的資料
如果用兩個adoquery 取得兩個資料集,那我在欄位處理完後,該如何在本機將資料合併?

2.自建adotable 一定要有 connectionstring 嗎?
我只是想要自建個資料表塞值
var at :TADOTable;
af: TWideStringField;
begin
at := TADOTable.Create(owner);
af := TWideStringField.Create(at);
af.Name := 'ad1';
at.Fields.Add(af);
at.Active := true;


superrakce
一般會員


發表:24
回覆:35
積分:11
註冊:2006-10-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-02-04 09:06:48 IP:114.33.xxx.xxx 訂閱
讓我把狀況巨細靡遺的表示:
Atable:姓名、身份證(加密)
Btable:會員編號、身份證(明碼)

所以兩個資料表是無法在資料庫裡做合併查詢的
所以當使用者下關鍵字搜尋的時
搜尋姓名:select ? from Atable where 姓名 like ?(然後撈出來去解密接著搜尋Btable)
搜尋會員編號:select ? from Btable where 會員編號 like ?(撈出來加密接著搜尋Atable)

當這兩個表都過瀘完出來,最後在本機合併,就不想要再有任何連線返回資料庫了

所以我想要在本機建立一個沒有連線資料庫的資料表
合併這兩個篩選後的資料
這是當資料庫的資料這以這種形式儲存時,我所能想出來的解決辦法
或者有其實更適當的做法我都來try 看看
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-02-04 10:50:31 IP:118.171.xxx.xxx 訂閱
在本機建立記憶體中的資料集可以使用 TClientDataSet 或是 TAdoDataSet
無論是使用 TClientDataSet 還是 TAdoDataSet 方法都一樣

[code delphi]
// 建立 FieldDef
with ADODataSet1.FieldDefs.AddFieldDef do
begin
Name := '姓名';
DataType := ftString;
Size := 10;
end;
with ADODataSet1.FieldDefs.AddFieldDef do
begin
Name := '會員編號';
DataType := ftString;
Size := 10;
end;
with ADODataSet1.FieldDefs.AddFieldDef do
begin
Name := '身份證';
DataType := ftString;
Size := 10;
end;

// 依據 FieldDefs 建立空的資料集
ADODataSet1.CreateDataSet;
[/code]

接下來就可以往 ADODataSet1 裡面塞資料了
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
superrakce
一般會員


發表:24
回覆:35
積分:11
註冊:2006-10-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-02-06 09:25:42 IP:114.33.xxx.xxx 訂閱
如果我在本機建立了兩個TAdoDataSet
該如何join 這兩個tadodataset?

還是要用lookup field?
用Filter 去篩選至第三個TAdoDataSet?

小弟目前的作法是把資料取出,填值到DataSet 然後加密或解密再去搜尋另一份集料集
DataSet 的LookupFied該如何加入?

[code delphi]
var ds:TDataSet; aq:TADOquery;
begin
(以下省略)
ds.FieldDefs.Add('身份證',ftString,15,true);
ds.FieldDefs.Add('o身份證',ftString,15,true);
//ds.FieldDefs.Add('姓名',ftString,20,true);

with TStringField.Create(ds)do
begin
FieldName:='姓名';
FieldKind:=fkLookup;
DataSet:=ds;
Name:='FieldName';
KeyFields:='o身份證';
LookupDataSet:=aq;
LookupKeyFields:='身份證';
LookupResultField:='姓名';

ds.FieldDefs.Add(FieldName,ftString,50,False);
end;
[/code]

會出現 「Cannot perform this operation on an open dataset 」的錯誤


編輯記錄
superrakce 重新編輯於 2012-02-05 23:31:11, 註解 無‧
P.D.
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-02-08 02:47:29 IP:118.169.xxx.xxx 未訂閱
要create field , TAdoDataSet 不可以在開啟狀況, 把 Active 改為 False
===================引 用 superrakce 文 章===================
如果我在本機建立了兩個TAdoDataSet
該如何join 這兩個tadodataset?

還是要用lookup field?
用Filter 去篩選至第三個TAdoDataSet?

小弟目前的作法是把資料取出,填值到DataSet 然後加密或解密再去搜尋另一份集料集
DataSet 的LookupFied該如何加入?

[code delphi]
var ds:TDataSet; aq:TADOquery;
begin
(以下省略)
ds.FieldDefs.Add('身份證',ftString,15,true);
ds.FieldDefs.Add('o身份證',ftString,15,true);
//ds.FieldDefs.Add('姓名',ftString,20,true);

with TStringField.Create(ds)do
begin
FieldName:='姓名';
FieldKind:=fkLookup;
DataSet:=ds;
Name:='FieldName';
KeyFields:='o身份證';
LookupDataSet:=aq;
LookupKeyFields:='身份證';
LookupResultField:='姓名';

ds.FieldDefs.Add(FieldName,ftString,50,False);
end;
[/code]

會出現 「Cannot perform this operation on an open dataset 」的錯誤


系統時間:2024-04-25 11:31:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!