| 网站首页 | 业界新闻 | 群组 | 人才 | 技术文章 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 182 人关注过本帖
标题:关于数据工作区的使用
只看楼主 收藏
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:版主
威 望:319
帖 子:10990
专家分:41646
注 册:2006-5-13
结帖率:99.55%
  问题点数:0  回复次数:8   
关于数据工作区的使用
很多初学VFP的朋友在程序中经常出现“找不到别名'***'”、“文件正在使用”、“当前工作区没有打开的表”等等出错的提示,之所以会出现此类问题,主要是没有正确使用好工作区。目前的教材上对工作区的介绍还停留在forBASE阶段,通常是
select 1   &&选择第一个工作区
use 表1    &&打开第一个表
select 2   &&选择第二个工作区
use 表2    &&打开第二个表
......
使用时
select 1
......
select 2
......
这样的做法需要编程者牢记在哪个工作区打开了哪个表,记错了程序自然就会出错。
稍微进步一点的教材会介绍更先进一点的打开最小编号空闲工作区的命令,如:
select 0
以及通过表别名来选择工作区的命令,如:
use 表2
这样就可以不必记住具体在哪个工作区打开了哪个表,用表别名就可以方便快捷地选择到相应的工作区。
这样就能满足我们的编程需要了么?答案是否定的,举例来说,有一个名称为abc的表,我们在一个表单里需要使用这个表,很自然地在表单的开始时(例如init事件中)使用一行use abc in 0,然后在表单结束时(例如unload事件中)写上二行语句
select abc
use
这看起来很正常,教材中是这么写的,老师也许也是这样教的,上机测试也正常通过的。但实际使用起来就可能会有问题,例如我们在其他表单上也使用这个表,也用相同的方法打开和关闭表,两个表单分别运行进没有问题的,但如果前一个表单尚未关闭,启动第二个表单时,由于表不能被同时打开,于是自然就出错了。允许表单有多个实例(也就是可以多次打开同一表单)也会涉及到这个问题。
也许有熟悉VFP语句的朋友会说这很容易解决,在表单打开用一个检测命令就行,如:
if used("abc")  &&abc表已经被打开了
  select abc
else
  use abc in 0
endif
这的确可以解决表被重复打开的问题,确保表只能打开一次,不会被重复打开,因此也不会出这个方面的错误。
本帖最近评分记录
  • mywisdom88 积分 +10 我很赞同 2017-9-12 13:27
  • xinjie 积分 +10 我很赞同 2017-9-12 09:56
2017-09-12 09:00
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:版主
威 望:319
帖 子:10990
专家分:41646
注 册:2006-5-13
  得分:0 
接上贴。
且慢!这只是解决了重复打开表的问题,尚未解决表如何关闭的的问题。
继续以前面的例子,用户只要关闭了其中的一个表单,abc表就会被关闭了,但另一个表单仍在运行,只要一使用abc表,立马就出错,原因很简单,正在使用的表被关闭了!这就要求在表单结束运行时不能直接关闭表,而是要判断这个表还有没有其他的使用者正在使用。
这太复杂了,VFP并没有现成的函数来检测,如果用完都不关闭表,又会增添损坏表的机率。要自己解决就得建一个使用情况表,记录有多少个表单在使用某个表,如果只有一个表单使用才可以关闭表,否则就不能关闭表。
此类微观的“数据共享”问题,其实VFP系统早已为我们考虑到了,这就是“数据环境”的概念,我们只要将需要使用的表加入了“数据环境”,VFP系统就会自动解决表如何打开和如何关闭的问题,不需要我们操心,“秘书”会替我们安排妥当。
正确利用VFP系统提供的功能,在很多时候会为我们带好方便,但也不能一概而论。

活到老,学到老! http://www.qs98.com E-mail:hu-jj@21cn.com
2017-09-12 09:29
xinjie
Rank: 5Rank: 5
等 级:贵宾
威 望:13
帖 子:206
专家分:330
注 册:2007-8-11
  得分:0 
狗尾续貂:
需要注意两点:
1 表单的工作期默认的是公共的。
2 增加到表单数据环境中的表,默认是独占打开的。
本帖最近评分记录
  • mywisdom88 积分 +10 我很赞同 2017-9-12 13:28
2017-09-12 10:03
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:版主
威 望:319
帖 子:10990
专家分:41646
注 册:2006-5-13
  得分:0 
以下是引用xinjie在2017-9-12 10:03:04的发言:

狗尾续貂:
需要注意两点:
1 表单的工作期默认的是公共的。
2 增加到表单数据环境中的表,默认是独占打开的。

的确是,需要在数据环境中将表改为非独占打开,即在属性窗口中设置为readonly=.f.。

活到老,学到老! http://www.qs98.com E-mail:hu-jj@21cn.com
2017-09-12 13:03
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:58
帖 子:2058
专家分:4895
注 册:2015-3-25
  得分:0 
我一直没使用数据环境,去年坏过2次表后,就改用SQL2000.
至于防止关闭1个,影响全部.我增加自定义属性,如 用到3个表,分别是 a1.dbf,a2.dbf,a3.dbf,我就增加3个属性 thisform.a1,thisform.a2,thisform.a3
在表单的 init 中
thisform.a1="a1"+sys(2015)
thisform.a2="a2"+sys(2015)
thisform.a3="a3"+sys(2015)
以后就这样使用
select * from a1 into cursor (thisform.a1) readw
select (thisform.a1)
brow
...
if used(thisform.a1)
   use in (thisform.a1)
endif






2017-09-12 13:35
nsjdy
Rank: 2
等 级:论坛游民
帖 子:26
专家分:14
注 册:2006-6-13
  得分:0 
我觉是这是VFP的不足,SQL里,没有这些问题。
2017-09-13 07:57
sylknb
Rank: 4
等 级:贵宾
威 望:11
帖 子:1450
专家分:141
注 册:2006-6-3
  得分:0 
好文章
2017-09-13 09:40
kim_wei
Rank: 1
等 级:新手上路
帖 子:38
专家分:7
注 册:2008-5-5
  得分:0 
这个问题如果遇到了一定很闹心,斑竹的意见太实用了!
2017-09-13 14:34
schtg
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:156
专家分:198
注 册:2012-2-29
  得分:0 
谢谢分享!
2017-09-13 18:31









关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.081247 second(s), 9 queries.
Copyright©2004-2017, BCCN.NET, All Rights Reserved