请教一个关于“无法访问选定表”的问题

ffyy001 2012-03-08 10:13:19
现象描述:
在表单中有两个表格Grid1、Grid2,其数据源分别是表T、临时表myT。通过一文本框对表格Grid1进行赋值,当焦点离开文本框时,对表T进行合计运算,结果赋给表myT。
在不进行合计运算、给表myT赋值时,文本框的LostFocus主要代码如下:
Select T
Replace 贷方 With 0 && 赋值
Select T
Go Bottom
If 借方 # 0 Or 贷方 # 0
Append Blank
Endif
Thisform.grid1.column1.n1.SetFocus

在此代码下运行时,当焦点到达表格的另一单元格时,可以通过其中的下拉框控件正常进行查询(查询中用到了一个临时表TMP)。

问题:
但是当我把给表Grid2合计赋值代码加进来后,运行完这段代码进行到表格第二行进行查询时,就会出现“无法访问选定表。TMP”的提示,下拉框无法显示,但是通过命令查表TMP,都还存在。
然后中断程序,再次运行时,却一切又可以正常查询了。就是说,这段代码只在第一次打开VFP运行时会出现“无法访问选定表。TMP”的问题。
是什么原因呢?请大侠帮助分析指点!
改变后的代码:
Select T
Replace 贷方 With 0
**-- 进行合计计算
This.Parent.grid2.RecordSource=""
Do sumPZ && 求和的一个过程
This.Parent.grid2.RecordSource="myT"
Select T
Go Bottom
If 借方 # 0 Or 贷方 # 0
Append Blank
Endif
Thisform.grid1.column1.n1.SetFocus



Procedure sumPZ
***--- 数值合计处理:
Select T
Sum(借方) To sum借方
Sum(贷方) To sum贷方
v_str=Alltrim(Str(sum借方,12,2)) && 12位字符串值,取两位小数。
v_str贷=Alltrim(Str(sum贷方,12,2))
***--- 生成临时表myT,做为合计表Grid2的数据源:
Create Cursor myT (no c(1), 借亿 c(1), 借千 c(1), ......贷分 c(1) )
Append Blank
Replace 借分 With Right(v_str,1),借角 With Substr(v_str,(Len(v_str)-1),1),......贷亿 With Substr(v_str贷,(Len(v_str贷)-11),1)
Return
...全文
263 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
十豆三 2012-03-09
  • 打赏
  • 举报
回复

Select Distinct 科目代码,科目名称 From account Where Upper(Alltrim(This.Value)) $ 名称简拼+科目代码+科目名称 Into CURSOR TMP
之前加代码
Thisform.k2.RowSource=NULL

我1楼说了“对下拉框的数据源表做以上操作时,先将 下拉框 的数据源清空,然后操作后,再设置上。

另外 k2 的 RowSource 属性初始应该不设置
lygcw9602 2012-03-09
  • 打赏
  • 举报
回复
自己可以做个测试,在CREATE 时,是否关闭前面的工作区
lygcw9602 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 ffyy001 的回复:]
问题解决了,不胜感谢各位的热心相助!

按照lygcw9602的方法,保存和恢复工作区,没能解决问题。

但是按第二个方法,不用游标,而改用myT.dbf,问题得到解决!
然而困惑的是,知其然,不知其所以然。哪位能指教一下呢?

另外,依照十豆三老师的说法试验了一下,加上
Thisform.k2.RowSource=NULL
当不删除数据环境中的myT.dbf,合……
[/Quote]
可能与创建临时表有关系
ffyy001 2012-03-09
  • 打赏
  • 举报
回复
问题解决了,不胜感谢各位的热心相助!

按照lygcw9602的方法,保存和恢复工作区,没能解决问题。

但是按第二个方法,不用游标,而改用myT.dbf,问题得到解决!
然而困惑的是,知其然,不知其所以然。哪位能指教一下呢?

另外,依照十豆三老师的说法试验了一下,加上
Thisform.k2.RowSource=NULL
当不删除数据环境中的myT.dbf,合计运算是用游标myT,也不出问题。但是从数据环境中删除 myT.dbf ,问题就又出现了。相信十豆三老师的人方法应该是可行的,应该是我的语句还是有问题吧。

lc_apple 2012-03-08
  • 打赏
  • 举报
回复
搞不明白工作区变换,那就在命令中加上工作区引用!

如:
Replace 贷方 With 0
写成:
Replace T.贷方 With 0
lygcw9602 2012-03-08
  • 打赏
  • 举报
回复
查看SELECT()函数
ffyy001 2012-03-08
  • 打赏
  • 举报
回复
先谢谢lygcw9602老师!
我明天试试这两个办法。然后回来报告结果。关于保存、恢复工作区的问题还是不太明白。笨 :(
lygcw9602 2012-03-08
  • 打赏
  • 举报
回复
OLDGZQ=SELECT() &&保存工作区
.
.
.
.
.
SELECT (OLDGZQ) &&恢复工作区




ffyy001 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lygcw9602 的回复:]
把临时表MYT,改为DBF表,直接加入数据环境中,试下
或者在Procedure sumPZ的过程中,在CREATE CURSOR 前,先保存SELECT T 工作区
调用结束后,恢复SELECT T 工作区
[/Quote]
“先保存SELECT T 工作区
调用结束后,恢复SELECT T 工作区”--如何实现呢?

lygcw9602 2012-03-08
  • 打赏
  • 举报
回复
对临时表(TMP)是如何操作的
lygcw9602 2012-03-08
  • 打赏
  • 举报
回复
把临时表MYT,改为DBF表,直接加入数据环境中,试下
或者在Procedure sumPZ的过程中,在CREATE CURSOR 前,先保存SELECT T 工作区
调用结束后,恢复SELECT T 工作区

ffyy001 2012-03-08
  • 打赏
  • 举报
回复
我传图过去了。
前面几个栏目:客户名称、业务号、提单号,都是通过查询,都用了临时表TMP。只是相对少了一步:把查询结果直接写入单元格中就可以了。而“会计科目”这一栏中,除了要把查询到的内容写入单元格内,同时要在金额栏显示输入框,进而进行处理。
在前面几栏都没有问题。唯独到了“会计科目”这一栏就出问题。而且还是在加入求和后。所以我以为还是十豆三老师说的那种情况:临时表变了。但我不知道该怎么恢复。
lygcw9602 2012-03-08
  • 打赏
  • 举报
回复
不用临时表,用SET DEFAULT TO 条件 试
lygcw9602 2012-03-08
  • 打赏
  • 举报
回复
上传到:http://www.access911.net/csdn/
注明用户名
ffyy001 2012-03-08
  • 打赏
  • 举报
回复

图调整一下尺寸
ffyy001 2012-03-08
  • 打赏
  • 举报
回复

运行到第二行的“会计科目”下时就出现问题了
十豆三 2012-03-08
  • 打赏
  • 举报
回复
应该是你的下拉框的数据源表被关闭,或关闭后又打开了,或被重新生成了。

如果是这样,对下拉框的数据源表做以上操作时,先将 下拉框 的数据源清空,然后操作后,再设置上。
ffyy001 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lygcw9602 的回复:]
Select T
Replace 贷方 With 0 && 赋值
Select T
Go Bottom
[/Quote]
这里出现两个Select T
是因为我把中间的求和代码去掉了。在repl后面应该有一段求和的代码。问题就出在这里,加上求和代码后就出现“无法访问表”的情形了 :(
lygcw9602 2012-03-08
  • 打赏
  • 举报
回复
最好能将表单执行时,发生错误的图传上来
lygcw9602 2012-03-08
  • 打赏
  • 举报
回复
Select T
Replace 贷方 With 0 && 赋值
Select T
Go Bottom
加载更多回复(2)

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧