zoukankan      html  css  js  c++  java
  • Form开发中组件控制的几个常用方法

    转自:http://oracleseeker.com/2009/09/01/graphical_component_control_in_oracle_ebs_form/

    在Oracle EBS 的Form二次开发中,经常需要灵活的来控制某些组件是否可用、是否可见;有时希望某些字段的值自动生成或者手动输入;有时又希望能够根据不同的职责、不同的用户等来设置不同的行为控制。常见的需求:

    1. 只有某些角色的人才能看到销售订单中“登记订单”这个按钮
    2. 只有某些角色的人才可以切换到某个标签页
    3. 实现订单号码根据需要自动生成编号或者手工录入
    4. 快速编码的值即可以录入所有应用下的,也可以只能录入某个应用,更可以只能录入某个应用下某个类型下的值
    5. 在某些情况下Form需要只能够查询
    6. ……

    在Oracle EBS环境中有很多方法来实现这些功能,但是使用预置文件(Profile)子功能(Subfunction)功能参数(Function Parameter)是最常用最方便有效的3种方式,

    一,子功能(Subfunction)

    子功能是实际上是一个特殊的功能,利用子功能的方式其实就是使用了Oracle EBS的功能权限控制来实现安全性的控制,其实质就是某个用户能够执行一个被授权的功能,一般情况下会使用子功能来控制某些按钮是否显示,进而实现了用户是否可以操作Form中的某些功能,所以Oracle EBS的开发人员经常使用子功能来通过显示/隐藏或者有效/失效界面上的组件来实现功能的有效或无效,如上面常见需求中的1,2使用子功能最适合。

    如下我希望只有授权的用户才能看到Book Order这个按钮,看不到的自然也无法进行这个操作了

    book_order_example

    实现步骤:

    [postads468x60]

    1,为Book Order按钮组件定义一个子功能

    define_subfunction 

    2,Form代码中根据功能来控制组件

    在PRE-FORM触发器中,来判断用户是否有权限看到这个操作,如果有就显示否则不显示

    1
    2
    3
    4
    5
    
    IF (fnd_function.test('XHUORDER_BOOK_ORDER')) THEN
      app_item_property.set_property('headers.book_order', DISPLAYED, PROPERTY_ON);
    ELSE
      app_item_property.set_property('headers.book_order', DISPLAYED, PROPERTY_OFF);
    END IF;

    3,将子功能授权给有权的用户

    如果某个用户需要显示这个按钮,只要将子功能XHUORDER_BOOK_ORDER添加用户拥有的职责对应的菜单里面,把子功能XHUORDER_BOOK_ORDER添加为一个菜单项,但是Prompt留空就可以

    menu_subfunction_define

    定义的时候需要将Prompt栏位留空,这样在菜单显示的时候就看不到这个菜单项,实际关键的是最后的Grant列,默认都是勾上的,代表了授权给相关的职责用户

    二、功能参数

    功能参数的方法实际上和子功能是一致的控制方法,都是使用功能权限来进行控制, 它通过针对同一个Form定义多个Function,不同Function参数的值不同来实现控制,Oracle EBS中最典型的应用就是Form中的仅仅查询功能和快速编码(Lookup Code)定义界面

    在快速编码定义界面中,可以通过APPL_SHORT_NAME参数来控制只能查询特点应用的快速编码;LOOKUP_TYPE参数来控制特点类型的快速编码。实现了参数值不同界面的行为也不同

    lookup_type_demand_class 

    实现步骤:

    1,在Form设计器中定义参数

    像快速编码定义的Form中,定义了如下图的参数

    form_parameter

    2,在Form程序代码中引用参数的值来控制

    根据业务需求和功能设计的要求,通过参数的值来编写代码,如

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
      if (:parameter.lookup_type is not null) then
        set_block_property('FND_LOOKUP_TYPES', INSERT_ALLOWED,
            PROPERTY_FALSE);
      end if;
     
      if (:parameter.appl_short_name is not null) then
        :parameter.appl_short_name := upper(:parameter.appl_short_name);
        :parameter.appl_id := 
            fnd_utilities.get_application_id(:parameter.appl_short_name);
        :parameter.application := 
            fnd_utilities.get_application_name(:parameter.appl_id);
     
        app_item_property.set_property('FND_LOOKUP_TYPES.APPLICATION_NAME',
            INSERT_ALLOWED, PROPERTY_OFF);
      end if;

    parameter的参数值在Form运行的时候会从Function定义中传入

    3,定义Function时设置具体的参数值

    如上面显示的DEMAND_CLASS的快速编码,参数为:VIEW_APPLICATION=”AU” LOOKUP_TYPE=”DEMAND_CLASS”

    lookup_type_demand_class_function

    为Function定义了参数,在运行的时候就会到form的parameter中去查找同名的参数,并将等号(=)后的值传给参数,多个参数间用空格隔开。因此可以采用功能参数值的不同定义不同的功能,并赋给对应用户的职责就实现了不同的控制

    [postads300x250]

    三、预置文件(Profile)

    预置文件的控制是这些方法中最灵活最强大的一种方法,通过预置文件可以实现到站点层、应用层、职责层和用户层的控制,预置文件相当于Oracle EBS系统中根据的一个全局变量,这个全局变量在不同的上下文可以设置为不同的值,因此在Form的开发中可以使用它来实现业务逻辑的控制,上面列出的常见需求都可以使用预置文件的方法来实现,只是预置文件太过灵活,所以有的需求则显得大材小用,因此只要需要较灵活层次控制并符合站点层、应用层、职责层和用户层这样层次控制的时候才采用。

    实现步骤:

    1,定义预置文件

    在Application Developer职责下定义预置文件,就像在Oracle EBS系统中定义一个变量的感觉,SQL Validation区域就是预置文件可以定义的值列表

    define_profel 

    2,Form中根据预置文件值进行控制

    1
    2
    3
    4
    5
    6
    7
    
      l_order_num_mode := fnd_profile.value('DEMO_ORDER_NUMBER_MODE');
     
      if :parameter.order_number_mode = 'AUTOMATIC' then
        app_item_property.set_property('HEADERS.ORDER_NUMBER', REQUIRED,  PROPERTY_FALSE);
        app_item_property.set_property('HEADERS.ORDER_NUMBER', ENTERABLE, PROPERTY_FALSE);
        app_item_property.set_property('HEADERS.ORDER_NUMBER', NAVIGABLE, PROPERTY_FALSE);
      end if;

    上面的代码代表了如果预置文件DEMO_ORDER_NUMBER_MODE的值是AUTOMATIC的话,进行ORDER_NUMBER的控制

    3,设置预置文件的值

    Form程序中根据预置文件值的不同进行了不同的控制,而预置文件的值则是根据需要进行设置

    profile_set_find

    profile_set

    通过以上预置文件值设置的不同,Form控制的项就会根据设置的不同表现出不同的行为。

    上面描述的3个方法是Oracle EBS Form二次开发中最常用的方法,根据功能需求的不同选择最适合的方法。

    ############################## 通往精神的路很多,物质只是其中一种 ##############################
    http://www.onejava.com/article/oracle/wip/wiptop.htm
    https://docs.oracle.com/cd/A60725_05/html/comnls/us/index.htm
    http://www.oracle.com/technetwork/cn/developer-tools/apex/getting-started-094884-zhs.html
    https://docs.oracle.com/cd/B34956_01/current/html/docset.html
  • 相关阅读:
    [工作代码]dom4j解析实例
    dom4j解析xml报错:Nested exception: org.xml.sax.SAXParseException: White space is required between the processing instruction target and data.
    小米蓝牙耳机使用说明书
    猎豹浏览器(chrome内核)屏蔽视频广告
    [转载]python的常用代码模板
    [转载]存储过程
    存储过程格式及实例
    springboot(十八):解决跨域问题
    springboot(十八):CORS方式实现跨域
    springboot(十七):过滤器(Filter)和拦截器(Interceptor)
  • 原文地址:https://www.cnblogs.com/pompeii2008/p/5309672.html
Copyright © 2011-2022 走看看