Oracle Forms主从表无法返回全部记录问题求助
解决Oracle Forms主从结构仅返回一条记录的问题
咱们先拆解下你当前代码的问题,然后一步步给出修正方案:
核心问题分析
你现在的代码逻辑是进入从块D后定位到第一条记录,循环给当前记录赋值,再执行NEXT_RECORD。但这里有个关键漏洞:当从块没有空白记录时,NEXT_RECORD不会自动创建新记录。也就是说,你的循环其实一直在覆盖同一条记录,最终只会留下最后一条游标数据,看起来就像只返回了一条记录。
另外,代码末尾的COMMIT也没必要——Oracle Forms是事务驱动的,随意提交会把整个会话的未保存数据都提交,一般应该留给用户通过专门按钮操作。
修正后的代码
下面是调整后的代码,解决了上述问题:
DECLARE CURSOR N IS SELECT B.CODIGO_BARRA, B.REFER, B.DESC_PROD, B.CANT, B.PRECIO FROM PS62 B WHERE B.NRODOCTO = :E.NRO_DOCTO_PEDIDO AND B.CODCIA = :E.CODCIA; BEGIN -- 第一步:清空从块D的所有旧记录,避免干扰新数据 GO_BLOCK('D'); FIRST_RECORD; -- 循环删除所有非最后一条记录 WHILE :SYSTEM.LAST_RECORD != 'TRUE' LOOP DELETE_RECORD; NEXT_RECORD; END LOOP; DELETE_RECORD; -- 删除最后一条剩余记录 -- 第二步:循环创建新记录并填充游标数据 FOR I IN N LOOP GO_BLOCK('D'); CREATE_RECORD; -- 手动创建新的空白记录,确保每条数据都有独立行 :D.CODIGO_BARRA := I.CODIGO_BARRA; :D.REFER := I.REFER; :D.DESC_PROD := I.DESC_PROD; :D.CANT := I.CANT; :D.COSTO := I.PRECIO; END LOOP; -- 定位到从块第一条记录,方便用户查看 GO_BLOCK('D'); FIRST_RECORD; END;
关键优化点说明
- 用
CREATE_RECORD替代依赖NEXT_RECORD:CREATE_RECORD会直接在从块生成一条新的可插入记录,确保每条游标返回的数据都能存入单独的行,不会出现覆盖问题。 - 先清空从块旧数据:如果用户之前查询过其他主记录,从块会残留旧数据,先清空能保证显示的都是当前主记录对应的从数据。
- 移除不必要的
COMMIT:保留事务控制权给用户,避免意外提交未完成的操作。
额外检查项
最后确认下从块D的属性设置:
- 确保
Insert Allowed属性设为Yes,这样才能创建新记录 - 如果从块绑定了基表,确认表的权限没问题(不过你是手动赋值,这一点影响不大)
内容的提问来源于stack exchange,提问作者Carlos Qvistgaard
相关产品推荐
相关产品推荐

