【问题标题】:oracle form many recordsoracle形成许多记录
【发布时间】:2018-05-09 14:38:41
【问题描述】:

我需要在主详细信息中返回表的所有记录,为此我使用触发器 WHEN-VALIDATE-ITEM 并且我正在使用此代码

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 
      GO_BLOCK('D');
      FIRST_RECORD;
             FOR I IN N  LOOP
                      :D.CODIGO_BARRA := I.CODIGO_BARRA;
                      :D.REFER := I.REFER;
                      :D.DESC_PROD := I.DESC_PROD;
                      :D.CANT := I.CANT;
                      :D.COSTO := I.PRECIO;
        NEXT_RECORD;
    END LOOP;
    COMMIT;
END;

这只是返回我一个记录。请帮帮我!

【问题讨论】:

  • 创建主从不需要任何触发器,这是完全错误的。您需要创建关系。使用表单向导创建主从表单。它将引导您完成。

标签: sql oracle plsql oracle-sqldeveloper oracleforms


【解决方案1】:

这当然不是在 Oracle Forms 中填充数据块的方法。即使您设法做到了,Forms 也会考虑这些行new,并且 - 如果您尝试保存它们 - 您将获得主键/唯一键违规。

您应该使用数据块向导来指导您完成创建主块的过程(通常在表单布局中,显示单个记录)。

然后再次运行向导以创建详细信息块(通常以表格布局显示,显示多条记录)。确保创建这两个块之间的关系。

如果这些表被正确创建(即具有主键以及建立主从关系的外键),表单将自动提供应连接的列。

向导完成后,该表单将在所有方面发挥作用 - 您无需编写任何代码。所以,你可以

  • 查询那些表
    • 查询 master 将自动检索其详细信息,无需在您自己的程序单元中编写任何循环
  • 输入新值,
  • 更新或删除现有的。

截至您编写的代码:Barbaros 告诉您如何修复它,但它在 WHEN-VALIDATE-ITEM 触发器中无论如何都不起作用,因为您不能在它。这真的没关系,因为你想要这样做的方式是完全错误的。

【讨论】:

    【解决方案2】:

    为什么需要COMMIT 来返回记录。

    目标块总是应该被清除(CLEAR_BLOCK(NO_VALIDATE) 需要这个目标才能在没有任何弹出窗口的情况下执行),

    再次使用FIRST_RECORD,将光标移到返回全部末尾的记录顶部。

    因此,您可以使用以下内容:

    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 
          GO_BLOCK('D');
          CLEAR_BLOCK(NO_VALIDATE);
          FIRST_RECORD;
                 FOR I IN N  LOOP
                          :D.CODIGO_BARRA := I.CODIGO_BARRA;
                          :D.REFER := I.REFER;
                          :D.DESC_PROD := I.DESC_PROD;
                          :D.CANT := I.CANT;
                          :D.COSTO := I.PRECIO;
            NEXT_RECORD;
        END LOOP;
       FIRST_RECORD;
    END;
    

    【讨论】:

      猜你喜欢
      • 2011-07-24
      • 1970-01-01
      • 2018-11-18
      • 2010-09-25
      • 2011-03-03
      • 2018-12-31
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多