Visual FoxPro 6游标无法更新求助:如何将文本框值赋给游标列
解决Visual FoxPro 6中游标无法更新的问题
问题原因
你通过GROUP BY聚合查询创建的abc3游标是只读游标,Visual FoxPro默认对这类聚合结果游标限制了更新权限,因此直接执行UPDATE语句会报错。
解决方案
方案1:创建可更新游标(推荐)
在创建游标时添加READWRITE关键字,让游标具备可更新属性:
select month, memid, mname, bt, st, bh, sh, totk, toth, sum(totk*0.025)/100 as laga, sum(toth*0) as hchg, sum(totk*0.050)/100 as Tax ; from abc2 ; group by memid ; order by 2 ; into curs abc3 READWRITE
之后无需逐行循环更新,直接用REPLACE ALL批量修改所有记录的month字段:
SELECT abc3 REPLACE ALL month WITH Thisform.txtReportHeader.Value
注:原代码中IF !USED("abc3")的判断多余,SELECT INTO CURSOR会自动创建并打开游标,无需重复执行打开操作。
方案2:临时表中转更新
如果不想修改原游标创建逻辑,可以将游标数据复制到可更新的临时表中操作:
-- 原游标创建语句保持不变 select month, memid, mname, bt, st, bh, sh, totk, toth, sum(totk*0.025)/100 as laga, sum(toth*0) as hchg, sum(totk*0.050)/100 as Tax ; from abc2 ; group by memid ; order by 2 ; into curs abc3 -- 将游标数据复制到可更新临时表 SELECT * FROM abc3 INTO CURSOR abc3_temp READWRITE -- 更新临时表的month字段 SELECT abc3_temp REPLACE ALL month WITH Thisform.txtReportHeader.Value -- 后续业务逻辑操作abc3_temp即可
补充说明
原代码中的DO WHILE循环存在逻辑冗余:每次执行UPDATE abc3 set month = ...会更新游标中所有记录,循环多次只是重复执行无意义的操作。使用REPLACE ALL或单次UPDATE(游标可更新时)即可完成批量修改,效率更高。
内容的提问来源于stack exchange,提问作者A. F. M. Golam Kibria
相关产品推荐
相关产品推荐

