求助,找原因~~

rainyedge 2016-06-12 10:34:22
各位大神,以下这段代码老是报该表正在使用,什么回事?谢谢~~
工作区1打开local_list,工作区2打开一个sql的临时表,根本就没有其他程序打开数据库,而SET EXCLUSIVE OFF也在主程序里写了~找不到原因啊~~~
SELECT 1
SELECT local_list
GO top
DO WHILE EOF()=.f.
memidx=memid
SELECT 2
GO TOP
DO WHILE EOF()=.f.
IF VAL(mem_in_no)=VAL(memidx)
thisform.txtlist.value=ALLTRIM(thisform.txtlist.value)+ALLTRIM(mem_name)+ALLTRIM(",")+ALLTRIM(STR(sid))+ALLTRIM(";")
thisform.Refresh
ENDIF
SKIP +1
ENDDO
SELECT 1
SELECT local_list
SKIP +1
ENDDO
...全文
157 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
都市夜猫 2016-06-12
  • 打赏
  • 举报
回复
你这样的描述别人是没办法帮到你的,因为你自己都不知道是那条语句出错 简单点,把你的整个项目打包上传到 http://www.access911.net/CSDN/,帮你看看
rainyedge 2016-06-12
  • 打赏
  • 举报
回复
引用 2 楼 dkfdtf 的回复:
这段代码没有 use 语句,触发错误的最终原因也就不在这些语句中 唯一有可能的就是 thisform.Refresh 这句,整个表单上所有的控件都会执行一次刷新,只有你才知道它们都做了些什么,注释掉这句看看有没有改变 也不知道你这段代码想干啥,不停的给 txtlist 赋值,又不停的刷新,还有,.... 问题太多,一个字,乱
thisform.Refresh是疏忽了,谢谢~ 不是专业的开发工程师,没办法~多多包涵~哈 但是确实检查过,明明使用了SET EXCLUSIVE OFF,但是运行过程中总是报占用或者没有打开~两个工作区,第一个打开dbf,第二个打开sql的一个临时表,切换的时候就报错了,但是检查过代码都没有关闭表和独享打开的语句
都市夜猫 2016-06-12
  • 打赏
  • 举报
回复
这段代码没有 use 语句,触发错误的最终原因也就不在这些语句中 唯一有可能的就是 thisform.Refresh 这句,整个表单上所有的控件都会执行一次刷新,只有你才知道它们都做了些什么,注释掉这句看看有没有改变 也不知道你这段代码想干啥,不停的给 txtlist 赋值,又不停的刷新,还有,.... 问题太多,一个字,乱
rainyedge 2016-06-12
  • 打赏
  • 举报
回复
是不是28m大小的那个vfp 9.0 sp2版本有缺陷?以前用9.0没出现过这个问题!……求大神解答~
rainyedge 2016-06-12
  • 打赏
  • 举报
回复
噢……谢谢,非常感谢!看来要找本书好好看看……这些相关的细节的问题有什么书推荐吗?会有这种书吗?~
都市夜猫 2016-06-12
  • 打赏
  • 举报
回复
引用 14 楼 qq_29587521 的回复:
话说,我原来的代码是什么问题呢?
编程习惯有待规范 1. 硬性使用工作区编号,而不是使用表别名切换工作区 2. 打开表之前不判断是否已经打开: *-- checklist 中代码 SELECT 1 USE local_list SHARED 3. 无效的代码: *-- checklist 中代码 SELECT 2 sqlexec(con_sqllist,sqllist,"list_temp") && list_temp 创建在哪个工作区不是你上面那句 select 2 可以控制的 4. 随意使用 public 类型变量 5. ....
rainyedge 2016-06-12
  • 打赏
  • 举报
回复
话说,我原来的代码是什么问题呢?……谢谢~
都市夜猫 2016-06-12
  • 打赏
  • 举报
回复
引用 11 楼 qq_29587521 的回复:
我也测试了,应该是这个问题 cast(SUBSTRING(res_sid,1,3) as int) as sid …… 这句,报“在将 varchar 值 'PC ' 转换成数据类型 int 时失败。” 应该怎么改?好像语法没有错……
SQL Server 不像 vfp,非数字字符 ‘PC’ 转成 int 类型时是会报错的,不像 vfp 会转成 0
rainyedge 2016-06-12
  • 打赏
  • 举报
回复
引用 10 楼 dkfdtf 的回复:
and res_date>='<<thisform.txtbegin.value>> 00:00:00' and res_date<='<<thisform.txtend.value>> 23:59:59' 最好也改下: and res_date >= '<<dtos(ctod(thisform.txtbegin.value))>>' and res_date < '<<dtos(1+ctod(thisform.txtend.value))>>'
哦,看错了,不好意思……应该是sql数据库的数据出问题了……非常感谢!!麻烦您了!
rainyedge 2016-06-12
  • 打赏
  • 举报
回复
嗯,我也测试了,应该是这个问题
cast(SUBSTRING(res_sid,1,3) as int) as sid ……
这句,报“在将 varchar 值 'PC ' 转换成数据类型 int 时失败。”
应该怎么改?好像语法没有错……
都市夜猫 2016-06-12
  • 打赏
  • 举报
回复
and res_date>='<<thisform.txtbegin.value>> 00:00:00' and res_date<='<<thisform.txtend.value>> 23:59:59' 最好也改下: and res_date >= '<<dtos(ctod(thisform.txtbegin.value))>>' and res_date < '<<dtos(1+ctod(thisform.txtend.value))>>'
都市夜猫 2016-06-12
  • 打赏
  • 举报
回复
引用 7 楼 qq_29587521 的回复:
点击之后文本框还是空白……按理来说不可能没有的,我核对过两个数据库里的id是有相等的,因为VFP的数据是我手动按照sql中的数据录进去的……哪里的逻辑出什么了?

那得检查 sqlexec 后的临时表有没有查到数据

查询按钮的 click 事件代码也改下:
Local  sqllist as String
Local array aTemp[1]

TEXT to sqllist Noshow textmerge pretext 1+2+4+8
SELECT distinct
pat_name,
pat_sex,
pat_age_exp,
pat_tel,
pat_in_no,
pat_bar_code,
pat_report_date,
pat_dep_name,
res_itr_id,
cast(SUBSTRING(res_sid,1,3) as int) as sid
FROM clab.dbo.patients a,clab.dbo.resulto b
where a.pat_id=b.res_id and res_itr_id='10049'
and res_date>='<<thisform.txtbegin.value>> 00:00:00'
and res_date<='<<thisform.txtend.value>> 23:59:59'
order by sid
ENDTEXT

Do case
Case sqlexec(con_sqllist,sqllist,"list_temp") < 0
AError(aTemp)
MessageBox('查询错误' + Chr(13)+Chr(13) + aTemp[3])
Case Reccount("list_temp") < 1
MessageBox('没有查询到任何记录')
Otherwise
Thisform.checklist()
Use in Select('list_temp')
*-- Thisform.Refresh()
EndCase
都市夜猫 2016-06-12
  • 打赏
  • 举报
回复
又看了下,checklist 中无必要再次执行 sqlexec 查询,这样就可以了:
If !Used('local_list')
	Use local_list Shared In 0
EndIf
Select local_list
Scan all
	patidx = patid
	Select list_temp
	Scan all
		IF VAL(pat_in_no)=VAL(patidx)
			With thisform.txtlist
				.value = .value + ALLTRIM(pat_name) + "," + ALLTRIM(STR(sid)) + ";"
				.SelStart = Len(.Value)
			EndWith
		ENDIF
	EndScan
EndScan
*-- Use in Select('list_temp')
rainyedge 2016-06-12
  • 打赏
  • 举报
回复
改了之后是不报错,但是运行点击之后文本框还是空白……按理来说不可能没有的,我核对过两个数据库里的id是有相等的,因为VFP的数据是我手动按照sql中的数据录进去的……哪里的逻辑出什么了?……谢谢
都市夜猫 2016-06-12
  • 打赏
  • 举报
回复
checklist 方法改成这样试试:
If !Used('local_list')
Use local_list Shared In 0
EndIf
Select local_list
Scan all
patidx = patid
If sqlexec(con_sqllist,sqllist,"list_temp") > 0
Select list_temp
Scan all
IF VAL(pat_in_no)=VAL(patidx)
With thisform.txtlist
.value = .value + ALLTRIM(pat_name) + "," + ALLTRIM(STR(sid)) + ";"
.SelStart = Len(.Value)
EndWith
ENDIF
EndScan
EndIf
EndScan
Use in Select('list_temp')

不要试图用 select <工作区编号> 这种方式切换工作区,用表别名
rainyedge 2016-06-12
  • 打赏
  • 举报
回复
引用 4 楼 dkfdtf 的回复:
你这样的描述别人是没办法帮到你的,因为你自己都不知道是那条语句出错 简单点,把你的整个项目打包上传到 http://www.access911.net/CSDN/,帮你看看
已上传,请帮忙,很简单的程序而已,不会用太多的时间,万分感谢指导!

2,748

社区成员

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

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