如果你有一个应用程序必须不停止的工作或表太大以致于应用程序不能在为它建立索引是停止下来,你将面临这样的问题:如果工作站或服务器崩溃,索引被破坏并要求重建时,应该怎么办? 有一个好的理由让你的表单和报表是基于视图的而不是基于表的。你可以让一个视图离线,并在用户继续查询或数据输入时重建索引。一但索引完成,从离线视图把数据更新到源表。仅需要短暂的中断来让视图离线后更新源表并重新让视图联线。事实上,如果你需要进行常规的重建索引,你可以考虑使用离线视图,并周期性的短时联线时间进行重建索引工作。 一个小的复杂的地方是,如何关闭各工作站上的视图足够长的时间来使视图离线(以及连线) 而不需要打电话告诉各个用户告诉他们关闭数据输入表单一会?我使用的方法是一种“旗语”方案:各数据输入表单监视一个需要维护的信号。当接收到该信号时,表单关闭,然后应用程序等待第二个视图状态已改变的信号(离线或联线),然后数据输入可以继续下去。在收到第二个信息前,用户不能访问数据输入表单或任何使用视图的报表。 监视信号的基础是计时器对象。在该方案中居然使用了三个有关的计时器: 重索引表单中的计时器用于执行重建索引时的等待,直到所有用户关闭了视图。然后让视图离线或联线(这要看是否重建索引是开始了或已经完成) 并传送信号到应用程序级的计时器。 在数据输入表单中的计时器等待一个信号时,视图必须改变状态。当接收到该信号时,表单关闭且一个应用程序级的计时器开始工作。 应用程序级的计时器,它仅在等待视图的修改状态时被启用,监视来自重索引表单中的视图状态改变信号,这样数据输入和查询可以继续。 当你解压本文所附的源代码(在第二节)时,会在REINDEX 目录中生成一些文件。以下是这些文件中的一部分: SYSINFO.DBF 是一个包含一个逻辑字段CHNGSTATE 的表(ChangeState的缩写)。该字段在通常情况下的值为.F.,当它的值被设置为.T.时,它反映了视图中所有的该状态的块必须修改。该表在应用程序运行过程中始终是打开的。 应用程序菜单中的所有功能都需要一个Skip For SYSINFO.CHNGSTATE 。因此当视图的该状态被修改时,用户不能访问该功能。 任何使用视图的数据输入表单都有一个计时器对象,在其Timer() 事件中的代码关闭表单并启用一个应用程序级的计时器,如果 SYSINFO.CHNGSTATE 变为.T。以下是CUSTOMER 表单中的计时器对象中的代码 (在该代码中,oTimer 是应用程序级的计时器): if SYSINFO.CHNGSTATE messagebox(’Closing form to perform maintenance。’ . ’The form will automatically reopen in just a ’ . ’moment.’,48) oTimer.Enabled = .T. Thisform.Release() endif SYSINFO.CHNGSTATE
在应用程序启动时,一个计时器对象被实例化但是被废止的(disabled)。该计时器 仅在表单因视图处于修改状态而被强制关闭时启用,在它的Timer() 事件event 代码中搜索SYSINFO.CHNGSTATE 是否为.F.因此它可以重新打开任何因视图处于修改状态而被强制关闭的表单。以下是其代码在(在类库MYAPP.VCX 中的MyApp计时器类)中: if not SYSINFO.CHNGSTATE This.Enabled = .F. do form CUSTOMER endif not SYSINFO.CHNGSTATE