foxpro维护源表
当然,这些代码是硬编码来打开CUSTOMER 表单,因为它是本例中指定的表单。在一个真正的应用程序中,你可以用一个管理对象在关闭表单将它注册到应用程序的INI文件中,管理器对象负责再次启动各个表单的备份。
一个用于重建索引的表单,当用户开始重索引时或已完成时设置SYSINFO.CHNGSTATE 为 .T. 并启动计时器。正象我们已看到的那样,设置SYSINFO.CHNGSTATE 通知所有工作站上的所有打开的表单,它需要启动应用程序范围的计时器然后关闭它自己。重索引表单计时器使用试着以独占方式打开视图的方法来定期检查所有用户已经关闭视图。一但可以以独占方式打开视图,视图离线或联线 (首先更新源表),并且 SYSINFO.CHNGSTATE 设置回.F.(通知应用程序级计时器数据输入可以继续)。以下是REINDEX 表单的计时器对象的Timer() 事件的代码:
with Thisform
* Disable 计时器(因此当我们执行这此代码时它不会激活)
* 并看我们是否可以以独占方式打开该视图。
This.Enabled = .F.
.CloseTables()
select 0
use LV_CUSTOMER exclusive
do case
* 我们可以打开该视图,因此再关闭它,我们自己disable它
* 并转换视图的状态.
case used('LV_CUSTOMER')
.CloseTables()
.SwitchState()
* 如果我们还再尝试中,看我们是否超过了最大时间数。
* 如果是,取消处理.
case seconds() - .nStartTime > .nMaxTime
.cmdOffline.Click()
* 再次Enable 计时器.
otherwise
This.Enabled = .T.
endcase
endwith
如果 VFP 没有安装在这些文件所在驱动器上的VFP5 目录中,修改 SETUP.PRG 并按需要修改lcDataDir 中的目录定义。运行SETUP.PRG 来在DATA目录中建立VFP 样板数据库文件TESTDATA。一个新的叫做LV_CUSTOMER的视图和一个叫SYSINFO.DBF 的表将被建立。
在运行了SETUP后,运行 MYAPP.PRG。显示一个customer 表单的实例 (注意表单标题指明视图是online的) 然后从菜单中选择重索引表。重建索引表表单显示一个亮红色并指明重索引不能处理因为视图是online (重建索引按钮也将被废止)。单击离线按钮。注意颜色变为黄色并指明正在等待视图离线。同时,联线按导的提示改变为取消; 这允许你在等待时取消处理。5秒钟后(客户表单中的计时器时钟),将会显示一个对话框指明客户表单将被关闭。然后客户表单关闭,重索引表单的颜色变为绿色并指明可以进行重建索引处理。同时,取消按钮的提示变为联线,允许你将视图回联,且重建索引按钮变为可用状态。
客户表单也立即自动打开,但请注意标题指明视图是offline。单击重建索引按钮来重索引customer 表。在客户表单中修改一条记录来证明可以进行数据输入。现在单击联线按钮并注意它自己的重复处理:客户表单关闭,重索引表表单指明视图已回联,然后客户表单在视图联线时重新打开。注意你对离线视图中的数据的修改现在 reflected 在联线视图中了。 可能会想当视图离线时是否可以更新源表的结构。
回答是:可能VFP 会非常不快(因此,你也会非常不快)。如果表的结构修改了,任何基于该表的视图都会受到影响。
例如,如果 LV_CUSTOMER 是用 SELECT * 命令建立的基于CUSTOMER 的视图,在该表中添加或删除一个字段;你会得到一条错误"基表字段已改变与视图不再匹配" 且视图不能打开。(有趣的是,如果在修改时视图是离线的,你可以继续以该视图工作并在online 模式下打开它并更新到源表。然而,一但你将该视图回联并试着打开它时,你将看到该错误信息)。
如果视图的每一个字段是用精确的字段名(例如SELECT CUST_ID,COMPANY,CONTACT …),字段可以添加到表中并不影响视图(如果你想通过视图向新字段输入数据,视图当然必须重新定义)。从表中删除一个字段或更名一个字段会致使“SQL 列<字段名> 未找到” 错误且视图不能打开(如果它是一个联线视图)。
如果视图是离线的,它可以被打开,但tableupdate() 将失败。
这个故事的教训是:根据你的视图是如何定义的和对表的结构进行了什么样的修改,你可能可以在对一个表的离线视图进行数据输入的同时修改该表的结构。为确保存安全,你应该在表结构改变后重新定义视图。数据备份是另一个当源表与离线视图未关联时的维护任务。
