现在的位置: 首页 > 综合 > 正文

EBS FORM開發總結(2)

2013年07月31日 ⁄ 综合 ⁄ 共 5563字 ⁄ 字号 评论关闭
  • 必要的环境设置

NLS_LANG
该环境变量在操作系统中设置,建议其值为:
AMERICAN_AMERICA.ZHS16CGB231280
FORMS45_PATH
该环境变量在操作系统中设置,用于指定引用对象的存放路径,请确认其值包含:
<$AU_TOP>/forms/US
<$AU_TOP>/resource

 

  •  

    日历

这是在TEMPLATE.fmb里面内置的对象,可以看到,form里包含calendar窗口、calendar画布、calendar数据块以及一些触发器等。

在template模板中创建一个数据块emp,其中hiredate为日期类型,我们选中hiredate项,设置其lov属性,选择“值列表”属性为ENABLE-LIST-LAMP,设置“从列表中验证”为“否”。

接下来创建hiredate项级触发器key-listval,写入代码:calendar.show;--此时默认为当天日期;注意:你可以给函数设置参数,该参数为日期的默认值,eg:calendar.show(to_date('','YYYY-MM-DD'));ok,运行测试,弹出值列表时就可以看到日历了。

  • EBS中客户化表结构的设计原则:

             1)必须包括一个主键,并建立相应的序列;
             2)建立5个WHO字段,也就是
             CREATED_BY                 NUMBER
             CREATION_DATE                 DATE
             LAST_UPDATED_BY                 NUMBER
             LAST_UPDATE_DATE         DATE
             LAST_UPDATE_LOGIN         NUMBER
             在FORM中使用属性类:CREATION_OR_LAST_UPDATE_DATE,WHO字段并不会自动地被赋值,必须自己在FORM中编写代码来完成这项工作。
             EBS中提供了一个函数FND_STANDARD.SET_WHO,大家只要在FORM的BLOCK级触发器PRE-INSERT/PRE-UPDATE中进行调用即可。

             3)对于业务数据表,要考虑建立15个弹性域字段;
             4)如果对于需要并发请求处理过的数据表,则需要增加跟踪请求的4个字段
                     REQUEST_ID         NUMBER
                     PROGRAM_APPLICATION_ID         NUMBER
                     PROGRAM_ID         NUMBER
                     PROGRAM_UPDATE_DATE         DATE
             5)要考虑这个表是否区分OU和库存组织;

  • 在FORM开发中不管是FORM级还是BLOCK级或者ITEM级的TRIGGER,不要把代码直接写到TRIGGER中,要使用PROGRAM UNIT来创建相应的TRIGGER,举例如下:

    FORM级和BLOCK级可以按照下面格式在PROGRAM UNIT中创建PACKAGE:
    PACKAGE BODY FORM_NAME/BLOCK_NAME IS
             PROCEDURE EVENT_HANDLER( EVENT   IN VARCHAR2)
             IS
             BEGIN
               IF EVENT = 'WHEN-NEW-FORM-INSTANCE' THEN
                  XXXXXXXX;
               ELSIF EVENT = 'PRE-FORM' THEN
                  XXXXXXXX;
               ELSE
                 APP_EXCEPTION.INVALID_ARGUMENT('EVENT_HANDLER', 'EVENT', EVENT);
               END IF;
             END EVENT_HANDLER;
    END FORM_NAME/BLOCK_NAME;
    ITEM级的可以按照下面的格式:
    PACKAGE BODY BLOCK_NAME IS
             PROCEDURE ITEM_NAME( EVENT   IN VARCHAR2)
             IS
             BEGIN
               IF EVENT = 'WHEN-NEW-ITEM-INSTANCE' THEN
                 XXXXXXXX;
               ELSE
                 APP_EXCEPTION.INVALID_ARGUMENT('ITEM_NAME', 'EVENT', EVENT);
               END IF;
             END ITEM_NAME;
    END BLOCK_NAME;

  • set_item_property, set_item_instance_property与display_item

set_item_property 如果数据块只有一行,用这个
set_item_instance_property 设置多行数据块某一行的属性

1、set_item_instance_property,display_item 

  两个内置子程序都可以用来设置项中某行的 相关属性(同项中的其余行属性会保持原来的属性不变),如颜色。

      only changes the instance of that item that belongs to the block's current record. 

      If you want to change all instances of an item in a multi-record block, use SET_ITEM_PROPERTY .

2、二者区别:

  adisplay_item是较早版本中出现的,    set_item_instance_property是较晚版本中才 有的(6i以后的应都有)。

  bdisplay_item有一个特性,就是当通过其改变 后的属性,会延伸到与其同步的项上.即与 其同步的项也跟着变了.

       set_item_instance_property已取消了此特性.

            DISPLAY_ITEM has the side-effect of also  changing the appearance of any items that mirror
the changed instance.

             SET_ITEM_INSTANCE_PROPERTY does   not change mirror items.

             (哦,原来mirror items 有同步项的意思)

   c、如硬是还要找个区别的话,就是调用时所需  参数有所不同,一个需要提供记录号,一个不用。

   其实根据这点可以猜测到 set_item_instance_propertydisplay_item可能可 以使用的地方要多要广!

          至于到底哪些地方set_item_instance_property用而display_item不可用。这个留给自己或大家有时间的时候再去研究下

3、另提一下set_item_property这个内置子程序。

  通过这个内置子程序设置的是整个项(即某项的 所有记录)的属性。

      另发现当利用此内置子程序改变颜色时,颜色值 应是r()g(绿)b()三原色的组合,而不是在属性面版里直接选择颜色,

      然后返回到颜色属性那栏里的值(即使看起来也 是rgb组合)。否则将发现设置不成功(但不报错)

     如:红色为:R255G0B0 (而不是RED)   酸橙色 为:R153G204B0

    具体要找某个颜色的rgb组合代码可借助于WORD 中的颜色自定义功能得出。

  • .向系统注册报表的时候,参数是无法根据顺序自动对应,需要我们指定Token,即报表的参数名称;而对于Procudure是可以根据位置自动对应的,即使定义的参数名称和Procedure参数名称不一样。这个可以这样理解,Procudure的参数是明确的,参数有多少个、顺序如何是由Procedure明确定义的;
    而对于报表来说 ,参数非常多,如果传了某个参数,就用该参数,否则Report用本身的默认值,没有顺序和个数的强制要求;
    另外procedure有且只有两个out put(return_code说明:0/success,1/warning ,2/error)参数,并且这两个参数一定在前面,其他的in参数可以自动根据顺序对应,若in参数为varchar型定义时候不能限制其长度。
  • 定义Table类型的值集的时候,有三个字段其中value和Id都为值,Id的优先级高于Value,但一般我们只定义Value 关联子集定义的语法为where field_name = $FLEX$. value_set_name;
  • 报表里面好像没有环境变量,需要建一个用户参数 P_CONC_REQUEST_ID/Number/20,
    在Before Report触发器里加 SRW.USER_EXIT('FND SRWINIT');
    在After Report触发器里加 SRW.USER_EXIT('FND SRWEXIT');

  • 当要用堆叠画布时,1.可以直接画出 2.直接建堆叠画布,但要在菜单VIEW->STACKED VIEW 设置要显示的堆叠画布.
  • 当堆叠画布颜色和EBS不配时,要设置画布的SUBCLASS INFORMATIONW值为canvas_stacked.
  • 设置按键的首字母为快捷键:在按键名前加&.
  • 挂FORM

1. APPLICATION DEVELOPER -->FORM

2.APPLICATION  DEVELOPER--->FUNCTION

3.system administrator --->security---->responsbility--->define   输入用户名 找到MENU

4.APPLICATION DEVELOPER--->MENU 一层层找,然后把FORM挂在自己想要的菜单下.

  • 建立光标指示列:建一个TEXT ITEM,继承属性为CURRENT_RECORD_INDICATOR.
  • 新增數據前使某一數據塊為插入狀態:app_find.new('block_name');
  • 在报表后台取得报表的request_id语句为:fnd_global.conc_request_id;
  • 在form中建立主从数据关系时,Relation应当创建在master block中,不需要在Detail block中也建,这样会导致死循环,使detail block显示不出来.
  •  *query模式下window不能被关闭;

       *关闭window后并不会自动执行commit操作,除非开发人员编码提交;

       *关闭parent window时系统会提醒用户是否保存detail window变化;

       *关闭window后,焦点会离开该窗体返回previous block所在windows

       *关闭master window会自动关闭其所有detail windows和其相关的find windows

    *关闭first window会退出form

  • 请求组

在EBS各个职责下面会有一个reports菜单,分别包含不同数目的报表,这个是通过请求组实现的.

首先要在Security->Responsibility->Request中定义一个请求组,把需要包含的报表加进来.

然后定义Function,调用系统标准form(run reports),要在form选项的parameters中输入值,向form中传入参数值,其中REQUEST_GROUP_CODE表求调用哪一个请求组,这一点很重要.

例如:REQUEST_GROUP_CODE="ACCOUNTING" REQUEST_GROUP_APPL_SHORT_NAME="AR" TITLE="AR:AR_SRS_TITLE_ACC_RPTS"

最后定义menu,调用刚刚定义好的funciton.

在这里学习了一个知识点,在form中获取变量的值可以用name_in.

如 if name_in('parameter.query_only') = 'YES' 

     NAME_IN('find.DOCUMENT_NO_S')

这种用法和直接使用变量没什么区别,但当变量名是由字符组合而成时,这时就显现出name_in的优势了,如

name_in('user'||'_name'),这样就可以取得变量user_name的值了

 

FORM中copy也是这种用法,把第一个参数值赋给第二个参数(变量),如:

DECLARE

          global_var_name VARCHAR2(80);

 BEGIN

       IF :Selection.Choice = 5 THEN

              global_var_name := 'Storage_1';

       ELSE

               global_var_name := 'Storage_2';

       END IF; 

       COPY( 'Yes', 'GLOBAL.'||global_var_name );

 END;

 

  • FORM中trigger调用trigger:

Execute_trigger(‘CLOSE_WINDOW’);

抱歉!评论已关闭.