BookMark用法幾問 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位! 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 發送簡訊給我 |
引言: 請問各位! 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 發送簡訊給我 |
引言: 請問各位! 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 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 關於第一個問題andersonhsieh兄說的應該對.....你把指標丟給你宣告的 另一個指標...則兩個指標應該指向同一個記憶區塊....當你把原先的 指標free後....則你後來宣告的那個之標應該就不能用了....我在書上 好像有看過關於指標的範例...不知對不對︿︿我了解兩位意思了, 由於 nowrec 是一個指標, 所以其實 nowrec 內部並沒有記錄實體的資料, 而是類似位址, 而這位址與原先的 bookmark 是同一個, 如果 query close , bookmark消失而 nowrec 所指向的位址自然也就不存在, 所以是我誤解了 TBookMark 的用法, 它並不是一個變數及實際存值的作用, 不知我這樣說對不對? 那如果說我想做到上面我所提到的功能(不可以使用 where 方式查資料或 locate), 有沒有其他作法可以達成呢? |
Wesly
中階會員 發表:14 回覆:103 積分:53 註冊:2002-05-31 發送簡訊給我 |
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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 我剛試了一下發現在新增的那一筆資料會沒有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 發送簡訊給我 |
引言:其實bookmark的功能和locate的功能是一樣的所以你的資料是在最後一筆時,也會有同樣的問題....... @@~~飛翔在天際的精靈~~@@引言: 我剛試了一下發現在新增的那一筆資料會沒有bookmark,所以你的才會無法跳到101筆,只有利用變數記下key值,在close,open以後利用locae移到你想要的那一筆去,以上是我的建議 @@~~飛翔在天際的精靈~~@@原來如此, 因為我無法使用 locate , 就如我上面所說明, 如果這筆在最後, 那如果用 lcoate 是否會造成 server 將所有資料全部 upload 到 client 端, 那不是就會造成資源的大損耗(我的記錄會達到千萬筆), 所以我想了一個辦法, 雖然還沒有進行測試, 不過我想就理論值先提出來, 看可不可行, 我建立兩個 query 指向同一個 table資料, 當 query1.commit 之後, query2 做 where 的條件找到該新增的那一筆, 將 BookMarkStr 存入nowrec變數, 然後在 query1.bookMark:= nowrec, 是否會正確的指向 query1 原來新增的那一筆, 不知可否?
------
@@~~飛翔在天際的精靈~~@@ |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |