(整理)FORM:Oracle EBS客制化Form的菜单栏用法说明

用户最多可以定义45个form-level的trigger,名称必须为SPECIALn,

其中SPECIAL1 to SPECIAL15属于Tools菜单项,放在“工具”主菜单下。

SPECIAL16 to SPECIAL30属于Reports菜单项, 放在在“报表”主菜单下

SPECIAL31 to SPECIAL45属于Actions菜单项,放在在“活动”主菜单下,

其中Reports、Actions的名称可以被修改。

修改代码为:

APP_SPECIAL.INSTANTIATE('SPECIAL_B','库存');

APP_SPECIAL.ENABLE('SPECIAL_B',PROPERTY_On);

其中SPECIAL,SPECIAL_B,SPECIAL_C分别代表的是Tools,Reports,Actions.

SPECIAL菜单项选中后的处理代码在SPECIALn 触发器中定义

右击快捷菜单选中后的处理代码在PRE-POPUP-MENU触发器中定义,用于对文本项目的右击快捷菜单最多可增加10个菜单项。在项目级别或者数据块级别的PRE-POPUP-MENU触发器中调用,设置该触发器的Execution Hierarchy 属性为After。

 

Procedure APP_SPECIAL.INSTANTIATE(

option_name varchar2,  -----传入SPECIAL1到SPECIAL45之间的值,代表的是菜单项的位置

hint varchar2 default null,-------- 菜单项显示文本

icon varchar2 default null,-------- 工具栏要显示的小图标的名字,如果不需要在工具栏上显示小图标,传入NULL即可

initially_enabled boolean default true,--------- 表示菜单项初始化时是否可用,传入TRUE或者FALSE

separator varchar2 default null -----如果想在新增菜单项的上面显示分割线,请传入’LINE’,给SPECIAL1(_CHECKBOX), SPECIAL16, 或者SPECI                                  ---AL31传入’LINE’将会被忽略

);

说明:用于创建程序特定的菜单。在表达级别的PRE-FORM触发器的APP_STANDARD.EVENT(’PRE–FORM’) 改行代码后调用。当用户点击创建的菜单项或者其对应的工具栏按钮时,一个与参数option_name 相同的自定义触发器将被触发执行。

参数:

option_name 请传入SPECIAL1到SPECIAL45之间的值,代表的是菜单项的位置,SPECIAL1代表的是第一个特殊菜单(EBS中目前是工具菜单)最上面的菜单项,SPECIAL15代表的是第一个特殊菜单(EBS中目前是工具菜单)最下面的菜单项,SPECIAL16代表的是第二个特殊菜单(EBS中目前是报表菜单)最上面的菜单项,SPECIAL30代表的是第二个特殊菜单(EBS中目前是报表菜单)最下面的菜单项,SPECIAL31代表的是第三个特殊菜单(EBS中目前是活动菜单)最上面的菜单项,SPECIAL45代表的是第三个特殊菜单(EBS中目前是活动菜单)最下面的菜单项。当你调用该过程后,新增菜单项对应的特殊菜单项自动可用了。

菜单项边上显示复选框只对第一个特殊菜单可用,请传入SPECIAL1_CHECKBOX到SPECIAL15_CHECKBOX来显示复选框。如果你使用了复选框,你还应该使用APP_SPECIAL.SET_CHECKBOX来设置复选框的初始值。

传入SPECIAL, SPECIAL_B, 或者SPECIAL_C来控制这个特殊菜单是否可用,按顺序分别控制第一、第二和第三个特殊菜单的是否可用。

hint 菜单项显示文本。

icon 工具栏要显示的小图标的名字,如果不需要在工具栏上显示小图标,传入NULL即可,对于菜单栏项目旁边显示复选框的菜单项不可以同时拥有工具栏图标。

initially_enabled 逻辑值,表示菜单项初始化时是否可用,传入TRUE或者FALSE。

Separator 如果想在新增菜单项的上面显示分割线,请传入’LINE’。给SPECIAL1(_CHECKBOX), SPECIAL16, 或者SPECIAL31传入’LINE’将会被忽略。

举例:

APP_SPECIAL.INSTANTIATE(’SPECIAL3’,’&Book Order’, ’POBKORD’,TRUE, ’LINE’);

app_special.instantiate(’SPECIAL12_CHECKBOX’,’Specia&l 12 Check Box with Line’,separator=>’LINE’);

app_special.set_checkbox(’SPECIAL12_CHECKBOX’,’TRUE’);

 

 

Procedure APP_SPECIAL.ENABLE(

option_name varchar2,-------- 菜单项的名称。可能的值包括ABOUT, ATTACHMENTS,MODAL, SAVE, SELECT_ALL, SINGLE,SPECIAL1, ...到 SPECIAL45                      --------(或者SPECIALn_CHECKBOX 菜单项), SPECIAL,SPECIAL_B, SPECIAL_C, SUMMARY/DETAIL,TRANSLATION,或者是菜单项的                     --------全名。如果要禁用所有的特殊菜单则传入SPECIAL。

state number         --------传入PROPERTY_ON代表可用,PROPERTY_OFF代表禁用。

);

描述:

启用或者禁用某些菜单项(包括该菜单项对应的工具栏图标),也可以用于启用禁用特殊菜单项,也就是你新增的菜单项。

如果某个菜单项对于表单中的大部分数据块是可用的,那么在表单的PRE-FORM触发器中启用这个菜单项,对于不能使用这个菜单项的数据块,在它的PRE-FORM触发器中禁用这个菜单项,并将这个触发器的Execution Hierarchy 属性为Override。

 

启用或者禁用菜单项保存来控制File>保存和文件>保存并继续这两个菜单项。当你调用APP_FORM.QUERY_ONLY MODE,保存会自动被禁用。

进入拥有菜单栏的模块窗口前调用APP_SPECIAL.ENABLE(’MODAL’, PROPERTY_OFF),当你离开这个模块窗口时将其属性设置为PROPERTY_ON。设置为PROPERTY_OFF时将会禁用那些不能在模块窗口中使用的菜单。

你可以控制ATTACHMENTS,TRANSLATION, SUMMARY/DETAIL, and SELECT_ALL等菜单项的是否可用。

如果是一次只能显示一条记录的数据块,则传入SINGLE,将会禁用查看>记录>第一个,查看>记录>最后一条菜单项。原文中还提到了会禁用查看>记录>上一条记录和查看>记录>下一条记录,但是ebs中并没有。

传入ABOUT来禁用帮助>历史记录菜单项。

 

举例:

APP_SPECIAL.ENABLE(’SPECIAL3’,PROPERTY_ON);

APP_SPECIAL.ENABLE(’SPECIAL’,PROPERTY_OFF); ---禁用所有的特殊菜单(比如当数据块进入查询模式时)

 

Function APP_SPECIAL.GET_CHECKBOX(

option_name varchar2 ------请传入SPECIAL1_CHECKBOX到SPECIAL15_CHECKBOX中的一个值

)

RETURN varchar2;

描述:用来获取菜单项旁边有复选框的新增特殊菜单项的复选框的值,如果选中状态,则返回TRUE这个字符串,否则返回FALSE这个字符串,如果菜单项不存在则会引发错误。

举例:

if (app_special.get_checkbox(’SPECIAL3_CHECKBOX’)=’TRUE’) then

fnd_message.debug(’Special 3 is True!’);

else

fnd_message.debug(’Special 3 is False!’);

end if;

 

Procedure APP_SPECIAL.SET_CHECKBOX(

option_name varchar2, ------传入SPECIAL1_CHECKBOX到SPECIAL15_CHECKBOX中的一个值

new_value varchar2    ------传入字符串TRUE或者FALSE

);

描述:用于设置新增的带有复选框的特殊菜单项旁边的复选框的初始值,通常在初始化SPECIAL菜单项后调用。

举例:

app_special.instantiate(’SPECIAL3_CHECKBOX’,’Spe&cial 3 Box with Line’,’’,TRUE,’LINE’);

app_special.set_checkbox(’SPECIAL3_CHECKBOX’,’TRUE’);

app_special.instantiate(’SPECIAL4_CHECKBOX’,’Special &4 Box’);

app_special.set_checkbox(’SPECIAL4_CHECKBOX’,’TRUE’);

 

同步更新

菜单栏项和工具栏项是否可用是由标准的表单级别的WHEN-NEW-RECORD-INSTANCE、WHEN-NEW-BLOCK-INSTANCE、WHEN-NEW-ITEM-INSTANCE等触发器控制的。如果你更改了数据块或者项目的属性,菜单项和工具栏项不会立即更着更新除非其相应的触发器触发了。

比如将鼠标放在某个数据块上,然后将数据块的INSERT ALLOWED属性设置为关闭状态,此时需要调用如下代码来同步更新菜单项和工具栏项:

APP_STANDARD.SYNCHRONIZE;

 

 

Procedure APP_POPUP.INSTANTIATE(

option_name varchar2,------ 到POPUP10,最后数字越大代表该新增菜单项越靠底部

txt varchar2,        ------菜单项显示的文本

initially_enabled boolean default true, ----逻辑值,表示菜单项初始化时是否可用,传入TRUE或者FALSE

separator varchar2 default null  ----如果希望在增加的菜单项的上面显示一个分割线则传入’LINE’。注意,右击弹出菜单的新增的文件夹菜单项                                  ---下面的那个菜单项上面会自动加上分隔线。

);

描述:用于对文本项目的右击快捷菜单增加最多10个菜单项。在项目级别或者数据块级别的PRE-POPUP-MENU触发器中调用,设置该触发器的Execution Hierarchy 属性为After。

举例:

APP_POPUP.INSTANTIATE(’POPUP1’,’First Entry’);

APP_POPUP.INSTANTIATE(’POPUP2’,’Second Entry’, TRUE,’LINE’);

APP_POPUP.INSTANTIATE(’POPUP3’,’Third Entry’, FALSE);

 

 

SPECIAL菜单举例

    如果你想要的行为没有自动提供,你可以使用APP_SPECIAL.ENABLE这个过程来动态控制菜单项。这么做首先要确定默认菜单控制器控制菜单项是否有问题,而且确实有必要覆盖这个默认行为。

    如果菜单项不是由默认菜单控制器控制的,请使用合适的触发器(一般是PRE-BLOCK或者WHEN-NEW-BLOCK-INSTANCE触发器)增加如下的代码:

app_special.enable(’the menu item’, PROPERTY_OFF|ON);

当你离开时使用合适的触发器(一般都是POST-BLOCK触发器)来使菜单项恢复原状,代码方法同上。

代码中的then menu item参数应该使用菜单项的全称,比如

app_special.enable(’CLEAR.FIELD’, PROPERTY_OFF);

如果菜单项是由默认菜单控制器控制的,你也想修改它是否可用,可以通过在项目级别或者数据块级别的触发器(主要指WHEN-NEW-BLOCK-INSTANCE、WHEN-NER-RECORD-INSTANCE、WHEN-NEW-ITEM-INSTANCE)中编写代码来解决,将该触发器的Execution Hierarchy 属性设置为Override,示例代码如下:

app_standard.event(’TRIGGER_NAME’);

app_special.enable(’Menu_item’, PROPERTY_OFF|ON);

因为菜单项会在转到其他数据块时由默认菜单控制器自动设置,所以在离开数据块或者记录或者项目时不需要特意编写代码来恢复设置。

    影响菜单的常见错误编码方法

v  一个项目或者数据块的触发器的Execution Hierarchy被设置为Before,但是它的逻辑在调用APP_STANDARD.EVENT( ) 时被重置了。

v  一个项目或者数据块的触发器的Execution Hierarchy被设置为Override,但是在撰写逻辑类代码前没有调用APP_STANDARD.EVENT( )。

v  数据块级别的QUERY ALLOWED, DELETE ALLOWED, INSERT ALLOWED设置错误。在任何时候,你更改了数据块的属性,要强迫刷新菜单栏((因为控制菜单栏的WHEN类触发器,只有你的更改确实生效了才会触发),请调用APP_STANDARD.SYNCHRONIZE。

v  控制块使用了基表

假设你想在菜单栏和工具栏同时增加一个Book Order的项目,这个项目是第一个最顶层的菜单(一般是工具菜单)的第一个菜单项,同时还想在工具栏显示个小图标。还有就是它只是在数据块Header 上可用,其余地方不可用。

解决方案:

l 步骤1:修改表单级别的PRE-FORM触发器增加代码

app_special.instantiate(’SPECIAL1’, ’&Book Order’, ’bkord’);

如果菜单项将来可能涉及到不同语言之间的转换,请使用消息字典(Message Dictionary)或者参数或者静态记录组来存储菜单的显示文本。然后提取转换后的值给一个变量,并将这个变量提供给这个过程,比如

app_special.instantiate(’SPECIAL1’, my_menu_entry, ’bkord’);

l 步骤2:修改表单级别的PRE-BLOCK触发器增加代码:

app_special.enable(’SPECIAL1’,PROPERTY_OFF);

l 对你想使用该菜单项的数据块(本例中是Header数据块)的PRE-BLOCK增加如下代码来激活该菜单项和工具栏项:

app_special.enable(’SPECIAL1’,PROPERTY_ON);

l 对你想使用该菜单项的数据块(本例中是Header数据块)增加一个名称为SPECIAL1的触发器,撰写你想在点击该菜单项或者工具栏项时执行的功能。每次点击都会执行这个触发器。

在你的表单中增加工具栏项目小图标

这个图标应该放在虚拟目录OA_MEDIA里面(请咨询web 服务器管理员获取该目录信息),必须是标准gif格式图片。请注意获取这个图片需要到服务器上下载到客户机上,如果性能为关注的焦点的话,请尽量控制工具栏图片的数量。

 

保存并继续(Save and Process)菜单项

默认情况下,该菜单项执行保存后,将光标移至表单的第一个导航数据块上的下一条记录,你可以更改这种默认行为。

对表单级别的ACCEPT触发器,没有创建它并将其Execution Hierarchy 属性设置为Override,并调用如下的代码:

l APP_STANDARD.EVENT(’ACCEPT’) 调用它则使用的是默认行为。

l APP_STANDARD.EVENT(’ACCEPT:0’) 调用它与默认行为基本相同,只是焦点依然停留在当前数据块。

l APP_STANDARD.EVENT(’ACCEPT:’) 调用它与默认行为基本相同,只是光标移到参数指定的数据块。

l 其他合适的代码。

 

右键菜单自定义

     Oracle应用程序为所有文本项目提供了默认的右键快捷菜单,当在文本项目上右击时会弹出自适应的快捷菜单,你可以定制这个菜单,增加与应用程序特定相关的最多10个菜单项,这些新增的菜单项会放在文件夹和帮助这两个菜单项之间,当然你还可以为你的新增菜单项增加分隔线

     为右击快捷菜单每新增一个菜单项最少需要使用两个触发器。第一个触发器是PRE-POPUP-MENU触发器,可以根据需要放在数据块级或者项目级。这个触发器调用APP_POPUP.INSTANTIATE 来增加菜单项,这个过程可以传入两个参数,第一个是POPUPn(n为1到10的数字,是新增菜单项从上倒下排列的顺序),第二个参数是要显示的菜单项文本。请将触发器PRE-POPUP-MENU的Execution Hierarchy 属性设置为After,这样你的这个触发器就会在表单级别的PRE-POPUP-MENU触发后触发。(表达级别的PRE-POPUP-MENU触发器先触发确定用户当前光标所在项目,然后设置为默认的右击快捷菜单)。

第二个触发器就是自定义的POPUPn(n为1到10的数字,是新增菜单项从上倒下排列的顺序)触发器,也就是选择菜单项时执行的代码,一般是项目级或者数据块级的触发器。请注意,即使光标所在项目是禁用的项目,选择了右击快捷菜单项也会执行其对应的功能,所以你在撰写代码时应该考虑到这种情况。

 

举例

假设你想在右击快捷菜单中增加一个Approve的菜单项(中文意思是审批通过),是新增的第一个特殊菜单项,只有在项目Requisition Number上可用,解决方案如下:

l 步骤1:项目Requisition Number的PRE-POPUP-MENU触发器增加如下代码,确保设置该触发器的Execution Hierarchy 属性为After。

app_popup.instantiate(‘POPUP1’, ’Approve’);

l 步骤2:对项目Requisition Number增加一个名称为POPUP1的触发器,撰写合适的代码来执行用户选择该菜单项时执行的功能。

form-level PRE-POPUP-MENU trigger引用APPSTAND.EVENT('PRE-POPUP-MENU')建立default menu;建立block /item level pre-pop-menu trigger须(Execution Hierarchy After)。

从block /item level pre-pop-menu trigger(Execution Hierarchy After)中调用app_popup.instantate函数初始化右键菜单项:

procedure APP_POPUP.INSTANTIATE(

option_name varchar2,

txt varchar2,

initially_enabled boolean default true,

separator varchar2 default null);

Example

• This example results in a menu that has a line above the second custom entry and has the third custom entry grayed out (disabled)

APP_POPUP.INSTANTIATE(‘POPUP1’,’First Entry’);

APP_POPUP.INSTANTIATE(‘POPUP2’,’Second Entry’, TRUE, ‘LINE’);

APP_POPUP.INSTANTIATE(‘POPUP3’,’Third Entry’, FALSE);

右键菜单的处理函数写在名为POPUP1 ~  POPUP10的trigger中,应该在正确的level上建立这些trigger (通常是block/item level)。

############################## 通往精神的路很多,物质只是其中一种 ##############################
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
原文地址:https://www.cnblogs.com/pompeii2008/p/5311031.html