You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:39:45