| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4516 人关注过本帖
标题:出现不能访问选定表是怎么回事?
只看楼主 加入收藏
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
通常教材的例子都是以close、clear等命令开头,却没有说明为什么要这样做和在什么情况下才能这样做。于是在初学者中滥用此类命令比比皆是,造成出错也不知所措。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2016-07-19 05:48
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用hu9jj在2016-7-19 05:48:41的发言:

通常教材的例子都是以close、clear等命令开头,却没有说明为什么要这样做和在什么情况下才能这样做。于是在初学者中滥用此类命令比比皆是,造成出错也不知所措。

我在做更新程序时,发现,如果我更换时,不发出 close all,clear all,好像有点问题。如下
**自动更新程序,分2个文件,主程序.EXE,update.exe
1、在主程序.EXE中检查文件是否最新的。如果不是最新的,调用更新程序,同时退出,主要代码为

close all && 不加,好像有点问题
clear all  && 不加,好像有点问题
if 需要更新=.t.
  *调用更新程序 update.exe,在更新程序中读取数据,更新完成后,复制到 主程序.exe去
  DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER , STRING , STRING , STRING , STRING ,INTEGER
  = SHELLEXECUTE(0,0,'update.exe',0,0,1)
  QUIT
endif

** 退出update.exe时,再调用 主程序.exe
*调用主程序,
DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER , STRING , STRING , STRING , STRING ,INTEGER
= SHELLEXECUTE(0,0,'主程序.exe',0,0,1)
QUIT
2016-07-19 08:46
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
以下是引用hu9jj在2016-7-19 05:48:41的发言:

通常教材的例子都是以close、clear等命令开头,却没有说明为什么要这样做和在什么情况下才能这样做。于是在初学者中滥用此类命令比比皆是,造成出错也不知所措。
请你具体解释一下,好吗?
2016-07-20 08:15
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用mywisdom88在2016-7-19 08:46:01的发言:


我在做更新程序时,发现,如果我更换时,不发出 close all,clear all,好像有点问题。如下
**自动更新程序,分2个文件,主程序.EXE,update.exe
1、在主程序.EXE中检查文件是否最新的。如果不是最新的,调用更新程序,同时退出,主要代码为

close all && 不加,好像有点问题
clear all  && 不加,好像有点问题
if 需要更新=.t.
  *调用更新程序 update.exe,在更新程序中读取数据,更新完成后,复制到 主程序.exe去
  DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER , STRING , STRING , STRING , STRING ,INTEGER
  = SHELLEXECUTE(0,0,'update.exe',0,0,1)
  QUIT
endif

** 退出update.exe时,再调用 主程序.exe
*调用主程序,
DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER , STRING , STRING , STRING , STRING ,INTEGER
= SHELLEXECUTE(0,0,'主程序.exe',0,0,1)
QUIT

更新程序是要将原程序替换掉,在这种情况下首先要将原程序关闭,否则就无法替换,关闭原程序时势必也要将打开的所有库、表文件同时关闭。这属于特例,与正常的处理程序明显不同。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2016-07-20 08:20
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用sylknb在2016-7-20 08:15:41的发言:

请你具体解释一下,好吗?

close all关闭所有打开的文件,clear all是清除所有变量。在教材例子中使用这些命令是防止之前打开的文件或者赋值的变量影响例子执行结果,我们在项目的启动部分通常也会使用这些命令,注意这仅仅是在整个程序启动时执行,而不是在每个子程序(或者表单)开始时都执行,否则就会将其他正在运行的程序(或表单)打开的表(数据库或者其他文件)关闭掉,影响这些程序的正常运行。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2016-07-20 08:30
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
在通常情况下程序运行时是不会使用close和clear命令的,每个子程序(或者表单)在结束(关闭)时,期间建立的变量会自动清除,用不着使用clear命令,打开的表文件则可以使用【use 表别名】命令来关闭,也可以先select 表别名,再use关闭表。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2016-07-20 09:05
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:3 
在子程序(或表单)结束时用use命令来打开或关闭表其实不是好的办法。因为如果你的程序中会有多个子程序(表单)同时运行,且同时运行的子程序(表单)使用了同一个表,那末你在打开一个新的子程序(表单)时同步打开一个表,恰巧这个表已经被正在运行的子程序(表单)打开了,此时就会出错,因为一个表(或者文件)不能被重复打开。常用的解决办法是用下列代码:
if used("表别名")
  select 表别名 &&如果这个表已经打开,就选择到这个工作区
else
  use 表 in 0   &&否则就在一个空闲的工作区中打开这个表
endif
这个办法仅仅能解决表重复打开的问题,无法解决表关闭的问题。如果在子程序(表单)结束时将打开的表关闭掉(这也是常规的做法),而这个表恰恰是其他正在运行的子程序(表单)需要用的,这些子程序(表单)访问这个被关闭掉的表时就会出错。这就出现一个难题:子程序(表单)在结束退出时,打开的表不关闭是不合常理的,也可能会影响到下次再打开,关闭掉又可能会影响到其他正在运行的子程序(表单)。
其实VFP系统早已替我们考虑到这个难题,使用数据环境就能解决。将需要使用的表放在表单的数据环境里,我们用不着考虑表何时该打开、何时该关闭的问题,VFP系统会自动处理,决不会出现表被重复打开或者其他正在运行的表单还需要使用这个表,却被表单结束时关闭了。所以我一律使用数据环境,从不自己去管理表的打开或关闭。
此贴讨论的是多个子程序(表单)同时运行的情况,假如你的程序不存在多个子程序(表单)同时运行的情况,则不在此讨论范围内。
这也仅仅是个人看法,仅供参考。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2016-07-20 09:29
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
可能与创建临时表有关系 你自己测试下
2016-07-20 09:57
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:5 
我在开发一个小系统时就遇到过楼主说的问题,但奇怪的是,不是所有以表文件为数据源的控件都会发生问题。总结了一下,得出两点:1、RowSource设置完了以后,对数据源不再作任何修改,是永远不会产生这个问题的;2、RowSource设置完了以后,对数据源有修改,也不会所有被修改过数据源的控件都会出问题,而是随机一个或几个。这个随机现象是真的很随机。举个栗子:我开发的那个系统里大量采用组合框控件,大多数的组合框控件数据源都是表文件。某天突然发现其中一个出现了这个问题,网上查询以后修正了。而该控件的这个数据源内容从设计之初就是应该随着另一个控件的选择而变动的,此前一直没有问题,突然有一天就冒出来了,然后一直就有。
修正这个问题的方法有2种:
1、采用微软帮助文件中说的方法,即,先将该控件的数据源指向为一个空字符串,然后再指向那个表文件。如:
  .学生.RowSource=""
  SELECT DISTINCT CAST(ALLTRIM(Xh)+" "+ALLTRIM(Xm)+","+ALLTRIM(Xnj)+"级,"+ALLTRIM(Xbmc) AS V(67)) 学生信息;
     FROM 成绩修改单登记,Xsjbxx;
     WHERE 学号==Xh;
  UNION ALL ;
  SELECT DISTINCT CAST(ALLTRIM(Xh)+" "+ALLTRIM(Xm)+","+ALLTRIM(Xnj)+"级,"+ALLTRIM(Xbmc) AS V(67)) 学生信息;
     FROM 成绩修改单登记,Bzxmd;
     WHERE 学号==Xh;
     ORDER BY 学生信息;
     INTO CURSOR Xsxxb
  WITH .学生
     .RowSourceType=2
    .RowSource="Xsxxb"

     .DisplayValue=1
  ENDWITH
2、如果数据源是临时生成的表文件,且按方法1修正了之后还有问题,那么可以把它生成为一个数组,就是用INTO ARRAY子句。但请记住,也要按方法1的步骤写代码,即,先把数据源指向一个空字符串,再指向这个数组。
2016-07-20 15:15
小小菜7
Rank: 1
等 级:新手上路
帖 子:67
专家分:0
注 册:2016-5-13
收藏
得分:0 
回复 19楼 taifu945 这是combo2的代码,根据我的该怎么改呢?
图片附件: 游客没有浏览图片的权限,请 登录注册
2016-07-20 16:32
快速回复:出现不能访问选定表是怎么回事?
数据加载中...
 
   



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

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