2014-05-21 BaoXinjian In
Capgemini
1. Trigger
(1). Override模式:默认模式不再触发高级别事件
(2). Before模式:触发完本级别事件后再触发高级别事件
(3). After模式:触发高级别事件后再触发本级别事件
2. 常用form trigger
(1). Form Level
i. per-form: form版本信息
设定第一个windows
切换org
对Global和Parameter参数赋值
ii. when-new-form-instance:
定义弹性域
定义folder
(2). Block Level
i. post-query
ii. when-new-record-form
3. Form 对基于View的block进行数据操作
on-lock
on-insert
on-update
on-delete
4. Form Trigger的优先级
(1).先从Item -> Record -> Block
-> Form
(2).如果另外设置Execution
Hierarch属性(override,before,after),则按照设置后的顺序执行。
如果是override的话,则执行完这个级别的触发器,就不往上执行了,
before就是执行完这个级别的触发器后,如果上一个级别也有这个触发器的话,继续去执行,
after就是先去执行上一个级别的触发器,然后再回来执行。
5. 打开Form时的Tigger执行的顺序
- (1)PRE-FORM
- (2)PRE-BLOCK(BLOCK级)
- (3)WHEN-NEW-FORM-INSTANCE
- (4)WHEN-NEW-BLOCK-INSTANCE
- (5)WHEN-NEW-RECORD-INSTANCE
- (6)WHEN-NEW-ITEM-INSTANCE
6. 触发Tigger的Execution
Hierarchy
(1).当一个事件发生的时候,Forms
Engine可一并触发由低到高3个级别(Item、Block、Form)的同名事件,如何触发,由定义低级别的事件时所设置的执行层次决定。
(2).Execution Hierarchy:
Override模式,默认模式,不再触发高级别事件
Before模式,触发完本级别的事件后,再触发高级别事件
After模式,先触发高级别事件,再回来触发本级别事件
当然了,如果某一层次我们没定义事件代码,Forms
Engine就跳过该级别,直接进入下一级别。此外,Block中任何Item发生的事件,都可能引发该Block级事件,所以在Block级写本属于Item级的事件,要特别性能问题;Form级事件更有类似问题。
例子. WHEN-VALIDATE-ITEM例子
假设:
1、 Item
XXX的WHEN-VALIDATE-ITEM的代码是“代码1”,模式是“After”;
2、 Item
XXX所在BlockWHEN-VALIDATE-ITEM的代码是“代码2”,模式是“Override”;
3、
Form级WHEN-VALIDATE-ITEM的代码是“代码3”。
事件:发生Item
XXX的WHEN-VALIDATE-ITEM
那么:实际先执行“代码2”,然后执行“代码1”。
7. Form Builder的四种commit方式
(1).commit
对form和数据库进行提交.
如果form上面的数据变动和代码中的数据变动有冲突,最后以界面上的为准。
(2).commit_form
针对form上面的数据变动进行commit,对于代码中的类似update,insert语句也进行提交;会触发on-update,如果form上面的数据变动和代码中的数据变动有冲突,最后以界面上的为准。
(3).do_key(‘commit_form‘)
会首先寻找form下的triggers中的KEY-COMMIT这个trigger,并执行KEY-COMMIT中所写的代码。
如果没有KEY-COMMIT这个trigger,则会针对form和代码一起提交。
如果form上面的数据变动和代码中的数据变动有冲突,最后以界面上的为准。
(4).forms_ddl(‘commit‘);
只针对代码中的update,insert,delete语句进行提交,form上面的数据变动不提交.
8. Form 中遍历行
go_block(‘block_name‘);
first_record;
LOOP
message(:block_name.item);
if
:system.last_record = ‘TRUE‘ then
exit;
end if;
next_record;
END LOOP;
9. Compile Form
frmcmp_batch module=xxapinvoice.fmb
userid=apps/apps output_file=$CUX_TOP/forms/ZHS/xxapinvoice.fmx
10. Form 的查询三种方式
(1). 使用:parameter.G_query_find参数;
if
(name_in(‘PO_HEADERS.PO_HEADER_ID‘) is not null) then
:parameter.g_query_find := ‘TRUE‘;
app_find.find(‘CUX_PO_HEADERS_ADD_MESSAGE‘);
go_block(‘CUX_PO_HEADERS_ADD_MESSAGE‘);
:parameter.G_query_find := ‘FALSE‘;
else
FND_MESSAGE.DEBUG(‘请先保存订单头‘);
end if;
在CUX_PO_HEADERS_ADD_MESSAGE的PRE-BLOCK中处理
COPY(name_in(‘PO_HEADERS.PO_HEADER_ID‘),‘CUX_PO_HEADERS_ADD_MESSAGE.PO_HEADER_ID‘);
(2). 使用Default_where属性处理
declare
lv_default
varchar2(2000);
begin
lv_default:=‘.....‘;
go_block(‘CUX_PO_HEADERS_ADD_MESSAGE‘);
set_block_property(‘CUX_PO_HEADERS_ADD_MESSAGE‘,DEFAULT_WHERE,lv_default);
execute_query;
end;
(3).
用app_find.query_range()来处理:
begin
....
app_find.query_range(:find_date_from,
:find_date_to,
‘CUX_PO_HEADERS_ADD_MESSAGE.REATE_DATE‘);
:parameter.q_query_find:=‘false‘;
end;
(4). LOV查询,选择LOV值后自动查询Block,如选择Invoice
Num后自动查询:
a.
创建一个Paramter参数<invoice_id>
b. 创建LOV, 并将返回的值付给:Parameter.Invoice_id
SELECT
invoice_id, invoice_number, description FROM bxj_invoices_all
c. 添加Block层级的Trigger<query_find>
app_find.query_find(‘q_invoices‘);
d. 添加Block层级Trigger<pre_query>
IF
:parameter.g_query_find = ‘true‘ THEN
:invoice_header.invoice_id
= :paramter.invoice_id
:paramter.g_query_find
= ‘true‘
END
IF;
11. Form 建立表时常用栏位
(1). 1个表关键字ID,通常与表名一致,并用Sequence为每条记录获得一个唯一值。
(2). 1个组织ID,根据不同的开发选用不同层次的组织ID,这里的销售订单跑在OU层,所以基表命名为_ALL表,并创建一个过滤组织的View作为“基表”。
(3). 5个Who字段,记录由谁在何时创建,并由谁在何时修改,登录ID是多少。
(4). 4个请求字段,处理的请求ID、请求日期、并发程序ID及其应用ID,如果有的话。
(5). 16个描述性弹性域字段,1个上下文字段,15个弹性域字段。
Thanks and Regards
Form_Form Builder的基本语法(概念),布布扣,bubuko.com