4

我正在使用 oracle 表单。每当修改特定字段的值时,我都必须运行一个程序。我必须执行的过程包含一个 go_block 指令,该指令不能在 when_validate_item 触发器中使用。反正有没有绕过这个?

编辑

我必须使用 when_validate_item,因为我必须运行的过程必须在修改字段时运行,但在执行验证之前。

4

3 回答 3

12

通常对使用GO_BLOCKGO_ITEM有限制WHEN-VALIDATE-ITEM。然而,有几种方法可以克服这一点。一种方法是使用WHEN-TIMER-EXPIRED触发器。这是如何 -

WHEN-TIMER-EXPIRED

Begin    
if GET_APPLICATION_PROPERTY(TIMER_NAME) = 'NEW_TIMER' then    
   CALL_PROG_UNIT(); --This is your Procedure that calls the GO_BLOCK   
   /*Do rest of validation here*/
end if;
END;

WHEN-VALIDATE-ITEM

DECLARE    
  timer_id TIMER;    
Begin        
  timer_id := CREATE_TIMER('NEW_TIMER',1,NO_REPEAT);    --set a short timer so that the WHEN-TIMER-EXPIRED trigger is fired immediately
End;

发生的情况是 - 这将在CREATE_TIMER调用函数后立即创建和过期计时器,然后表单级别触发器WHEN-TIMER-EXPIRED将检查过期的计时器名称并调用具有GO_BLOCK. 希望这可以帮助。


更新

Jeffery Kemp先生希望看到该解决方案有效的证据。所以这里是——

BLOCK1一个带有两个块和BLOCK2文本项的 Oracle 表单

在此处输入图像描述

WVI 触发器

在此处输入图像描述

WTE 表单触发器。P_CALL_PROC这首先调用带有函数调用的 PROGRAM UNIT ,GO_BLOCK然后对字段进行一些验证Number 2

在此处输入图像描述

这是P_CALL_PROC

在此处输入图像描述

这是结果-

在此处输入图像描述

在此处输入图像描述

是一个 Youtube 链接,可以查看实际的表单。

于 2012-09-26T19:40:09.423 回答
0

当我遇到这类问题时,我通常能够通过重写和/或重新设计表单本身来解决问题。换句话说,为什么您需要在验证之前使用将焦点移动到另一个项目的过程?

为了能够解决此类问题,我建议您通读 Forms 帮助以了解哪些触发器存在受限内置问题。有了足够的知识,它是如何工作的,您应该能够解决大多数此类问题。在我无法解决问题的极少数情况下,我使用了计时器解决方法。

于 2012-09-27T12:22:23.813 回答
0

您可以尝试使用 POST-CHANGE 触发器。

于 2012-09-26T19:40:18.487 回答