foxpro 用离线视图工作

发表于:2007-07-02来源:作者:点击数: 标签:
你可以用 USE 命令打开离线视图就象打开一个联线视图一样。然而, 就象我在前面的说明一样, VFP 事实上打开离线视图的持久表而不是执行一条一般的 SQL SELECT 命令。 使用离线视图工作时有一些要注意的事: 改变模式到离线视图,添加, 修改或删除操作都是对视

你可以用 USE 命令打开离线视图就象打开一个联线视图一样。然而, 就象我在前面的说明一样, VFP 事实上打开离线视图的持久表而不是执行一条一般的 SQL SELECT 命令。

使用离线视图工作时有一些要注意的事:

  • 改变模式到离线视图,添加, 修改或删除操作都是对视图表而没有写回到视图所基于的源表。这意味着其它人打开源表时,看不到数据在离线视图中的改变。
  • 在另一方面: 你也不能从源表中刷新离线视图的内容。
  • 视图表的行动象一个普通表的缓存。getfldstate() 和getnextmodified() 反映了视图的缓存状态。tableupdate() 将视图缓冲中的修改写回到视图表中, tablerevert() 则取消修改。没有这些函数将不能对源表进行任何处理。
  • 你不能修改视图表的结构,也不能使用对它使用create trigger, insert, pack, 或 zap 命令 (但可以使用delete all)。
  • 与联线视图一样, 离线视图自动使用行缓存和表缓存, 因此你应该将multilocks 设置为 on。如果你试图关闭缓存将会得到一条错误信息。
  • 与联线视图不同的是, 打开一个离线视图不会自动打开视图所基于的源表 ,这是由于离线视图是与源表"脱离的"。这意味着当你把离线视图交给别人时,不需要提供源表的拷贝 (它可能会非常大或是一个非VFP 数据表)。同时也意味着你可以在源表上进行某些类型的(诸如重建索引之类)维护, 甚至在多个用户打开离线视图时。稍后我们将看到这种例子。
  • 在离线视图上输入数据时,源表的规则和触发器不会激活, 仅当你将数据更新到源表时, 源表的规则和触发器才会激活。这就是说除非你为使用 dbsetprop()为离线视图定义了规则, 有可能有不正确的数据进入离线视图并不能在较早的时候被发现。
  • 如果你使用"修补关键字", 你需要为添加到视图中的记录指定关键字值。最常用的指定关键字段值的方法是调用一个NEXTID 程序来为该表的取得下一个可用的基本关键字段值。如果你使用的是这种方案, 你需要使用dbsetprop() 来设置离线视图中的字段的DefaultValue 属性,这样添加记录到离线视图中时可取得指定的关键字段值。
  • 使用候选关键字段的一个不利因素是: 如果离线视图用于允许远程数据输入 (如在笔记本电脑中), 你需要为每一个笔记本电脑指定一个关键字段值块,这样主关键字段的值才不会重复。作为一种选择, 你可以将用户名或笔记本电脑名组合进关键字段值中, 这样就不用担心会出现相同的主关键字段值了。
  • 如果一个离线视图是用于一个远程计算机上进行数据输入, 你需要传送离线视图表(包括FPT), 持久表缓存文件和数据库容器(DBC, DCX, 和DCT) 到那个远程计算机中。

如果你需要确定自视图离线后那些记录被修改了, 使用use 命令的admin 子句。这需要以独占方式访问视图表否则你会得到一条错误信息。下面是使用该命令的例子:

use LV_CUSTOMER admin exclusive

当用admin 模式打开视图时,它自动使用表缓存而不是行缓存。

试图改变表的缓存模式会造成错误。

一但视图以admin 模式打开, 你可以使用getnextmodified() 和 getfldstate() 来确定哪些记录和这些记录中的哪些字段被修改了。

有趣的是, 在admin模式下打开一个离线视图时并没有自动打开它的源表, 因此 VFP 必须使用 TBF 文件来检查哪些记录被修改了。

当视图在管理模式下打开时,你不能更新源表; 更详细的信息参见下一章中的更新源表。可是, 你可以使用tablerevert() 来撤消对离线视图的修改.

原文转自:http://www.ltesting.net