在标准Form中提交客户化请求,通过使用Form的个性化,完全可以实现这个需求。下面这个例子是在发票界面上打印付款申请,使用工具栏上活动--打印付款申请提交请求。
首先创建菜单按钮,这个就不赘述了,触发器事件选择WHEN-NEW-FORM-INSTANCE
其次,响应打印按钮 ,这里使用执行过程这个内置项来调用请求,调用的过程代码如下
- PROCEDURE submit_pay_request( p_org_id IN VARCHAR2,
- p_invoice_id_list IN VARCHAR2)
- IS
- l_success BOOLEAN;
- l_request_number NUMBER;
- l_errbuf VARCHAR2(2000);
- e_exception EXCEPTION;
- BEGIN
- l_success := fnd_request.add_layout('XXBG','XXBGREQP','zh','CN','PDF');
- IF p_invoice_id_list <> '()' THEN
- IF l_success THEN
- fnd_request.set_org_id(to_number(p_org_id));
- -- 提交打印付款申请请求
- l_request_number :=
- fnd_request.submit_request(
- 'XXBG',
- 'XXBGREQP',
- '',
- '',
- FALSE,
- p_invoice_id_list,
- CHR(0), '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '',
- '', '', '', '', '', '', '', '', '', '');
- IF l_request_number = 0 THEN
- l_errbuf := 'Submit Request Failure';
- RAISE e_exception;
- ELSE
- COMMIT;
- END IF;
- ELSE
- l_errbuf := 'Add Template Failure';
- RAISE e_exception;
- END IF;
- ELSE
- l_errbuf := 'Please Choice an invoice';
- RAISE e_exception;
- END IF;
- EXCEPTION
- WHEN e_exception THEN
- raise_application_error(-20002, l_errbuf);
- WHEN OTHERS THEN
- raise_application_error(-20001, SQLERRM);
- END;
在个性化中,添加响应按钮事件,事件触发器就是第一步中添加的菜单项了,本例中为SPECIAL45。在活动中,选择类型为内置,内置类型--执行过程,变元为
='XXBG_AP_UTL.submit_pay_request('''||:INV_SUM_FOLDER.ORG_ID||''','||'''('||:INV_SUM_FOLDER.INVOICE_ID||')'')'
这里需要特别解释一下变元,在个性化中,其实认为变元是一串字符串。这里变元可以分为两种,
第一种,不带“=”的字符串,这种方法在个性化申请后,便已经绑定了执行的语句,任何时候执行的语句都是固定的,例如变元中填写XXBG_AP_UTL.insert_log(1, 'AP_INVOICE') (注意,外层无需加''),那么在个性化申请后,我们点击菜单项的按钮永远都是执行过程XXBG_AP_UTL.insert_log(1, 'AP_INVOICE'),这种方法适合简单的执行过程。
第二种,带“=”的变元,当字符串使用了“=“,那么就代表这个字符串还包含了一些动态的参数,Form个性化申请后不绑定该字符串而是在执行时动态解析。本例中由于使用到了发票界面的invoice_id和org_id,所以使用第二种方式。
保存,申请个性化,再看效果
使用执行过程的个性化来实现上述需求,有一个小缺陷,就是无法精确的定位到某一个特定请求,因为reques_number无法通过过程传回,我尝试讲procedure增加一个out参数将改参数传回给form上的global变量,但是无论用什么方式都成功不了,不知道哪位高手有研究过这个问题,麻烦告知一下。
另外一个我觉得不足的是关于过程的消息处理,使用这个个性化在消息处理上捉襟见肘,只有几个可用的方法。所以,我使用了另外一个Form个性化方法来解决这两个问题,也就是下一篇要介绍的--”自定义程序库“