Oracle Forms 10g,多次插入和更新不起作用

Posted

技术标签:

【中文标题】Oracle Forms 10g,多次插入和更新不起作用【英文标题】:Oracle forms 10g,multiple insert and update not working 【发布时间】:2012-08-06 06:54:46 【问题描述】:

我有一个数据块(基于视图)的表格形式(显示 4 条记录)。

查询后,表单无法更新所有记录,只能从LOV中选择第一条记录值。

我在 on-insert 和 on-update 中调用了一个过程。

查询是这样的:

PACKAGE BODY MAPPING IS

PROCEDURE INSERT_ROW(EVENT_NAME IN VARCHAR2)
IS
BEGIN
IF (EVENT_NAME = 'ON-INSERT') THEN


INSERT INTO XX_REC_MAPPING
(BRANCH_CODE,COLLECTION_ID,PAY_MODE_ID,RECEIPT_METHOD,CREATED_BY,
CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN)
VALUES
( :XX_REC_MAPPING.OFFICE_CODE,
:XX_REC_MAPPING.COLLECTION_ID,
:XX_REC_MAPPING.PAY_MODE_ID,
:XX_REC_MAPPING.RECEIPT_METHOD,
:XX_REC_MAPPING.CREATED_BY,
:XX_REC_MAPPING.CREATION_DATE,
:XX_REC_MAPPING.LAST_UPDATED_BY,
:XX_REC_MAPPING.LAST_UPDATE_DATE,
:XX_REC_MAPPING.LAST_UPDATE_LOGIN); 

ELSIF (EVENT_NAME = 'ON-UPDATE') THEN 

UPDATE XX_REC_MAPPING
SET BRANCH_CODE=:XX_REC_MAPPING.OFFICE_CODE,
COLLECTION_ID=:XX_REC_MAPPING.COLLECTION_ID,
PAY_MODE_ID=:XX_REC_MAPPING.PAY_MODE_ID,
RECEIPT_METHOD=:XX_REC_MAPPING.RECEIPT_METHOD,
LAST_UPDATED_BY=:XX_REC_MAPPING.LAST_UPDATED_BY,
LAST_UPDATE_DATE=:XX_REC_MAPPING.LAST_UPDATE_DATE,
LAST_UPDATE_LOGIN=:XX_REC_MAPPING.LAST_UPDATE_LOGIN
WHERE ROWID=:XX_REC_MAPPING.ROW_ID;

END IF;


END INSERT_ROW;

END MAPPING;

是查看表格还是应该使用其他触发器或循环?

请有人向我建议如何编辑此查询以进行多次更新?

谢谢

sat33

【问题讨论】:

ON-INSERT 和 ON-UPDATE 触发器将自动为块中的每个新行或修改行调用,因此您无需自己编写任何循环。 我的问题是查询后我无法更改表单列中的记录值。它保持相同的值并显示 FRM:40654 记录已被另一个用户重新查询以查看更改 【参考方案1】:

托尼是正确的。

您的块基于视图的行为与该块基于表的行为一样。 当编辑此块上的记录时,会发生几件事。 :system.form_status 将从 QUERY 变为 CHANGED。 每条被更改的记录都会将 :system.record_status 设置为 CHANGED。

因此,当提交表单时 - Oracle 表单自动知道它必须做一些工作,因为 form_status 已更改。然后它开始处理块中的记录,循环遍历记录并处理每个记录状态为更改的记录。

如果您因为您的块基于视图而覆盖 ON-INSERT 和 ON-UPDATE(您似乎是),那么您需要做的就是剪切并粘贴您的语句 插入到 XX_REC_MAPPING ..... 进入块级的 ON-INSERT 触发器。这有效地覆盖了表单会触发的插入。

您也应该对更新执行相同的操作 - 只需将该语句剪切并粘贴到块级别的 ON-UPDATE 触发器中。


FRM:40654 记录已被另一个用户重新查询以查看 改变

由于表单中的 LOCKING 机制触发而发生此错误。 该块正在尝试使用 ROWID 锁定记录。如果您已将块基于视图,则将没有可用的 ROWID。

将块上的 KEY MODE 设置为不可更新应该可以解决此问题。

我还建议阅读 KEY MODE 属性,因为这对于基于 JOINS 和 VIEWS 的块至关重要。

【讨论】:

我的问题是查询后我无法更改表单列中的记录值。它保持相同的值并显示 FRM:40654 记录已被另一个用户重新查询以查看更改。跨度>

以上是关于Oracle Forms 10g,多次插入和更新不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Forms 10g Tutorial Ebook Download - Oracle Forms Blog

Oracle Forms 10g 自动查询

oracle forms 10g,运行一个form

从 Oracle Forms 10g WebUtil 执行 SUSE Linux 命令

oracle forms 10g web应用程序

在 Oracle Forms 10g 中使用 LOV 值过滤数据块