当前位置: 代码迷 >> VFP >> 这算是bug吗?该如何处理
  详细解决方案

这算是bug吗?该如何处理

热度:6198   发布时间:2013-02-26 00:00:00.0
这算是bug吗?
今天在帮朋友将一个原来是用 vfp6 写的软件转成 vfp9 时出现一个运行时错误
出错语句是一条 vfp6 中经常使用的命令:Insert Blank After
出错提示是:在启用行缓冲或表缓冲,或者使用完整性约束时,不能执行 INSERT操作。

下断点检查
1. 要插入的表是一个 Cursor(临时表),也没有使用任何 DBC,全部都是自由表,所以不存在完整性约束问题
2. ? CursorGetProp('Buffering') 结果返回 1,证实没有启用表或行缓冲
至此,vfp 错误提示指出的原因全部排除

因为一开始就只用 vfp9,所以没有用过 Insert Balnk Before/After 这样的命令,上网查找到这一贴:
http://topic.csdn.net/t/20060529/15/4786214
根据此贴 12 楼的提示,可能是因为表存在索引的原因,执行:
list stru 命令,结果是所有字段均没有索引

几经搜索,发现在调用出错代码的父模块中有下列语句:
...
index on ename tag ename
seek 'ccc'
if found()
...
endif
delete tag all
...

去掉 index,改 seek 为 locate 后,错误排除!
尽管这个临时表创建了一个临时索引,用完后索引已全部删除,但仍无法使用 inser ... before/after 命令

由于要搜索的表很小,所以这里改成 locate 没有性能问题,但如果表很大呢?
因为朋友要求点插入按钮后,空行要出现在 grid 的指定行之后,以便参照上下记录来修改数据,这段代码也不想做大的改动,所以不想将 insert ... after 改成 append,难道只能用 locate 了吗?
原来的代码在 vfp6 中执行不会出错,但在 vfp9 中不行,怀疑是一个 vfp9 bug

vfp9 中可以这样重现此问题:
SQL code
去掉第 2,3 行前的注释符号后,执行下面代码可看到发生的错误create cursor ttt (f1 C(10))* index on f1 tag f1        && 创建一个临时索引* delete tag all            && 删除所有索引insert blank before



------解决方案--------------------------------------------------------
create cursor ttt (f1 C(10))
index on f1 tag f1 && 创建一个临时索引
delete tag all && 删除所有索引
insert blank before

在VFP6.0下运行正常。严格的讲,应该是个错误。
------解决方案--------------------------------------------------------
在VFP9 确实如此,可惜没人去修复了!
------解决方案--------------------------------------------------------
在VFP9下测试,确实存在此问题,一般不用insert blank before, 如果一定要用,表中增加唯一标识的字段,根据此字段的值,做处理再插入
------解决方案--------------------------------------------------------
你在
insert blank before/after
之前加一句
CursorSetProp('Buffering',1,'表名')
就可以了。
3 楼我代码在 vfp9.0 sp2 7423 + xp sp3 中加上 CursorSetProp('Buffering',1,'表名') 就不报错了。
------解决方案--------------------------------------------------------
这是高手与高手之间的讨论...我只有学习的份

不过,此问题,我是遇到过的,但当时没有解决
------解决方案--------------------------------------------------------
留个脚印,以前碰到过,走不过绕道了。
  相关解决方案