全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4141
推到 Plurk!
推到 Facebook!

資料重覆比對

尚未結案
smallmi
一般會員


發表:18
回覆:18
積分:7
註冊:2012-09-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-08-19 21:22:44 IP:124.11.xxx.xxx 訂閱
 請問各位版大...有什麼方式可以達到以下效果...請各位版大指導...謝謝!!
讀取文字檔並存入資料庫...但是再存入資料庫前先比對資料庫是否有重覆的值
如有的話...則該筆資料不存入...
例如....文字檔中檔案內容如下
2013081900
2013081901
2013081902
2013081903
假如資料庫中已有2013081902...該筆資料不存入...存2013081900,2013081901,2013081903這三筆資料
目前已將文字檔讀取並存入資料庫...但不知該用什麼方法作比對...比較有效率
請各位版大指導...謝謝!!



老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-08-20 07:29:04 IP:210.61.xxx.xxx 未訂閱
最基本的方式...
存入前去Select資料庫是不是有那筆資料
沒有的話就新增


另解...
先一口氣把資料庫裡的資料全都Select出來到DataSet中
然後讀進文字檔後
逐一與DataSet筆對
可用Lookup或locate都行
沒有的話就新增
這樣也行
詳細用法請自行查相關資料



===================引 用 smallmi 文 章===================
請問各位版大...有什麼方式可以達到以下效果...請各位版大指導...謝謝!!
讀取文字檔並存入資料庫...但是再存入資料庫前先比對資料庫是否有重覆的值
如有的話...則該筆資料不存入...
例如....文字檔中檔案內容如下
2013081900
2013081901
2013081902
2013081903
假如資料庫中已有2013081902...該筆資料不存入...存2013081900,2013081901,2013081903這三筆資料
目前已將文字檔讀取並存入資料庫...但不知該用什麼方法作比對...比較有效率
請各位版大指導...謝謝!!



編輯記錄
老大仔 重新編輯於 2013-08-20 07:29:21, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-08-20 10:20:15 IP:202.39.xxx.xxx 訂閱
為資料庫中的該 Table 的該 Column 建立 Unique Index,
則文字檔中與 Table 重覆的資料便無法 Insert 進 Table.
tuga
高階會員


發表:16
回覆:109
積分:120
註冊:2002-07-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2013-08-22 11:17:44 IP:1.34.xxx.xxx 訂閱
1
如果文字檔筆數很少, 資料庫筆數很多, 每讀文字檔一筆, 對 database 做 select 一次 (select my_key from my_table where my_key = :key1 )
資料庫必須已對 my_key 建立 index, 否則就是你在挑戰你的 server 的效能

2
如果資料庫筆數不多, 一次將 資料 select 到前端, select my_key from my_table order by my_key, 再用 locate 找資料
smallmi
一般會員


發表:18
回覆:18
積分:7
註冊:2012-09-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2013-08-22 12:33:01 IP:220.130.xxx.xxx 訂閱
謝謝各位版大的答覆...如果是資料庫及記事本資料都很多的話..有哪些做法可行??謝謝!!
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2013-08-22 12:48:09 IP:202.39.xxx.xxx 訂閱
資料庫中的 Table 本就該有 Primary Index (或 Unique Index) 以防止重複的資料
及做為 Update 唯一的一筆資料的 Key,
前端 Insert 一筆資料進資料庫中的 Table, 若重複便發生 Exception 而不執行並返回 Error Message 給前端,
前端迴圈只要不理會, 繼續 Insert 次一筆進 Table, 並無額外的程式碼呀!?
編輯記錄
herbert2 重新編輯於 2013-08-22 12:48:52, 註解 無‧
smallmi
一般會員


發表:18
回覆:18
積分:7
註冊:2012-09-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2013-08-24 13:47:37 IP:124.11.xxx.xxx 訂閱
 謝謝版大的指導...目前已經建立UK...防止重覆資料新增...但遇到以下問題..
如資料如下,如DB中已有23452則會跳出錯誤...整筆資料均無輸入...
但要如何才可以達到...只要不輸入23452此筆資料..其他沒重覆資料依然會新增
請指導...謝謝!
12334
23452
23453

herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2013-08-24 21:11:03 IP:202.39.xxx.xxx 訂閱
您 Insert Text 檔資料進 DB 不是用迴圈嗎?

最簡單的作法:把迴圈中的 Insert 指令用 Try 與 End; 包起來,
不處理 Exception,不就繼續下一筆 Insert 嗎?
smallmi
一般會員


發表:18
回覆:18
積分:7
註冊:2012-09-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2013-09-04 12:32:06 IP:220.130.xxx.xxx 訂閱
 主KEY新增的問題..我的主EKY規則是當天日期 四碼流水號..隔天的話..四碼流水號重新計算
請版大指導..謝謝!!

[code sql]
CREATE OR REPLACE FUNCTION GetSerialNo RETURN VARCHAR2 IS
  v_DateStr   VARCHAR2(10); --系統日期對應的字串
  v_SerialNum NUMBER(4); --流水序號
BEGIN
  --取系統日期生成需要的字串
  v_DateStr := TO_CHAR(SYSDATE, ('YYYYMMDD'));
  --生成產生流水號的序號
  BEGIN
    SELECT Decode(num_rtnm, v_DateStr, (num_ps   1), 1)
      INTO v_SerialNum
      FROM AAA
       FOR UPDATE;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      v_SerialNum := 1;
      INSERT INTO AAA (num_rtnm, num_ps) VALUES (v_DateStr, v_SerialNum);
  END;
  --修改流水號參數
  UPDATE AAA SET num_rtnm = v_DateStr, num_ps = v_SerialNum;
  COMMIT;
  --得到需要的流水號
  RETURN v_DateStr || Lpad(v_SerialNum, 4, '0');
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    RETURN NULL;
END;
[/code]
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2013-09-04 14:40:07 IP:202.39.xxx.xxx 訂閱
請問您用 Delphi 幾版,Oracle 幾版?

Function 是給 Oracle 的 Package 或 Procedure 呼叫的,前端 Delphi 應無法呼叫。
您應改寫成 Procedure,讓 Delphi 的 TStoredProc 執行 Open(),
並以 OPEN Cursor 的方式傳回 TStoredProc 讀取該 Cursor 該 Field 的值。

其實您這架構仍有問題,若多台 PC 同時在 Insert 資料,在 A 台獲得 'dd0001' 而尚未 Post() 時,
B、C、D.... 台可能也得到 'dd0001',若 C 台先 Post(),A、B、D.... 台都 Post() 不進去了。
若是單機作業則無妨,否則您應詳加考慮是否要用 Trigger 來處理。
編輯記錄
herbert2 重新編輯於 2013-09-04 14:58:13, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2013-09-04 14:50:02 IP:202.39.xxx.xxx 訂閱
又,您用 'ddnnnn' 當 Primary Key 雖然可以,
但若 User 控管不佳,同一筆文件資料,Key-in 多次,
會得到 dd0001,A,B,C,.... 及 dd0002,A,B,C,.... 兩筆甚至多筆除了 Key 以外都相同的資料,
宜加用另一個 Unigue Index 防止或檢查,
否則可能發生一張訂單兩筆銷貨。一個員工兩筆人事資料(離職再新進又另當別論)等問題。
編輯記錄
herbert2 重新編輯於 2013-09-04 14:51:09, 註解 無‧
smallmi
一般會員


發表:18
回覆:18
積分:7
註冊:2012-09-02

發送簡訊給我
#12 引用回覆 回覆 發表時間:2013-09-26 22:23:24 IP:124.11.xxx.xxx 訂閱
 感謝大大的協助...我使用一個procedure來產生"日期+流水號"...但遇到以下問題
同時在2台PC執行程式...會發生..."日期 流水號"重覆的情況...
例如:201308080001 AAA
201308080001 BBB
請問各位版大...有什麼方式可以防止取到重覆的編號
請版大指導...謝謝!!

[code sql]
create or replace procedure p_Get_SerialNo(retval out varchar2) as
curDate char(8);
curNo number(10);
begin
select to_char(sysdate, 'YYYYMMDD') into curDate from dual;
select nvl(max(num_ps), 0) 1
into curNo
from AAA
where num_rtnm = to_date(curDate,'YYYYMMDD') for update;
if (curNo = 1) then
insert into AAA (num_rtnm, num_ps) values (to_date(curDate,'YYYYMMDD'), 1);
else
update AAA set num_ps = curNo where num_rtnm = to_date(curDate,'YYYYMMDD');
end if;
retval := curDate || lpad(to_char(curNo), 8, '0');
commit;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20199, '??');
END;
[/code]
編輯記錄
smallmi 重新編輯於 2013-09-26 22:25:15, 註解 無‧
smallmi 重新編輯於 2013-09-26 22:26:36, 註解 無‧
smallmi 重新編輯於 2013-09-26 22:28:11, 註解 無‧
smallmi 重新編輯於 2013-09-26 22:29:45, 註解 無‧
smallmi 重新編輯於 2013-09-26 22:30:34, 註解 無‧
smallmi 重新編輯於 2013-09-26 22:33:27, 註解 無‧
smallmi 重新編輯於 2013-09-26 22:34:22, 註解 無‧
smallmi 重新編輯於 2013-09-26 22:35:20, 註解 無‧
smallmi 重新編輯於 2013-09-26 22:36:25, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2013-09-26 22:45:26 IP:202.39.xxx.xxx 訂閱
唉!我在 09/04 #10 不就提醒您多台同時 Insert 會發生這種事嗎?

請問,您的 Primary Index Key 或及 Unique Index Key 到底為何?
一個 Table 是可以有多個 Index 的,難道您未建立 "日期 流水號" 的 Unique Index 嗎?

若您有建立 "日期 流水號" 的 Unique Index,較晚 Post 者便無法 Post;
若您未建立 "日期 流水號" 的 Unique Index,較晚 Post 者便仍可 Post,於是就發生您這種狀況了!

當 User 新增時,您於他 Key-In 日期後就呼叫 StoredProc 給他新的流水號,
然後他 Key-In 其他欄位資料,又接個電話,別人搞不好都已 Key-In 新增好多筆了,
當然會發生您這種冏事啊!
即使您於 BeforePost() 再重抓一次流水號,Post 時差個幾毫秒,您仍是無法避免這個錯誤的。
故一定要建立 "日期 流水號" 的 Unique Index 去擋這個錯誤!

您這才兩台在 Key-In 呢,若是台鐵、高鐵、演唱會...的售票,數千台同時湧入,像您這種疏忽,
不被罵得臭頭才怪!

很多事情自己推敲一下就知道,不一定要等跌倒才知道會痛吧!

依我猜想,您可能還漏考慮多台 PC 短時間內同時去修改或刪除同一筆資料、日期打錯要改日期...等問題吧!

最好的老師是 User,別忘了,子曰:「吾不如老圃!」
編輯記錄
herbert2 重新編輯於 2013-09-26 23:18:31, 註解 無‧
it1506
初階會員


發表:32
回覆:89
積分:49
註冊:2011-02-16

發送簡訊給我
#14 引用回覆 回覆 發表時間:2013-09-27 13:51:24 IP:59.120.xxx.xxx 未訂閱
 不知道你用的是那種 server

不過你一開始似乎沒把主key設定好,才會有重複資料

流水號不是不好,只是多台電腦同時在insert時, 流水號要從哪裡開始算呢??


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