先比對兩表( t1 and t2 ) 中有沒有完全相同的數據,如沒有就插入該條數據! |
|
books
一般會員 ![]() ![]() 發表:9 回覆:27 積分:7 註冊:2006-10-27 發送簡訊給我 |
先比對兩表( 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 發送簡訊給我 |
|
st33chen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
您好,
因目的不同, 程式的寫法也會不同 請問, 您的目的是 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 發送簡訊給我 |
謝謝樓上的兩位師傅,謝謝你們建議和分析。
其實我的目的是: 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 發送簡訊給我 |
我又修改成以下:
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 發送簡訊給我 |
|
books
一般會員 ![]() ![]() 發表:9 回覆:27 積分:7 註冊:2006-10-27 發送簡訊給我 |
因為是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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |