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

Master Detail 在明細資料 Insert Post 會自動移動至最後一筆

缺席
VICSYS
初階會員


發表:21
回覆:64
積分:32
註冊:2002-10-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-10-14 07:16:16 IP:219.68.xxx.xxx 未訂閱
我是用 Delphi 7 發覺這個現像! 主檔(或單檔)正常, 但是明細就怪怪的!
您可以測試一下 Demos 程式, Delphi7\Demos\Db\MastApp\mastapp.exe
用新增的方式在 DBGrid 輸入明細資料, 只要一經 POST 就會移至最後一筆!
如果加上 Index, 則變成 POST 會依 Key 值排序, 就不知道這筆資料會移至那裡!
請問有沒有辦法解決或從那個方向著手! 我希望在輸入資料時記錄指標不要跑上跑下!
感恩!
herbert2
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-10-14 13:57:55 IP:211.72.xxx.xxx 未訂閱
使用 Flat Table (Paradox, dBase等), 原本就是如此的運作規則. TDBNavigator 的 Insert 雖是執行 Insert, 但不管是否有開 Index, 存檔皆是 Append 至檔尾, DBGrid 只是 Memory Stream 中的一段資料, 有開索引便會依 Key 重排.
建議: 要於 Detail 檔增加一欄 ItemNo, 並納入 Primary Index Key, 才能解決此問題.
即使是 SQL Base 的 Table, Insert 插入 TQuery 後, TDBGrid 的資料錄位置也會亂跑, 用 Append 較妥當. 若 Detail 檔每單筆數不多, 也可每次 Post OK 後, 記住 Key 值後再重新 Open 並 Locate, 可能可以符合您的需求.

VICSYS
初階會員


發表:21
回覆:64
積分:32
註冊:2002-10-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-10-14 17:41:24 IP:219.68.xxx.xxx 未訂閱
謝謝您的熱心回答!

我不知道為什麼 delphi 要去重新調整明細的位置! 可能是為了要配合 Flat Table 的元件吧!
可是主檔的 INSERT POST 並沒有這個現像!

重新 Open 並 Locate, 這個方式可行! 不過執行成本太高!

itemno 的方法可行
-----------------------
1
2 <- insert
3
post
1
2 <- 會在這裡
2 <- 還是這裡
3
-----------------------
如果變成
10
20 <- insert , delphi 是 insert 20 之前
30
第一筆沒有問題
10
15 <-
20
但多次之後
11
12 <- 問題又出現了
12
13
-----------------------

itemno 如何設計, 才不會有這個問題!
如果假設使用者一次最多只會輸入 1000 筆, 而原本的明細資料最多 1000筆

1000000
2000000 <- insert

1000000
1250000<- insert
1500000

1000000
1125000 <- insert
1250000

數字要到 2^1000 ?
herbert2
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-10-15 01:22:13 IP:211.72.xxx.xxx 未訂閱
主檔的 INSERT POST 若無 INDEX, 連續數筆, 也會有此現像的!
M001 M001 M001
M002 M002 M002
M005 <- Insert Here, OK M005 M006 <- Result
M003 M006 <- Insert Here M005
M004 M003 M003
M004 M004
除非一定要依 User 的需求將新 Item 插入舊 Item 間, 否則最好用 Append() 的 Method 勿用 Insert().
設 ItemNo n4 Max 9999 or c4 Max 36^4, ItemNoIns n2 Max 99 or c2 Max 36^2 for 日後 Insert, 或可解決您的問題.
VICSYS
初階會員


發表:21
回覆:64
積分:32
註冊:2002-10-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-10-15 04:31:54 IP:219.68.xxx.xxx 未訂閱
測試一下所開發的程式, ClientDataSet的主檔沒有 Index! Post 時並不會上下跑!
另外情況沒有那麼複雜, 如果使用者 Refresh 或 Reopen 時, 順序會依 SQL Server 查詢的順序
(SQL 的查詢結果會依 KEY 來排序, 但又不會讓 Delphi 自行加入 Index)
並不是存檔後的順序要依 Insert 時的樣子! 只是輸入明細時, 不要上下跑!
所以這個 Index 可以用 fkInternalCalc 來完成!
ItemNoIns n2 的話, 如前述!
10         10           10           10
11<-Insert 10(inserted) 10*<-Insert  10<- 10* 不知道會在這裡
12         11           11           10<- 或是在這裡
13         12           12           11
系統時間:2024-06-02 17:44:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!