TEC1303.Form个性化技术总结 - 第一部分 Form个性化技术讲解

来源:互联网 发布:微盘外汇交易平台源码 编辑:程序博客网 时间:2024/06/07 14:03

         前言

个性化主要用于客户化标准功能的Form。对于我们自己开发的Form,除非已经上线很久、很稳定了,不想改源文件了否则没必要用个性化。

个性化的好处在于,基本上不用担心升级问题,因为个性化信息是保存在表中的,独立于源代码,EBS版本升级或打Patch时,fmb可能被覆盖,但个性化信息仍然得以保留。

         第一部分 Form个性化技术讲解

 

 

第一章   Form个性化概念

1.     概述

Form个性化允许修改基于Form基础页面的事件,包括:修改物件的属性、执行内建函数、产生提示信息和添加标签入口。

对于每个功能(需在功能处指定上下文条件,相应的Form才能执行)来说,可以制定一个或一个以上的规则。每条规则包括:一个事件(Event,事件执行的条件(Condition,事件执行的范围(Scope,一个或多个动作(Action

Form上的一个Trigger就是一个事件(Event)。例如,开启页面的TriggerWHEN-NEW-FORM-INSTANCE),或者光标从一条记录移至另一条新的记录所触发的TriggerWHEN-NEW-RECORD-INSTANCE)等等,这几乎是每个Form传送资料都必须执行的,或者确认传送资料附加的事件。

若指定了事件执行的范围(Scope),当Form在运行的时候,系统会去检查当前的规则是否可执行。事件执行的范围有以下层级:地点、责任、用户、行业,每个规则可有相应层级的执行范围与之相关联。(行业层级没用)

事件执行的条件(Condition)是一段SQL语句,来控制事件在何时执行。只有在执行条件的返回结果是真时,该时间才会执行。

一个动作(Action)包含以下的任意一项内容:

Ø 设置属性,如:设置一个栏位状态为必输,隐藏一个Tab页签等。

Ø 执行内建函数,如:GO_BLOCKDO_KEYFND_FUNCTION.EXECUTE等。

Ø 显示提示信息,如:弹出一个自定义内容的提示框。

Ø 创建一个自定义菜单选项,如: 在菜单项“工具”下添加一个自定义选项。

规则一旦建立,当目标功能执行时,规则会被系统视为Form里的一个事件,并会自动执行。

2.     启用和禁用Form个性化

要创建一个个性化控制,首先要进入到目标功能Form,然后按下拉菜单 帮助->诊断->自定义代码->正常(启用个性化)/关闭(关闭个性化)/个性化(打开个性化设置页面)。

clip_image002[4]

若该下拉菜单不可见,请检查系统Profile设定选项:

“隐藏诊断菜单项” 和“公用程序:诊断”。

Profile

功能

隐藏诊断菜单项

隐藏诊断菜单

显示诊断菜单

公用程序:诊断

直接进入FORM个性化设置界面

需要输入APPS密码

进入到个性化控制页面时,系统会罗列当前功能页上已定义的规则。

如果做了修改,请保存然后重新进入该功能页,这样所做的改动才能生效。也可以按下按钮 “验证”和“现在申请”,分别来验证修改的值和快速查看所做改动的执行结果,而不必重新进入功能页。

3.     个性化运行机制

Form个性化的工作原理是触发器代码的“添加”。那添加在哪里呢?什么时候会被执行?是这样子的,我们在个性化编写的条件(包括触发器名称,条件等等),系统先会自动将对应的代码“添加”在APP_STANDARD.EVENT对应的触发器代码里面(其实是APP_STANDARD.EVENT会寻找个性化里面的代码去执行),然后Form级触发器调用代码的时候,会自动执行对应的触发器的增加在个性化里面的代码,从而达到个性化实现效果的目的。

Step01.Form启动时,所有与当前Function相关的个性化规则都会被加载进内存;

Step02.Form触发特定的Event时,系统将会搜寻相应的规则并进行匹配;

Step03.按匹配的规则序号由有小到大)依次执行对应匹配的Action(由小到大)

Step04.执行完成后,将该Event回传Form,执行Form元定义的处理代码。

注意事项:

1)     如果针对同一Event,定义了两条规则,那么序号小的规则会先处理;假如两条规则对同一对象同一属性作了不同的设置,那么个性化的效果以最后执行的规则为准;

2)     如果同一规则的不同Action,针对同一对象同一属性作了不同的设置,那么个性化的效果以最后执行的Action(序号最大)为准;

3)     假如Event回传Form后,Form原定义的处理代码override了原先执行的个性化效果,会让人误以为个性化没有起作用。

重要:

当你在个性化里面添加了触发器和对应的执行条件,如果都不会被执行,而且你确认你的条件是满足的前提下,你可以打开对应的Form,确认Form级触发器有没有对应的触发器名称,还有,里面的是否有代码:APP_STANDARD.EVENT(对应的触发器名称)

另外,触发器的执行层次可能也会影响到个性化的触发!

我们一般在FormBlock里面添加的触发器,其执行层次一般是:Override,这样子会导致一个后果:你在对应的块,再用个性化编写对应的触发器代码,那这个个性化的代码永远不会被执行。为什么?因为块级的触发器的执行层次已经覆盖了Form级的执行层次!而个性化的代码是添加在Form级的触发器的。

所以,在客制开发Form的时候就要注意这点了。如果你还想用对应触发器的个性化添加代码的话,最好将执行层次改为:Before

4.     Form个性化的后台表

l applsys.fnd_form_custom_rules

l applsys.fnd_form_custom_scopes

l applsys.fnd_form_custom_actions

表关系:

SELECT fcr.function_name,       fcr.description,       fcr.trigger_event,       fcr.trigger_object,       fcr.condition,       fcr.enabled,       fcr.fire_in_enter_query,       fcr.rule_type,       fcr.form_name,       fcs.level_id,       fcs.level_value,       fca.*  FROM applsys.fnd_form_custom_rules   fcr,       applsys.fnd_form_custom_scopes  fcs,       applsys.fnd_form_custom_actions fca WHERE fcr.id = fcs.rule_id(+)   AND fcr.id = fca.rule_id(+)

5.     个性化管理及异常处理

打开form个性化窗口,工具-管理,和验证所有。

输入表单,函数,可以看到启用了的form个性化规则个数,如果不输入,直接查询的话,可以看到所有定义了个性化的formfunction名称,包括定义了没有启用的。这个可以应用在当我们打了patch之后,在这里可以看出是否影响了form的个性化。

如果我们定义了个性化以后,form运行出现错误,甚至打不开form了。这时可以采取以下方法: 工具栏:帮助-诊断-自定义代码-关闭,这样就关闭了系统中所有的个性化规则。打开出了问题的form的个性化:工具-验证所有(只能验证启用了的个性化规则)。根据报错信息查找错误。修改出了问题的个性化。

 

第二章   Form个性化设置界面构成元素

clip_image004[4]

clip_image006[4]

个性化设置界面主要分为规则头、条件tab页、上下文、活动tab页四部分,一般也是按照这个顺序来进行设置。

1.     规则头

l 函数名:当前Function的名称。

l 表单名称:当前Form的名称。

l 调式模式:下拉列表,默认为关闭。设置是否显示调试信息。

.每个一个规则都包含:

l 序号:对应规则的序号。值从1-100,序号可重复,值小的优先执行。

l 说明:描述,可用于注明当前规则的用途。

l :下拉列表。“功能”,表示该规则只在当前的功能中适用;“表单”,表示该规则在所有应用当前Form的功能中适用。

l 启用:勾选时当前规则才有效。

2.     条件tab

定义个性化规则触发的时机和条件。

l 触发器事件:选择规则执行的Trigger,可以从LOV中挑选,或者自己键入当前Form 还未用到的Tirgger,该栏位是复合型的,可从LOV挑选,也可自己输入。

个性化规则会先匹配事件,然后按序号顺序执行。 trigger可选的有: WHEN-NEW-FORM-INSTANCEWHEN-NEW-BLOCK-INSTANCEWHEN-NEW-RECORD-INSTANCEWHEN-NEW-ITEM-INSTANCEWHEN-VALIDATE-RECORD15MENU45SPECIAL

MENU1-15:当选择对应菜单项时触发。只用于客户化的额外菜单项,显示在下拉“工具”菜单,但ORACLE建议使用SPECIAL菜单项。

SPECIAL1-15:当选择对应菜单项时触发。额外菜单项,显示在下拉“工具”菜单。

SPECIAL16-30:当选择对应菜单项时触发。额外菜单项,显示在下拉“报表”菜单。

SPECIAL30-45:当选择对应菜单项时触发。额外菜单项,显示在下拉“活动”菜单。

l 触发器对象:选择对象。对象的挑选值依赖触发器事件,根据不同的触发器事件其状态亦不同。即,可能是不可输入的,也可能是必须输入的。例如,如果挑选的触发器事件是WHEN-NEW-ITEM-INSTANCE,此时必须输入一个触发器对象。

l 条件:这个栏位是选择性输入的SQL语句段,只有SQL语句段返回值是真,个性化定义的动作才会执行。条件可包含如下内容:

a)     SQL函数和运算子,如ANDORTO_CHAR DECODE NVL等。

b)     关联到Form某个字段(:Block.feild),包括::System , :Globle, :parameter

c)     调用服务器上没有外部参数的函数。

输入的判断条件语法上必须是正确的,可按下按钮 ‘验证’来检查语法的正确性。若语法上有错误,系统会弹出一个错误信息提示框警示出错的部分。

例:

条件

说明

:users.user_name is not null and :users.description is null

个性化规则动作执行的条件,User_name不为空,且 Description为空

sysdate >= to_date(15-1-2013,DD- MM-RRRR)

个性化规则动作执行的条件,系统日期大于等于2013115

l 处理模式:设定执行的模式。

a)     不在“输入—查询”模式下,查询模式(F11)下不使用个性化规则;

b)     仅在“输入—查询”模式下,仅在查询模式(F11)下使用个性化规则;

c)     两者兼有(BOTH),两种状态下都使用个性化规则。

3.     上下文

l :个性化规则执行的层级。下拉列表,含有:行业、地点、职责、用户。

行业:ORACLE预留选项,将来可能使用。

地点:对于非跨国公司的企业,等同于全局生效(地点层详细含义可参阅公司ERP导航文档)

责任:只对某个责任生效

用户:只对某个用户生效

l :层级的值。

注意,这几个只要有一个满足条件就会触发该个性化规则。

4.     活动tab

个性化具体要做什么在这里面定义。

l 序号:个性化规则动作的序号,值从1-100,序号可重复,值小的优先执行。

l 类型:个性化规则动作的类型,包括:

1)     特性<Property >即物件的属性。

2)     消息<Message >即提示消息。

3)     内置<Buildtin>Form的内建函数如:GO_BLOCKDO_KEY等。

4)     菜单<Special >呼叫一个下拉菜单入口,定义其标签,已经在哪个Block可激活。

l 说明:用于注明当前个性化动作的用途。

l 语言:个性化规则动作执行的语言环境。

l 启用:勾选该个性化动作才有效。

5.     四种活动类型介绍

1)     “特性”类型:

clip_image008[4]

按文本选择:快速需找某个栏位名表述方式。

对象类型:物件类型。如:项目Item,块Block,窗口Window,标签页Tab,画布Canvas,单选按钮Radio Button,视图View,全局变量Globle,参数Parameter,值列表、局部变量 。

目标对象:目标物件。指定当前个性化动作的执行对象,即指定要针对哪个物件进行动作设定。

特性名称:属性名。指定物件的属性。

:给出物件属性值。

获取值: 取得当前对象属性值。

2)     “消息”类型:

clip_image010[4]

消息类型:用于设定提示信息的类型。“显示(Show),“提示(Hint),“警告(Warn),“错误(Error)”和“调试(Debug)”。

Ø “显示”类型的消息,弹出窗口提示,图标正常。

Ø “警告”或 “错误”类型的消息,当按下按钮 Cancel 时,系统会执行 form_trigger_failure这个Trigger,以阻止Form继续执行。

Ø “调试”类型的消息只有页面上的“调式模式”不为关闭时才会显示。

Ø “提示”类型的消息,显示在窗口左下角。

消息文本:提示消息的内容。

3)     “内置”类型:

clip_image012[4]

内置类型:指定所使用的内建函数。

1)     启动URL:设置一个HTML目标窗口,打开指定的URL

2)     启动功能:调用功能,可以使用用户功能名或功能名。

3)     启动SRS表单:打开提交请求表单,接收请求名称,注意这里没有安全性验证,哪怕在标准查看-请求操作中找不到这个请求,也可以提交成功。

4)     执行过程:执行数据库中的存储过程。

5)     SYNCHRONIZE:针对罕见的客户端和中间件不同步的情况。

6)     EXECUTE_TRIGGER:执行一个FORM中的TRIGGER

7)     调用自定义程序库:调用CUSTOM库。

8)     根据查询创建记录组:允许动态生成记录组,两个参数分别是创建记录组的SQL和一个目前不存在的记录组名。

程序名: 内建函数所使用的参数。

4)     “菜单”类型:

clip_image014[4]

菜单项:指定下拉菜单的入口。由3个集组成。每个集15个,挑选不同的集,下拉标签将出现在不同的下拉菜单位置上。若挑选了Form已有的Menu并且创建了个性化控制,那么所创建的个性化规则将改写Form原有的菜单入口功能。

1)     MENU1-15:当选择对应菜单项时触发。只用于客户化的额外菜单项,显示在下拉“工具”菜单,但ORACLE建议使用SPECIAL菜单项。

2)     SPECIAL1-15:当选择对应菜单项时触发。额外菜单项,显示在下拉“工具”菜单。

3)     SPECIAL16-30:当选择对应菜单项时触发。额外菜单项,显示在下拉“报表”菜单。

4)     SPECIAL30-45:当选择对应菜单项时触发。额外菜单项,显示在下拉“活动”菜单。

菜单标签:标签的标示符。

编译菜单前的行:若勾选,在标签上方会出现一条直线以做区隔所用。

图标名称: 若需要在工具栏上添加一个图形(功能与点击对应下拉菜单的标签相同),则可以在此指定图形的名称。

已在块中启用: 在哪个Block标签被激活。

6.     底部按钮

给我们的个性化提供了一些方便的按钮。

l 插入“获取”表达式:获取当前项目的表达式。

l 插入项目值: 获取选定项目值的表达式。

l 验证:测试输入的字符串是否符合语法,如果不符和会报错。如果正确,会弹出结果。

l 现在申请:立即应用所做的个性化规则,只对某些类型适用,还是要以实际运行中为准。

7.     赋值规则

个性化的赋值或写条件的时候是有一些规则的,例如在form个性化里面取item的值用 :block.item,也可以用SPEL(Simplest Possible Expression Language),不能用name_in((但是在custom.pll中,只能用name_in())

获取属性不能用GET_ITEM_PROPERTY等。

1)     赋值

每个属性值输入的字符串可能直接被引用,也可能个性化规则在运行时才被检查。(取决于字符串是否以“=”开头) 不以“=”开头,值在个性化规则运行时直接被引用。 以“=”开头,值在个性化规则运行时被检查,允许添加上下文逻辑,如: SQL运算子函数:||TO_CHARDECODE,和 NVL绑定变量值:(:Block.Field),:System,:Globle,:Parameter调用服务器上的函数。 Select 语句,但必须遵循以下条件: 需以 = SELECT 开头。 查询值结果必须为字符型的,且长度不超过2000个字节。语句段的查询结果集不超过一行,若超过一行,只有第一行被使用。 使用“=”的一些例子:

输入的字符

执行结果

='Your password will expire on '||(sysdate+7)

Your password will expire on 2007-12-28 (假设系统日期为2007-12-21)

='Your password must have at least '||:global.password_length||' characters.'

Your password must have at least 8 characters。 (假设该Global项的值长度为8

=Your password isn’’’t valid.

Your password isnt valid.

=:items.part_number

{栏位=:items.part_number的值}

=SELECT meaning A from fnd_lookups where lookup_type = 'DAY_NAME' and lookup_code = 'SAT'

Saturday (假设系统作业是在英文环境下执行)

=SELECT 'The office is closed on '||meaning A from fnd_lookups where lookup_type = 'DAY_NAME' and lookup_code = 'SAT'

The office is closed on Saturday (假设系统作业是在英文环境下执行)

2)     SPEL

表达式的写法如下: ${objectType.objectName.Property}例如:${item.po_lines.line_num.requeired}

SPEL替代了一些form builtins,比如GET_ITEM_PROPERTY,GET_BLOCK_PROPERTY等。另外,它还可以获取PROFILE、消息字典的值,以及

Local VariablesLocal Variables也是新增的,它类似与全局变量,但是只能在当前form使用,最大长度是4000 bytes,全局变量只有255 

bytes)。

在上面所说的,新版本中增加的按钮:插入“获取”表达式,它可以打开一个新的window,自动的生成获取属性表达式,当然也可以手工输入,但是oracle建议用自动生成。写法举例:(引用oracle文档)

类型

写法

结果

Value

=The Prompt is|| ${item.block.field.prompt_text}||‘,located at:|| ${item.block.field.x_pos}

The prompt is : User Name,located at 2.0

Condition

${item.block.field.required} = ‘TRUE’

TrueFalse

3)     Folder块赋值

Folder块与一般的块有些不同,所以做个性化的时候也要注意:

下列属性只能在form打开之前设置(WHEN-NEW-FORM-INSTANCE),因为我们必须在folder的代码读取这些值之前就把它设置好,否则会出现异常。

PROMPT_TEXT

DISPLAYED

WIDTH

DEFAULT_WHERE

ORDER_BY

X_POSITION,Y_POSITION(单行的folder)

有些属性设置是有条件的,例如:

ENABLED:不能把它设为FALSE,因为在folder块里需要导航,不过可以通过把ALTERABLE设为FALSE来代替。

NEXT_ NAVIGATION_ITEMPREVIOUS_NAVIGATION_ITEM:也是不可用的。

0 0
原创粉丝点击