你可以用 USE 命令打開離線視圖就象打開一個聯(lián)線視圖一樣。然而, 就象我在前面的說明一樣, VFP 事實上打開離線視圖的持久表而不是執(zhí)行一條一般的 SQL SELECT 命令。
使用離線視圖工作時有一些要注意的事:
改變模式到離線視圖,添加, 修改或刪除操作都是對視圖表而沒有寫回到視圖所基于的源表。這意味著其它人打開源表時,看不到數(shù)據(jù)在離線視圖中的改變。
在另一方面: 你也不能從源表中刷新離線視圖的內(nèi)容。
視圖表的行動象一個普通表的緩存。getfldstate() 和getnextmodified() 反映了視圖的緩存狀態(tài)。tableupdate() 將視圖緩沖中的修改寫回到視圖表中, tablerevert() 則取消修改。沒有這些函數(shù)將不能對源表進行任何處理。
你不能修改視圖表的結(jié)構(gòu),也不能使用對它使用create trigger, insert, pack, 或 zap 命令 (但可以使用delete all)。
與聯(lián)線視圖一樣, 離線視圖自動使用行緩存和表緩存, 因此你應(yīng)該將multilocks 設(shè)置為 on。如果你試圖關(guān)閉緩存將會得到一條錯誤信息。
與聯(lián)線視圖不同的是, 打開一個離線視圖不會自動打開視圖所基于的源表 ,這是由于離線視圖是與源表"脫離的"。這意味著當你把離線視圖交給別人時,不需要提供源表的拷貝 (它可能會非常大或是一個非VFP 數(shù)據(jù)表)。同時也意味著你可以在源表上進行某些類型的(諸如重建索引之類)維護, 甚至在多個用戶打開離線視圖時。稍后我們將看到這種例子。
在離線視圖上輸入數(shù)據(jù)時,源表的規(guī)則和觸發(fā)器不會激活, 僅當你將數(shù)據(jù)更新到源表時, 源表的規(guī)則和觸發(fā)器才會激活。這就是說除非你為使用 dbsetprop()為離線視圖定義了規(guī)則, 有可能有不正確的數(shù)據(jù)進入離線視圖并不能在較早的時候被發(fā)現(xiàn)。
如果你使用"修補關(guān)鍵字", 你需要為添加到視圖中的記錄指定關(guān)鍵字值。最常用的指定關(guān)鍵字段值的方法是調(diào)用一個NEXTID 程序來為該表的取得下一個可用的基本關(guān)鍵字段值。如果你使用的是這種方案, 你需要使用dbsetprop() 來設(shè)置離線視圖中的字段的DefaultValue 屬性,這樣添加記錄到離線視圖中時可取得指定的關(guān)鍵字段值。
使用候選關(guān)鍵字段的一個不利因素是: 如果離線視圖用于允許遠程數(shù)據(jù)輸入 (如在筆記本電腦中), 你需要為每一個筆記本電腦指定一個關(guān)鍵字段值塊,這樣主關(guān)鍵字段的值才不會重復(fù)。作為一種選擇, 你可以將用戶名或筆記本電腦名組合進關(guān)鍵字段值中, 這樣就不用擔心會出現(xiàn)相同的主關(guān)鍵字段值了。
如果一個離線視圖是用于一個遠程計算機上進行數(shù)據(jù)輸入, 你需要傳送離線視圖表(包括FPT), 持久表緩存文件和數(shù)據(jù)庫容器(DBC, DCX, 和DCT) 到那個遠程計算機中。
如果你需要確定自視圖離線后那些記錄被修改了, 使用use 命令的admin 子句。這需要以獨占方式訪問視圖表否則你會得到一條錯誤信息。下面是使用該命令的例子:
use LV_CUSTOMER admin exclusive
當用admin 模式打開視圖時,它自動使用表緩存而不是行緩存。
試圖改變表的緩存模式會造成錯誤。
一但視圖以admin 模式打開, 你可以使用getnextmodified() 和 getfldstate() 來確定哪些記錄和這些記錄中的哪些字段被修改了。
有趣的是, 在admin模式下打開一個離線視圖時并沒有自動打開它的源表, 因此 VFP 必須使用 TBF 文件來檢查哪些記錄被修改了。
當視圖在管理模式下打開時,你不能更新源表; 更詳細的信息參見下一章中的更新源表??墒? 你可以使用tablerevert() 來撤消對離線視圖的修改.
使用離線視圖工作時有一些要注意的事:
改變模式到離線視圖,添加, 修改或刪除操作都是對視圖表而沒有寫回到視圖所基于的源表。這意味著其它人打開源表時,看不到數(shù)據(jù)在離線視圖中的改變。
在另一方面: 你也不能從源表中刷新離線視圖的內(nèi)容。
視圖表的行動象一個普通表的緩存。getfldstate() 和getnextmodified() 反映了視圖的緩存狀態(tài)。tableupdate() 將視圖緩沖中的修改寫回到視圖表中, tablerevert() 則取消修改。沒有這些函數(shù)將不能對源表進行任何處理。
你不能修改視圖表的結(jié)構(gòu),也不能使用對它使用create trigger, insert, pack, 或 zap 命令 (但可以使用delete all)。
與聯(lián)線視圖一樣, 離線視圖自動使用行緩存和表緩存, 因此你應(yīng)該將multilocks 設(shè)置為 on。如果你試圖關(guān)閉緩存將會得到一條錯誤信息。
與聯(lián)線視圖不同的是, 打開一個離線視圖不會自動打開視圖所基于的源表 ,這是由于離線視圖是與源表"脫離的"。這意味著當你把離線視圖交給別人時,不需要提供源表的拷貝 (它可能會非常大或是一個非VFP 數(shù)據(jù)表)。同時也意味著你可以在源表上進行某些類型的(諸如重建索引之類)維護, 甚至在多個用戶打開離線視圖時。稍后我們將看到這種例子。
在離線視圖上輸入數(shù)據(jù)時,源表的規(guī)則和觸發(fā)器不會激活, 僅當你將數(shù)據(jù)更新到源表時, 源表的規(guī)則和觸發(fā)器才會激活。這就是說除非你為使用 dbsetprop()為離線視圖定義了規(guī)則, 有可能有不正確的數(shù)據(jù)進入離線視圖并不能在較早的時候被發(fā)現(xiàn)。
如果你使用"修補關(guān)鍵字", 你需要為添加到視圖中的記錄指定關(guān)鍵字值。最常用的指定關(guān)鍵字段值的方法是調(diào)用一個NEXTID 程序來為該表的取得下一個可用的基本關(guān)鍵字段值。如果你使用的是這種方案, 你需要使用dbsetprop() 來設(shè)置離線視圖中的字段的DefaultValue 屬性,這樣添加記錄到離線視圖中時可取得指定的關(guān)鍵字段值。
使用候選關(guān)鍵字段的一個不利因素是: 如果離線視圖用于允許遠程數(shù)據(jù)輸入 (如在筆記本電腦中), 你需要為每一個筆記本電腦指定一個關(guān)鍵字段值塊,這樣主關(guān)鍵字段的值才不會重復(fù)。作為一種選擇, 你可以將用戶名或筆記本電腦名組合進關(guān)鍵字段值中, 這樣就不用擔心會出現(xiàn)相同的主關(guān)鍵字段值了。
如果一個離線視圖是用于一個遠程計算機上進行數(shù)據(jù)輸入, 你需要傳送離線視圖表(包括FPT), 持久表緩存文件和數(shù)據(jù)庫容器(DBC, DCX, 和DCT) 到那個遠程計算機中。
如果你需要確定自視圖離線后那些記錄被修改了, 使用use 命令的admin 子句。這需要以獨占方式訪問視圖表否則你會得到一條錯誤信息。下面是使用該命令的例子:
use LV_CUSTOMER admin exclusive
當用admin 模式打開視圖時,它自動使用表緩存而不是行緩存。
試圖改變表的緩存模式會造成錯誤。
一但視圖以admin 模式打開, 你可以使用getnextmodified() 和 getfldstate() 來確定哪些記錄和這些記錄中的哪些字段被修改了。
有趣的是, 在admin模式下打開一個離線視圖時并沒有自動打開它的源表, 因此 VFP 必須使用 TBF 文件來檢查哪些記錄被修改了。
當視圖在管理模式下打開時,你不能更新源表; 更詳細的信息參見下一章中的更新源表??墒? 你可以使用tablerevert() 來撤消對離線視圖的修改.

