Form触发器when-validate-record思想启迪

在开发Oracle Forms时,有没有碰到这样的需求,我需要在每次离开一行记录时执行某个操作。用WHEN-VALIDATE-RECORD,不过实际测试的时候,怎么有时行有时不行?那你有没有尝试过WHEN-LEAVE-RECORD呢?什么?还有WHEN-LEAVE-RECORD?从来没有听说过……

在请出WHEN-LEAVE-RECORD前,让我们先来分析分析下见过的几个WHEN触发器:

WHEN-NEW-RECORD-INSTANCE:鼠标每次进入新的一行时触发。

WHEN-CREATE-RECORD:每次插入一行时触发,没输入任何数据时SYSTEM.RECORD_STATUS为NEW,输入数据后SYSTEM.RECORD_STATUS变为INSERT。

WHEN-VALIDATE-RECORD:当鼠标离开当前行,且当前行在上一次WHEN-VALIDATE-RECORD到当前离开该行的时刻止,该行数据发生过变换时触发。

当新插入一行数据,SYSTEM.RECORD_STATUS变为INSERT时,移出会触发一次。但是,当鼠标再次进入该行并打算移出,而这段时间内该行并没有发生改变时,尽管此时该行的SYSTEM.RECORD_STATUS仍为INSERT(未保存的情况下),但不会再触发WHEN-VALIDATE-RECORD事件。

同理,当修改了一行数据,SYSTEM.RECORD_STATUS变为CHANGED时,移出该行会触发一次。但是,当鼠标再次进入该行并打算移出,而该段时间内该行并没有发生改变时,尽管此时该行的SYSTEM.RECORD_STATUS仍为CHANGED(未保存的情况下),将不会再触发WHEN-VALIDATE-RECORD事件。

好了,时机也差不多成熟了,是时候WHEN-LEAVE-RECORD出马啦,当当当当……

我们如何才能在每次移出某行时执行某个操作?从上面的分析我们知道WHEN-VALIDATE-RECORD并不是每次离开行时都会触发,而似乎又没有类似WHEN-leave-RECORD之类的触发器,那碰到这类需求时是不是就没有其他办法了呢?

当然不是,我们只需仔细想想WHEN-VALIDATE-RECORD的触发条件就不难发现,当且仅当该行数据发生了改变WHEN-VALIDATE-RECORD便会触发。这样的话,我们通过人为改变行上的数据来引起WHEN-VALIDATE-RECORD。例如,在BLOCK(BLK_DUMMY)上加一个非数据库的ITEM(就叫ITM_DUMMY吧,为了后面叙述方便,这里设为数值型,初始值为1),然后在WHEN-NEW-RECORD-INSTANCE(因为WHEN-NEW-RECORD-INSTANCE会在每次进入一行时无条件的触发)中改变这个ITEM的值(可以这样做::BLK_DUMMY.ITM_DUMMY := NVL(:BLK_DUMMY.ITM_DUMMY, 1) + 1;),到此便大功告成了,WHEN-VALIDATE-RECORD已经被我们改造成了我们自己的WHEN-LEAVE-RECORD触发器。

补充:上面是关于when-validate-record,那么when-validate-item呢?还有key-next-item?

when-validate-item的用法比较类似,不赘述。至于when-validate-item与key-next-item,key-next-item是优先于when-validate-item先执行的,但是如果输入到item的值不符合item的数据类型,那么按下TAB键就无法跳到下一个item,而且when-validate-item和key-next-item都不会触发,可以看成每个item内部都有一个类似when-validate-item的存在,而且其优先级最高。

本文标题:Form触发器when-validate-record思想启迪

本文链接:http://yedward.net/?id=97

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章