我需要在主详细信息中返回表的所有记录,因为我使用了触发器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;这只会返回一条记录。请帮帮我!
发布于 2018-05-10 04:24:21
这肯定不是一种在Oracle Forms中填充数据块的方法。即使您设法做到了这一点,表单也会将这些行视为新的,并且-如果您尝试保存它们-您将得到主键/唯一键冲突。
您应该已经使用了Data Block Wizard,它将引导您完成创建主块(通常在窗体布局中,显示单个记录)的过程。
然后再次运行向导以创建详图块(该详图块通常以表格布局显示,显示多条记录)。确保创建这两个块之间的关系。
如果正确创建了这些表(即具有主键和建立主-详细关系的外键),表单将自动提供应该联接的列。
一旦向导完成,该表单将在所有方面发挥作用-您不需要编写一行代码。因此,您可以
不需要在您自己的程序unit中编写任何循环,
在您编写的代码中: Barbaros告诉您如何修复它,但它无论如何都不会在WHEN-VALIDATE-ITEM触发器中工作,因为您不能在其中使用受限过程(如GO_BLOCK或FIRST_RECORD)。这真的无关紧要,因为你想要做的方式是完全错误的。
发布于 2018-05-09 23:28:13
为什么需要COMMIT来返回记录。
应始终清除目标块(执行此目标需要CLEAR_BLOCK(NO_VALIDATE),而不会出现任何弹出窗口),
再次使用FIRST_RECORD,将光标移到returning末尾的记录顶部。
因此,您可以使用以下内容:
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;https://stackoverflow.com/questions/50256061
复制相似问题