oraclestudyroad 2011-08-23
在开发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-LEAVE-RECORD触发器吧。