zoukankan      html  css  js  c++  java
  • 使用Custom.pll修改标准Form的LOV

    在开发过程中,经常碰到需要修改标准Form中LOV的需求,一般来说都是做一些条件限制。在不修改标准Form的fmb文件的前提下,可以通过Custom.pll来实现。

    一、Custom.pll的工作机制

    在EBS中大部分Form都是在TEMPLATE.fmb的基础上创建的,另外还有一些HR模块的Form是在HRTEMPLT.fmb的基础上创建的,这些模板Form在form级的触发器中会去调用custom.pll

    这些Form级的触发器为:

    1. ZOOM
    2. WHEN-NEW-FORM-INSTANCE
    3. WHEN-NEW-BLOCK-INSTANCE
    4. WHEN-NEW-RECORD-INSTANCE
    5. WHEN-NEW-ITEM-INSTANCE
    6. WHEN-VALIDATE-RECORD

    在HRMS模块,还有以下触发器也调用了custom.pll

    1. PRE-DELETE
    2. POST-DELETE
    3. PRE-UPDATE
    4. POST-UPDATE
    5. PRE-INSERT
    6. POST-INSERT
    7. POST-FORMS-COMMIT
    8. WHEN-CREATE-RECORD
    9. KEY-DELREC

    Template_Trigger

    在这些触发器中,会调用APP_STANDARD.EVENT过程中的call_all_libraries(event_name),call_all_libraries过程会调用custom.event(event_name)。

    二、使用custom.pll修改标准form的LOV

    从服务器下载custom.pll文件,使用form builder打开。点击PL/SQL Libraries,点击新建按钮,另存为pll文件,例如XXPOXPOEPO.pll,新建Package XXPOXPOEPO

    XXPOXPOEPO

    新建procedure set_po_vendor_lov:

    代码为:

    1. PROCEDURE set_po_vendor_lov IS  
    2.   l_query_string      VARCHAR2(2000);  
    3.   l_customer_group_id recordgroup;  
    4.   l_temp_id           NUMBER;  
    5.   l_customer_lov      lov;  
    6. BEGIN  
    7.   IF name_in('system.cursor_item') = 'PO_HEADERS.VENDOR_NAME' THEN  
    8.     l_query_string := 'SELECT DISTINCT pov.vendor_name, pov.segment1 FROM  
    9.                       po_vendors pov WHERE pov.enabled_flag = "Y"';  
    10.     IF not id_null(find_group('CUX_SUPPLIER_NAME')) THEN  
    11.       delete_group(‘CUX_SUPPLIER_NAME’);  
    12.     END IF;  
    13.     l_customer_group_id := create_group_from_query('CUX_SUPPLIER_NAME',  
    14.                                                    l_query_string);  
    15.     set_lov_property('SUPPLIER_NAME', GROUP_NAME, 'CUX_SUPPLIER_NAME');  
    16.   END IF;  
    17. END set_po_vendor_lov;  

    首先,使用create_group_from_query来创建一个lov record group,

    然后, 将我们需要修改的LOV的group置换为我们创建的group。由于这个过程是在when-new-item-instance中调用的,为了防止其他非使用该Lov的Item也执行改过程,所以在程序的开始进行了name_in(‘system.cursor_item’) = ‘PO_HEADERS.VENDOR_NAME’条件的判断,

    另外,由于record group创建一次在第二次如果再次创建就会报错,所以使用了

            if not id_null(find_group(‘CUX_SUPPLIER_NAME’)) then
              delete_group(‘CUX_SUPPLIER_NAME’);

            end if;

    删除group再创建(delete_group只能删除由程序创建的record group)。之所以用这种逻辑而不在创建的时候判断是否已经存在该group是因为这个query_string是动态的,所以在每次都创建才能保证每次LOV的结果是正确的。

    接下来,就要把我们的pll添加到custom里面去,点击custom的Attached Libraries,点击添加按钮,选择XXPOXPOEPO。双击打开custom.pll中的custom package,

    将procedure event过程修改为如下:

    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.   item_name  VARCHAR2(30) := name_in('system.cursor_item');  
    5. BEGIN  
    6.   IF event_name = 'WHEN-NEW-ITEM-INSTANCE' THEN  
    7.     IF form_name = 'POXPOEPO' AND block_name = 'PO_HEADERS' AND  
    8.        item_name = 'PO_HEADERS.VENDOR_NAME' THEN  
    9.       XXPOXPOEPO.set_po_vendor_lov;  
    10.     END IF;  
    11.   END IF;  
    12. END event;  

    在开始的时候,我是在custom过程中去判断当前Item是否等于VENDOR_NAME(红颜色的代码),结果发现添加了改条件之后,某一些Form会出现no data found的错误(例如应用开发员的功能form),这是因为该Form在打开的时候system.cursor_item为空,所以要把item的判断写进了自己客户化的pll中。

    最后,把custom.pll和xxpoxpoepo.pll上传到服务器$AU_TOP/resource目录下,使用下面的命令编译pll,退出EBS再重新登陆,LOV就生效了

  • 相关阅读:
    OCP-1Z0-053-200题-178题-187
    OCP-1Z0-053-200题-179题-232
    OCP-1Z0-053-200题-181题-407
    OCP-1Z0-053-200题-182题-408
    OCP-1Z0-053-V13.02-408题
    OCP-1Z0-053-200题-183题-232
    OCP-1Z0-053-200题-184题-270
    OCP-1Z0-053-200题-185题-44
    OCP-1Z0-053-200题-186题-61
    OCP-1Z0-053-200题-187题-610
  • 原文地址:https://www.cnblogs.com/liuweicong39/p/2771165.html
Copyright © 2011-2022 走看看