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

temp table問題

答題得分者是:ccchen
mygod
一般會員


發表:52
回覆:64
積分:23
註冊:2002-09-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-03 23:00:57 IP:211.74.xxx.xxx 未訂閱
一、請問如果需要將server 端的table 抓到local端暫存做處理 該怎麼做比較好 比如:等local端變更完全無誤後再完全寫回server端 二、請問是否primary key有變動時寫回資料庫一定會發生錯誤 謝謝 oh~mygod
------
oh~mygod
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-10-04 08:00:17 IP:211.74.xxx.xxx 未訂閱
1.不管user是新增或修改,一定會有存檔Button吧...在存檔ButtonCLICK時把 local的資料一次寫回Server... 2.primary key變動時回寫應該沒問題阿... 新增時 insert into AAA //AAA Table Name (BBB,CCC) //BBB,CCC primary key values (:123, :456) 修改時 update AAA set BBB= :BBB, CCC= :CCC, DDD = :DDD, where BBB= :BBB, and CCC= :CCC 以上是MsSQL...不知道你用何種資料庫..?? 不知道這樣有沒有幫助你.. 如有錯誤敬請指正... chih.. 發表人 - chih 於 2002/10/04 08:02:54
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-10-04 08:02:34 IP:61.219.xxx.xxx 未訂閱
一、請問如果需要將server 端的table 抓到local端暫存做處理 該怎麼做比較好 可以用TClientDataSet或BDEClientDataSet直接SaveToFile, 存在Local後可離線操作. 等連線後再ApplyUpdate回去 二、請問是否primary key有變動時寫回資料庫一定會發生錯誤 Primary Key主要在惟一確認一筆資料, 如有重複當然不行, 否則Primary也不是不能改. 只是要很小心. 用ClientDataSet, 仔細研究測試一下provider之UpdateMode[upWhereall,upWhereChanged,upWhereKey]及ReconcileError相信可解決你的問題
dinokuo
初階會員


發表:3
回覆:29
積分:31
註冊:2002-09-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-10-04 08:46:23 IP:61.218.xxx.xxx 未訂閱
通常我在作大量運算時 都是利用Oracle 的procedure來作 直接在後端運算 一則速度比較快 二則發生錯誤時,可以正確的回復資料 不知道你的資料庫是不是支援這種方式 如果有的話, 我比較建議你用這種方法啦 我會捉資料到Local運算的狀況是在作報表的時候 方法如下,提供你作參考 begin //建立來源 with Query1 do begin Close; SQL.Clear; SQL.Add('SELECT * FROM CUSTOMERS'); end; //寫入Table1 with Table1 do begin Close; BatchMove(Query1,batCopy); Open; end; end; 這是我慣用的方法, 可能不是最快的方式(或許也不是最好的) 但好處是 建立一個Local Table 後 真的是想幹嘛就幹嘛 順心呢!!! 發表人 - dinokuo 於 2002/10/04 08:47:44
mygod
一般會員


發表:52
回覆:64
積分:23
註冊:2002-09-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-10-04 08:49:19 IP:211.74.xxx.xxx 未訂閱
感謝兩位的回答 but upWhereAll All columns (fields) are used to locate the record. upWhereChanged Only key field values and the original value of fields that have changed are used to find the record. upWhereKeyOnly Only key fields are used to find the record. 這三個...看了之後還是不太懂用起來有什麼差別 另外在applyupdate之前針對多筆資料異動...包括primary key的欄位 如: 一個table test1欄位如下 YYY,SEQ,tf3,tf4,tf5 (YYY為年份) primary key為YYY,SEQ,tf3 select * from test1 where YYY=??? 每次取出後的SEQ需重新排序value改為由1到recordcount (等於不同年份的資料各自排序) insert資料的SEQ為recordcount 1, 刪除後的資料,該筆資料以下的資料的SEQ都減一 問題如下: 做完新增刪除之後只要applyupdate就會發生問題 如果沒有異動到SEQ這個欄位就不會有問題 我覺得是因為異動到primary key的關係... 請問有比較好的寫法嗎? oh~mygod
------
oh~mygod
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-10-04 10:23:06 IP:211.21.xxx.xxx 未訂閱
----------------------------------------------------------------- 另外在applyupdate之前針對多筆資料異動...包括primary key的欄位 如: 一個table test1欄位如下 YYY,SEQ,tf3,tf4,tf5 (YYY為年份) primary key為YYY,SEQ,tf3 select * from test1 where YYY=??? 每次取出後的SEQ需重新排序value改為由1到recordcount (等於不同年份的資料各自排序) insert資料的SEQ為recordcount 1, 刪除後的資料,該筆資料以下的資料的SEQ都減一 -------------------------------------------------------- 我絕得這有些問題 例如說你總資料的 recordcount = 100 YYY = 10 的 有50筆 YYY = 20 的 有50筆 如你說的 select * from test1 where YYY = 10 如此recordcount = 50 你市這時候直接insert 資料嗎 那他的SEQ = 51 如果剛好在Table中所有筆數中 SEQ = 51 的資料 其 YYY = 10 tf3 也相同 那就會重複到了
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-10-04 10:39:59 IP:211.74.xxx.xxx 未訂閱
如果像你講的這種情形.. 是不是一開始不用將SEQ SELECT 出來.. select * from test1 where YYY=??? open後在手動給SEQ的值存在local端.. 要存檔前應該要先將 test1 資料(YYY=???的所有資料)刪除後再將local端insert 回去..這樣就不會有primary key值得問題了吧?? 是不是ㄋ?? chih...
dinokuo
初階會員


發表:3
回覆:29
積分:31
註冊:2002-09-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-10-04 12:47:02 IP:61.218.xxx.xxx 未訂閱
這是回寫的方式 主要是用來避免兩個人同時更新同一筆資料 1.upWhereAll All columns (fields) are used to locate the record. 所有欄位都和修改前一樣,才作更新 2.upWhereChanged Only key field values and the original value of fields that have changed are used to find the record. 只要鍵值欄位及修改的欄位其值和修改前一樣,更作更新 3.upWhereKeyOnly Only key fields are used to find the record. 只要鍵值欄位都和修改前一樣,更作更新 大概是這樣子啦.. 至於序號(seq)的問題 基本上 像我在作單據時(如進出貨單) 序號有因刪除而跳號時 原則上是不處理的 因為無傷大雅嘛 如果你真的要處理 嗯..再說啦!!
mygod
一般會員


發表:52
回覆:64
積分:23
註冊:2002-09-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-10-04 17:23:29 IP:211.20.xxx.xxx 未訂閱
謝謝各位的幫忙 因為所有的欄位user必須看到所以比較麻煩點 原本的做法是當Insert時SEQ=recordcounter+1 (因為是insert時的動作所以SEQ不會重複) delete時該筆資料以下的所有record的SEQ都減一 這樣就不會有重複key的問題 但是必須每一個動作都執行applyupdate(包括insert,delete...), 不然會發生類似pprayer兄所說的狀況 到目前為止都沒問題 BUT有一個很怪的現象: 若重新查詢再進行刪除則不會有問題 但如果新增後不重新查詢就會發生錯誤(同樣有applyupdate,但沒重新查詢) trace的結果發現,新增後若沒有重新查詢直接進行刪除會讓 recordcount一次減2,如:原本recordcounter=5,一過query.delete時就變3 ...真的很怪... oh~mygod
------
oh~mygod
mygod
一般會員


發表:52
回覆:64
積分:23
註冊:2002-09-10

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-10-04 17:41:16 IP:211.20.xxx.xxx 未訂閱
ccchen兄提到的方法不太懂說 SaveToFile後...跟applyupdate時的資料有啥關西?? 能夠再重file裡讀出來嗎? 如果我想動態產生一個table(比如paradox...dbf之類的) 處理完再重這個temp table寫回資料庫該怎麼做比較好?? oh~mygod
------
oh~mygod
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-10-04 20:56:20 IP:203.217.xxx.xxx 未訂閱
SaveToFile後再存在Local, 以後隨時可LoadFromFile再取入ClientDataSet, 後執行ApplyUpdate. 這叫做 Bierf case, 通常是Client-Server 程式須要離線作業時所用,也可以用來做資料交換. 若要存成local Table, ClientDataSet直接存比paradox方便,不過你的狀況顯然並不須要.
mygod
一般會員


發表:52
回覆:64
積分:23
註冊:2002-09-10

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-10-05 17:47:25 IP:211.74.xxx.xxx 未訂閱
謝謝各位的回答,我先試試ccchen兄的SaveToFile...如果不行再請教各位 新增後不重新查詢,會造成delete時recordcount會一次減二 這個問題真的很怪...ccchen兄知道問題在哪嗎?? oh~mygod
------
oh~mygod
mygod
一般會員


發表:52
回覆:64
積分:23
註冊:2002-09-10

發送簡訊給我
#13 引用回覆 回覆 發表時間:2002-10-05 18:19:35 IP:211.74.xxx.xxx 未訂閱
大概我太笨了...try不出來.... 為啥用BDEClientDataSet改一個普通欄位 applyupdate時就發生Transaction are not enabled...的錯誤 用Query就很正常...why????? 還有...LoadFromFile後...資料怎麼還是不會更新到DBGRID... 另外能否請版主幫我回答 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21617 這篇關於dbexpress的問題 發表人 - mygod 於 2002/10/05 18:35:57
------
oh~mygod
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2002-10-08 08:33:28 IP:61.219.xxx.xxx 未訂閱
你原來的問題是 請問如果需要將server 端的table 抓到local端暫存做處理 該怎麼做比較好 所以我建議用TClientDataSet, 後來發現你主要是要解決PrimaryKey之寫入,那就沒道理存Local File了->自找麻煩 PrimaryKey之處理,可有幾種考慮方式 1. User可自行輸入, post前只檢查是否唯一 2. 由程式產生, User不可修改, 而且最好是在要寫入時才產生, 且刪除時就留下空號 3. 如果要在新增時就產生, 那一新增就必須先存入資料庫再改為Edit. 4. 如果如你所說, 要顯示給User看, 若還要求連號(無空號), 那就只有編輯時完全在前端,編輯完後將資料全部刪除重寫.這是效率最差的方法, 但在不合理的要求下也是唯一可行的方法 用TQuery, CacheUpdated:=True 或用TBDEClientDataSet直接編輯均可
mygod
一般會員


發表:52
回覆:64
積分:23
註冊:2002-09-10

發送簡訊給我
#15 引用回覆 回覆 發表時間:2002-10-08 13:08:18 IP:211.74.xxx.xxx 未訂閱
謝謝版主.. oh~mygod
------
oh~mygod
系統時間:2024-05-07 6:24:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!