Form个性化--调用Procedure

在标准Form中提交客户化请求,通过使用Form的个性化,完全可以实现这个需求。下面这个例子是在发票界面上打印付款申请,使用工具栏上活动--打印付款申请提交请求。
首先创建菜单按钮,这个就不赘述了,触发器事件选择WHEN-NEW-FORM-INSTANCE


其次,响应打印按钮 ,这里使用执行过程这个内置项来调用请求,调用的过程代码如下

  1. PROCEDURE submit_pay_request( p_org_id          IN VARCHAR2,  
  2.   
  3.                               p_invoice_id_list IN VARCHAR2)  
  4.   
  5. IS  
  6.   
  7.   l_success              BOOLEAN;  
  8.   
  9.   l_request_number  NUMBER;  
  10.   
  11.   l_errbuf                 VARCHAR2(2000);  
  12.   
  13.   e_exception           EXCEPTION;  
  14.   
  15. BEGIN  
  16.   
  17.   l_success := fnd_request.add_layout('XXBG','XXBGREQP','zh','CN','PDF');  
  18.   
  19.     
  20.   
  21.   IF p_invoice_id_list <> '()' THEN  
  22.   
  23.     IF l_success THEN  
  24.   
  25.       fnd_request.set_org_id(to_number(p_org_id));  
  26.   
  27.       -- 提交打印付款申请请求  
  28.   
  29.      l_request_number :=   
  30.   
  31.                 fnd_request.submit_request(   
  32.   
  33.                        'XXBG',  
  34.   
  35.                        'XXBGREQP',  
  36.   
  37.                        '',  
  38.   
  39.                        '',  
  40.   
  41.                        FALSE,  
  42.   
  43.                        p_invoice_id_list,  
  44.   
  45.                        CHR(0), '''''''''''''''',  
  46.   
  47.                        '''''''''''''''''''',  
  48.   
  49.                        '''''''''''''''''''',  
  50.   
  51.                        '''''''''''''''''''',  
  52.   
  53.                        '''''''''''''''''''',  
  54.   
  55.                        '''''''''''''''''''',  
  56.   
  57.                        '''''''''''''''''''',  
  58.   
  59.                        '''''''''''''''''''',  
  60.   
  61.                        '''''''''''''''''''',  
  62.   
  63.                        '''''''''''''''''''');  
  64.   
  65.       IF l_request_number = 0 THEN  
  66.   
  67.         l_errbuf := 'Submit Request Failure';  
  68.   
  69.         RAISE e_exception;  
  70.   
  71.       ELSE  
  72.   
  73.         COMMIT;  
  74.   
  75.       END IF;  
  76.   
  77.         
  78.   
  79.     ELSE  
  80.   
  81.       l_errbuf := 'Add Template Failure';  
  82.   
  83.       RAISE e_exception;  
  84.   
  85.     END IF;  
  86.   
  87.   ELSE  
  88.   
  89.     l_errbuf := 'Please Choice an invoice';  
  90.   
  91.     RAISE e_exception;  
  92.   
  93.   END IF;  
  94.   
  95. EXCEPTION  
  96.   
  97.   WHEN e_exception THEN  
  98.   
  99.     raise_application_error(-20002, l_errbuf);  
  100.   
  101.   WHEN OTHERS THEN  
  102.   
  103.     raise_application_error(-20001, SQLERRM);  
  104.   
  105. 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,所以使用第二种方式。



最后,再加一个功能,弹出请求窗口。



保存,申请个性化,再看效果

FORM_PERSONALIZE_PROCEDURE4.png



使用执行过程的个性化来实现上述需求,有一个小缺陷,就是无法精确的定位到某一个特定请求,因为reques_number无法通过过程传回,我尝试讲procedure增加一个out参数将改参数传回给form上的global变量,但是无论用什么方式都成功不了,不知道哪位高手有研究过这个问题,麻烦告知一下。
另外一个我觉得不足的是关于过程的消息处理,使用这个个性化在消息处理上捉襟见肘,只有几个可用的方法。所以,我使用了另外一个Form个性化方法来解决这两个问题,也就是下一篇要介绍的--”自定义程序库“

posted @ 2012-11-15 11:34  刘伟聪  阅读(1920)  评论(2编辑  收藏  举报