五.触发器
1.when-new-record-instance
一般触发条件:是每次在光标进入 Record 后触发(when-new-block-instance先触发)。 其他触发条件:在删除行块的最后一条记录,保存时,它会检验记录有没有数据,如果有必输字段没有数据,则会不断提示你输入数据。
2.when-create-record
作用:主要用于给新纪录指定某些栏位的缺省值,一般为item赋初值时写在该触发器内。
触发条件:创建record时触发。 触发场景:
第一次进入form时,WHEN-CREATE-RECORD触发在前,when-new-form-instance触发在后。
进入block时(即打开窗口时),when-create-record也会触发。 进入新的记录时,会触发。 关闭窗口时,也会触发。
查询窗口点击清除按钮时,也会触发,所以赋初值放在该触发器内。
when-create-record先于 pre-record 执行
WHEN-CREATE-RECORD的三大定律一大推论:
1.如果BLOCK是可INSERT的,且BLOCK的记录数为0,则在PRE-BLOCK之前必会调用 2.如果BLOCK是当前块,且是可INSERT的,如果记录数为0,则会调用。比如,CLEAR_BLOCK时,执行查询但未查到记录时 3.如果BLOCK得状态是NEW,那么每次FOCUS ON该BLOCK时,都会触发;QUERY,CHANGED不会
例子:http://note.youdao.com/share/?id=92c68dae0ea7150fa10cc8c7ee345e94&type=note
3.pre-record
一般没进入一行数据之前都会触发,因为查询后也会触发,用于控制block,item的状态。
注意:
触发器内,先设置 item能否更新,即是否灰显,再设置块的增删改属性。不然可能会导致使用F11+ctrl F11后,item变成必输的样式。
4.do-key 和execute_trigger
execute_trigger:用来运行一个指定的触发器,一般是用户自定义的触发器。 do-key:运行一个关联了键(Key)的内置触发器
注意:do-key的参数是关联了key的内置子程序,不是键触发器本身。
例如,在默认的处理中,如果when-validate-item触发器失败,那么它会抛出一个异常并停止form的运行,但是,如果when-validate-item是由execute_trigger来调用执行的,那么如果调用执行失败了,这个失败并不会停止form的运行
六.PLSQL相关
1.MOAC对于OU的控制(暂时没理解逻辑的,但是代码可以大概看懂)
moac.txt
2. 手动建立库存组织模板,增加org_id参数:
1、从INVSTANDARD.fmb中拖INV_PARAMS到我们的Form中,并用Subclass,这样会 生成4个参数。
2、在FORM级的trigger pre-form中加上:FND_ORG.CHOOSE_ORG; 3、想把库存组织显示在窗口上面的话在form level 的trigger when-new-form-instance(或者when-new-block-instance视情况而定)中加上:APP_WINDOW.SET_TITLE('WDW_XXX',:PARAMETER.ORG_CODE);
3. fnd_standard.set_who函数
EBS系统在在进行客户化表结构设计的时候,会建立如下5个who字段,用来记
录用户的相关信息,这5个字段是:
CREATE_BY NUMBER CREATE_DATE DATE
LAST_UPDATE_BY NUMBER LAST_UPDATE_DATE DATE LAST_UPDATE_LOGIN NUMBER
一般form开发时,设置CREATION_DATE和LAST_UPDATE_DATE两个字段的subclass为:CREATION_OR_LAST_UPDATE_DATE,这样可以看到form的更新日期是谁。 一般在XXXX_private包中会包含该代码。
4.item的动态布局
基本思路: ①.改变LIST item的值,在when-list-changed(或者其他触发器)内包含如下代码 DECLARE
timer_id timer; BEGIN
timer_id := create_timer('SET_LINE_LAYOUT', 1,
no_repeat); END;
参数1:表示这个timer定时器的名字 参数2:表示执行定时器的间隔时间
参数3:是否重复执行,还有一个值为repeat(重复执行)
②在FORM级的WHEN-TIMER-EXPIRED内调用
IF get_application_property(timer_name) = 'SET_LINE_LAYOUT'THEN
SET_LINE_DYMIC_LAYOUT(:pc_req_headers.DOC_TYPE_CODE,'PC_REQ_HEADERS'); ENDIF;
③. SET_LINE_DYMIC_LAYOUT是一个存储过程。
关于代码详解:
动态行布局.txt