时间:2021-07-01 10:21:17 帮助过:19人阅读
还有其它的SPECIALLn(总共45个,最终的结果是在菜单栏的下拉列表中添加一个菜单项,SPECIAL1至15是在Tools菜单下,16至30是在Reports菜单下,31至45在Actions菜单下,需要注意的是,一般Actions菜单不显示,因为它下面没有菜单项目,没有显示的意义,只有在这个菜单下创建了菜单项才会有显示出这个菜单),MENUn(15个)触发器。
有时候我们在个性化的开发中往往不能选准触发器,触发的时间过早会导致界面上相关字段的取值不能取到,触发的时机过迟会导致达不到效果。我们可以把界面设置成显示自定义状态,然后在界面上试着操作,找到我们对应的触发时机,需要打开个性化代码中的“显示自定义选项”的单选框。使用完成后需要关闭。
还需要注意的是,基于Form界面的五个WHEN触发器,不一定在所有的界面中都有,比如说个性化希望加在一些标准界面的查询界面,希望在点击查询按钮的时候对输入的数据经行校验,因为个性化不能加载在按钮上,所以我们想把数据的校验加载在when-validate-record上,但是查询界面并没有存储记录,更新记录,验证记录的要求,也不存在这个触发器。
5. 处理模式,也属于一个个性化执行条件,主要是指定个性化是否需要在查询状态下使用,或者仅在查询状态下使用。
6. 层,行业,地点,职责,用户,表示限制个性化的产生效果的范围,但是这里的效果并不像配置文件中的用户层设置覆盖职责层,职责层覆盖地点层,层级之间是相互覆盖和重写的的关系。而是或的关系,一条个性化规则只要符合其中一条层级限制,这个个性化规则就会产生作用。
7. 界面下端的两个按钮。“插入‘获取’表达式”,“插入项目值”是两个不错的按钮,通过这个按钮可以快速和准确的取得界面上对象的值。
插入‘获取’表达式按钮
${item.view_line_info_stub.ok_button.prompt_text}
ITEM:对象类型 ,有块(Block),窗口Windows
view_line_info_stub.ok_button 目标对象(数据块.数据项)
value:Property Name 属性名称。 value 为值, Prompt_text 为提示文本,还有高度,宽度,位置
这种方法可以替换在Form中使用的内置方法GET_ITEM_PROPERTY,GET_BLOCK_PROPERTY 等
常见的类型:
窗口: ${window.} 块:${block.} 标签页: ${tab.} 画布: ${canvas.} 单选按钮: ${radio.}
视图: ${view.} 全局变量:${global.} 参数: ${parameter.} 值列表:${lov.} 局部变量: ${var.}
配置文件:${ps.} 消息:${ms.}
插入项目值按钮只获取item对象的值,得到的表达式是常见的
:数据库.数据项形式。例如 :OPERATING_UNITS.OPERATING_UNIT
1. 验证按钮:判断条件框中的条件是否成立。
2. 现在申请按钮:使设置的个性化规则立即生效,不用在重新打开和关闭Form 界面,查看个性化规则是否起作用。
第二个界面主要是定义符合条件下执行的动作,总共有四种活动类型,每种类型下又有几种子类型,下面我们给出每一种类型的使用方法。
这个活动类型,类似于我们在Form开发中按F4键打开对象的属性版,设置对象的属性。这些对象包括数据块,数据项,画布,窗口等,这个动作属性也可以用来定义全局变量,局部变量,参数等。
这里的局部变量:与全局变量的使用类似,但是只能在当前form使用,最大长度是4000 bytes,全局变量只有255 bytes,不能在Form的相互调用中使用。
选择这个动作类型的时候,会出现一个按文本选择的按钮,通过Form界面上的提示文本快速选择对象,这个按钮很有用,可以帮我们准确的找到对应的对象。
比如说我如果要修改一个ITEM的LOV的记录组,因为LOV,记录组的命名和字段不是一一对应的,我们仅仅通过帮助里面的诊断查看项不能准确的找到对应的 LOV名称,通过这个查询框,我们可以清楚地看到,那个对象对应那种类型的属性,从而获得属性名称。
触发器事件 |
WHEN-NEW-FORM-INSTANCE |
类型 |
特性 |
对象类型 |
窗口 |
目标对象 |
CONC_PROG |
特性名称 |
Title |
值 |
=‘并发程序‘||(select t.name from hr_operating_units t where t.organization_id =${ps.org_id.value}) |
赋值语句:${ps.org_id.value} 取的是当前配置文件中的默认业务实体的值,通过“插入‘获取’表达式按钮”获得
这里需要注意的是给对象的属性赋值的时候 “=”号的使用
不以“=”开头的值,在加载个性化的时候直接赋值给对象的属性
以“=”开头的值,可以在个性化加载的时候动态的执行内部的查询语句,替换绑定变量,全局变量等。常见的有
SQL 运算子:||,TO_CHAR,DECODE,和NVL
绑定变量值:(:Block.Field),:System,:Globle,:Parameter
Select 语句,但必须遵循以下条件:
需以? =SELECT?开头。
查询值结果必须为字符型的,且长度不超过2000
个字节。
所查询的栏位的别名需给“A”(11.9
以后的版本没有此限制)。
语句段的查询结果集不超过一行,若超过一行,只有第一行被使用。
根据平时Form开发的过程中使用到选择库存组织的案例可以知道,选择的库存组织ID是存储在Form的parameter参数里面的,下面的查询语句,可以使用这个参数作为绑定变量,动态的获取业务实体的值。
触发器事件 |
WHEN-NEW-FORM-INSTANCE 设置两个Property类型的活动 |
|
序号 |
10 |
11 |
类型 |
Property |
Property |
对象类型 |
item |
item |
目标对象 |
FIND.OPERATING_UNIT |
FIND.ORG_ID |
特性名称 |
Value |
Value |
值 |
= SELECT hr.name FROM hr_operating_units hr, ORG_ORGANIZATION_DEFINITIONS ood WHERE hr.organization_id = ood.OPERATING_UNIT And ood.ORGANIZATION_ID = nvl(:PARAMETER.org_id,121) |
= SELECT to_char(hr.organization_id) FROM hr_operating_units hr, ORG_ORGANIZATION_DEFINITIONS ood WHERE hr.organization_id = ood.OPERATING_UNIT and ood.ORGANIZATION_ID = nvl(:PARAMETER.org_id,121) |
在这里由于SQL语句只能返回字符串,这里需要把数字转换成字符串,原本是错误的做法,好在Oracle会自动转换数据类型。Item 的初始化值(INITIAL_VALUE)只能在 WHEN-NEW-RECORD-INSTANCE触发器下设置
-INSTANCE 事件下进行改变设置
这里需要注意的是:如果Value的来源是通过select获取时,且是由多部分组合而成,其中的“select语句”这部分需要用()括起来
触发器事件 |
WHEN-NEW-FORM-INSTANCE |
||
类型 |
特性 |
对象类型 |
Item |
目标对象 |
CONC_PROG.EXECUTABLE_NAME |
特性名称 |
UPDATE_ALLOWED |
值 |
False |
触发器事件 |
WHEN-NEW-BLOCK-INSTANCE |
触发器对象 |
FND_EXECUTABLES(也可以不填,其他的块没有这个触发器) |
执行模式 |
两者兼有(直接Ctrl+F11查询也要满足) |
类型 |
Property |
目标对象 |
FND_EXECUTABLES |
特性名称 |
DEFAULT_WHERE |
值 |
executable_id > 4 and APPLICATION_NAME =‘Custom Application‘(红色部分为新增) |
这里需要注意的是:(1)触发器的选择 打开界面和按F11,或者直接按Ctrl+F11快捷键 进入查询状态都会触发 when-new-record-instance 触发器,因此这里也可以使用这个触发器。
(2)以前的教程里面介绍刚进入界面的时候通过“获取值”按钮来获取以前的default_where的值,再在其后加入我们需要限定的值,但是这个方法看不到上下文关联的字段。比如这里的通过该按钮只获取到executable_id> 4 而得不到与应用产品相关的字段。
直接加上:andexists(select1fromFND_EXECUTABLES_FORM_V t where t.APPLICATION_NAME =‘CustomApplication‘)
是不会对以前的where子句加上限制效果的,我们可以在不加个性化之前通过诊断-项目-块-last_query找到这个块的最后一次的查询语句。在此基础上增加我们的限制
触发器事件 |
WHEN-NEW-FORM-INSTANCE(Special 的申明只能在 when-new-form-instance 事件下进行) |
类型 |
Menu |
菜单项 |
SPECIAL15 |
菜单标签 |
打开可执行 |
编译菜单前的行 |
若勾选,在标签上方会出现一条直线以做区隔所用。一般special1,special16,special31 在菜单的最顶部不需要分割。 |
图标名称 |
图标名称可以使用我们自己的图片 路径放在 $COMMON_TOP/java/oracle/apps/media/ |
已在块中启用 |
指定菜单项在哪个Block 标签被激活。 |
需要注意的是这里除了可以选的45个SPECIAL菜单项,还可以选到15个MENU菜单项,这十五个菜单项是Form中原先已经有的,那么所创建的个性化规则将改写Form原有的菜单入口功能。
触发器事件 |
SPECIAL15(上一步中我们自定义的菜单项,这个个性化的触发事件时我们点击这个菜单项的时候出发) |
条件 |
${item.conc_prog.executable_name.value} is null |
类型 |
Message |
消息类型 |
Error |
消息文本 |
请输入可执行文件名称 |
共有‘显示(Show)‘, ‘提示(Hint)‘, 警告(Warn), ‘错误(Error)‘, 和调试(Debug)。注意的是,若消息类型挑选了,Warn或 ‘Error‘, 当您按下按钮 Cancel 时,系统会执行RAISE_FORM_TRIGGER_FAILURE 这个Trigger ,将终止进一步的程序处理语句的执行。
触发器事件 |
SPECIAL15 |
||
序号 |
10 |
序号 |
11 |
类型 |
Property |
类型 |
Buildin |
对象类型 |
全局变量 |
内置类型 |
启动功能 |
目标对象 |
G_EXEC_NAME |
功能代码 |
FND_FNDCPMPE |
特性名称 |
Value |
函数名 |
可执行并发程序 |
值 |
=${item.conc_prog.executable_name.value} |
参数 |
|
第一步打开可执行界面的时候,设置全局变量的初始值:INITIAL VALUE =NULL
触发器事件 |
WHEN-NEW-FORM-INSTANCE |
类型 |
特性 |
对象类型 |
全局变量 |
目标对象 |
G_EXEC_NAME |
特性名称 |
INITIAL VALUE(全局变量有两个属性,Value和INITIAL VALUE,VALUE是直接赋值,而INITIAL VALUE为如果该变量为null或未被创建,会被赋初值,如果有值的话,则不会覆盖) |
值 |
=Null(这个个性化的目的是为了直接打开该FORM时,不是通过点击我们个性化的菜单按钮打开这个界面,后面定义的用到此全局变量的个性化规则有效,因为如果直接打开这个界面,后面我们会去判断这个全局变量的值是否为空来执行查询,如果这个全局变量都不存在的话,个性化规则就出错了,打开这个界面就会报错) |
第二步判断全局变量的值是否为空,不为空则进入查询状态
触发器事件 |
WHEN-NEW-FORM-INSTANCE |
条件 |
:global.G_EXEC_NAME is not NULL |
类型 |
内置 |
内置类型 |
DO_KEY |
变元 |
ENTER_QUERY |
第三步在查询模式下,用全局变量的值作为查询条件,执行查询
触发器事件 |
WHEN-NEW-RECORD-INSTANCE(上一步我们进入了查询界面,进入这个模式后就会执行新建记录触发器) |
||||
触发器对象 |
FND_EXECUTABLES(新建记录所在的块名称) |
||||
序号 |
10 |
序号 |
11 |
序号 |
12 |
类型 |
Property |
类型 |
Property |
类型 |
内置 |
对象类型 |
Item |
对象类型 |
全局变量 |
内置类型 |
DO_KEY |
目标对象 |
FND_EXECUTABLES.EXECUTABLE_NAME |
目标对象 |
G_EXEC_NAME |
变元 |
EXECUTE_QUERY |
特性名称 |
VALUE |
特性名称 |
VALUE |
|
|
值 |
= ${global.g_exec_name.value} |
值 |
=NULL(使用完这个全局变量之后,把值置为空,为下一次使用) |
触发器事件 |
WHEN-VALIDATE-RECORD |
|||
触发器对象 |
CONC_PROG |
|||
条件 |
${item.conc_prog.description.value} is NULL |
|||
序号 |
10 |
序号 |
11 |
|
类型 |
Message |
类型 |
内置 |
|
消息类型 |
Show |
内置类型 |
RAISE_FORM_TRIGGER_FAILURE |
|
消息文本 |
必须输入可执行的说明字段 |
|
||
触发器事件 |
WHEN-NEW-ITEM-INSTANCE |
|||||||||||
触发器对象 |
ORDER.ORDER_TYPE |
|||||||||||
层 |
Responsibility |
Value |
HET INTER ORG(限制个性化加载在某个职责下) |
|||||||||
序号 |
10 |
序号 |
11 |
|||||||||
类型 |
Builtin |
类型 |
Property |
|||||||||
Builtin Type |
Create Record Group from Query |
对象类型 |
LOV |
Target Object |
ORDER_TYPE |
|||||||
Argument |
select distinct OT.order_type_id, OT.name, OT.description from oe_order_types_v OT, oe_workflow_assignments OW, fnd_lookup_values_vl flv where trunc(sysdate) between trunc(OT.start_date_active) and nvl(trunc(OT.end_date_active), trunc(sysdate)) and trunc(sysdate) between trunc(OW.start_date_active) and nvl(trunc(OW.end_date_active), trunc(sysdate)) and OT.order_type_id = OW.order_type_id and process_name IS NOT NULL and line_type_id IS NULL and nvl(wf_item_type, ‘OEOH‘) = ‘OEOH‘ AND flv.enabled_flag = ‘Y‘ AND SYSDATE BETWEEN flv.start_date_active AND nvl(flv.end_date_active, SYSDATE) and flv.lookup_type = ‘XXOM_INTER_ORG_ORDER_TYPE‘ and upper(ot.name) = flv.LOOKUP_CODE and flv.TAG = NVL(:ORDER.OPERATING_UNIT, ‘HET_OU‘) order by name |
|||||||||||
Group Name |
XXOM_ORDER_TYPE |
Property Name |
GROUP_NAME |
Value |
XXOM_ORDER_TYPE |
|||||||
在这里我们修改了标准销售订单界面上订单类型字段的LOV取值,一般的做法就是重新创建一个记录组,然后用这个记录组替换LOV以前的记录组。 我们需要注意的是新的记录组的返回字段的顺序和名称都应该和以前的记录组的一样,因为我们只改变了记录组,并没有重新设定LOV返回项,如果不能保持一致,会导致界面上有的记录不能从LOV选择中得到值,所以通常的做法就是先获取原来的LOV查询语句,再修改原来查询语句的 From子句和 where子句,不修改select子句。在PL/SQL Developer 中得到的LOV查询语句其中where子句中会有很多绑定变量,我们需要根据业务逻辑来确定绑定变量的值,做到尽量小的改动以前的LOV的记录组。
还有需要注意的是个性化开发中,我们不能对按钮添加个性化规则,如果有此类的需求一般都转换成加载在when-validate-record触发器上,如果校验的字段有LOV也可以通过限制LOV的取值来做到这一点。
触发器事件 |
WHEN-VALIDATE-RECORD |
触发器对象 |
FND_LOOKUP_VALUES |
类型 |
Buildin |
内置类型 |
Forms_DDL |
变元 |
=‘Declare Begin update fnd_lookup_types_tl set description=‘‘‘||:FND_LOOKUP_VALUES.DESCRIPTION||‘‘‘ where lookup_type=‘‘‘||:FND_LOOKUP_TYPES.LOOKUP_TYPE||‘‘‘; Commit; End;‘ |
需要注意的是:Forms_DDL 的变元是字符串,如果字符串中有绑定变量需要用三个单引号和字符串连接符连接起来。 如果update,inset 语句内有手工输入的字符串,则需要使用双引号引用起来,数字类型的值不需要引号。
例如:=‘Declare
Begin Insert into student(stu_id,stu_name) values(1001,’’Smith’’);
Commit;
End;‘
Forms_DDL 执行的数据库定义语言,执行完成之后都需要显示的Commit
这里总结一下PL/SQL语言中的单引号和双引号的用法
单引号有两个作用:第一个作用就是字符串用单引号括起来,第二个作用是连续的单引号,第二个开始被看作转义字符。
输出一个单引号: select‘‘‘‘resultfrom dual –输出一个单引号
第一和第四两个单引号作为字符串的首尾单引号,第二单引号作为转义字符所起的作用的声明第三个单引号作为普通字符输出。
所以上面的insert 语句对于字符类型的字段,用了两个单引号括起来,一头一尾两个作为字符串标识,第二和第四个单引号转义第三和第五个单引号
最终执行的insert语句是: insert into student(stu_id,stu_name)values(1001,’smith’);
如果遇到字符串连接符:|| 又会出现另外一种情况
字符串连接符会分割两个字符串,也就是||符号左右两边的单引号没有任何关系
select‘‘‘||&l_var||‘‘‘resultfrom dual –输入2 输出 ‘||2||‘
左边第二个单引号转义第三个单引号得到一个单引号作为普通字符,从第一个单引号开始的字符串并没有结束,所以这里的字符串连接符并没有起到分割单引号的作用,而是被看成是普通的字符,但是内部的动态变量还是被解析了。
因此SQL会动态的解析字符串内部的绑定变量,如果我们的insert语句插入的number类型的值,直接写在字符串内就可以了,例如:’insert intostudent(stu_id,stu_name) values(:header.header_id,’smith’);’
select‘‘‘‘||&l_var||‘‘‘‘resultfrom dual –输入2 输出 ‘2‘
左边和右边四个单引号分别得到一个普通的单引号字符(仅包含一个单引号字符的字符串),连接中间的动态变量,得到的输出结果是一个被一对单引号括起来的字符串。
这样就符合上面的Update语句了,更新description字段赋给的值应该是由一对单引号括起来的里面的值
双引号的用法比较简单:
1. SQL语句中以中文作为别名时候需要用双引号括起来
select‘‘‘‘ "你好" from dual–输出一个单引号,列名是:你好
2.字符串中出现双引号只被当作普通字符来看
select‘hh24"小时""mi""分"""ss"秒"‘ results from dual; -- hh24"小时""mi""分"""ss"秒"
3. 当出现在to_char的格式字符串中时,双引号有特殊的作用, 就是将非法的格式符包装起来,避免出现ORA-01821: date format not recognized错误。也就是说,去掉双引号和其包含的字符后,剩下的应该是一个合法的格式串。
select to_char(sysdate,‘hh24"小时"mi"分"ss"秒"‘) results from dual;
-- 21小时39分37秒
规则1 |
创建打开CSDN博客菜单项 |
规则2 |
打开CSDN博客 |
触发器事件 |
WHEN-NEW-FORM-INSTANCE |
触发器事件 |
SPECIAL45 |
活动类型 |
菜单 |
活动类型 |
Buildin |
菜单项 |
SPECIAL45 |
内置类型 |
启动URL |
|
|
变元 |
http://blog.csdn.net |
第一步在定义并发请求的个性化下定义一个菜单项,点击该该菜单项提交我们执行的请求“CRC_B28_PO_采购入库单”
触发器事件 |
WHEN-NEW-FORM-INSTANCE |
|||||
类型 |
菜单 |
菜单项 |
SPECIAL44 |
菜单标签 |
打印采购接收单据 |
|
触发器事件 |
SPECIAL44 |
||
序号 |
10 |
序号 |
11 |
类型 |
Property |
类型 |
Buildin |
对象类型 |
全局变量 |
内置类型 |
启动SRS表单 |
目标对象 |
G_ALL_PARAMETER |
程序名 |
CRC_B28_PO_采购入库单(客户化程序) |
特性名称 |
Value(这里我们通过全局变量为提交请求界面的请求参数自动赋值,请求所需要参数之间用‘:‘冒号隔开,如果连续几个参数是空的话可以写在一起,例如‘:::::‘表示连续4个参数为空的,参数的顺序和个数必须与定义并发程序的时候一致) |
||
值 |
SELECT ‘B28_BZCL0_常州包装‘ || ‘:::‘ || (select rsh.receipt_num from rcv_shipment_headers rsh, org_organization_definitions ood where ood.organization_id = rsh.ship_to_org_id and ood.operating_unit = 101 and rownum =1)||‘:‘|| ‘28010000623‘ || ‘:::::‘|| to_date(sysdate-365, ‘dd-mm-yyyy‘) ||‘:‘|| to_date(sysdate, ‘dd-mm-yyyy‘) FROM dual |
第二步在提交并发程序界面设置个性化,如果当前提交的请求是“CRC_B28_PO_采购入库单”且全局变量不为空,则给请求的参数自动赋值
触发器事件 |
WHEN-NEW-ITEM-INSTANCE |
||
触发器对象 |
WORK_ORDER.PARAMETERS |
||
条件 |
${item.work_order.concurrent_program_name.value} =‘CUX28PORCVRP1‘ and -- 这里是并发程序的简称 ${global.G_ALL_PARAMETER.value} is not null |
||
类型 |
特性 |
项目 |
WORK_ORDER.PARAMETERS |
特性名称 |
Value |
||
值 |
=select nvl(${global.g_all_parameter.value}, ${item.work_order.parameters.value}) from dual |
执行过程指的是执行数据库中一个包的procedure,function等,而不是Form的内置程序 set_item_property()等,在包中能实现的代码这里都能实现,只需要调用就可以了,调用数据库中的过程时可以使用当前界面的字段作为参数。这里不再重复。
一般的需求在Form界面上做个性化都能完成,如果在界面上不能完成,就考虑在CUSTOM.PLL文件中实现。凡是能在界面上实现的个性化效果都能够在CUSTOM.PLL文件中实现,反之不成立。界面上有很多的对象属性和内置程序都有,需要用到界面上没有的属性和内置程序就要在CUSTOM.PLL文件中实现。
(1) 将custom.pll 另外复制一份,起名为xx模块名.pll。把xx模块名.pll加载到custom.pll 下(用form builder 打开custom.pll,在Attached Libraries 里面加上xx模块名.pll)
(2) 在xx模块名.pll文件中新建一个接口包和包体:xx模块名_personalize,里面定义一个存储过程
procedure event(eventvarchar2); 接收传递过来的触发器事件
(3) 然后在custom.pll 的event 里面调用每个模块名下的接口过程:
xx模块名_personalize.event(event_name); 这样,我们的客户化代码都可以放在xx模块名.pll 这个library 里面,降低了风险。
(4) 每次更改完xx模块名.pll 文件之后,都要删除CUSTOM.PLL 文件附加库中的这个xx模块名.pll 这个附加库文件,再把最新的xx模块名.pll 文件附加到CUSTOM.PLL文件的附加库里面。同时上传和编译CUSTOM.PLL 文件和 xx模块名.pll 文件这两个文件,而不是只需要编译CUSTOM.PLL文件。
(5) 编译的路径在:$AU_TOP/resource下
编译代码:
frmcmp_batchModule=$AU_TOP/resource/XXAP.pll Userid=apps/apps Module_Type=LIBRARYoutput_file=$AU_TOP/resource/XXAP.plx
frmcmp_batchModule=$AU_TOP/resource/CUSTOM.pll Userid=apps/apps Module_Type=LIBRARYoutput_file=$AU_TOP/resource/CUSTOM.plx
编译完成之后要重新登录EBS系统才能够看到效果。
(6) custom.pll文件中有两个function,一个procedure和四个常量如下:
function zoom_available return BOOLEAN;
function style(event_name varchar2) return integer;
procedure event(event_namevarchar2);
before constant integer := 1;
after constant integer := 2;
override constant integer := 3;
standard constant integer := 4;
第一个函数 zoom_available 很少使用,作用是可根据Form和块名称,激活EBS界面上菜单栏中的
“查看”菜单下的 “缩放(Zoom)”菜单项是否可用
例如当光标定位到采购订单头块上时候,激活Zoom菜单项,成功返回true,失败返回false
function zoom_available returnbooleanis form_name varchar2(30):= name_in(‘system.current_form‘); block_name varchar2(30):= name_in(‘system.cursor_block‘); begin if((form_name =‘POXPOEPO‘and block_name =‘PO_HEADERS‘)or (form_name =‘POXPOERL‘and block_name =‘PO_RELEASES‘))then returntrue; else returnfalse; endif; returnfalse; end zoom_available; |
第二个函数style 指定下面的存储过程event中的触发器事件码执行的方式,是先执行,后执行,还是覆盖。可选的有: custom.before、 custom.after、 custom.override、 custom.standard(默认值)
标准参考代码
function style(event_name varchar2)returnintegeris begin if event_name in(‘SPECIAL10‘,‘SPECIAL11‘,‘SPECIAL12‘)then return custom.override; else return custom.standard; endif; end style; |
第三个存储过程Event才是我们最经常使用的,我们在这里捕获接收Form表单上触发事件,对触发的事件进行处理。我们在这个存储过程中,把每个触发器事件传递到新的PLL文件中做处理。如下图所示
这里我们能够捕获到的触发器事件中有:
ZOOM,WHEN-NEW-FORM-INSTANCE, WHEN-NEW-BLOCK-INSTANCE,WHEN-NEW-RECORDINSTANCE,WHEN-NEW-ITEM-INSTANCE,WHEN-VALIDATE-RECORD,自定义的菜单special1~special45
由于这个字段的这个属性在界面上的个性化中并不能选到,而且DO_KEY中没有内置过程set_item_property,所以我们可以通过在库文件中动态的实现。
代码如下: