这算是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.html
根据此贴 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 中可以这样重现此问题:
去掉第 2,3 行前的注释符号后,执行下面代码可看到发生的错误create cursor ttt (f1 C(10))* index on f1 tag f1 && 创建一个临时索引* delete tag all && 删除所有索引insert blank before