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

BookMark用法幾問

 
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-07-17 11:38:10 IP:210.85.xxx.xxx 未訂閱
請問各位! 1.我用query, 加上 order by ITEMNO 方式開啟資料 假設記錄有1~100筆(ITEMNO為10~1000, 間隔10), 我insert第101筆, ITEMNO=505, 在記錄未POST前, 宣告 var nowrec: TBookMarkStr; begin nowrec:= Query1.BookMark; Query1.ApplyUppdate; Query1.Commit; Query1.Close; : : Query1.Open; Query1.BookMark:= nowrec end; 在最後一行的 bookmark 無法回到我指定的第101筆, 而是跳到其他記錄 這是什麼原因 2.我以interbase 資料庫開啟一個 query1, 放置在一個dbgrid上顯示, dbgrid上每次大約可顯示20筆, 就理論值而言, query1第一次open應該會丟20筆到client端的dbgrid, 當捲動dbgrid 再丟20筆過來, 那如果我在 query1.open之後, 即刻指定 bookmark 位置, 那第一次 server丟過來的記錄大約是多少筆?雖然我實測其速度及記憶體似乎沒有太大的變化, 但我很想知道client/server在處理這種事是如何作業的? 3.與上題有點類似, client/server的資料處理方式, 假設我有10000記錄在server, 當我open資料庫, 指定一個bookmark(假設在第7000筆), 則server會丟回來幾筆記錄到 client端載入? 4.我使用 table 方式開啟資料庫, 在insert完後要將該筆bookmark指定存入, 那應該是在 post之後或之前來指定 nowrec:= Table1.BookMark; 因為最近我發現我的程式一個怪現象, 原來程式寫在 post 之前的語法, 我重新 complier之後, 記錄指標竟無法指回原來的位置, 而改在 post之後就可以, 可是, 我發誓, 原先的程式寫在之前的的確運作很正常(而且客戶也在用沒有問題), 為何會有如此現象(delphi版本是一樣的) 以上小弟觀念不是很清楚, 請各位前輩指點一二, 謝謝!
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-07-17 11:48:31 IP:211.20.xxx.xxx 未訂閱
引言: 請問各位! 1.我用query, 加上 order by ITEMNO 方式開啟資料 假設記錄有1~100筆(ITEMNO為10~1000, 間隔10), 我insert第101筆, ITEMNO=505, 在記錄未POST前, 宣告 var nowrec: TBookMarkStr; begin nowrec:= Query1.BookMark; Query1.ApplyUppdate; Query1.Commit; Query1.Close; : : Query1.Open; Query1.BookMark:= nowrec end; 在最後一行的 bookmark 無法回到我指定的第101筆, 而是跳到其他記錄 這是什麼原因 DATASET的BOOKMARK是一個指標,DATASET CLOSE後該指標就會不見 2.我以interbase 資料庫開啟一個 query1, 放置在一個dbgrid上顯示, dbgrid上每次大約可顯示20筆, 就理論值而言, query1第一次open應該會丟20筆到client端的dbgrid, 當捲動dbgrid 再丟20筆過來, 那如果我在 query1.open之後, 即刻指定 bookmark 位置, 那第一次 server丟過來的記錄大約是多少筆?雖然我實測其速度及記憶體似乎沒有太大的變化, 但我很想知道client/server在處理這種事是如何作業的? 如果BDE的MAXROWS如為-1則是會全部的資料帶回CLIENT的 3.與上題有點類似, client/server的資料處理方式, 假設我有10000記錄在server, 當我open資料庫, 指定一個bookmark(假設在第7000筆), 則server會丟回來幾筆記錄到 client端載入? 答案如上題 4.我使用 table 方式開啟資料庫, 在insert完後要將該筆bookmark指定存入, 那應該是在 post之後或之前來指定 nowrec:= Table1.BookMark; 因為最近我發現我的程式一個怪現象, 原來程式寫在 post 之前的語法, 我重新 complier之後, 記錄指標竟無法指回原來的位置, 而改在 post之後就可以, 可是, 我發誓, 原先的程式寫在之前的的確運作很正常(而且客戶也在用沒有問題), 為何會有如此現象(delphi版本是一樣的) 同問題一 以上小弟觀念不是很清楚, 請各位前輩指點一二, 謝謝!
@@~~飛翔在天際的精靈~~@@ 發表人 - andersonhsieh 於 2002/07/17 11:49:41
------
@@~~飛翔在天際的精靈~~@@
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-07-17 17:15:12 IP:210.85.xxx.xxx 未訂閱
引言: 請問各位! 1.我用query, 加上 order by ITEMNO 方式開啟資料 假設記錄有1~100筆(ITEMNO為10~1000, 間隔10), 我insert第101筆, ITEMNO=505, 在記錄未POST前, 宣告 var nowrec: TBookMarkStr; begin nowrec:= Query1.BookMark; Query1.ApplyUppdate; Query1.Commit; Query1.Close; : : Query1.Open; Query1.BookMark:= nowrec end; 在最後一行的 bookmark 無法回到我指定的第101筆, 而是跳到其他記錄 這是什麼原因 DATASET的BOOKMARK是一個指標,DATASET CLOSE後該指標就會不見 可是我在close之前先以一個TBookMarkStr變數來存入指標了, 然後再open之後將記錄重指回原指標, 就理論而言, 不是應該要令query1移到我指定的記錄嗎? 2.我以interbase 資料庫開啟一個 query1, 放置在一個dbgrid上顯示, dbgrid上每次大約可顯示20筆, 就理論值而言, query1第一次open應該會丟20筆到client端的dbgrid, 當捲動dbgrid 再丟20筆過來, 那如果我在 query1.open之後, 即刻指定 bookmark 位置, 那第一次 server丟過來的記錄大約是多少筆?雖然我實測其速度及記憶體似乎沒有太大的變化, 但我很想知道client/server在處理這種事是如何作業的? 如果BDE的MAXROWS如為-1則是會全部的資料帶回CLIENT的 InterBase 的用法好像沒有透過BDE, 那這樣結果會如何? 3.與上題有點類似, client/server的資料處理方式, 假設我有10000記錄在server, 當我open資料庫, 指定一個bookmark(假設在第7000筆), 則server會丟回來幾筆記錄到 client端載入? 答案如上題 這個也是 InterBase上作業
目前我仍然有點迷惑, 不知各位前輩是否可再指點一二, 謝謝!
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-07-17 20:29:26 IP:61.59.xxx.xxx 未訂閱
關於第一個問題andersonhsieh兄說的應該對.....你把指標丟給你宣告的 另一個指標...則兩個指標應該指向同一個記憶區塊....當你把原先的 指標free後....則你後來宣告的那個之標應該就不能用了....我在書上 好像有看過關於指標的範例...不知對不對︿︿
------
星期一,二...無窮迴圈@@
ccchen
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-07-17 22:12:07 IP:203.217.xxx.xxx 未訂閱
如andersonhsieh所言, close後再Open, bookMark就完全不一樣了要回至原記錄必須用locate TQuery取資料時有buffer, 故每次只取一些(如20筆)但如果你移至第7000筆那麼這7000筆就全進來了, 執行locate亦然
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-07-17 22:16:14 IP:210.85.xxx.xxx 未訂閱
引言: 關於第一個問題andersonhsieh兄說的應該對.....你把指標丟給你宣告的 另一個指標...則兩個指標應該指向同一個記憶區塊....當你把原先的 指標free後....則你後來宣告的那個之標應該就不能用了....我在書上 好像有看過關於指標的範例...不知對不對︿︿
我了解兩位意思了, 由於 nowrec 是一個指標, 所以其實 nowrec 內部並沒有記錄實體的資料, 而是類似位址, 而這位址與原先的 bookmark 是同一個, 如果 query close , bookmark消失而 nowrec 所指向的位址自然也就不存在, 所以是我誤解了 TBookMark 的用法, 它並不是一個變數及實際存值的作用, 不知我這樣說對不對? 那如果說我想做到上面我所提到的功能(不可以使用 where 方式查資料或 locate), 有沒有其他作法可以達成呢?
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-07-19 12:00:50 IP:211.22.xxx.xxx 未訂閱
1.我用query, 加上 order by ITEMNO 方式開啟資料 假設記錄有1~100筆(ITEMNO為10~1000, 間隔10), 我insert第101筆, ITEMNO=505, 在記錄未POST前, 宣告 var nowrec: TBookMarkStr; begin nowrec:= Query1.BookMark; Query1.ApplyUppdate; Query1.Commit; Query1.Close; : : Query1.Open; Query1.BookMark:= nowrec end; 在最後一行的 bookmark 無法回到我指定的第101筆, 而是跳到其他記錄 這是什麼原因 DATASET的BOOKMARK是一個指標,DATASET CLOSE後該指標就會不見 小弟認為不是這個問題, 原因如次 1P.D. 兄宣告是TBookMarkStr, 查Delphi OnLine Help, TBookMarkStr原型為String, 既然是String, DataSet Close 後 Open, 該值是不會消失的。 2P.D. 兄之所以回不到101筆, 小弟認為是因為該筆為新增的問題, 因為為新增所以在Local端是不存在該筆的, 如何能取得該筆的BookMark值呢? 也就是為什麼要Close 後 Open 的原因所在。 以上為小弟的淺見, 請各位先進指教。
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-07-19 13:28:11 IP:211.20.xxx.xxx 未訂閱
我剛試了一下發現在新增的那一筆資料會沒有bookmark,所以你的才會無法跳到101筆,只有利用變數記下key值,在close,open以後利用locae移到你想要的那一筆去,以上是我的建議 @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-07-19 14:10:10 IP:210.85.xxx.xxx 未訂閱
引言: 我剛試了一下發現在新增的那一筆資料會沒有bookmark,所以你的才會無法跳到101筆,只有利用變數記下key值,在close,open以後利用locae移到你想要的那一筆去,以上是我的建議 @@~~飛翔在天際的精靈~~@@
原來如此, 因為我無法使用 locate , 就如我上面所說明, 如果這筆在最後, 那如果用 lcoate 是否會造成 server 將所有資料全部 upload 到 client 端, 那不是就會造成資源的大損耗(我的記錄會達到千萬筆), 所以我想了一個辦法, 雖然還沒有進行測試, 不過我想就理論值先提出來, 看可不可行, 我建立兩個 query 指向同一個 table資料, 當 query1.commit 之後, query2 做 where 的條件找到該新增的那一筆, 將 BookMarkStr 存入nowrec變數, 然後在 query1.bookMark:= nowrec, 是否會正確的指向 query1 原來新增的那一筆, 不知可否?
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-07-19 14:14:52 IP:211.20.xxx.xxx 未訂閱
引言:
引言: 我剛試了一下發現在新增的那一筆資料會沒有bookmark,所以你的才會無法跳到101筆,只有利用變數記下key值,在close,open以後利用locae移到你想要的那一筆去,以上是我的建議 @@~~飛翔在天際的精靈~~@@
原來如此, 因為我無法使用 locate , 就如我上面所說明, 如果這筆在最後, 那如果用 lcoate 是否會造成 server 將所有資料全部 upload 到 client 端, 那不是就會造成資源的大損耗(我的記錄會達到千萬筆), 所以我想了一個辦法, 雖然還沒有進行測試, 不過我想就理論值先提出來, 看可不可行, 我建立兩個 query 指向同一個 table資料, 當 query1.commit 之後, query2 做 where 的條件找到該新增的那一筆, 將 BookMarkStr 存入nowrec變數, 然後在 query1.bookMark:= nowrec, 是否會正確的指向 query1 原來新增的那一筆, 不知可否?
其實bookmark的功能和locate的功能是一樣的所以你的資料是在最後一筆時,也會有同樣的問題....... @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-07-19 16:11:28 IP:210.85.xxx.xxx 未訂閱
引言: 其實bookmark的功能和locate的功能是一樣的所以你的資料是在最後一筆時,也會有同樣的問題....... @@~~飛翔在天際的精靈~~@@
感謝各位的指導, 我對 bookmark 總算有較正確的了解了!
系統時間:2024-04-29 7:36:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!