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

先比對兩表( t1 and t2 ) 中有沒有完全相同的數據,如沒有就插入該條數據!

 
books
一般會員


發表:9
回覆:27
積分:7
註冊:2006-10-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-12-15 11:51:33 IP:220.198.xxx.xxx 訂閱
先比對兩表( t1 and t2 ) 中有沒有完全相同的數據,如沒有就插入該條數據!
請幫忙分析下面代碼,不知為什麼不能對兩表作比對,請高手指點,謝謝!
procedure Tyd.BT_move_addClick(Sender: TObject);
var
s:string;
begin
//先比對兩表( t1 and t2 ) 中有沒有完全相同的數據
with adoquery3 do
begin
close;
sql.Clear;
sql.Add(' ');
sql.Add(' select * from yd_list ');
ADOQuery3.Active:=True;
ADOQuery3.open;
end;
if ADOQuery3.fieldByName('yd_no').asstring=trim(Label11.caption) // and
( ADOQuery3.fieldByName('yd_date').asstring=trim(Label12.caption) ) and
( ADOQuery3.fieldByName('el_no').asstring=trim(edit10.text )) and
( ADOQuery3.fieldByName('dep_name').asstring=trim(edit2.text )) and
( ADOQuery3.fieldByName('ymd').asstring=trim(MaskEdit1.text)) and
( ADOQuery3.fieldByName('el_fin').asstring=trim(edit12.text )) and
( ADOQuery3.fieldByName('el_name').asstring=trim(edit3.text )) and
( ADOQuery3.fieldByName('el_unit').asstring=trim(edit4.text) ) and
( ADOQuery3.fieldByName('el_qty').asstring=trim(edit5.text) ) and
( ADOQuery3.fieldByName('where').asstring=trim(edit6.text )) and
( ADOQuery3.fieldByName('bg_user').asstring=trim(edit7.text )) and
( ADOQuery3.fieldByName('zl_user').asstring=trim(edit8.text )) and
( ADOQuery3.fieldByName('memo').asstring=trim(edit9.text )) and
( ADOQuery3.fieldByName('old_dep_name').asstring=trim(edit13.text )) and
( ADOQuery3.fieldByName('old_where').asstring=trim(edit14.text ))
then
begin
showmessage('Sorry~! 此財產編號在異動歷史記錄中己有一次完全相同的記錄,不能重復,請檢查!');
exit;
end
else
//如沒有就插入該條數據!
if messagebox(0,'你确定要轉移該條記錄嗎?','提示',mb_yesno mb_iconquestion)=idyes then
begin
if (trim(Edit10.text)='') or (length(trim(Edit10.text))<8) then
begin
showmessage('Sorry~! 沒有財產編號記錄或財產編號不對,是不是此條數據有異常,請檢查!');
exit;
end
else
//select yd_no as 異動單號,yd_date as 异動日期,el_no as 資產編號,dep_name as 部門,
//ymd as 取得日期,el_fin as 帳列類別,el_name as 品名,el_unit as 單位,el_qty as 數量,
//where as 放置地點,bg_user as 保管人,zl_user as 責任人,memo as 備注,
//old_dep_name as 申請單位,old_where as 原放置地點 from yd_list
begin
s:='%' Edit10.Text '%';
with adoquery1 do
begin
close;
sql.Clear;
sql.Add(' ');
sql.Add(' insert into yd_list select * from gdzc_1 ');
sql.Add('where el_no like :AA; ');
ADOQuery1.parameters.ParamByName('AA').value:=trim(s);
ADOQuery1.execsql;
end;
application.messagebox('轉移成功!','提示',0 64);
end;
end;
end;

syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-12-15 12:28:55 IP:61.64.xxx.xxx 未訂閱
先問你自己第一個問題,「懂什麼叫資料庫嗎?」
再問你自己第二個問題,「瞭解什麼叫演算法則嗎?」

最後問題就會很簡單的解決

問題:
先比對兩表( t1 and t2 ) 中有沒有完全相同的數據,如沒有就插入該條數據!

解:
1.請在資料庫中,設計好「Primary key」與「index」
2.然後直接使用 select xxx from xxx where Primary key=xxx and index=xxxxx ,找不到,就是沒重複

就是這樣簡單,效能又好,起碼比你的快 10 倍
st33chen
尊榮會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-12-16 11:38:01 IP:59.120.xxx.xxx 未訂閱
您好,
因目的不同, 程式的寫法也會不同
請問, 您的目的是
1. 先比較兩個 t1 和 t2, 如果 t2 中沒有任何一筆資料和 t1 中的相同, 才一次把整個 t2 轉存到 t1 中.
還是
2. 從 t2 中讀入一筆, 如果在 t1 中無完全相同資料, 將該筆資料轉存到 t1 中, 再從 t2 中讀入下一筆
如果是 1. 建議
先 select count(*) all_same from t2, t1 where t2.field1=t1.field1( ) and t2.field2=t1.field2( ) and ........
( ( )是 oracle 語法, 類似 left join )
如果 all_same = 0 , 再
insert into t1 select * from t2
如果是 2. 建議不要一筆一筆讀入再比對, 直接
insert into t1 select * from t2 where t2.field1 || t2.field2 || ..... not in (select t1.field1 || t1.field2 || ...)
當然數字欄位要轉成文字.
您的原程式可能是沒有全部 post 上來, 不然看起來很怪:
讀入 yd_list 第一筆
比對 畫面資料 和 讀入的那一筆
如果沒有任何欄位一樣就整個 gdzc_1 中 el_no like '%' Edit10.Text '%' (可能很多筆) 轉存到 yd_list
另外, 比對時是每個欄位都比, 轉存時只比對key值 el_no, 好像也是不一致的做法.
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
books
一般會員


發表:9
回覆:27
積分:7
註冊:2006-10-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-12-16 20:02:44 IP:220.198.xxx.xxx 訂閱
謝謝樓上的兩位師傅,謝謝你們建議和分析。
其實我的目的是:
1.首先我的gdzc_1表中有一筆數據要開始轉移到yd_list表中去;但是我又不知道以前有沒有轉移過去,所以我先要針對該筆數據到yd_list表中核對有沒有?
2.如果有,就退出,如果沒有就插入該條數據。
3.因為我的yd_list表中有多個字段會重復出現,所以無法建立唯一索引,所以只能一個一個字段作比對,才能確定有沒有重復。
yd_list的數據格式,如下:
字段1 字段2 字段3
a1 12345 5678
a1 23456 123
a2 12345 213
4.我又擔心我會無意中把錯誤的數據(或不需要轉移的數據)轉移過去.
鑒于以上目的,所以我才會寫出這段代碼,但是問題沒有解決,所以現在也很苦悶!

books
一般會員


發表:9
回覆:27
積分:7
註冊:2006-10-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-12-16 20:56:04 IP:220.198.xxx.xxx 訂閱
我又修改成以下:
procedure Tyd.BT_move_addClick(Sender: TObject);
var
s:string;
begin
with adoquery3 do
begin
close;
sql.Clear;
sql.Add('select count(a.yd_no) all_same from yd_list a,gdzc_1 b');
sql.Add(' where (a.yd_no=b.yd_no) and (a.yd_date=b.yd_date) and (a.el_no=b.el_no)');
sql.Add(' and (a.dep_name=b.dep_name) and (a.el_name=b.el_name) and (a.where=b.where)');
sql.Add(' and (a.old_dep_name=b.old_dep_name) and (a.old_where=b.old_where) ');
sql.Add(' and (a.old_dep_name=b.old_dep_name) and (b.yd_no= :AA)');
ADOQuery3.parameters.ParamByName('AA').value:=trim(Label11.caption);
ADOQuery3.Active:=True;
ADOQuery3.execsql;
end;
if ADOQuery3.fieldByName('all_same').value<>0
then
begin
showmessage('Sorry~! 此財產編號在異動歷史記錄中己有一次完全相同的記錄,不能重復,請檢查!');
exit;
end
else
if messagebox(0,'你确定要轉移該條記錄嗎?','提示',mb_yesno mb_iconquestion)=idyes then
begin
if (trim(Edit10.text)='') or (length(trim(Edit10.text))<8) then
begin
showmessage('Sorry~! 沒有財產編號記錄或財產編號不對,是不是此條數據有異常,請檢查!');
exit;
end
else
begin
s:=Edit10.Text;
with adoquery1 do
begin
close;
sql.Clear;
sql.Add(' ');
sql.Add(' insert into yd_list select * from gdzc_1 ');
sql.Add('where el_no like :AA; ');
ADOQuery1.parameters.ParamByName('AA').value:=trim(s);
ADOQuery1.execsql;
end;
application.messagebox('轉移成功!','提示',0 64);
end;
end;
end;
但是當我點這個BT_move_addClick按鈕時,會報如下錯誤:
查詢運算式' count(a.yd_no) all_same '中的語法錯誤(少了運算元).

Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-01-10 11:43:02 IP:61.219.xxx.xxx 訂閱
您好:
如果是 Oracle 9i 以上 有 Merge 指令...例如
MERGE INTO employees e
    USING hr_records h
    ON (e.id = h.emp_id)
  WHEN MATCHED THEN
    UPDATE SET e.address = h.address
  WHEN NOT MATCHED THEN
    INSERT (id, address)
    VALUES (h.emp_id, h.address);
books
一般會員


發表:9
回覆:27
積分:7
註冊:2006-10-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-01-11 11:52:12 IP:220.198.xxx.xxx 訂閱
因為是Access數據庫,這是個很小的程式,又是一個單機版的,所以沒有用到Oracle 9i ,所以謝謝樓上仁兄,問題我自己解決了,方法如下:procedure Tyd.BT_move_addClick(Sender: TObject);
var
i:integer;
s:string;
begin
with adoquery3 do
begin
close;
sql.Clear;
sql.Add('select a.* from yd_list a,gdzc_1 b ');
sql.Add('where [b].[yd_no]=[a].[yd_no] And [b].[el_no]=[a].[el_no] ');
sql.Add('and [a].[el_no]= :AA');
ADOQuery3.parameters.ParamByName('AA').value:=trim(Edit10.Text);
ADOQuery3.Active:=True;
ADOQuery3.execsql;
end;
i:=ADOQuery3.Recordcount;
if i>0 then
begin
showmessage('Sorry~! 此財產編號在異動歷史記錄中己有一次完全相同的記錄,不能重復,請檢查!');
exit;
end
else
begin
if messagebox(0,'異動歷史記錄中無此記錄,你确定要轉移該條記錄嗎?','提示',mb_yesno mb_iconquestion)=idyes then
begin
if (trim(Edit10.text)='') or (length(trim(Edit10.text))<8) then
begin
showmessage('Sorry~! 沒有財產編號記錄或財產編號不對,是不是此條數據有異常,請檢查!');
exit;
end
else
begin
s:=Edit10.Text;
with adoquery1 do
begin
close;
sql.Clear;
sql.Add(' ');
sql.Add(' insert into yd_list select * from gdzc_1 ');
sql.Add('where el_no like :BB; ');
ADOQuery1.parameters.ParamByName('BB').value:=trim(s);
ADOQuery1.execsql;
end;
application.messagebox('轉移成功!','提示',0 64);
end;
end;
end;
end;

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