cursorsetprop()函数用法

上传人:大米 文档编号:570311481 上传时间:2024-08-03 格式:PDF 页数:12 大小:418.19KB
返回 下载 相关 举报
cursorsetprop()函数用法_第1页
第1页 / 共12页
cursorsetprop()函数用法_第2页
第2页 / 共12页
cursorsetprop()函数用法_第3页
第3页 / 共12页
cursorsetprop()函数用法_第4页
第4页 / 共12页
cursorsetprop()函数用法_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《cursorsetprop()函数用法》由会员分享,可在线阅读,更多相关《cursorsetprop()函数用法(12页珍藏版)》请在金锄头文库上搜索。

1、欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档! 使用缓冲: 缺省情况下缓冲器是关闭的,这种情况下在更新表时 vfp 和 foxpro 2.x 是一样的,要使用缓冲你必需将它打开。 缓冲适用于自由表及数据库中的表。 要用缓冲还要 set multilocks on,因为 multilocks 缺省值是 off,如果你忘了设置其值为 on,会出现错误信息。你可以把multilocks=on 加入到 config.fpw 文件中,或是用工具栏下的选项功能保存其值为on。 我们通过 cursorsetprop(buffering,)来定义缓冲方式。如果是

2、对当前表设置缓冲,不必定义,根据你想要的缓冲及锁定方式为下列值: 缓冲及锁定法: 值: 无缓冲 1 保守式行缓冲 2 开放式行缓冲 3 保守式表缓冲 4 开放式表缓冲 5 例如,要将当前表设置为开放式行缓冲,用 cursorsetprop(buffering,3),要取得当前正打开的表的缓冲方式,用 cursorgetprop(buffering)。 要设置一个表单的缓冲方式,你可以在表单的 load 事件中用 cursorsetprop()定义所有用到的表,但最好的方法是直接设置表单的 buffermode 属性来决定是开放式还是保守式(缺省值为无) ,这样设置后,该表单就会自动对绑定到网格

3、(grid)中的表使用表缓冲,对其它 表 则 使 用 行 缓 冲 。 如 果 你 的 表 单 使 用 了 数 据 环 境 , 你 可 以 对 某 一 个 表 的buffermodeoverride 属性按你的意图设置缓冲,以取代表单的 buffermode 属性。 如果有用户正在修改缓冲记录中的数据(此时用户处在编辑状态) ,你不仅可以取得他们输入到每个字段中的值,还能取得每个字段的初始值和当前值(此值为磁盘中的实际值) ,为此 vfp 提供了 oldval()和 curval()函数。 要得到: 使用: 用户输入值(缓冲的数据) 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除

4、!我们将竭诚为您提供优质的文档! or 用户未做任何改动之前的值 oldval() 当前记录中的值 curval() 注: curval()和 oldval()仅用于开放式缓冲。 你可能搞不懂 curval()返回值和 oldval()返回值有什么不同,如果是在单用户程序中,二者之间是没什么区别,但是如果是在网络中,在开放式锁定下,很可能在本用户编辑一条记录时,另一个用户也编辑同一条记录,并在本用户保存之前进行了保存,下面是一个例子: 郑某将 contacts.dbf 指针定位到第 2 条记录,并点击了编辑按钮: 字段 缓冲值 初始值 oldval() 当前值 curval() 姓名 李达 李

5、达 李达 公司名称 狐友技术开发公司 狐友技术开发公司 狐友技术开发公司 然后,郑某将公司名称改为狐友俱乐部,但还没有保存记录: 字段 缓冲值 初始值 oldval() 当前值 curval() 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档! 姓名 李达 李达 李达 公司名称 狐友俱乐部 狐友技术开发公司 狐友技术开发公司 就在此时,于某也将 contacts.dbf 指针定位到第 2 条记录,并点击了编辑按钮,他改变了公司名称为猎狐者俱乐部,并保存。此时在郑某的机器上会看到如下结果: 字段 缓冲值 初始值 oldval() 当前值 curval

6、() 姓名 李达 李达 李达 公司名称 狐友俱乐部 狐友技术开发公司 猎狐者俱乐部 注意:在上表中 contacts.公司名称、oldval(公司名称)以及 curval(公司名称)将返回不同的值。访问记录中各字段的初始值、缓冲值和当前值,你可以: l 通过比较缓冲值和初始值来确定哪些字段被用户修改了; l 通过比较初始值和当前值来检测在开始编辑后,网络中是否有其它用户修改了同一条记录。 如果你不关心初始值和当前值,而只是希望检测到某个字段中的内容是否被修改过,可以用 getfldstate()函数。这个函数返回一个数值,指出当前记录是否被做了修改。getfldstate()按以下格式调用:

7、getfldstate( | , | ) 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档! 返回值及其意义如下表所示: 返回值 意义 1 没改变 2 字段被编辑或者记录的删除标记被改变 3 添加了一条新记录但没编辑字段,以及记录的删除记录未改变 4 添加了一条新记录并编辑了字段,或者记录的删除标记被改变 记录的删除标记被改变,是指删除记录或恢复(recall)记录。值得注意的是:对记录删除后又马上进行了恢复, 尽管对记录来说没影响, 但是其删除标记被改变过, 因此, getfldstate()函数会返回 2 或 4。 如果你没有定义别名或工作区,g

8、etfldstate()将对当前打开的表进行操作。将定义为 0,该函数返回当前记录的添加及删除状态,如果定义为-1,将返回一个字符串,在这个字符串中,第一个数字反映整个表的状态,以后每个数字返映的是各字段的状态。 以我们前面讲到的情况为例,在郑某编辑第 2 条记录时,getfldstate(-1)将返回112,第一个数字1说明记录没有添加或删除,第二个数字1说明第一个字段(姓名)没有改变,第三个数字2说明第二个字段(公司名称)内容改变了。 缓冲记录的写回 我们还继续刚才的例子。现在假设郑某点击了保存按钮,我们应该怎样将缓冲中的数据写到记录中(更新表)呢?对于行缓冲来说,当你移动记录指针或调用

9、tableupdate()函数时,表就会被更新。对于表缓冲来说,移动记录指针并不会引起表的更新(因为它是多记录被同时缓冲) ,所以通常情况下只能调用 tableupdate()函数来更新表。对于行缓冲最好也用 tableupdate()函数,因为这样更好地控制程序的去向。 如果缓冲器中的内容被正确地写入到记录中,tableupdate()返回.t.值,如果记录缓冲没有改变(用户没有编辑任何字段、添加记录或改变记录的删除状态),此时,tableupdate()也返回.t.,尽管实际上什么也没有做。 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档! t

10、ableupdate()可以带几个参数: tableupdate( ,| ) 第一个参数指明哪些记录被更新:设为.f.,则只更新当前记录,若为.t.,则更新所有记录(仅影响表缓冲) 。 如果第二个参数是.t.,那么其它用户的任何修改将被当前用户的修改所覆盖。如果没定义第三个参数,tableupdate()将更新当前表。 怎样取消用户所做的修改呢?对于用内存变量的方法, 可以再次用 scatter memevar 语句从磁盘上的数据恢复到内存变量中, 而对于缓冲来说, 用 tablerevert()函数即可达到同样功能。 错误处理 我们继续郑某和于某的例子,当郑某点击保存按钮后,代码将执行 ta

11、bleupdate()函数以把缓冲中的数据写入记录。请记住,在郑某编辑记录时于某已经修改了同一条记录并做了保存。当郑某点击保存时,tableupdate() 将返回.f.,说明它不能将缓冲写入记录中,为什么会是这样呢? vfp 在以下几种情况下无法将缓冲写入记录: l 当一个用户编辑记录时,其它用户修改并保存了该记录(正如我们例子中的那种情况) 。 vfp 自动对每个字段的 oldval()值和 curval()值进行比较, 如果检测到任何不同,就会产生冲突。 l 用户输入了重复的主索引或候选索引值。 l 违背了某个字段或表的验证规则,或者不支持 null 的字段出现了 null 值。 l 某

12、个触发(trigger)失败。 l 其它用户锁定了该记录。 l 其它用户删除了该记录。 当 tableupdate()失败时,我们必须决定下一步做什么,而且,如果你的程序在编辑记录时允许用户点击下一个或上一个按钮,而这两个按钮中又没有调用 tableupdate()的话,你必须得处理在自动保存时将会发生的错误。在这两种情况下,将程序指定到适当的位置就是错误陷阱处理程序。 visual foxpro 中的多用户及数据缓冲问题(下) 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档! - 2000-10-6 17:07:00 在 vfp 中错误处理已经得

13、到改进。以前处理错误陷阱的方法(你仍然可以在 vfp 中继续使用这些方法)是当错误发生时用 on error 命令来决定要执行的程序,典型的错误处理程序是查看 error()和 message()来确定发生了什么错误,然后采取相应的动作。 现在 vfp 提供了一种自动的错误处理机制:就是 error 方法。如果定义了一个控件或表单中的 error 方法,当错误发生时它就被自动执行。aerror()是 vfp 的一个新增函数,通过传递一个参数,该函数可以创建或更新一个含有以下元素的数组 元素 类型 描述 1 数字 错误号(与 error()相同) 2 字符 错误信息(与 message()相同)

14、 3 字符 如果有一个错误信息参数(与 sys(2018)相同) ,则返回之(例如:一个字段名) ,无,则返回.null. 4 数字或字符 发生错误的工作区。如果没有,则返回.null. 5 数字或字符 如果一个触发器失败, 返回触发器号 (插入为 1, 更新为 2, 删除为 3) , 如果没有则返回.null. 6 数字或字符 .null.(应用于 ole 和 odbc 错误) 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档! 7 数字 .null.(应用于 ole 错误) 例如:aerror(iaerror)会创建或更新一个称为 iaerror

15、 的数组。 以下是 vfp 在将缓冲写入表时可能发生的一些错误: 错误号 错误信息 说明 109 记录正由其它用户使用 1539 触发器失败 检测数组的第 5 个元素可以确定是哪个触发器失败了 1581 字段不接受空值(null) 检测数组的第 3 个元素可以确定是哪个字段引起的错误 1582 违反了字段的验证规则 检测数组的第 3 个元素可以确定是哪个字段引起的错误 1583 违反了记录的验证规则 1585 记录已被其它用户修改 1884 违反了索引的唯一性 检测数组的第 3 个元素可以确定是哪个索引标记引起的错误 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为

16、您提供优质的文档!欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档! 在手工输入存货数量或帐目余额时,有一种可能就是其它用户输入的值对缓冲值会产生影响。比如,如果检测到 oldval()是 10, curval()是 20,说明其它用户将数额已增加了 10;如果现在缓冲值为 5,说明当前用户要将数额在原基础(10)上减少 5,因此新的缓冲值就应该是 value+ oldval()- curval(),即等于 15,应该用此数来更新字段。 对于日期型字段的冲突, 就要考虑商业规则或按实际情况处理。 例如, 在病人预约时间程序中, 有一个字段保存着病人下

17、次预约医生的时间, 如果该字段两个日期发生冲突的话,那么,靠近当前日期的那个日期很可能是正确的。当然,若是其中一个预约日期比当前日期还要早的话(已经过期) ,那就应该取靠后的那个日期了。 其它类型的字段,特别是字符型和备注型字段,通常情况下如果不询问用户以决定是覆盖其它用户的修改还是取消自己的修改的话,则冲突不好解决。只有当用户在屏幕上看到其它用户到底做了什么修改后,他才能做出正确地判断。 以下是解决冲突的一些代码(这些代码假设已检测到错误码为1585,即记录已被其它用户修改过。 ) * 检测每一个字段,看哪个发生了冲突。 llconflict = .f. for lni = 1 to fco

18、unt() 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) * 其它用户没有编辑该字段

19、,或者二者做了相同的修改,因此我们无需做任何处理。 case not llotheruser or llsamechange 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档! * 两个用户以不同的值修改了该字段。 otherwise llconflict = .t. endcase next lni * 如果发生了冲突,处理之! if llconflict lnchoice = messagebox(another user also changed this + ; record. do you want to overwrite their c

20、hanges (yes), + ; not overwrite but see their changes (no), or cancel + ; your changes (cancel)?, 3 + 16, problem saving record!) do case * 覆盖其它用户的修改。 case lnchoice = 6 = tableupdate(.f., .t.) * 通过产生一个表单实例来查看其它用户的修改内容。 case lnchoice = 7 do form myform name oname * 取消当前用户的修改。 otherwise = tablerevert(

21、) endcase 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档! * 如果没有发生冲突,则强行更新。 else = tableupdate(.f., .t.) endif llconflict 表缓冲的写入 我们前面已经讲到, 可以用 tableupdate(.t.)将表缓冲中的所有记录一次写入磁盘。 与行缓冲一样, 如果其它用户修改了表 (或是其它什么出错原因) 而不能正确更新表, tableupdate(.t.)将返回.f.值。 前文所讲的错误处理程序在行缓冲模式下运行良好,因为我们在某一时刻只关心单条记录。但对于表缓冲来说,我们不得不考虑

22、每一条记录,因为在缓冲区中可能既有修改过的记录,也有未修改过的记录,我们怎样知道到底更新哪条记录呢?如果用 tableupdate(.t.)失败(返回.f.) ,情况就变得更加复杂化:我们不知道错在哪条记录上!而且有些记录可能被做过保存,所以还不止一条记录会发生冲突呢。请不要着急: ) ,vfp 新增函数getnextmodified()可以精确地告诉我们想知道的信息: 该函数返回下一个被修改记录的记录号。如果返回值为 0,说明在缓冲区中没有被修改过的记录。这个函数接收两个参数:第一个参数是一个记录号,正是从这个记录号开始向下查找下一个被修改的记录;第二个参数是查找的工作区别名。最被,你应该将

23、 0 传给第一个参数,这样 getnextmodified()就会找到第一个被修改的记录,若要继续找下一个被修改的记录,只要将当前记录的记录号传给第一个参数即可。 下面是在刚才处理冲突的程序基础上改进后的代码,它用来处理表缓冲更新失败时的操作。 * 先找到第一个被修改过的记录。 lnchanged = getnextmodified(0) do while lnchanged 0 * 移动记录指针并尝试锁定它。 go lnchanged if rlock() * 检测每一个字段,看哪个发生了冲突。 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!

24、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)

25、 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 + ;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号