endcase
* 如果没有发生冲突,则强行更新。
else
= tableupdate(.F., .T.)
endif llConflict
表缓冲的写入
我们前面已经讲到,可以用tableupdate(.T.)将表缓冲中的所有记录一次写入磁盘。与行缓冲一样,如果其它用户修改了表(或是其它什么出错原因)而不能正确更新表,tableupdate(.T.)将返回.F.值。
前文所讲的错误处理程序在行缓冲模式下运行良好,因为我们在某一时刻只关心单条记录。但对于表缓冲来说,我们不得不考虑每一条记录,因为在缓冲区中可能既有修改过的记录,也有未修改过的记录,我们怎样知道到底更新哪条记录呢?如果用tableupdate(.T.)失败(返回.F.),情况就变得更加复杂化:我们不知道错在哪条记录上!而且有些记录可能被做过"保存",所以还不止一条记录会发生冲突呢。请不要着急:),VFP新增函数getnextmodified()可以精确地告诉我们想知道的信息:该函数返回下一个被修改记录的记录号。如果返回值为0,说明在缓冲区中没有被修改过的记录。这个函数接收两个参数:第一个参数是一个记录号,正是从这个记录号开始向下查找下一个被修改的记录;第二个参数是查找的工作区别名。最被,你应该将0传给第一个参数,这样getnextmodified()就会找到第一个被修改的记录,若要继续找下一个被修改的记录,只要将当前记录的记录号传给第一个参数即可。
下面是在刚才处理冲突的程序基础上改进后的代码,它用来处理表缓冲更新失败时的操作。
* 先找到第一个被修改过的记录。
lnChanged = getnextmodified(0)
do while lnChanged <> 0
* 移动记录指针并尝试锁定它。
go lnChanged
if rlock()
* 检测每一个字段,看哪个发生了冲突。
llConflict = .F.
for lnI = 1 to fcount()
lcField = field(lnI)
llOtherUser = oldval(lcField) <> curval(lcField)
llThisUser = evaluate(lcField) <> oldval(lcField)
llSameChange = evaluate(lcField) == curval(lcField)
do case
* 其它用户编辑了该字段,而当前用户没编辑,所以直接用新值即可。
case llOtherUser and not llThisUser
replace (lcField) with curval(lcField)
* 其它用户没有编辑该字段,或者二者做了相同的修改,因此我们无需做任何处理。
case not llOtherUser or llSameChange
* 两个用户以不同的值修改了该字段。
otherwise
llConflict = .T.
endcase
next lnI
* 如果发生了字段冲突,我们可以在此处理它,与行缓冲不同的是,我们也可以现在不处理,因为以后所有记录将被写入,到时会处理的。
if llConflict
lnChoice = messagebox(''''Another user also changed '''' + ;
''''record '''' + ltrim(str(lnChanged)) + ''''. Do you want to '''' + ;
''''overwrite their changes (Yes), not overwrite but see '''' + ;
''''their changes (No), or cancel your changes (Cancel)?'''', 3 + 16, ;
''''Problem Saving Record!'''')
do case
* 如果选择了覆盖其它用户的修改,在此可以不做处理,因为以后将一次性更新。
case lnChoice = 6
*通过产生一个表单实例来查看其它用户的修改内容。
&nb
转载!
上一页 [1] [2] [3] [系统软件]Visual Studio 2005 Express Beta Products 下载链… [系统软件]曝光Visual Foxpro 9.0 最新秘密 [系统软件]FOXPRO 系统指标 [系统软件]Visual FoxPro9.0中扩展报表系统功能 [系统软件]Visual FoxPro:我是旁观者 [系统软件]Visual Studio 2005 Express Editions Beta 2 下载… [系统软件]ASP对FoxPro自由表(DBF文件)的操作 [系统软件]Boost库在XP+Visual C++.net中的安装 [系统软件]Visual Studio 2005 Express Edition 正式版下载地… [常用软件]Visual Foxpro通用报表打印程序
|