Form_通过Custom.pll新增菜单项(案例)
2014-05-31 Created By BaoXinjian
一、摘要
custom.pll 一个每次form启动时都会调用的pll包,因此有些对标准form的客制化可以在custom.pll中实现
个人感觉和form个性化有类似性,区别是form个性化通过设定去设定,而custom.pll通过代码中实现
而且对custom.pll的修改会影响所有的form调用,所以对代码的可控性和效率要求比较高
而Form的个性化,影响的定义有function level 和 form level,所以只对所设定的function或form产生印象,修改存在问题,不会影响所有的form
其他引用了网络定义
- custom.pll是EBS标准的一个library,当系统启动的时候会加载这个library。
- 很多时候,我们会需要写一些pll文件,比如控制Form上某些item的属性,如果是控制标准Form的某些属性,那么我们就可以通过Library来实现,而不用去动标准的Form(一般我们建议不去修改标准的Form)。再比如在工具条上增加一些菜单,等等。
- 当然,所有这些我们都可以通过直接修改custom.pll来实现,但是,我们不建议这么做,我们可以copy custom.pll重命名为:xx_cn_custom.pll (名字自己取),然后把xx_cn_custom.pll加载到custom.pll下 (在custom.pll的event里,加上这段代码即可:xx_cn_custom.event;),这样,系统启动的时候就会通过custom.pll也把xx_cn_custom.pll启动起来,那么,以后有什么客户化的library都可以在xx_cn_custom.pll里面修改了。比如,我客户化了一个叫xx_wip_custom.pll的library,那么我只要在xx_cn_custom.pll的event的procedure里加上:xx_wip_custom.event;就可以了。
- 这样做的好处就是降低了风险,因为custom.pll是标准的library,不管是调试还是其它的,都会影响到全局,当我们加载xx_cn_custom.pll之后,就会避免这些问题。
二、案例
需求:用户要求在EBS 日记账功能菜单项中添加一个按钮
1. 下载Custom.pll文件至本地
2. 新增bxjcustom.pll文件,并添加procedure<bxj_pll_event_event>
3. 将bxj_custom.pll添加至custom.pll
4. 编译custom.pll至server上
三、案列测试
Test1. 打开Form后触发Custom.pll
Test2.新增Special
Test3. 点击Button,触发Button下的tigger
四、其他
1. 编译错误,先编译sub pll,后编译parater pll
2. 其他修改pll的例子,去form中的值,调用fnd_request打印报表
1 PROCEDURE event (event_name VARCHAR2) IS
2 form_name VARCHAR2 (30) := NAME_IN ('system.current_form');
3 block_name VARCHAR2 (30) := NAME_IN ('system.cursor_block');
4 BEGIN
5 IF event_name = 'CALL_CUSTOM_EVENT' THEN
6 IF (form_name = 'APXINWKB' AND block_name = 'INV_SUM_FOLDER') THEN
7 DECLARE
8 l_group_name VARCHAR2 (60) := block_name || '_MULTI';
9 l_rec_group_id recordgroup;
10 l_curr_rec_num NUMBER;
11 l_num_records NUMBER;
12 l_invoice_id_str VARCHAR2 (2000);
13 l_curr_record NUMBER;
14 l_success BOOLEAN;
15 l_request_number NUMBER;
16 e_check_error_exception exception;
17 BEGIN
18 -- 获取选中的invoice
19 l_rec_group_id := FIND_GROUP (block_name || '_MULTI');
20 IF NOT ID_NULL (l_rec_group_id) THEN
21 l_num_records := GET_GROUP_ROW_COUNT (FIND_GROUP (l_group_name));
22 IF l_num_records > 0 THEN
23 l_invoice_id_str := NULL;
24 -- 对选中的记录进行循环
25 FOR i IN 1 .. l_num_records LOOP
26 l_curr_rec_num := GET_GROUP_NUMBER_CELL (l_group_name || '.REC_NUM', i);
27 GO_RECORD (l_curr_rec_num);
28 -- 组合invoice id作为请求参数
29 IF l_invoice_id_str IS NULL THEN
30 l_invoice_id_str := NAME_IN (block_name || '.INVOICE_ID');
31 ELSE
32 l_invoice_id_str := l_invoice_id_str || ',' || NAME_IN (block_name || '.INVOICE_ID');
33 END IF;
34 END LOOP;
35 IF l_invoice_id_str IS NOT NULL THEN
36 l_invoice_id_str := '(' || l_invoice_id_str || ')';
37 -- 加载模板
38 l_success := fnd_request.add_layout ('XXBG', 'XXBGREQP','zh','CN','PDF');
39 IF l_success THEN
40 -- 设置请求的业务实体
41 fnd_request.set_org_id (l_org_id);
42 -- 提交打印付款申请请求
43 l_request_number := fnd_request.submit_request ('XXBG', 'XXBGREQP', '','',FALSE,l_invoice_id_str,CHR (0),'','');
44 IF l_request_number = 0 THEN
45 fnd_message.retrieve;
46 fnd_message.error;
47 ELSE
48 IF app_form.quietcommit THEN
49 fnd_message.set_name ('SQLGL','GL_REQUEST_SUBMITTED');
50 fnd_message.set_TOKEN ('REQUEST_ID',TO_CHAR (l_request_number),FALSE);
51 fnd_message.show;
52 END IF;
53 -- 弹出请求窗口
54 fnd_function.execute (function_name => 'FND_FNDRSRUN',open_flag => 'Y',session_flag => 'Y',other_params => 'DODT_REQ_ID="'|| TO_CHAR (l_request_number)|| '"');
55 END IF;
56 END IF;
57 END IF;
58 GO_RECORD (l_curr_record);
59 ELSE
60 fnd_message.set_name ('', 'Please select one record');
61 RAISE e_check_error_exception;
62 END IF;
63 END IF;
64 EXCEPTION WHEN e_check_error_exception THEN
65 fnd_message.error;
66 RAISE form_trigger_failure;
67 END;
68 END IF;
69 END IF;
70 END event;
Thanks and Regards
ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建