谁有全国计算机等级考试时间Visual F...

1. 新增扫二维码功能,可直接扫 VeryCD 网站影片页面的二维码,便能在应用上打开;
2. 新增支持 B 站视频(哔哩哔哩),满屏的弹幕更欢乐;
1. 新增支持 B 站视频(哔哩哔哩),满屏的弹幕更欢乐;
2. 在影片封面上展示在线视频的清晰度;
您的位置:
网友评论:
好资源,十分感谢!
不谢~O(∩_∩)O~
支持!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
引用(cyhcz2005 @ -10, 01:16 PM) 支持!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!本人第一次发布,感谢支持!
请楼主添加不少于100字的中文内容简介
引用(hipoking @ -10, 04:16 PM) 请楼主添加不少于100字的中文内容简介要那么多啊?ms写不出来啊!我再去找点信息~
引用(hipoking @ -10, 04:16 PM) 请楼主添加不少于100字的中文内容简介已经修改了,请问行吗?
好东西啊!太感谢楼主了!马上开学就考C语言,简直是雪中送炭啊!Thx a ton !
好东西,谢谢LZ~
不错的东东,谢谢分享!
引用(ethanhu @ -10, 08:45 PM) 好东西啊!太感谢楼主了!马上开学就考C语言,简直是雪中送炭啊!Thx a ton !不谢!开学我也要考试,我们共勉!
引用(灰色皮卡丘 @ -10, 09:03 PM) 引用(ethanhu @ -10, 08:45 PM) 好东西啊!太感谢楼主了!马上开学就考C语言,简直是雪中送炭啊!Thx a ton !不谢!开学我也要考试,我们共勉!请问楼主可否将文件上传到QQ中转站啊?Thx ~
引用(ethanhu @ -10, 09:15 PM) 引用(灰色皮卡丘 @ -10, 09:03 PM) 引用(ethanhu @ -10, 08:45 PM) 好东西啊!太感谢楼主了!马上开学就考C语言,简直是雪中送炭啊!Thx a ton !不谢!开学我也要考试,我们共勉!请问楼主可否将文件上传到QQ中转站啊?如果可以的话,麻烦发到我那,Thx ~是没速度吗?不好意思,水管太小了。今天迟些会发到你邮箱里的,QQ那上传也不太快~~
非常感谢!
如果急需此资源,又下不了的驴友可以留下QQ邮箱。
谢谢了啊! 下到8.7卡了。
引用(xiaomeme @ -10, 10:35 PM) 谢谢了啊! 下到8.7卡了。已经发给你了
哇哈哈~LZ顺便给我也发个吧!
大家能用驴子的尽量用驴子嘛,发扬我们的共享精神!
引用(灰色皮卡丘 @ -11, 12:49 AM) 大家能用驴子的尽量用驴子嘛,发扬我们的共享精神!谢谢,你收到你的QQ邮件。已下载分流中
引用(yxdr @ -10, 12:36 PM) 好资源,十分感谢!23级应聘单位已不在呼,有等考通 全国计算机等级考试四级网络工程师 考点分析全真模拟西北工业大学出版社等考通 全国计算机等级考试四级网络工程师 全真模拟试卷 哈尔滨工程大学请上传,谢了.
引用(caishang @ -11, 08:10 PM) 引用(yxdr @ -10, 12:36 PM) 好资源,十分感谢!23级应聘单位已不在呼,有等考通 全国计算机等级考试四级网络工程师 考点分析全真模拟西北工业大学出版社等考通 全国计算机等级考试四级网络工程师 全真模拟试卷 哈尔滨工程大学请上传,谢了.不好意思,我三级还没过,四级还没买。。。
好东西啊,不过现在是周日下不了。
一级的MS office 密码有误…………
引用(deceiveme @ -12, 10:05 AM) ……密码有误…………密码多数是错的!!请楼主更正!!
引用(wangnianf @ -12, 11:18 AM) 引用(deceiveme @ -12, 10:05 AM) ……密码有误…………密码多数是错的!!请楼主更正!!这位同学,以上密码我刚刚已经全部测试过了,只有一级的有问题。请你手动输入密码,中间有“-”,请勿漏输。还有,你说多数是错了,你真的都试了吗?
引用(deceiveme @ -12, 10:05 AM) 一级的MS office 密码有误…………不好意思,刚测试了,确实这一个密码有问题,我再去找找。。。大家如果在网上找到了,请立即联系我。
一级ms密码什么时候出来啊
谢谢楼主了,网络技术太重要了,加油
回帖支持嘿嘿
引用(灰色皮卡丘 @ -11, 08:22 PM) 引用(caishang @ -11, 08:10 PM) 引用(yxdr @ -10, 12:36 PM) 好资源,十分感谢!23级应聘单位已不在呼,有等考通 全国计算机等级考试四级网络工程师 考点分析全真模拟西北工业大学出版社等考通 全国计算机等级考试四级网络工程师 全真模拟试卷 哈尔滨工程大学请上传,谢了.不好意思,我三级还没过,四级还没买。。。电驴有北大青鸟ACCP5.0 BENET4.0课程,你去下来看一下,23级我过了,但到找工作才发现原来社会要四级,我今天买了有等考通 全国计算机等级考试四级网络工程师 考点分析全真模拟西北工业大学出版社等考通 全国计算机等级考试四级网络工程师 全真模拟试卷 哈尔滨工程大学正在报名9月考,建议学123级,考4级竞争太残酷了,还是谢谢你.
电驴资源下面是用户共享的文件列表,安装电驴后,您可以点击这些文件名进行下载 全国计算机等级考试二级教程--VisualBasic语言程序设计(2008年版)教程.rar 详情 34.8MB 全国计算机等级考试二级教程--公共基础知识(2008年版)教程.rar 详情 13.2MB 全国计算机等级考试三级教程--网络技术(2008年版)教程.rar 详情 29.3MB 全国计算机等级考试-二级教程-C语言程序设计(2008年版).rar 详情 11.1MB 全国计算机等级考试-四级教程-数据库工程师(2008年版).rar 详情 19.8MB 全国计算机等级考试-二级教程-Java语言程序设计(2008年版).rar 详情 12.9MB 全国计算机等级考试-二级教程-Access数据库程序设计(2008年版).rar 详情 24.6MB 全国计算机等级考试-三级教程-数据库技术(2008年版).rar 详情 19.3MB 全国计算机等级考试-二级教程-C.语言程序设计(2008年版).rar 详情 14.9MB 全国计算机等级考试二级教程--VisualFoxPro数据库程序设计(2008年版)教程.rar 详情 30MB 全选 19.8MB中文名: 2008年版全国计算机等级考试教程全英文名: 2008 Computer Qualification Exam Study Materials发行时间: 2008年地区: 大陆对白语言: 普通话简介:
2008年计算机等级考试教程等资料正在不断更新中。本书根据教育部考试中心最新颁布的2008考试大纲编写,是教育部考试中心组织编写的全国计算机等级考试系列教程之一。 本书内容精练、实用性强、叙述通俗、简易可读,每章之后都附有一定数量的习题,是参加计算机等级考试者必备的教材。本书也可以作为大专院校非计算机专业的计算机入门参考书。   全书为完整扫描电子书,为网友推荐收集整理而来,不得做为任何商业用途!仅供学习和研究使用。注意:C..为C++教程,发布种子的时候显示有误!全国计算机等级考试二级教程--VisualFoxPro(2008年版)教程 这个是VF的教程,楼下的朋友需要的!我将继续更新!由于本人是使用adsl为大家供源,带宽有限,先借用一个计算机论坛的ftp空间为大家提供教程!我会逐步把下载方式变成电驴下载,也希望大家都能够供源,方便大家下载!全国计算机等级考试二级教程--公共基础知识(2008年版)教程全国计算机等级考试二级教程--VisualFoxPro(2008年版)教程全国计算机等级考试二级教程--VB语言程序设计(2008年版)教程全国计算机等级考试二级教程--Delphi语言程序设计(2008年版)教程全国计算机等级考试-二级教程-Java语言程序设计(2008年版)教程全国计算机等级考试-二级教程-C语言程序设计(2008年版)教程全国计算机等级考试-二级教程-C++语言程序设计(2008年版)教程全国计算机等级考试-二级教程-Access数据库程序设计(2008年版)教程全国计算机等级考试三级教程--网络技术(2008年版)教程全国计算机等级考试-三级教程-数据库技术(2008年版)教程全国计算机等级考试-四级教程-数据库工程师(2008年版)教程再给大家推荐些关于等级考试的内容,有些比较大的内容我也会逐渐以电驴发布![吐血推荐]钱能 c++程序设计教程 第二版 高清PDF版Visual C++ 6傻瓜书 PDF文字版[特别推荐]数据结构C语言版视频教程 全52讲 完整版中山大学蔡培兴 C++语言视频教程 全51讲完整版 精品推荐[经典推荐]Java视频教程 孙鑫Java无难事 (全12CD)C++程序设计实验指导(钱能)[计算机等级考试]南开100题分类txt版[计算机等级考试]Visual Foxpro基础教程二级(VB)上机题南开上机题java篇(全)二级FOXPRO上机编程题题型[样题]全国计算机等级考试四级上机题谭浩强C语言全书word版VC++ 6.0 在2008全国计算机等级考试中的应用指南年9月计算机等级考试二级真题试题汇总年9月计算机等级考试三级历年真题试题汇集[安全检测]已通过安全检测安全检测软件: 瑞星2008程序版本:20.25.40病毒库: 共源服务器: RazorBack 3.0共源服务时间: 7*24对你的感谢.
引用(caishang @ -14, 11:22 AM) 引用(灰色皮卡丘 @ -11, 08:22 PM) 引用(caishang @ -11, 08:10 PM) 引用(yxdr @ -10, 12:36 PM) 部分楼层已被隐藏,23级应聘单位已不在呼,有等考通 全国计算机等级考试四级网络工程师 考点分析全真模拟西北工业大学出版社等考通 全国计算机等级考试四级网络工程师 全真模拟试卷 哈尔滨工程大学请上传,谢了.不好意思,我三级还没过,四级还没买。。。电驴有北大青鸟ACCP5.0 BENET4.0课程,你去下来看一下,23级我过了,但到找工作才发现原来社会要四级,我今天买了有等考通 全国计算机等级考试四级网络工程师 考点分析全真模拟西北工业大学出版社等考通 全国计算机等级考试四级网络工程师 全真模拟试卷 哈尔滨工程大学正在报名9月考,建议学123级,考4级竞争太残酷了,还是谢谢你.非常感谢你的提醒,原来现在四级才有用啊。想请教下,你觉得四级有用还是软考有用呢?哪个简单一些?想在三级过了以后选其中一个考。
引用(灰色皮卡丘 @ -12, 09:41 PM) 引用(wangnianf @ -12, 11:18 AM) 引用(deceiveme @ -12, 10:05 AM) ……密码有误…………密码多数是错的!!请楼主更正!!这位同学,以上密码我刚刚已经全部测试过了,只有一级的有问题。请你手动输入密码,中间有“-”,请勿漏输。还有,你说多数是错了,你真的都试了吗?我真的测试过了,是有好几个错的!!!
引用(wangnianf @ -14, 04:54 PM) 引用(灰色皮卡丘 @ -12, 09:41 PM) 引用(wangnianf @ -12, 11:18 AM) 引用(deceiveme @ -12, 10:05 AM) 部分楼层已被隐藏,密码多数是错的!!请楼主更正!!这位同学,以上密码我刚刚已经全部测试过了,只有一级的有问题。请你手动输入密码,中间有“-”,请勿漏输。还有,你说多数是错了,你真的都试了吗?我真的测试过了,是有好几个错的!!!那我肯定你密码输入方式有问题,因为我全部测试了
好东西 做个标记 一会来载
很好的资源,9月就要考试了,谢谢楼主分享!
下载再说~~
经典强烈支持了,下载使用
一级MS-OFFICE的密码是多少呢?
引用(灰色皮卡丘 @ -10, 01:22 PM) 引用(cyhcz2005 @ -10, 01:16 PM) 支持!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!本人第一次发布,感谢支持!四级和软考都不好考,工作单位更看重编程能力. 软件工程师 5.0 教材 ACCP 软件工程师 5.0 教学PPT和源代码 内部光盘北大青鸟 软件工程师 4.0 教学PPT和源代码北大青鸟 网络工程师 2.0 教学PPT、素材和视频演示默然说话ACCP5.0二年课程----全部更新完毕你可下来自学,我现在下来自学.祝你成功.
引用(yxdr @ -10, 12:36 PM) 好资源,十分感谢!四级和软考都不好考,工作单位更看重编程能力. 软件工程师 5.0 教材 ACCP 软件工程师 5.0 教学PPT和源代码 内部光盘北大青鸟 软件工程师 4.0 教学PPT和源代码北大青鸟 网络工程师 2.0 教学PPT、素材和视频演示默然说话ACCP5.0二年课程----全部更新完毕你可下来自学,我现在下来自学.祝你成功.
四级和软考都不好考,工作单位更看重编程能力. 软件工程师 5.0 教材 ACCP 软件工程师 5.0 教学PPT和源代码 内部光盘北大青鸟 软件工程师 4.0 教学PPT和源代码北大青鸟 网络工程师 2.0 教学PPT、素材和视频演示默然说话ACCP5.0二年课程----全部更新完毕你可下来自学,我现在下来自学.祝你成功.
引用(灰色皮卡丘 @ -14, 12:58 PM) 引用(caishang @ -14, 11:22 AM) 引用(灰色皮卡丘 @ -11, 08:22 PM) 引用(caishang @ -11, 08:10 PM) 部分楼层已被隐藏,好资源,十分感谢!23级应聘单位已不在呼,有等考通 全国计算机等级考试四级网络工程师 考点分析全真模拟西北工业大学出版社等考通 全国计算机等级考试四级网络工程师 全真模拟试卷 哈尔滨工程大学请上传,谢了.不好意思,我三级还没过,四级还没买。。。电驴有北大青鸟ACCP5.0 BENET4.0课程,你去下来看一下,23级我过了,但到找工作才发现原来社会要四级,我今天买了有等考通 全国计算机等级考试四级网络工程师 考点分析全真模拟西北工业大学出版社等考通 全国计算机等级考试四级网络工程师 全真模拟试卷 哈尔滨工程大学正在报名9月考,建议学123级,考4级竞争太残酷了,还是谢谢你.非常感谢你的提醒,原来现在四级才有用啊。想请教下,你觉得四级有用还是软考有用呢?哪个简单一些?想在三级过了以后选其中一个考。四级和软考都不好考,工作单位更看重编程能力. 软件工程师 5.0 教材 ACCP 软件工程师 5.0 教学PPT和源代码 内部光盘北大青鸟 软件工程师 4.0 教学PPT和源代码北大青鸟 网络工程师 2.0 教学PPT、素材和视频演示默然说话ACCP5.0二年课程----全部更新完毕你可下来自学,我现在下来自学.祝你成功.
vb的模拟系统里显示的内容是vfp的内容,请楼主查看一下 !!!
e:\2.jpg 这是截图,综合练习和模拟考试是VFP的题目,很是郁闷!!!
传不上图片???
我下不了!?、麻烦楼主帮我发以一个呗,急需QQ:谢谢!
类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
勿催片。请相信驴友们对分享是富有激情的,如果确有更新版本,您一定能搜索到。
请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
如果您发现自己的评论不见了,请参考以上4条。
使用 BBCODE()
对白语言:&文字语言:&
正在读取……
上海隐志网络科技有限公司 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
全国计算机等级考试二级VisualFoxPro笔试习题集参考答案及解析
下载积分:4000
内容提示:全国计算机等级考试二级VisualFoxPro笔试习题集参考答案及解析,平面解析几何习题集,visual fox,visual foxpro教程,visual foxpro下载,visual foxpro考试,visualfoxpro6,visualfoxpro9.0,visualfoxpro6.0cn,visual foxpro简介
文档格式:DOC|
浏览次数:3|
上传日期: 06:30:57|
文档星级:
该用户还上传了这些文档
全国计算机等级考试二级VisualFoxPro笔试习题集参考答
官方公共微信当前位置:
全国计算机等级考试二级VisualFoxPro学习资料
来源: 联系QQ: 作者: <
发布时间: 13/03/16
【网学网提醒】:会员为大家收集整理了全国等级考试二级VisualFoxPro提供大家参考,希望对大家有所帮助!&&&&上学吧:shangxueba&&&&VFP6.0中安装字库的范例&&&&*安装字库____范例_____**该范例已在Win2000Server+SP3+VFP6.0+VSSP5运行通过******************************************************&;&;原字库文件名cSrcFontFile="C:\Temp\金山简行楷.ttf"&;&;目标字库文件名cDstFontFile="C:\Winnt\Fonts\金山简行楷.ttf"lCopyFont=.T.&;&;.T.拷贝到系统目录.F.保留在原路径IflCopyFontCopyFile"&;cSrcFontFile"To"&;cDstFontFile"ElsecDstFontFile=cSrcFontFileEndIf&;&;字库文件DeclareIntegerAddFontResourceInGDI32StringAddFontResource(cDstFontFile)*******************御载字库文件的方法**DeclareIntegerRemoveFontResourceInGDI32String*RemoveFontResource(cDstFontFile)&;&;清除Dlls定义ClearDlls&&&&监视SQLServer上的连接情况&&&&在SQLEnterprisemanager中的[Server/CurrentActivity]可以让您一目了然地看出SQL的连接情况,是个非常好用的工具。在CurrentActivity中,可见到已登入的用户清单、数据库名称、工作站名称与应用程序名称。下方的状态栏显示目前有多少连接关系正在运作,多少连接关系处于空闲。存取时限一般连接关系的存取时限从15秒到1、分钟不等,2至于精确的数值要视你所选择的程序界面与时限的设定值而定。亦即假如你要存取数据库时,选择了不正确的服务器或服务器已经关机,则CLIENT端便会没有任何反应,一直到存取时限时,才会返回连接失败信息。若要连接LAN网中的SQLSERVER不须耗费多少时间,约1至5秒内便能获得回应,应用第一次连接会花费较长的时间,第二次后会比较短。因为Windows系统会将先前的连接关系所用的控件或DLL文件一直保留在内存。&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&设定远程数据的存取方式您可以自己设定取数据的处理方式,在VFP的TOOLS菜单里,选中Options...菜单项,弹出OPTIONS对话框,选中RemoteData标签:1:共享连接指定VisualFoxPro使用当前连接处理新的视图。在数据源一次只支持一个连接时,它很有用。它可以使一个连接处理多个视图。2:取备注字段指定只有在视图输出中激活一个备注或通用字段后才从数据源取备注或通用字段。清除该选项可以减少初始从远程表中的数据量,这将提高性能。3:SQL更新条件指定当您试图更新数据前的数据对比方式,VisualFoxPro检查远程服务器上的字段来决定是否改变数据。如果选择条件所指定远程字段中的数据已经更改,则更新失败。(1):KeyFiedsOnly只对比主键(2):KeyandUpdatebleFieds对比主键和要更新的字段(3):Key&&&&andModifiedFieds对比主键和修改过的字段(默认)(4):KeyandTimestamp对比主键和数据库的时间截。4:SQL更新指定VisualFoxPro是使用SQLUPDATE还是使用SQLDELETE,然后用INSERT来更新远程服务器上的信息。(1):SQLUpdate直接用SQL语言更新(默认)(2):SQLDelete+SQLInsert删除旧记录,然后增加一条新记录5:每次取的记录数当用批处理方式时,指定VisualFoxPro从远程数据源中一次返回多少条记录。选定“全部”可以指定在第一次取操作中即返回所有的记录。该设置受“要取的最大记录数”中指定值的限制。6:要取的最大记录数指定一个视图返回的记录总数。如果您错误地建立了一个,它可以防止返回过多的数据。选择“全部”可以指定返回所有的记录。7:使用备注字段的长度&=指定长字符型字段中数据的最大长度。指定在视图输出中,如果字符数据超出指定长度时,将长字符字段转换成备注字段。默认值是255,等于VisualFoxPro中字符型字段的最大长度。8:成批更新的记录数指定视图一次发送的更新语句数目。调整这个值可以明显地提高更新性能。默认值是1。有关的详细内容,请参阅“REPLACE命令”以及“Scope子句”。9:异步执行指定把控制权返回给您的应用程序之后,VisualFoxPro在后台执行SQLpass-through命令(使用SQLEXEC()、SQLMORERESULTS()、SQLTABLES()和SQLCOLUMNS())。如果您选定了该选项,您的应用可以显示过程信息,并且允许用户使用ESC键中&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&断一个命令(如果SETESCAPE已经设置为“真”。您可以决定一个异步执行的SQL命令)的状态,方法是重复地调用其中一个SQLpass-through函数,直至它报告命令已经完成为止。这个选项的默认值是废止(同步执行),它指定VisualFoxPro在把控制权返回您的应用之前一直等待,直至pass-throughSQL命令完成为止。10:显示警告信息允许显示警告信息。11:批处理在使用SQLEXEC()发送多个SQLpass-through语句时,指定VisualFoxPro并不返回任何结果,直到所有结果集合都检索到为止。对应于在SQLSETPROP()函数中设置BatchMode。如果废止了该选项,您必须调用SQLMORERESULTS()来确定数据是否可用。12:自动事务处理指定由远程表上的连接自动处理事务。如果清除了该选项,您必须使用SQLCOMMIT()和SQLROLLBACK()人工处理事务过程。13:显示登录信息当一个连接激活时,指定是否显示登录提示(如果该连接需要用户进行登录)例如,。“只在必&&&&要时”指出,只有在连接或视图定义中未指定登录信息的情况下,才出现登录提示。14:连接超时设定(秒)指定与远程服务器建立一个连接所需等待的秒数(0到600之间)。如果在指定时间内不能建立这个连接,则VisualFoxPro显示错误。指定0为无限制地等待一个连接。15:空闲超时设定(分钟)指定连接不活动前允许空闲时间的分钟数。如果在指定时间内没有请求使用服务器,则VisualFoxPro终止该连接。但是,连接超时后如果对服务器又有请求,则VisualFoxPro将试图自动恢复这个连接。16:查询超时设定(秒)指定等待服务器响应一个请求的秒数(0与600之间)。如果服务器在指定秒数的时间内还不处理查询,VisualFoxPro显示错误。则指定0可以无限制地等待结果。等待时间(毫秒)指定VisualFoxPro检查SQL语句是否执行结束之前经过的毫秒数。&&&&VFP中常用WIN32API函数调用事例&&&&我们在VFP编程时,为了弥补VFP本身功能的不足,常常会用到WIN32API函数来对VFP的功能行扩展,例如取得系统信息、对注册表进行操作等,但是由于WIN32API函数是C++的数据结构形式,在调用时与VFP的数据格式有所不同,因此在调用时往往会产生,而目前的一些所介绍的大都是VB、DELPHI等语言如何调用,VFP如何调用介绍的比较少,对更缺少具体的调用事例,下面我分几次介绍在VFP如何调用WIN32API函数,并就一些常用的WIN32API函数作一介绍,由于本人水平有限,所介绍的内容,仅供您参考,也欢迎您在我的[请您留言]中共同探讨:一、VFP中调用WIN32API函数的格式&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&VFP中调用WIN32API函数的命令主要是:DECLARE-DLLCLEARDLLS1.DECLARE-DLL它用于注册外部Windows32位动态链接库(.DLL)中的一个函数。语法:DECLARE[cFunctionType]FunctionNameINLibraryName[ASAliasName].......[cParamType1[@]ParamName1,cParamType2[@]ParamName2,...]说明:cFunctionType指定该函数返回值的类型,其类型代码如下:SHORT16位整数INTEGER32位整数SINGLE32位浮点数DOUBLE64位浮点数STRING字符串FunctionName指定要注册使用的32位函数名。注意FunctionName区分大小写。如果该函数名与VisualFoxPro的保留字相同,应使用AS参数另起别名。INLibraryName指定该函数所在的外部动态链接库文件名,如果LibraryName为:WIN32API时,VFP将依次查找KERNEL32.DLL、GDI32.DLL、USER32.DLL、MPR.DLL及ADVAPI32.DLL等动态库文件名&&&&。ASAliasName当API函数的名称与VisualFoxPro的保留字相同时,另取AliasName别名,另取的别名是不区分大小写的。cParameterType1[@]ParamName1,cParameterType2[@]ParamName2,...指定传递给被调用的32位.DLL函数的参数类型及参数名称。其类型代码如FunctionType,如果要以传址方法传递参数则应在参数名前加上@。2.CLEARDLLS释放所有利用DECLARE-DLL命令所装入的动态链接库。....一旦申明WIN32API函数成功,就可以和一般函数一样用?xxx()、=xxx()来调用。....下面以具体事例谈谈win32api在Vfp中的运用:1.利用win32api函数获取指定磁盘的卷标:Stor0toC_var,C_cd,C_qfC_Var='c:\'DECLAREINTEGERGetVolumeInformationINWin32APISTRING@,STRING@,INTEGER,;INTEGER@,INTEGER@,INTEGER@,STRING@,INTEGERxx=GetVolumeInformation(C_Var,"",20,@C_var,@C_cd,@C_qf,0,0)CLEARDLLS&;&;释放所有利用DECLARE-DLL命令所装入的动态链接库。xx&&0获取指定磁盘的卷标成功,反之则未成功。C_var=指定磁盘的卷标,是个十进制的数值,与我们在DOS下看到的16进制不同。C_cd=系统规定的文件名每一部分的长度,是个十进制的数值。C_qf=文件名的大小写标志,是个十进制的数值。&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&怎么样很简单吧,我们可以把获取的磁盘卷标,用来加密我们的软件,这样我们的软件就具有防拷贝的功能了。&&&&vsFlexgrid绑定ADO记录集的示例&&&&001:*--在表单中的代码,可以放在一个按纽的click中002:ADOConnect()003:ADORunSQL("selectID,per_code,per_namefrompersonal")004:thisform.olecontrol1.DataSource=goRS&;&;olecontrol1是个vsFlexgrid控件005:006:*--过程文件:007:*--用ADO的方式创建连接008:*--红虎于编写009:FUNCTIONADOConnect010:IFTYPE("goConn")="U"011:PUBLICgoConn012:ENDIF013:*--创建一个连接014:goConn=CREATEOBJECT("ADODB.Connection")015:goConn.ConnectionStringServer};Server=RedTUID=PWD=;DataBase=hr"016:goConn.Open017:ENDFUNC018:019:*--用ADO的方式打开一个SQL020:FUNCTIONADORunSQL021:LPARAMETERStcSQLCommand022:IFTYPE("goRS")="U"023:PUBLICgoRS024:goRS=0025:ENDIF026:goRS=CREATEOBJECT("ADODB.RecordSet")027:WITHgoRS028:.Source=tcSQLCommand029:.CursorType=2&;&;adOpenDynamic030:.LockType=3&;&;adLockOptimistic031:.ActiveConnection=goConn032:.Open033:ENDWITH034:ENDFUNC035:036:037:*--关闭ADO的连接&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&&=&&&&"Driver={SQL&&&& 上学吧:shangxueba&&&&038:FUNCTIONADOClose039:IFgoConn.State&0040:goConn.Close041:ENDIf&&&&vf编程计&&&&算3!+4!+5!&&&&settalkoffs=0p=1*2n=3dowhilen&=5p=p*ns=s+pn=n+1enddo?s结果为150&&&&VF编写简易计算器&&&&(1)建立应用程序用户界面。选择“新建”表单,进入表单设计器,增加一个文本框控件Textl、一个标签控件Label1和一个命令按钮组CommandGroup1,并将命令按钮组的ButtonCount属性改为16。(2)设置对象属性如下表所示:CommandGroup1中各按钮的属性设置对象属性属性值说明Command1~Command10Caption依次改为:1、2、3、4、5、6、7、8、9、mand11~Command10Caption依次改为:.、=、+、-、*、/FontBold.T.(3)编写代码。①编写CommandGroup1的Click事件代码:IFTHISFORM.Tag=.T.THISFORM.Text1.Value=ALLT(RIGHT(STR(THIS.Value),1))THISFORM.Tag=〃〃ELSEa=THISFORM.Text1.ValueTHISFORM.Text1.Value=a+ALLT(RIGHT(STR(THIS.Value),1))ENDIF②编写“.”按钮Command11的Click事件代码:&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&a=THISFORM.Text1.ValueTHISFORM.Text1.Value=a+〃.〃③编写“=”按钮Command12的Click事件代码:a=THISFORM.Text1.ValueTHISFORM.Text1.Value=ALLT(STR(&;a))THISFORM.Tag=.T.④编写“+”按钮Command13的Click事件代码:a=THISFORM.Text1.ValueTHISFORM.Text1.Value=a+〃+〃THISFORM.Tag=〃〃⑤编写“-”按钮Command14的Click事件代码:a=THISFORM.Text1.ValueTHISFORM.Text1.Value=a+〃-〃THISFORM.Tag=〃〃⑥编写“*”按钮Command15的Click事件代码:a=THISFORM.Text1.ValueTHISFORM.Text1.Value=a+〃*〃THISFORM.Tag=〃〃⑦编写“/”按钮Command16的Click事件代码:a=THISFORM.Text1.ValueTHISFORM.Text1.Value=a+〃+〃THISFORM.Tag=〃〃&&&&把FoxPro数据库转变成HTML表格&&&&Internet的WWW网页中有大量的二维表格,这些表格有的从数据库转化而来。笔者在将数据库文件转化为超文本表格时编写了一段程序来自动实现,效率很高,现介绍给读者朋友。程序的设计思想很简单:打开.DBF数据库,按记录顺序分别读取数据库的各字段,然后加上HTML文件的表格控制符,写到超文本格式的.html文件中。笔者的程序用VisualFoxPro5.0写成,可在Foxpro各版本下使用。样例数据库为Taxed.dbf,源清单和生成的超文本文件TAX.HTM清单附后。*Pragram:dbf2htm.prg*表结构:Taxed.dbf*字段名类型宽度小数位*swdjzh字符型9(税务登记证号)*qymc字符型20(企业名称)*tbrq日期型8(填表日期)*sz字符型10(税种)*ynsk数值型82(应纳税种)settalkoffsetsafeoffcr=chr(13)+chr(10)text=″〈!--AHTMLtableconventedfromTaxed.dbf--〉″+crtext=text+″〈Html〉″+crtext=text+″〈Head〉″+cr+″〈Title〉纳税情况统计表〈/Title〉″+&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&+″〈/Head〉″+crtext=text+″〈Body〉″+cr+″〈Tableborder=1〉″+crtext=text+″〈Caption〉纳税情况统计表〈/Caption〉″+crtext=text+″〈Tr〉″+&&&&关联扩展名到自定义的VFP&&&&有时,开发者可能需要关联某些文件扩展名到自定义的VisualFoxPro应用程序.它在要求对指定类型的文件执行某种操作时是有用的.例如,开发者可能想运行.ZZ0文件并编辑.ZZ1文件.以下示例演示如何在VisualFoxPro中用API调用来完成该任务.注意:使用该示例中的代码时,需要VisualFoxPro6.0和VisualStudio6.0ServicePack3(VFP6_SP3).这是因为在自定义的VisualFoxPro应用程序中编译程序的能力只在VFP6_SP3才能实现.设置关联在Windows桌面创建一个新的名为RUNTEST.TXT的文本文件,其内容如下:MESSAGEBOX("你好!",48,"通过API关联")将该文件的扩展名由.TXT改为.ZZ0.当被提示文件可能变为不可用时选择确认.在桌面复制一个RUNTEST.ZZ0并命名为MODITEST.ZZ1.注意:这些文件的图标将变为Windows标志,如果双击它们将产生一个"打开方式?"对话框.如果出现以上情况,说明文件扩展名没有与机器上的任何程序关联.如果没有出现"打开方式?"对话框,则有一个已安装的应用程序与该扩展名关联.如果是这样,切莫运行本应用程序!若运行可能会破坏你的电脑上的文件关联.打开VisualFoxPro并复制以下代码到一个新的文件中:LOCALnResult,nDisplay,cKeyName,cKeyValue,nKeyLen#DEFINESECURITY_ACCESS_MASK983103&;&;SAMvalueKEY_ALL_ACCESS#DEFINESHCNE_ASSOCCHANGED0x#DEFINEHKEY_CLASSES_ROOT-#DEFINESHCNF_IDLIST0x0000DECLARERegCreateKeyExINADVAPI32.DLL;INTEGER,STRING,INTEGER,STRING,INTEGER,INTEGER,INTEGER,INTEGER@,INTEGER@DECLARERegSetValueExINADVAPI32.DLL;INTEGER,STRING,INTEGER,INTEGER,STRING,INTEGERDECLARERegCloseKeyINADVAPI32.DLLINTEGERnHKeyDECLARESHChangeNotifyINShell32.DLLINTEGER,INTEGER,STRING,STRING*创建一个叫aaApp的根入口nResult=0nDisplay=0cKeyName="aaAPP"cKeyValue="MyApplication"nKeyLen=LEN(cKeyValue)&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&RegCreateKeyEx(HKEY_CLASSES_ROOT,cKeyName,0,"REG_SZ",;0,SECURITY_ACCESS_MASK,0,@nResult,@nDisplay)RegSetValueEx(nResult,"",0,1,cKeyValue,nKeyLen)RegCloseKey(@nResult)*创建一个叫做.ZZ0的与aaApp关联的根入口nResult=0nDisplay=0cKeyName=".ZZ0"cKeyValue="aaApp"nKeyLen=LEN(cKeyValue)RegCreateKeyEx(HKEY_CLASSES_ROOT,cKeyName,0,"REG_SZ",;0,SECURITY_ACCESS_MASK,0,@nResult,@nDisplay)RegSetValueEx(nResult&&&&,"",0,1,cKeyValue,nKeyLen)RegCloseKey(@nResult)*创建一个叫做.ZZ1的与aaApp关联的根入口nResult=0nDisplay=0cKeyName=".ZZ1"cKeyValue="aaApp"nKeyLen=LEN(cKeyValue)RegCreateKeyEx(HKEY_CLASSES_ROOT,cKeyName,0,"REG_SZ",;0,SECURITY_ACCESS_MASK,0,@nResult,@nDisplay)RegSetValueEx(nResult,"",0,1,cKeyValue,nKeyLen)RegCloseKey(@nResult)*为与aaApp关联的文件设置命令行*路径需要修改.nResult=0nDisplay=0cKeyName="aaApp\shell\open\command"**修改该路径以反映你的目录结构*cKeyValue="C:\WINDOWS\Desktop\testexe.exe%1"***nKeyLen=LEN(cKeyValue)RegCreateKeyEx(HKEY_CLASSES_ROOT,cKeyName,0,"REG_SZ",;0,SECURITY_ACCESS_MASK,0,@nResult,@nDisplay)RegSetValueEx(nResult,"",0,1,cKeyValue,nKeyLen)&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&RegCloseKey(@nResult)*关联后刷新图标的代码.SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,NULL,NULL)CLEARDLLS修改以下行,以使路径反映当前机器上的DESKTOP路径(TESTEXE.EXE将在稍后生成):cKeyValue="C:\WINDOWS\Desktop\testexe.exe%1"保存程序为"KB_ASSOC.PRG."生成测试可执行程序在VisualFoxPro中打开一个新项目.在代码标签中创建一个新的程序,内容如下.保存该程序为Main.prg:*双击文件传递它自己的路径到关联的程序(在这种情况下是.EXE).LPARAMETERcFileName#DEFINEMB_OK0&;&;只确认按钮#DEFINEMB_ICONINFORMATION64&;&;Information图标SETSYSMENUOFF_SCREEN.CAPTION="TestExecutable"*检查传递过来的文件的扩展名.DOCASECASEUPPER(RIGHT(cFileName,3))="ZZ0"*检查VFP6SP3.*如果没有则退出.IF!("06.00.8492.00"$ALLT(VERS()))MESSAGEBOX("未使用VFP6SP3.需要编译到.EXE.",0,"退出")RETURNENDIF*文件扩展名是.ZZO而且系统是VFP6SP3.编译并运行它.COMPILE(cFileName)DO(cFileName)CASEUPPER(RIGHT(cFileName,3))="ZZ1"*文件是.ZZ1,修改它.不依赖VFP6SP3.MODICOMM(cFileName)ENDCASE关联一个自定义图标到项目并编译项目为TESTEXE.EXE可执行文件.保存它到Windows桌面.运行该测试在VisualFoxPro内部,运行先前生成的"KB_ASSOC.PRG".注意Windows桌面上的MODITEST.ZZ0和RUNTEST.ZZ1的外观发生了变化:现在它们的图标是TESTEXE.EXE或&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&VisualFoxPro的图标了.转到Windows桌面并双击RUNTEST.ZZ0.将运行TEXTESE.EXE并显示一个"HELLO"对话框.现在,双击MODITEST.ZZ1文件.将运行TESTEXE.EXE且文件会以个性状态打开.关闭编辑窗口以退出.清理返回到VisualFoxPro,复制以下代码到一个名为CLEANUP.PRG的新程序文件中:*!*在演示程序运行后,使用以下&&&&来从注册表中移去它创建的注册键值.#DEFINESHCNE_ASSOCCHANGED0x#DEFINEHKEY_CLASSES_ROOT-#DEFINESHCNF_IDLIST0x0000FILE_KEY1=".ZZ0"FILE_KEY2=".ZZ1"EXE_KEY0="aaAPP\shell\open\command"EXE_KEY1="aaAPP\shell\open"EXE_KEY2="aaAPP\shell"EXE_KEY3="aaAPP"DECLARERegDeleteKeyINADVAPI32.DLLINTEGER,STRINGDECLARESHChangeNotifyINShell32.DLLINTEGER,INTEGER,STRING,STRINGRegDeleteKey(HKEY_CLASSES_ROOT,FILE_KEY1)RegDeleteKey(HKEY_CLASSES_ROOT,FILE_KEY2)RegDeleteKey(HKEY_CLASSES_ROOT,EXE_KEY0)RegDeleteKey(HKEY_CLASSES_ROOT,EXE_KEY1)RegDeleteKey(HKEY_CLASSES_ROOT,EXE_KEY2)RegDeleteKey(HKEY_CLASSES_ROOT,EXE_KEY3)SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,NULL,NULL)CLEARDLLS运行CLEANUP.PRG来删除先前创建的注册表中的入口.桌面上的两个文件的图标将会变回到Windows标志.&&&&计算机二级Foxpro:在VFP中模拟动画&&&&在当今众多的编程语言中,VFP的简单、方便和实用使我一直情有独衷。它不仅提供了对中、小型数据库完善的管理和操作机制,在应用界面的设计上也提供了丰富的手段。比如说,VFP的表单设计器提供了图象控制,允许我们直接在表单中添加.BMP。稍显不足的是它不支持其他格式的图象,更不用说是动画了。由于图象控制和其他控制一样,具有自己一整套的属性,在设计时可以动态地改变它,因此我在实践中摸索到一种变通的方法,在VFP的表单中加入模拟的“动画”。其设计思想是准备几帧连贯的.BMP图象(可用相关的绘图软件自行制作),利用计时器的计时功能,在规定的时间间隔内动态地改变所显示的.BMP图象。下面我就通过一个演示实例来加以说明:首先,我准备了四幅连贯的红旗飘图象,分别取名为:1.bmp,2.bmp,3.bmp和4.bmp。如下&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&所示(略),然后使用表单设计器设计表单如下:演示表单其中包括三个控制:Image(图象),Timer(计时器)和Command(命令按钮)。设置属性如下:Image.Picture=“1.bmp”Ttimer.Enabled=.t.Timer.Interval=200Command.Caption=“退出演示”在表单的Activate事件中添加如下代码:PublicII=1在计时器的Timer事件中添加代码如下:IfI$#@62;=4I=1ElseI=I+1EndifPic=Str(I,1)+".bmp"Thisform.Image.Picture=Pic在命令按钮的Click事件中添加代码如下:Thisform.Release最后,保存并运行表单,我们会看到窗口中一幅鲜艳的红旗在迎风招展。单击“退出演示”命令按钮,模拟动画的演示就结束了。&&&&事务在VFP更新中的应用&&&&摘要事务处理是访问共享数据的有效方法,本文分析了VFP事务处理的功能,定义了事务处理类。&&&&1事务和事务处理事务是独立的基本工作单位,例如对数据库字段的写操作。在多用户环境中,对多个数据库的写入操作必须进行同步处理,并且必须保证写入的数据被所有的数据库接收。事务处理有四个特性:原子性、一致性、孤立性和持续性。下面结合VFP对本地表和远程表对事务的命令的功能分析,讨论实现事务处理的方法。2VFP事务处理的控制命令及其应用2.1控制事务处理的命令VFP提供了以下处理事务的命令和函数:.BEGINTRANSACTION初始化一个事务,表示一个事务的开始。.ROLLBACK取消最近BEGINTRANSACTION语句以来对表的全部修改。.ENDTRANSACTION锁定记录,确认最近BEGINTRANSACTION语句以来对表的全部修改。.TXTLEVEL()确定当前事务处理的等级,最大值为5,表示事务最多嵌套五层,TXTLEVEL()为0表示当前无事务处理。2.2更新远程表时控制事务处理的命令a)SQLSETPROP()格式如下:SQLSETPROP(连接句柄,设置类型[,设置值])&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&设置类型为Transactions且设置值DB―TRANSMANUL(在FOXPRO.H中定义)表示可以通过SQLCOMMIT()和SQLROLLBACK()人工处理事务。如果调用成功,SQLSETPROP()返回1;否则,如果发生连接级错误则返回-1,发生环境级错误则返回-2。b)SQLROLLBACK()取消当前事务处理期间所做的任何更改。如果事务取消成功,SQLROLLBACK()返回1;否则,返回-1。如果SQLROLLBACK()返回-1,可以使用AERROR()确定该事务不能取消的原因。如果设置成人工处理方式,用SQLROLLBACK()可以事务处理期间将对远程表的所有更新全部取消。c)SQLCOMMIT()提交一个事务如果成功提交了事务,SQLCOMMIT()返回1;否则,返回-1。如果SQLCOMMIT()返回-1,可使用AERROR()函数确定该事务不能取消的原因。2.3VFP使用事务处理的原则事务以BEGINTRANSACTION开始,以ENDTRANSACTION或ROLLBACK结束,必须成对使用;除非应用程序终止,事务一旦开始,直到遇到ENDTRANSACTION或ROLLBAKC语句期间,将保持有效;缓冲区中的数据比磁盘中的数据优先级高,即事务处理优先使用缓冲区中的数据;如果在事务处理过程中应用程序终止,则取消事务对表的所有操作;事务处理可以嵌套使用,最多嵌套五层。BEGINTRANSACTION和ENDTRANSACTION(ROLLBACK)采用最近优先原则匹配。最内层的更新优先于嵌套事务处理中的其他更新;直接或间接调用事务时,VFP自动加锁,直到ENDTRANSACTION(ROLLBACK)时自动解锁;如果在事务处理期间使用了LOCK()命令,ENDTRANSACTION(ROLLBACK)时不自动解锁。3事务处理实现本地表的数据更新用事务来缓冲对磁盘数&&&&据的更新操作,对磁盘数据更新在事务结束之后进行,如果系统不能执行对数据库的更新操作,则取消整个事务,不执行任何更新操作。首先建立事务处理自定义类―TRANSACTION,包括本地表事务处理确认(―TRANSCONFIRM)和本地表事务处理取消(―TRANSCANCEL)两种方法。这两种方法的前提条件是访问共享数据的各个用户程序都使用行缓冲。用CURSORSETPROP(“Buffering”,3)将表设置成开放式行缓冲方式。―TRANSCONFIRM方法BEGINTRANSACTION&;&;开始事务1Isuccess=TABLEUPDATE(.T.,.F.)&;&;非强制的更新所有修改记录IFIsuccess=.F.&;&;若失败oROLLBACK&;&;取消修改,结束事务1o=AERROR(aErrors)&;&;取消事务出错oDOCASE&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&ooCASEaErrors[1,1]=1585&;&;当前记录被其他用户改过=RLOCK()&;&;记录加锁FORnField=1toFCOUNT()&;&;依次处理每一字段cField=FIELD(nField)IFOLDVAL(cField)&&CURVAL(cField)o&;&;字段被改过,确认修改有效oDOCASECASETYPE(cField)='N'T1=CURVAL(cField)-LDVAL(cField)REPLcFieldWITHT1+EVAL(cField))oOTHEWISEoREPLcFieldWITHCURVAL(cField))oENDCASEoENDIFoENDFORoUNLOCKoBEGINTRANSACTION&;&;开始事务2o=TABLEUPDATE(.T.,.T.)&;&;强制更新数据oENDTRANSACTION&;&;结束事务2oENDCASEELSEENDTRANSACTION&;&;结束事务1ENDIFo―TRANSCANEL方法BEGINTRANSACTION&;&;开始事务1Isuccess=TABLEUPDATE(.T.,.F.)&;&;非强制的更新所有修改记录IFIsuccess=.F.&;&;若失败oROLLBACK&;&;取消修改,结束事务1o=AERROR(aErrors)&;&;取消事务出错oDOCASECASEaErrors[1,1]=1585&;&;当前记录被其他用户改过=RLOCK()&;&;记录加锁FORnField=1toFCOUNT()&;&;依次处理每一字段cField=FIELD(nField)IFOLDVAL(cField)&&CURVAL(cField)o&;&;字段被改过,确认修改无效,恢复原记录o=TABLEREVERT(.F.)oUNLOCK&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&oEXIToENDIFoENDFORoBEGINTRANSACTION&;&;开始事务2o=TABLEUPDATE(.T.,.T.)&;&;强制更新数据oENDTRANSACTION&;&;结束事务2oUNLOCKENDCASEELSEENDTRANSACTION&;&;结束事务1ENDIF4事务处理实现远程表的数据更新当使用远程表中的数据时,事务处理只更新视图临时表的本地备份,对远程基表的更新不起作用。使用SQLSETPROP()启动人工事务,SQLROLLBAK()和SQLCOMMIT()控制事务处理。在自定义类―TRANSACTION中增加方法远程表事务处理确认―RTRANSCONFIRM和取消(―RTRANSCANCEL)两种方法。同样共享数据的各个用户程序也使用行缓冲。―RTRANSCONFIRM方法LPARAMETERShConnect&;&;连接句柄SQLSETPROP(hConnect,'transmode',DB―TRANSMANUAL)Isuccess=TABLEUPDATE(.T.,.F.)&;&;非强制的更新所有修改记录IFIsucces&&&&s=.F.&;&;若失败oROLLBACK&;&;取消修改,结束事务1o=AERROR(aErrors)&;&;取消事务出错oDOCASECASEaErrors[1,1]=1585&;&;当前记录被其他用户改过=RLOCK()&;&;记录加锁FORnField=1toFCOUNT()&;&;依次处理每一字段cField=FIELD(nField)IFOLDVAL(cField)&&CURVAL(cField)&;&;字段被改过,确认修改有效DOCASEoCASETYPE(cField)='N'oT1=CURVAL(cField)-LDVAL(cField)oREPLcFieldWITHT1+EVAL(cField))oOTHEWISEoREPLcFieldWITHCURVAL(cField))oENDCASEENDIFENDFORUNLOCK&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&=TABLEUPDATE(.T.,.T.)&;&;强制更新数据SQLCOMMIT(hConnect)&;&;提交事务ENDCASEoELSEoSQLCOMMIT(hConnect)&;&;提交事务oENDIFo―RTRANSCANCEL方法LPARAMETERShConnect&;&;连接句柄oSQLSETPROP(hConnect,'transmode',DB―TRANSMANUAL)oISuccess=TABLEUPDATE(.T.,.F.)o&;&;非强制的更新所有修改记录oIFIsuccess=.F.&;&;若失败ROLLBACK&;&;取消修改,结束事务1=AERROR(aErrors)&;&;取消事务出错DOCASEoCASEaErrors[1,1]=1585&;&;当前记录被其他用户改过o=RLOCK()&;&;记录加锁oFORnField=1toFCOUNT()o&;&;依次处理每一字段ocField=FIELD(nField)oIFOLDVAL(cField)&&CURVAL(cField)&;&;字段被改过,确认修改无效,恢复原记录=TABLEREVERT(.F.)UNLOCKENDIFENDFOR=TABLEUPDATE(.T.,.T.)&;&;强制更新数据SQLCOMMIT(hConnect)&;&;提交事务ENDCASEoELSEoSQLCOMMIT(hConnect)&;&;提交事务oENDIF5效果事务处理自定义类―TRANSACION已经在VFP5.0环境下调试通,使用效果良好。可以根据需要修改类或创建新的类,如创建采用开放式表缓冲时事务处理的类。如果在事务处理过程中出现断电或其他系统中断情况,数据更新将失败,此时的数据恢复由操作系统的事务处理跟踪系统解决。&&&&数据共享程序设计&&&&如果创建的应用程序在网络环境中的多台计算机上运行,或者一个表单的多个实例对相同的数据进行访问,这时就需要进行共享访问程序设计。共享访问不仅能为用户使用数据和数据&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&共享提供更有效的方法,而且可以在必要时对访问进行限制。VFP支持如下功能:对数据的共享或独占访问;锁定选项;数据工作期;记录缓冲和表缓冲以及事务处理。尽管这些功能主要应用在共享环境里,但在单用户环境下也可以使用。一、控制对数据的访问因为访问数据是在文件里进行,所以有效的数据管理首先从控制这些文件开始。您需要选择访问数据的方式,还要选择在什么时间、如何限制对数据的访问。1、访问数据在共享环境中,可以用两种方式访问数据:从独占文件中访问或从共享文件中访问。若打开&&&&一个共享访问的表,其他用户也可以对该文件进行访问;若打开一个独占访问的表,其他用户就不能对该表进行读写。独占访问不具备在网络环境中共享数据的许多优点,所以应该避免使用。1)以独占方式使用表打开一个文件最严格的限制方式就是独占方式。通过界面打开一个表时,默认情况下是独占使用的,也可以利用VFP命令明确地以独占方式打开一个表。如果要打开一个独占使用的表,可以在命令窗口中输入如下命令:SETEXCLUSIVEONUSEcMyTable或者在命令窗口中输入:USEcMyTableEXCLUSIVE下列命令要求以独占方式打开一个表:?ALTERTABLE?INDEX:当创建、添加或删除一个复合索引标志时。?INSERT[BLANK]?MODIFYSTRUCTURE:如果要以此命令更改一个表结构,必须以独占方式打开该表。但是,当以共享方式打开这个表时,只能在只读方式下使用此命令。?PACK?REINDEX?ZAP在一个共享表中执行上述命令,VFP将返回出错信息:“文件必须以独占方式打开”。可以使用FLOCK()函数限制对表的访问。如果使用FLOCK()锁定表,则其它用户不能对该表进行写操作,但可以读该表。2)以共享访问方式使用表以共享方式打开一个表时,多个工作站可以同时访问该表。通过界面打开表时,可以不理会SETEXCLUSIVE默认的ON设置,而明确地用VFP命令打开一个表供共享使用。若要打开一个共享使用的表,可以在命令窗口中输入下列命令:SETEXCLUSIVEOFFUSEcMyTable&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&或者:USEcMyTableSHARED当在一个共享表中添加或更改数据时,必须首先锁定要更改的记录或整个表。对一个以共享方式打开的表或记录,可通过下列方式进行锁定:?使用命令来自动锁定记录或表。?用记录和表锁定函数,人工锁定一个或多个记录。?用CURSORSETPROP()函数设置缓冲。与共享表相关的备注和索引文件也是以共享方式打开的。如果应用程序所使用的表只用于查找数据,而该应用程序的所有用户都要访问它,那么将该表标记为只读可以提高性能。2、锁定数据如果要共享访问文件,必须通过锁定表和记录来对这种访问进行管理。锁定不同于访问允许权限,它既可以对数据进行长期控制,也可以短期控制。VFP提供自动和人工锁定方式。1)选择记录或表锁定无论是哪一种锁定方式,目的都是为了防止两个用户同时写一个记录。表锁定用来防止其他用户向表中写入,但允许读整个表。由于表锁定阻止其他用户更新表中的记录,因而很少使用。2)人工或自动锁定除了选择记&&&&录锁定还是表锁定,还可以选择自动锁定或人工锁定,许多VFP命令在执行之前都会自动锁定一个记录或一个表,如果成功锁定了记录或表,则继续执行该命令,然后再解锁。下面列出了自动锁表和记录的命令:命令锁定范围――――――――――――――――――ALTERTABLE整个表APPEND整个表APPENDBLANK表头APPENDFROM整个表APPENDFROMARRAY表头APPENDMEMO当前记录BLANK当前记录BROWSE、CHANGE和EDIT一旦开始编辑字段,锁定对象为当前记录和相关表中别名字段的所有记录CURSORSETPROP()取决于参数DELETE当前记录DELETENEXT1当前记录DELETERECORDn记录nDELETE删除多个记录整个表DELETE-SQL当前记录GATHER当前记录INSERT整个表INSERT-SQL表头&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&MODIFYMEMO编辑开始时,锁定当前记录READ当前记录和别名字段的所有记录RECALL当前记录RECALLNEXT1当前记录RECALLRECORDn记录nRECALL恢复多个记录整个表REPLACE当前记录和别名字段的所有记录REPLACENEXT1当前记录和别名字段的所有记录REPLACERECORDn记录nREPLACE替换多个记录整个表和别名字段的所有记录SHOWGETS当前记录和别名字段引用的所有记录TABLEUPDATE()取决于缓冲UPDATE整个表UPDATE-SQL整个表3)记录锁定的特点锁定记录的命令比锁定表的命令破坏性要小。锁定一个记录时,其他用户仍然可以添加或删除其他记录。如果记录或表已经被其他用户锁定,或者表已经被其他用户用独占方式打开,则锁定记录或表的操作失败。如果不能锁定记录,则尝试锁定当前记录的命令将返回出错信息“其他用户正在使用记录”。BROWSE、CHANGE、EDIT和MODIFYMEMO命令只有在编辑时才锁定记录。如果您正在编辑来自相关表记录中的字段,那么该相关记录可能会被锁定。如果当前记录或相关记录已被其他用户锁定,则锁定失败。如果锁定成功,则可以编辑该记录;在移到另一个记录或激活其他窗口时,记录解锁。4)表头和表锁定的特点一些VFP命令锁定整个表,而有些命令则只锁定表头。表锁定命令比表头锁定命令更加严厉。锁定表头时,其他用户不能添加或删除记录,但可以修改字段内的数据。当发出APPENDBLANK命令时,用户可以共享表而不发生冲突,但是当其他用户也向该表追加一个空白记录时,就会出错。出错信息是:“其他用户正在使用文件”。这个信息表明有两个或两个以上的用户在同时执行APPENDBLANK命令。如果无法锁定一个表,则锁定整个表的命令将返回一个错误信息:“其他用户&&&&正在使用文件”。要取消正在进行的锁定操作,可按[ESC]键。5)自动锁定示例在下面的示例中,即使customer表是以共享方式打开的,用户为了从其他表追加记录也将自动锁定整个表。SETEXCLUSIVEOFFUSEcustomerAPPENDFORMoldcustFORstate="OPEN"6)人工锁定您可以用锁定函数人工锁定一个记录或一个表。这些函数有:&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&RLOCK()LOCK()FLOCK()RLOCK()函数等同于LOCK()函数,都可以锁定一个或多个记录;FLOCK()锁定一个文件。LOCK()和RLOCK()函数可以用户锁定表头,如果把0作为记录编号提供给LOCK()或RLOCK(),而且测试表明表头没有锁定,则该函数将锁定表头并返回.T.。如果锁定一个记录或一个表,那么一定要尽快解锁,以便其他用户访问。解锁可使用UNLOCK命令。这些人工锁定函数可以完成如下操作:*测试记录或表的锁定状态。*如果测试表明该记录没有锁定,则将该记录锁定并返回.T.。*如果该记录或表不能锁定,则根据SETREPROCESS的当前设置,再次进行锁定。*返回.T.或.F.,表明锁定尝试是否成功。注意:如果不想锁定记录,而测试该记录的锁定状态,请使用ISRLOCKED()或ISFLOCKED()函数。如果锁定记录或表的操作失败,SETREPROCESS命令和您当前的错误处理例程将确定是否再次尝试锁定。SETREPROCESS会影响不成功的锁定结果,因此可以利用SETREPROCESS来控制锁定尝试的次数和时间。下面的示例以共享方式打开customer表,并用FLOCK()函数锁定该表。如果该表锁定成功,则REPLACEALL将更新该表中的所有记录,UNLOCK对该文件解锁;如果其它用户已经锁定该文件或文件中的记录,现在还不能锁定该表,则显示一条信息。SETEXCLUSIVEOFFSETREPROCESSTO0USEcustomer&;&;打开共享表IFFLOCK()REPLACEALL&;&;替换并解锁WITHUPPER(contact)UNLOCKELSE&;&;输出信息WAIT"文件正被其他用户使用"ENDIF3、解锁数据在共享环境下锁定记录或文件并完成了相应的数据操作后,要及时解锁。解锁的方法有很多种,在某些情况下,只需简单的移动到下一个记录就能解锁,有些情况则需要明确的解锁命令。要解锁被自动锁定的记录,只需移动记录指针,甚至在设置了MULTILOCKSON的情况下也是如此。而对于人工锁定的记录,则必须对记录明确地解锁。下面列出了对人工和自动的锁定记录和表进行解锁的各种命令:命令效果――――――――――――――――――――――――――&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:&&&&shangxueba&&&&UNLOCK解锁当前工作区内的记录和文件UNLOCKALL对所有工作区的记录和文件解锁SETMULTILOCKSOFF建立新锁定的同时自动解锁当前锁定FLOCK()在锁定文件之前解锁文件中所有记录CLEARALL、CLOSEALL、USE、QUIT对所有文件和记录解锁ENDTRANSACTION对所有的自动锁定项解锁TABLEUPDATE()在更新表之前解锁所有锁定项注意:如果记录在UDF中被自动锁定,那么当移开记录指针然后又移回该记录时,锁定将会被解除。可以使用表缓冲解决这个问题。4、使用数据工作期为确保共享环境中的每个用户都具有安全的、正确的环境,确保表单的多个实例能独立操作,VFP提供了数据工作期。数据工作期是对当前动态工作环境的描述。可以将数据工作期看成是一个小型数据环境,这个数据环境是在一台机器上运行一个开发的VFP工作期。每个数据工作期包括:*表单的数据环境中的各项备份*表示打开的表、索引和关系的临时表请考虑当在多用户应用程序的各自工作站同时打开相同的表单时,会发生什么,这样可以很容易理解数据工作期的概念。这种情况下,每个工作站运行一个独立的VFP工作期,因此有自己的工作区设置以及自己表示打开的表、索引和关系的临时表。但是,如果您在一个机器上,同一个VFP工作期,打开单个项目中的同一个表单的多个实例,则这些表单共享默认的数据工作期,它代表了单个的动态工作环境。在同一个VFP工作期中打开的表单的每一个实例使用相同的工作区设置,并且在一个表单实例中移动工作区中的记录指针会自动影响相同表单的其他实例。1)使用私有数据工作期如果想更多的控制表单的多个实例,可以使用私有数据工作期。当表单使用私有数据工作期时,VFP为应用程序创建的表单、表单集或工具栏中的每个实例创建一个新的数据工作期。每个私有数据工作期包括:*表单的数据环境中每个表、索引和关系的独立备份。*数目不限的工作区。*独立于表单基表的每个备份表的记录指针。可用数据工作期数目只受系统内存和磁盘空间的限制。通过设置表单的DataSession属性可实现私有数据工作期,DataSession属性有如下两个设置:*1-默认的数据工作期(默认设置)*2-私有数据工作期如果要使用私有数据工作期,请选择下列选项之一:*在“表单设计器”中,将表单的DataSession属性设置为“2-私有数据工作期”。*在代码中将DataSession属性设置为2。例如,可输入:&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&frmMyForm.DataSession=2注意&&&&:只能在设计时设置DataSession属性。运行时DataSession为只读属性。当表单使用的是私有数据工作期时,在单个机器上,单个的VFP工作期中打开表单的每个实例使用自己的数据环境。使用私有数据工作期类似于在不同的工作站上同时运行同一个表单。2)识别数据工作期每个私有数据工作期是单独识别的。可以在“数据工作期”窗口中查看每个数据工作期的内容。也可以通过Load事件代码中的命令改变数据工作期的说明。使用DataSessionID的运行时属性,可以查看每个数据工作期的识别号。下面的示例显示名为frmMyForm的表单的DataSessionID属性。DOFORMfrmMyForm?frmMyForm.DataSessionID如果使用NAME子句激活表单,可使用该表单的名称访问DataSessionID属性,如下面的代码所示:DOFORMfrmMyFormNAMEone?one.DataSessionIDDataSessionID属性只是用来识别特殊的数据工作期。不要更改一个表单实例的DataSessionID属性,当更改DataSessionID属性时,与数据绑定的控件会丢失它们的数据源。3)使用多个表单实例更新数据私有数据工作期生成各自独立的工作区,工作区包含了表单的表、索引和关系的独立备份,表单的每个备份引用了相同的基表和索引文件。当用户从表单的一个实例中更新记录时,更新该表单引用的基表。当定位到更改的记录时,就可以看到表单的另一个实例所做的更改。如果在一个私有数据工作期对记录或表进行了锁定,其他私有数据工作期就不能再进行锁定。例如,数据工作期1的用户锁定了一个记录,数据工作期2的用户就不能锁定这个记录了。如果数据工作期1的用户以独占方式打开了一个表,数据工作期2的用户就不能打开这个表了。通过遵守其他数据工作期所做的锁定,VFP可以保护基表更新的完整性。4)定制数据工作期的环境由于数据工作期控制着某些SET命令的范围,可以在单一的VFP工作期中使用私有数据工作期建立自定义的SET命令设置。例如,SETEXACT命令,控制比较不同长度字符串时使用的规则,作用于当前数据工作期。SETEXACT命令的设置为ON时,规定直到表达式末尾每个字符必须都完全匹配时,两个表达式才算相等。通过在默认的数据工作期中将SETEXACT命令设置为OFF,可以使用“模糊”或相似查找;但是应用程序可能包含特殊的表单,它需要精确匹配。可以将需要精确匹配的表单的DataSession属性设置为2,使用私有数据工作期,然后将SETEXACT命令设置为ON。由于仅在使用私有数据工作期的表单使用一个SET命令,则当为一个特定的表单启用自定义工作期设置时,您可&&&&以保留整个的VFP工作期设置。5)使自动数据工作期的设置无效当使用表单的私有数据工作期时,在一个表单中对数据所做的更改不会自动地体现到相&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&同表单的其他实例中。如果想让表单的所有的实例都访问相同的数据,并立即反应对公共数据做的改动,可以忽略自动数据工作期的设置。若要使自动数据工作期设置无效,请使用命令SETDATASESSIONTO1或SETDATASESSIONTO。这两个命令都将启用命令窗口以及项目管理器所控制的默认数据工作期。5、缓冲访问数据如果希望在更新时保护数据,可以使用缓冲技术。在多用户环境下,VFP的记录缓冲和表缓冲技术可以保护对单个记录或多个记录所做的数据更新以及数据维护操作。缓冲区可以自动测试、锁定以及解锁记录或表。借助缓冲技术,可以很容易地检测并解决数据更新操作过程中所遇到的冲突:当前记录被复制到一个由VFP进行管理的内存区域或磁盘区域,其他用户仍然可以同时访问原来的记录。当离开该记录或以编程方式更新记录时,VFP将准备锁定该记录,确认其他用户没有做修改,然后写入编辑结果。在试图更新数据时,还必须解决冲突,若有冲突则应防止编辑结果写入原来的表。1)选择缓冲的方法在启用缓冲之前,应对数据环境进行评估,根据应用程序、记录以及表的类型和大小,信息的使用与更新方式以及其他因素,选择缓冲方法和锁定选项。一旦启用了缓冲,则在它被废止或关闭表之前一直保持有效。VFP提供两种缓冲:记录缓冲和表缓冲:*若一次只对一个记录进行访问、修改或写操作,那么请选择记录缓冲。在一个多用户环境中,记录缓冲能够提供适当的有效性检查机制,对其他用户所做的数据更新操作影响最小。*如要对多个记录的更新使用缓冲,请选择表缓冲。如果想在一个表中处理多个记录或在一对多的关系中处理子表的记录,表缓冲提供了最佳的工作方式。如果要对已有数据提供最大程度的保护,请使用VFP事务。可以单独使用事务,但是如果将事务和记录缓冲命令或表缓冲命令一起使用将会获得更好的效果。2)选择锁定方式VFP以两种锁定方式提供缓冲:保守式和开放式。这两种方式决定了一个或多个记录何时被锁定、优势何时、怎样被解锁。a、保守式缓冲在多用户环境下,保守式缓冲能防止其他用户在对某一特定记录或表进行修改时访问它。保守式缓冲为单个记录的修改提供最安全的工作环境,但是会降低用户的操作速度。&&&&这种缓冲方式非常象FoxPro以前版本的标准锁定机制。此外,它还带有内在数据缓冲等更多的好处。b、开放式缓冲开放式缓冲是更新记录的有效方法,因为锁定只在写记录时生效,这样在多用户环境中使单个用户独占系统的时间最少。当在一个远程表上使用记录或表缓冲时,VFP将强制使用开放式锁定。由函数&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&CURSORSETPROP()设置的Buffering属性值决定了缓冲和锁定的方法。下面列出了Buffering属性的有效值:若要启用请使用此缓冲值――――――――――――――――――――――――――――无缓冲,默认值1保守式记录锁定。它锁定当前记录,在记录指针移动或2发出TABLEUPDATE()命令后更新开放式记录锁定。它一直等到记录指针移动,然后锁定3并更新。保守式表锁定。它锁定当前记录,在发出TALBEUPDATE()4命令后更新。开放式表锁定。它一直等到发出TABLEUPDATE()命令,然后5锁定并更新已编辑的记录。对于表,Buffering的默认值为1;对于视图,默认值为5。如果您使用缓冲访问远程数据,则Buffering属性可以是3(开放式记录缓冲)或5(开放式表缓冲)。此外,对除1以外的缓冲方式,设置MULTILOCKS为ON。3)启用记录缓冲可用CURSORSETPROP()函数启用记录缓冲。若要在当前数据区启用保守式记录锁定,请使用如下函数和参数:CURSORSETPROP("Buffering",2)VFP在指针位置锁定记录。如果锁定成功,VFP将该记录放入缓冲区并允许编辑。当移动记录指针或发出TABLEUPDATE()命令时,VFP将把缓冲记录写入原来的表。若要在当前数据区启用开放式记录锁定,请使用如下函数和参数:CURSORSETPROP("Buffering",3)VFP将指针位置的记录放入缓冲区并允许编辑。当移动记录指针或发出TABLEUPDATE()命令时,VFP将对该记录进行锁定。若锁定成功,VFP将对磁盘上的记录的当前值与原来的缓冲区值进行比较。如果两值相同,则编辑结果写入原来的表;否则将发出错误信息。4)启用表缓冲可用CURSORSETPROP()函数启用表缓冲。若要在当前数据区对多个记录启用保守式锁定,请使用如下函数和参数:CURSORSETPROP("Buffering",4)VFP在指针位置锁定记录。如果锁定成功,VFP将该记录放入缓冲区并允许编辑。使用TABLEUPDATE()命令把缓冲记录写入原来的表。若要在当前数据区对多个记录启用开放式锁定,请使用如下函数和参数:CURSORSETPROP("Buffering",5)在发出TABLEUPDATE()命令之前,VFP把记录写入缓冲区并允许编辑,然后VFP对缓冲区内的每一个记录执行&&&&下列操作:&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&*对每一个已编辑记录锁定。*一旦锁定成功,即对磁盘上的每一个记录的当前值与原来的缓冲区值进行比较。*如果两值相等,将编辑结果写入原来的表。*如果两值不相等,给出错误信息。在启用表缓冲之后,VFP只在TABLEUPDATE()命令之后更新。5)在表缓冲区中追加和删除记录可以在启用表缓冲之后追加和删除记录。追加的记录将添加到缓冲区的末尾。要访问缓冲区中所有的记录,请使用RECNO()函数,RECNO()函数根据追加到表缓冲区中的记录情况返回序列负值。比如,如果您启用了表缓冲,编辑记录7、8、9,然后追加三个记录,则此时缓冲区将包含RECNO()的值为7、8、9、-1、-2和-3。只能使用TABLEREVERT()命令从缓冲区中删除追加记录。对于任何追加的记录,当维护序列时,TABLEUPDATE()和TABLEREVERT()都删除RECNO()为负值的记录。在使用表缓冲时,您可以用带负RECNO()值的GO命令来访问指定的追加记录。比如,对于前面的示例,可以输入:GO7&;&;转到第一个缓冲记录GO-3&;&;转到第六个缓冲记录(第三个追加记录)若要追加记录到表缓冲区,可在启用表缓冲后使用APPEND或APPENDBLANK命令。追加的记录具有序列递增的负RECNO()值。若要从表缓冲区中移去追加的记录,可以:a、使用带负值的GO命令将记录指针定位到要删除的记录。b、使用DELETE命令将该记录加上删除标记。c、使用TABLEREVERT()函数将该记录从缓冲区中移去。注意:TABLEREVERT()函数也影响到被删除和更改的行的状态。若要从表缓冲区中移去所有追加的记录,可使用带(.T.)值的TABLEREVERT()函数。TABLEREVERT()函数把追加的记录从表缓冲区中移去,而不将这些记录写入表。TABLEUPDATE()命令将所有当前的记录写入一个表,包括已经打上删除标记的记录。二、更新数据可以使用缓冲、事务或视图更新数据。1、使用缓冲进行更新在选择缓冲方法和锁定类型之后,就可以启用记录或表缓冲。若要启动缓冲,请选择下列选项之一:*在“表单设计器”中,设置表单数据环境中的临时表的BufferModeOverride属性。*在代码中设置Buffering属性。例如,将下面的代码放进表单的init过程中,可以启用保守式记录缓冲:CURSORSETPROR("Buffering",2)&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&然后将进行更新操作的代码放在控件的适当方法程序代码中。要把编辑结果写入原来的表,可以使用TABLEUPDATE()。由于规则限&&&&制,造成对表的更新操作失败之后,要取消编辑结果,可以使用TABLEREVERT()命令。TABLEREVERT()即使在没有明确启用表缓冲的情况也都有效。下面的示例说明在启用保守式记录缓冲的情况下,如何更新记录:OPENDATABASEtestdata在表单的init代码中,打开表单启用保守式记录缓冲。USEcustomers=CURSORSETPROP("Buffering",2)lModified=.F.FORnFieldNum=1toFCOUNT()遍历字段,检查是否有字段进行了修改。注意:此段IFGETFLDSTATE(nFieldNum)=2代码可以写在“更新”或“保存”按钮的click事件中。lModified=.T.EXITENDIFENDFORIFlModified定位下一个已修改的记录。nResult=MESSAGEBOX;("记录已经被修改,是否保存?"),;4+32+256,"数据更新")IFnResult=7提交当前值并为用户提供选择,询问是否还原对当前=TABLEREVERT(.F.)字段所做的修改。ENDIFENDIFSKIPSKIP确保最后一个修改内容也已写入。IFEOF()=MESSAGEBOX("已经到最后")SKIP-1ENDIFTHISFORM.refresh2、事务管理更新即便使用缓冲,事情有时也会出错。如果希望保护更新操作,并从一整段代码中还原回来,可以使用事务。在应用程序中添加事务所提供的保护机制,超过了记录缓冲和表缓冲提供的保护功能,它将整段代码作为一个受保护的、可恢复的单元。可以嵌套使用事务,并用它保护已操作的缓冲更新。VFP事务只能用于数据库中的表和视图。1)包装代码段事务类似一层外包装,用来缓冲对内存或磁盘的数据更新操作,而不直接对数据库进行更新。实际的数据库更新在事务结束后进行。如果由于某种原因,系统不能执行对数据库的更新操作,就可以回滚整个事务,而不执行任何更新。&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&注意:在同一数据工作期的事务中,忽略事务外面的缓冲更新操作。2)控制事务处理的命令VFP提供了三个命令和一个函数控制事务处理:若要请使用此命令――――――――――――――――――――――――――初始化一个事务BEGINTRANSACTION确定当前事务的等级TXNLEVEL()取消最近一条BEGINTRANSACTION语句ROLLBACK以来所做的全部修改锁定记录,将最近一条BEGINTRANSACTIONENDTRANSACTION语句以来对数据库中表所做的全部修改写入磁盘,然后解锁记录您可以使用事务缓冲对以下文件进行修改:表、结构化的.CDX文件以及数据库表相关的备注文件。涉及内存变量和其他对象的操作不属于事务,因此不能回滚这些操作。注意:当使用远程表中存储的数据时,事务命令只更新视图临时表的本地备份中的数据;对远程基表的更新不起作用。要对远程&&&&表启用人工事务,请使用SQLSETPROP(),然后用SQLCOMMIT()和SQLROLLBACK()控制事务处理。一般来讲,除非采用TABLEUPDATE()包装调用,事务最好和记录缓冲一起使用,而不和表缓冲一起使用。如果您在事务中使用了TABLEUPDATE()命令,那么可以回滚失败的更新操作,找到失败的原因,然后重试TABLEUPDATE()命令而不丢失任何数据,这样,就确保了更新操作一定是所谓的“要么全都做,要么全不做”的原则。尽管在正常的情况下,简单的事务处理能够提供安全的数据更新操作,但是它并不能提供对系统失败的完全保护。如果在处理ENDTRANSACTION命令期间断电或产生系统中断,则数据更新仍然将会失败。请使用下列事务处理代码:BEGINTRANSACTION*更新数据IFlSuccess=.F.&;&;出错ROLLBACKELSE&;&;执行修改*确认数据IF&;&;出错ROLLBACKELSEENDTRANSACTIONENDIFENDIF3)使用事务下列规则适用于事务:&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&a、一个事务起始于BEGINTRANSACTION命令,以ENDTRANSACTION或ROLLBACK命令终止。只有ENDTRANSACTION语句,而没有BEGINTRANSACTION与之相匹配将会出错。b、ROLLBACK语句前没有BEGINTRANSACTION将会出错。c、除非应用程序中止(这将导致回滚操作),事务一旦开始,到遇到相应的ENDTRANSACTION语句(或回滚语句)这一期间,将保持有效,在跨程序、跨函数的情况下也是如此。d、对于涉及事务数据的,VFP在使用磁盘数据前先使用在事务缓冲区内的缓冲数据,确保使用最近的数据。e、如果在事务处理过程中应用程序中止,则所有操作回滚。f、事务处理只在数据库容器中进行。g、如果INDEX命令改写了一个已有的索引文件,或者任一索引文件已打开,则不能使用INDEX命令。h、事务只在数据工作期中起作用。事务处理完成了下列锁定动作:a、当一个命令直接或间接调用事务时,VFP将强制锁定。任何系统或用户的直接或间接命令将被缓冲,直至ROLLBACK或BEGINTRANSACTION命令结束事务的操作。b、如果在事务处理中使用了锁定命令,如FLOCK()或RLOCK()、则ENDTRANSACTION语句将不会解锁。因此您必须明确地解除任何在事务处理中进行的明确锁定。应该使包含FLOCK()或RLOCK()命令的事务尽量简短;否则用户会长时间不能访问被锁定的记录。4)嵌套事务处理对于分隔在不同并发进程中的表,嵌套事务可以为表的更新操作提供逻辑组。事务处理命令BEGINTRANSACTION?ENDTRANSACTION不需要在同一函数或过程中。下列规则适用与嵌套事务处理:a、可以嵌套5层BEGINTRANSACTION?ENDTR&&&&ANSACTION。b、直到最外层的ENDTRANSACTION被调用时,才执行嵌套事务中的更新。c、在嵌套事务中,一个ENDTRANSACTION只对最近的BEGINTRANSACTION所引起的事务进行操作。d、在嵌套事务中,ROLLBACK语句只对最近的BEGINTRANSACTION所引起的事务进行操作。e、在嵌套事务中,对同一数据的更新操作,最内层的更新优先于嵌套事务处理块中的其他更新。请注意下面的示例,因为在嵌套事务中所做的修改没有写入磁盘,而写入事务处理缓冲区,内层事务处理将改写外层事务处理对同一STATUS字段所做的修改。BEGINTRANSACTION&;&;事务1UPDATEEMPLOYEE;&;&;第一次修改SETSTATUS="Contrcet"WHEREEMPIDBETWEEN9001AND10000BEGINTRANSACTION&;&;事务2UPDATEEMPLOYEESETSTATUS="Exempt"WHEREHIREDATE&{1/1/93}&;&;改写ENDTRANSACTION&;&;事务2ENDTRANSACTION&;&;事务15)保护远程更新&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&在对远程表进行数据更新的过程中,事务可以避免系统造成的错误。6)性能管理如果有一个能够正常工作的多用户应用程序,可以采用下面的方法提高程序性能:a、将临时文件放在本地驱动器上:VFP在默认文件夹下创建自己的临时文件。文本编辑工作期也临时地创建被编辑文件的备份(一个.BAK文件)。如果本地工作站的硬盘上有足够的剩余空间,将临时文件放在这个本地盘或RAM驱动器上可以提高程序性能。重定向这些文件到本地盘或RAM驱动器上,可以减少访问网络驱动器的次数,从而提高性能。也可以在配置文件CONFIG.FPW中使用EDITWORK、SORTWORK、PROGWORK及TMPFILES语句,为这些文件指定其他存放的位置。b、在排序和索引文件之间选择:当一个表中的数据相对稳定时,处理没有设置索引顺序的表会提高性能,这并不意味着已经经过排序整理的表就不能或不应该利用索引文件,象SEEK命令就需要一个索引,而且在定位记录时速度相当快。但是,一旦用SEEK完成定位操作后,就应该关闭索引。c、安排对文件的独占访问:对于在其他用户不访问数据时运行的命令,象夜间的更新操作,可以通过独占方式打开文件提高性能。当文件以独占方式打开时,由于VFP不需要测试记录或文件锁定的状态,因此性能得到提高。d、控制锁定文件的时间:要减少用户对表或记录写操作的竞争,就必须减少锁定记录或锁定表的时间。可以通过在编辑完成之后的非编辑过程中锁定记录来做到这一点。开放式记录缓冲锁定时间最短。3、使用视图管理更新可以使用视图具有的更新冲突管理技术来管理多用户对数据的访问&&&&。使用WhereType属性,视图控制发送到基于视图的基表的内容。可以为本地和远程视图设置该属性。WhereType属性提供了四种设置:DB-KEYDB-KEYANDUPDATABLEDB-KEYANDMODIFIED(默认)DB-KEYANDTIMESTAMP通过选择四种设置之一,可以控制VFP如何生成发送到视图基表的SQLUpdate语句的WHERE子句。可以使用“视图设计器”的“更新条件”选项卡来选择需要的设置,或者使用DBSETPROP()函数设置一个视图定义的WhereType属性。要想更改一个活动视图临时表的WhereType属性,请使用CURSORSETPROP()。1)只比较关键字段使用DB-KEY设置对更新的限制最小。用来更新远程表的WHERE子句只包含用KeyField或KeyFieldList属性指定的主关键字段。如果基表中的主关键字段的值在检索记录之后没有被更改或删除,更新将正常进行。&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&2)比较视图中的主关键字段和已更改字段默认的DB-KEYANDMODIFIED设置比DB-KEY多了一些限制。DB-KEYANDMODIFIED只将关键字段和在视图中更改的可更新字段与基表相应的字段进行比较。如果在视图中更改了一个字段,但该字段不是可更新字段,则字段不与基表中的数据比较。用来更新基表的WHERE子句包含用KeyField属性指定的主关键字段和其他在视图中更改的任意字段。3)比较关键字段和所有可更新字段DB-KEYANDUPDATABLE设置将关键字段以及任何视图中的可更新字段(不管是否被修改)与基表相对应的的字段进行比较。如果字段是可更新的,即使在视图中并没有更改它,但如果其他人在基表中更改了这个字段,更新就会失败。用来更新基表的WHERE子句包含用KeyField或KeyFieldList属性指定的主关键字段和其他任何可更新字段。4)比较基表记录中所有字段的时间戳DB-KEYANDTIMESTAMP设置是对更新的限制最多的,并且只有在基表中具有时间戳字段时才能使用该设置。VFP将基表记录中的当前时间戳与当数据被提取到视图中的时间戳进行比较。如果基表记录的任何字段被改变了,即使它不是视图更改的字段,甚至不是视图中的一个字段,更新也会失败。为了能够在多表视图中使用DB-KEYANDTIMESTAMP设置成功地更新数据,必须在每个可更新表的视图中包含时间戳字段。例如,在视图中有三个表,但是却只想更新其中的两个,而且选择了DB-KEYANDTIMESTAMP设置,必须从两个可更新表中将时间戳字段带入到结果集合中。可以使用CompareMemo属性的逻辑值来确定在冲突检查中是否包含备注字段。三、冲突管理不管选择了缓冲、事务还是视图、都必须在更新过程&&&&中管理冲突。那么,如何具体管理冲突呢?1、管理缓冲冲突在一个多用户环境中,通过精心选择打开、缓冲并锁定数据的时间和方式,可以更高效地进行数据更新操作。应该减少访问记录或表时发生冲突的时间,同时必须预测到不可避免的的冲突将导致什么样的后果,并对这种冲突进行管理。冲突一般在一个用户试图锁定一个当前正被其他用户锁定的记录或表时发生,两个用户不能同时锁定同一个表或记录。应用程序中应包含管理冲突的例程。如果没有冲突例程,系统将死锁。死锁通常在这种情况下发生:第一个用户已经锁定一个表或记录,现在试图去锁定已被第二个用户锁定的记录或表,而第二个用户又反过来试图锁定第一个用户锁定的记录或表。尽管这种情况很少发生,但记录或表锁定的时间越长,这种死锁的可能性就越大。无论是设计一个多用户的应用程序还是为一个单用户系统添加网络支持服务,都要求找到错误并对其进行处理。使用VFP记录缓冲和表缓冲可以简化这种工作。&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&如果试图锁定一个已被其他用户锁定的记录或表,VFP将返回错误信息。可使用SETREPROCESS自动处理不成功的锁定操作。此命令可与ONERROR例程和RETRY命令组合,继续或取消锁定操作。2、检测并解决冲突在数据更新操作过程中,特别是在共享环境下,您可能希望确定哪些字段已经被更改、确定已更改字段的原有值或当前值是什么。VFP的缓冲和GETFLDSTATE()、GETNEXTMODIFIED()、OLDVAL()及CURVAL()函数可以提供这些功能。通过它们来确定哪些字段已经被更改;查找已更改的数据;比较当前值、原有值及已编辑的值。这样,可以决定如何处理错误或冲突。如果要检测字段中所做的更改,可在更新操作之后使用GETFLDSTATE()函数。GETFLDSTATE()可以对非缓冲数据进行操作,但在启用了记录缓冲的情况下,此函数更加有效。比如将GETFLDSTATE()用于一个表单的Skip按钮代码中。当您移动记录指针时,VFP将检查记录中所有字段的状态,如下例所示:lModified=.F.FORnFieldNum=1TOFCOUNT()&;&;检查所有的字段IFGETFLDSTATE(nFieldNum)=2&;&;已修改lModified=.T.EXIT&;&;可以在此处插入一个ENDIFENDFOR若要检测并定位缓冲数据中已更改的记录,请使用GETNEXTMODIFIED()函数。GETNEXTMODIFIED()函数以0作为参数,查找第一个已修改的记录。如果其他用户对缓冲表进行了修改,则您的缓冲区中TABLEUPDATE()命令遇到任何修改都将导致&&&&冲突。可以用CURVAL()、OLDVAL()和MESSAGEBOX()计算冲突值并解决冲突,CURVAL()返回磁盘上记录的当前值,而OLDVAL()返回记录缓冲时的值。若要确定缓冲字段的原有值,请使用OLDVAL()函数,OLDVAL()返回一个缓冲字段的值。若要确定磁盘上一个缓冲字段的当前值,请使用CURVAL()函数,CURVAL()返回一个在编辑操作执行前磁盘缓冲字段的当前值。在共享环境中,可以创建一个出错处理过程,比较当前值和原有值,并决定是接受当前的修改还是更早一点的修改。1)使用备注字段检测冲突使用CompareMemo属性来控制何时使用备注字段检查更新冲突。这个视图和临时表属性确定了在更新的WHERE子句中是否包含备注字段(备注或通用型)。默认设置是.T.,即在WHERE子句中包含备注字段。如果这个属性设置为.F.,不论UpdateType如何设置,在更新的WHERE子句中就不会包含备注字段。当CompareMemo属性设置为假时,备注字段上的开放式冲突检查是不可用的。如果要用备注字段的冲突检查,请将CompareMemo属性设置为真。&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& 上学吧:shangxueba&&&&2)管理冲突的规则管理在多用户环境中的冲突需要有扩展和可重用的代码。一个完整的冲突管理例程进行如下操作:a、检查冲突;b、确定冲突的性质和位置;c、提供足够的信息,用户可以有效地解决这些冲突;有关冲突管理例程的示例,可以参阅位于VFP\SAMPLES\CLASSES的SAMPLES.VCX中的datachecker类。将该类添加到表单中,在将缓冲数据写入表的操作之前调用CheckConflicts方法程序,例如记录缓冲移动记录指针,关闭表,或者发出TABLEUPDATE()命令。&&&&在视图中复制表结构&&&&当使用游标作为临时的信息库用于最终转移到固定表时,通常使用CREATECURSOR语法来复制目标表的结构.创建这种方法,游标天生是可写的,而且可用APPENDFROM,INSERTINTO,或SCATTER和GATHER命令.必需的CREATECURSOR命令可以是硬编码的,但是,任何表结构的修改意味着必须重写或,至少要重新测试.我们可以用AFIELDS()函数填充一个数组来处理这种局限性,然后CREATECURSORFROMARRAY.但是,当该表是属于某一数据库时,AFIELDS()复制游标不需要的许多属性如触发器和规则表达式和默认值等.一个方案是用一个SQL-SELECT命令开始一个空的游标.你可以用下述命令使游标可写:USEDBF("EmptyCursor")AGAININ0ALIASTemp但也可以创建一个基于临时游标的数组,而不是基于表的,并根据该数组用CREATECURSOR命令创建一个可写游标.数组可以保存在一个对象的属性中:SELECT*;FROM&&&&上学吧为您提供&&&&计算机二级VF语言考试资料下载:shangxueba/share/e40.html&&&&上学吧为您提供二级VF考试:shangxueba/share/e40.htmll&&&& &&&&
上一篇资讯:
下一篇资讯:
文章排行榜}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信