racleorm个性化开发

Form个性化开发内容不是很多,在国内的项目上客户化界面上基本用不上,相关开发文档有的讲解的很详细,有的讲解太过简练,希望通过这个文档可以给我们这些刚开始做个性化的新手快速完成需求,不要再这方面花费过多的时间,我们都做过Form开发,可以把Form个性化的开发都用类比Form开发去理解就很快能上手。

Form启动时,所有与当前Function相关的个性化规则都会被加载到内存,当Form触发特定的Event时候,系统会搜索相应的个性化规则并进行匹配,得到匹配的规则,再按照规则序号从小到大一次执行对应的个性化效果。执行完毕后,将该Event会传到Form,执行Form原先定义的处理代码。所以这里注意的是,Form个性化的规则是加在在Form原先定义的程序之前的,如果针对同一个事件,个性化和Form原先定义的程序都处理了,那么个性化的效果就会被Form原先定义的程序所覆盖,看不到个性化效果,这一点需要注意。

公用程序:诊断    是

隐藏诊断菜单项    否

注意事项:

2.     调试模式:关闭,显示调试信息,逐步。

关闭:不使用调试模式,即当Action的类型为Message,Message的Message Type 为“调试“ 的时候,在打开Form界面的时候并不显示“调试”类型的消息。

显示调试信息:允许显示活动(Action)为Message,Message Type为“调试”的消息

逐步:设置为这个模式可以很方便的查看设置的个性化在哪一步起作用了,设置完成个性化之后,每次打开应用界面满足个性化条件的时候都会显示满足那个个性化规则。

3.     对一个界面所加的个性化序号在1到100直接,个性化的执行顺序按照需要的大小的顺序,序号可以是小数。

4.     执行该个性化的条件中的触发器时间,对于Form界面上只能用到五个触发器,并不像在Form Builder 开发工具中使用到很多的触发器,因为个性化效果是在Form代码之前加载的,这五个触发器分别是

WHEN-NEW-FORM-INSTANCE、WHEN-NEW-BLOCK-INSTANCE、WHEN-NEW-RECORD-INSTANCE、WHEN-NEW-ITEM-INSTANCE、WHEN-VALIDATE-RECORD。

还有其它的SPECIALLn(总共45个,最终的结果是在菜单栏的下拉列表中添加一个菜单项,SPECIAL1至15是在Tools菜单下,16至30是在Reports菜单下,31至45在Actions菜单下,需要注意的是,一般Actions菜单不显示,因为它下面没有菜单项目,没有显示的意义,只有在这个菜单下创建了菜单项才会有显示出这个菜单),MENUn(15个)触发器。

有时候我们在个性化的开发中往往不能选准触发器,触发的时间过早会导致界面上相关字段的取值不能取到,触发的时机过迟会导致达不到效果。我们可以把界面设置成显示自定义状态,然后在界面上试着操作,找到我们对应的触发时机,需要打开个性化代码中的“显示自定义选项”的单选框。使用完成后需要关闭。

还需要注意的是,基于Form界面的五个WHEN触发器,不一定在所有的界面中都有,比如说个性化希望加在一些标准界面的查询界面,希望在点击查询按钮的时候对输入的数据经行校验,因为个性化不能加载在按钮上,所以我们想把数据的校验加载在when-validate-record上,但是查询界面并没有存储记录,更新记录,验证记录的要求,也不存在这个触发器。

5.处理模式,也属于一个个性化执行条件,主要是指定个性化是否需要在查询状态下使用,或者仅在查询状态下使用。

6.层,行业,地点,职责,用户,表示限制个性化的产生效果的范围,但是这里的效果并不像配置文件中的用户层设置覆盖职责层,职责层覆盖地点层,层级之间是相互覆盖和重写的的关系。而是或的关系,一条个性化规则只要符合其中一条层级限制,这个个性化规则就会产生作用。

7.界面下端的两个按钮。“插入‘获取’表达式”,“插入项目值”是两个不错的按钮,通过这个按钮可以快速和准确的取得界面上对象的值。

插入‘获取’表达式按钮

ITEM:对象类型,有块(Block),窗口Windows

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对象的值,得到的表达式是常见的

1.验证按钮:判断条件框中的条件是否成立。

2.现在申请按钮:使设置的个性化规则立即生效,不用在重新打开和关闭Form界面,查看个性化规则是否起作用。

第二个界面主要是定义符合条件下执行的动作,总共有四种活动类型,每种类型下又有几种子类型,下面我们给出每一种类型的使用方法。

这个活动类型,类似于我们在Form开发中按F4键打开对象的属性版,设置对象的属性。这些对象包括数据块,数据项,画布,窗口等,这个动作属性也可以用来定义全局变量,局部变量,参数等。

这里的局部变量:与全局变量的使用类似,但是只能在当前form使用,最大长度是4000 bytes,全局变量只有255 bytes,不能在Form的相互调用中使用。

选择这个动作类型的时候,会出现一个按文本选择的按钮,通过Form界面上的提示文本快速选择对象,这个按钮很有用,可以帮我们准确的找到对应的对象。

比如说我如果要修改一个ITEM的LOV的记录组,因为LOV,记录组的命名和字段不是一一对应的,我们仅仅通过帮助里面的诊断查看项不能准确的找到对应的 LOV名称,通过这个查询框,我们可以清楚地看到,那个对象对应那种类型的属性,从而获得属性名称。

触发器事件

WHEN-NEW-FORM-INSTANCE

类型

特性

对象类型

窗口

目标对象

CONC_PROG

特性名称

Title

这里需要注意的是给对象的属性赋值的时候 “=”号的使用

不以“=”开头的值,在加载个性化的时候直接赋值给对象的属性

以“=”开头的值,可以在个性化加载的时候动态的执行内部的查询语句,替换绑定变量,全局变量等。常见的有

根据平时Form开发的过程中使用到选择库存组织的案例可以知道,选择的库存组织ID是存储在Form的parameter参数里面的,下面的查询语句,可以使用这个参数作为绑定变量,动态的获取业务实体的值。

触发器事件

WHEN-NEW-FORM-INSTANCE

设置两个Property类型的活动

序号

10

11

类型

Property

Property

对象类型

item

item

目标对象

特性名称

Value

Value

FROM hr_operating_units hr, ORG_ORGANIZATION_DEFINITIONS ood

FROM hr_operating_units hr, ORG_ORGANIZATION_DEFINITIONS ood

在这里由于SQL语句只能返回字符串,这里需要把数字转换成字符串,原本是错误的做法,好在Oracle会自动转换数据类型。Item的初始化值(INITIAL_VALUE)只能在WHEN-NEW-RECORD-INSTANCE触发器下设置

-INSTANCE 事件下进行改变设置

这里需要注意的是:如果Value的来源是通过select获取时,且是由多部分组合而成,其中的“select语句”这部分需要用()括起来

触发器事件

WHEN-NEW-FORM-INSTANCE

类型

特性

对象类型

Item

目标对象

特性名称

UPDATE_ALLOWED

False

触发器事件

WHEN-NEW-BLOCK-INSTANCE

触发器对象

FND_EXECUTABLES(也可以不填,其他的块没有这个触发器)

执行模式

两者兼有(直接Ctrl+F11查询也要满足)

类型

Property

目标对象

FND_EXECUTABLES

特性名称

DEFAULT_WHERE

executable_id > 4and

APPLICATION_NAME =‘Custom Application‘(红色部分为新增)

这里需要注意的是:(1)触发器的选择 打开界面和按F11,或者直接按Ctrl+F11快捷键 进入查询状态都会触发 when-new-record-instance 触发器,因此这里也可以使用这个触发器。

(2)以前的教程里面介绍刚进入界面的时候通过“获取值”按钮来获取以前的default_where的值,再在其后加入我们需要限定的值,但是这个方法看不到上下文关联的字段。比如这里的通过该按钮只获取到executable_id>4 而得不到与应用产品相关的字段。

是不会对以前的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(上一步中我们自定义的菜单项,这个个性化的触发事件时我们点击这个菜单项的时候出发)

条件

类型

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

函数名

可执行并发程序

参数

第一步打开可执行界面的时候,设置全局变量的初始值: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

目标对象

目标对象

G_EXEC_NAME

变元

EXECUTE_QUERY

特性名称

VALUE

特性名称

VALUE

=NULL(使用完这个全局变量之后,把值置为空,为下一次使用)

触发器事件

WHEN-VALIDATE-RECORD

触发器对象

CONC_PROG

条件

序号

10

序号

11

类型

Message

类型

内置

消息类型

Show

内置类型

RAISE_FORM_TRIGGER_FAILURE

消息文本

必须输入可执行的说明字段

触发器事件

WHEN-NEW-ITEM-INSTANCE

触发器对象

Responsibility

Value

HET INTER ORG(限制个性化加载在某个职责下)

序号

10

序号

11

类型

Builtin

类型

Property

Builtin Type

Create Record Group from Query

对象类型

LOV

Target Object

ORDER_TYPE

Argument

from oe_order_types_v        OT,

oe_workflow_assignments OW,

fnd_lookup_values_vl    flv

and process_name IS NOT NULL

and line_type_id IS NULL

and nvl(wf_item_type, ‘OEOH‘) = ‘OEOH‘

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

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‘‘‘‘resultfromdual–输出一个单引号

第一和第四两个单引号作为字符串的首尾单引号,第二单引号作为转义字符所起的作用的声明第三个单引号作为普通字符输出。

所以上面的insert语句对于字符类型的字段,用了两个单引号括起来,一头一尾两个作为字符串标识,第二和第四个单引号转义第三和第五个单引号

最终执行的insert语句是:insert into student(stu_id,stu_name)values(1001,’smith’);

如果遇到字符串连接符:||又会出现另外一种情况

字符串连接符会分割两个字符串,也就是||符号左右两边的单引号没有任何关系

select‘‘‘||&l_var||‘‘‘resultfromdual–输入2输出 ‘||2||‘

左边第二个单引号转义第三个单引号得到一个单引号作为普通字符,从第一个单引号开始的字符串并没有结束,所以这里的字符串连接符并没有起到分割单引号的作用,而是被看成是普通的字符,但是内部的动态变量还是被解析了。

select‘‘‘‘||&l_var||‘‘‘‘resultfromdual–输入2输出 ‘2‘

左边和右边四个单引号分别得到一个普通的单引号字符(仅包含一个单引号字符的字符串),连接中间的动态变量,得到的输出结果是一个被一对单引号括起来的字符串。

这样就符合上面的Update语句了,更新description字段赋给的值应该是由一对单引号括起来的里面的值

双引号的用法比较简单:

1. SQL语句中以中文作为别名时候需要用双引号括起来

select‘‘‘‘"你好"fromdual–输出一个单引号,列名是:你好

2.字符串中出现双引号只被当作普通字符来看

select‘hh24"小时""mi""分"""ss"秒"‘resultsfromdual;-- hh24"小时""mi""分"""ss"秒"

3. 当出现在to_char的格式字符串中时,双引号有特殊的作用,  就是将非法的格式符包装起来,避免出现ORA-01821: date format not recognized错误。也就是说,去掉双引号和其包含的字符后,剩下的应该是一个合法的格式串。

selectto_char(sysdate,‘hh24"小时"mi"分"ss"秒"‘)resultsfromdual;

-- 21小时39分37秒

规则1

创建打开CSDN博客菜单项

规则2

打开CSDN博客

触发器事件

WHEN-NEW-FORM-INSTANCE

触发器事件

SPECIAL45

活动类型

菜单

活动类型

Buildin

菜单项

SPECIAL45

内置类型

启动URL

变元

第一步在定义并发请求的个性化下定义一个菜单项,点击该该菜单项提交我们执行的请求“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_常州包装‘ ||

‘:::‘ ||

from rcv_shipment_headers rsh, org_organization_definitions ood

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

触发器对象

条件

-- 这里是并发程序的简称

类型

特性

项目

特性名称

Value

执行过程指的是执行数据库中一个包的procedure,function等,而不是Form的内置程序set_item_property()等,在包中能实现的代码这里都能实现,只需要调用就可以了,调用数据库中的过程时可以使用当前界面的字段作为参数。这里不再重复。

(2)在xx模块名.pll文件中新建一个接口包和包体:xx模块名_personalize,里面定义一个存储过程

procedure event(eventvarchar2);接收传递过来的触发器事件

xx模块名_personalize.event(event_name);这样,我们的客户化代码都可以放在xx模块名.pll这个library里面,降低了风险。

(5)    编译的路径在:$AU_TOP/resource下

编译代码:

function  zoom_available              return BOOLEAN;

functionstyle(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

functionzoom_availablereturnbooleanis

begin

if((form_name=‘POXPOEPO‘andblock_name=‘PO_HEADERS‘)or

(form_name=‘POXPOERL‘andblock_name=‘PO_RELEASES‘))then

returntrue;

else

returnfalse;

endif;

returnfalse;

endzoom_available;

标准参考代码

functionstyle(event_namevarchar2)returnintegeris

begin

ifevent_namein(‘SPECIAL10‘,‘SPECIAL11‘,‘SPECIAL12‘)then

else

endif;

endstyle;

第三个存储过程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,所以我们可以通过在库文件中动态的实现。

代码如下:

procedureevent(eventvarchar2)is

--获取值只能用name_in()

begin

andform_name=‘WSHFSTRX‘

andblock_name=‘QM_DLVB‘

andevent_name=‘WHEN-NEW-ITEM-INSTANCE‘--限定触发的时机

anditem_name=‘DLVB_SOURCE_HEADER_NUMBER_LO‘

then

validate_from_list,

property_true);

--动态设置item的属性,LOV验证有效

endif;

endevent;

在上面一个个性化中我们限制了个性化仅在一个职责下面有效,如果我们的个性化要新增职责或者是用户等,我们都要修改代码,修改后还要重新登录系统,不利于后期的维护。通常我们的做法是把职责和用户都维护在一个快码里面,这样的话后期做改动就比较方便了。我们这个个性化程序取值逻辑上有点繁琐,这里只把实现过程用到的一些方法做一些介绍。

PROCEDURE set_supplier_branch_number(p_event IN VARCHAR2) IS

l_supplier_branch_number VARCHAR2(100);

l_approval_status        VARCHAR2(100);

BEGIN

--AP header Invoices

IF form_name = ‘APXINWKB‘ AND --

block_name = ‘INV_SUM_FOLDER‘ AND --

p_event = ‘WHEN-VALIDATE-RECORD‘ AND --

-- 检测当前的职责是否在我们维护的快码之内,调用外部过程做处理,避免代码冗余

-- 如果发票号存在,检测发票状态是否已经审批,调用的是标准的程序包接口

ELSE

l_approval_status := ‘NEW‘;

END IF;

l_supplier_branch_number IS NULL AND --

l_approval_status NOT IN (‘CANCELLED‘) THEN

NULL,

-- 给目标弹性域段赋值,赋值只能用copy

END IF;

END IF;

END set_supplier_branch_number;

验证当前职责是否满足条件的验证函数

functionap_branch_enable_resp(p_resp_appl_idinnumber,

p_resp_idinnumber)returnbooleanis

l_returnboolean;

l_countnumber;

begin

l_count:=;

selectcount(1)

intol_count

fromxxap_lookups xl,fnd_responsibility_vl frv

where1=1

ifl_count>then

l_return:=true;

else

l_return:=false;

endif;

returnl_return;

exception

whenothersthen

returnfalse;

endap_branch_enable_resp;

在采购订单界面的Actions菜单下添加一个菜单项

procedureevent(eventvarchar2)is

begin

ifform_name=‘POXPOEPO‘andblock_name=‘PO_HEADERS‘and

event=‘WHEN-NEW-FORM-INSTANCE‘then

--添加菜单项

‘Print Purchase Order &Again‘,

‘‘,

true,

‘LINE‘);

endif;

--为菜单事件添加逻辑

if(event_name=‘SPECIAL45‘)then

if(form_name=‘POXPOEPO‘andblock_name=‘PO_HEADERS‘)then

/* Add your Print Order logic here */

raiseform_trigger_failure;

endif;

endif;

--带复选框的菜单

if(event_name=‘WHEN-NEW-FORM-INSTANCE‘)then

--带复选框菜单

‘TEST_CHECKBOX‘,

‘‘,

true,

‘LINE‘);

--设置复选框勾选

--获取复选框状态

else

endif;

endif;

endevent;

第一个参数option_name:

将SPECIAL1传送到SPECIAL45,以指示您想放置功能的特殊菜单上的插槽。SPECIAL1位于三个特殊菜单中的第一个的顶部,SPECIAL15位于第一个特殊菜单的底部。SPECIAL16位于三个特殊菜单中第二个的顶部,SPECIAL30位于第二个特殊菜单的底部。SPECIAL31位于三个特殊菜单的第三个的顶部,SPECIAL45位于第三个特殊菜单的底部。当实例化任何菜单条目时,将启用相应特殊菜单的顶级菜单。

传递SPECIAL,SPECIAL_B或SPECIAL_C以显式控制三个顶级特殊菜单之一。 SPECIAL位于三个特殊菜单中的第一个的顶部,SPECIAL_B位于第二个特殊菜单的顶部,SPECIAL_C位于第三个特殊菜单的顶部。这通常用于显式地启用或禁用顶级条目。

第二个参数:hint

您的菜单项标签。传递翻译后的字符串(如果要翻译表单,应在消息字典中定义消息,先检索消息,然后将检索到的消息字符串传递给APP_SPECIAL)。在字符串中包含一个“&”,以定义哪个字符成为该项的快捷键(这与OracleForms Form Builder中的行为相同,例如,‘&Book Orders‘,这时候字符“B”就是快捷键)。您可以更改SPECIAL_B(报告)或SPECIAL_C(操作)的标签,但不能更改SPECIAL菜单(工具)的标签。此外,您不能为SPECIAL_B或SPECIAL_C指定访问密钥。

第三个参数icon(图标)

如果要在功能的工具栏上包含图标按钮,请指定图标的名称。

第四个参数:initially_enabled

一个布尔值,用于设置菜单项的初始状态。如果您不想在应用程序启动时启用该项目,请传递FALSE。 默认值为TRUE。

第五个参数:separator

通过“LINE”在菜单条目上方显示菜单分隔符行。对于SPECIAL1(_CHECKBOX),SPECIAL16或SPECIAL31,将忽略LINE参数。 默认是没有行。

广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员

THE END
0.单引号和双引号的区别单引号和双引号的区别 单引号与双引号的用法在多数情况下相似,其唯一的差异在于:单引号‘’可以在双引号“”内部使用,而双引号“”则不能在单引号‘’内部使用。简而言之,当需要在引号内部再使用引号时,外层应使用双引号,内层则使用单引号。 1使用引号时的注意事项 引语通常用于引用他人的话语,包括成语、格言、诗词等,也涵盖拟声jvzq<84yyy4hcxxcp0ipo8lcqmgp1:5365>80qyon
1.C语言单引号(‘‘)与双引号(““)的区别C语言中单引号(‘’)与双引号(“”)的区别详解 在C语言编程中,单引号和双引号看似相似,实则有着天壤之别。本文将深入探讨它们的区别,帮助初学者避免常见的语法错误。 基本概念 单引号(‘’) -字符常量 单引号用于表示单个字符,在C语言中称为字符常量。 jvzquC41dnuh0lxfp0tfv8Ptcv€ek|ygnp5bt}neng5eg}fknu527<793474
2.你真的了解Python吗?单引号,双引号,三引号有什么区别?写Python脚本时,使用引号定义字符串内容;在Python中,可以使用三种引号,分别是单引号,双引号,三引号等,这三种引号都用来定义字符串,那使用起来有什么区别吗? 先说一下单引号,双引号 单引号和双引号都都是用来定义一个字符串: 实际上单引号和双引号的用法任何区别! jvzquC41yy}/7:hvq0ipo8ftvkimg8;239=90qyon
3.javasql单引号双引号sql双引号和单引号的区别SQL 中使用单引号表示字符串(双引号对于原生 SQL 来说只是普通字符)。 不过,现在很多衍生版的 SQL,比如 MySQL 中即可以使用单引号也可以使用双引号。 注:SQL 字段(列名)不需要用字符串表示 关于单引号和双引号 Python中单引号和双引号都表示字符串,本质没有区别 jvzquC41dnuh0>6evq4dqv4wa38:;>4::9<629
4.双引号之间用不用顿号双引号的用法双引号之间不要加顿号,根据《标点符号用法》说明:标有引号的并列成分之间、标有书名号的并列成分之间通常不用顿号。若有其他成分插在并列的引号之间或并列的书名号之间,宜用顿号。 双引号之间用不用顿号 双引号之间不要加顿号,从表述功能上看,并列的引号之间、并列的书名号之间无论实际上有没有停顿,不使用顿号都jvzq<84yyy4dj~xcp0ipo8jqpmlcx455:6847mvon
5.C语言简明讲解单引号与双引号的使用C语言这篇文章主要介绍了在C语言里单引号和双引号的使用,本文通过实例代码说明了单引号和双引号的概念与各自的用法,以下就是详细内容,需要的朋友可以参考下+ 目录 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!【 如果你想靠AI翻身,你先需要一个靠谱的工具!】 一、单引号和双引号 C语言中的单引号用来表示字符jvzquC41yy}/lk:30pku1jwvkerf1;9735>/j}r
6.单引号双引号与反引号的区别js单引号和双引号区别每一个编程语言都有引号,但作用和用法略有区别。JS也存在单引号、双引号与反引号,其用法与其他语言也有所区别。 1.单引号&双引号 JS 中单引号和双引号无任何区别,二者均用于表示字符串字面量。 vars0='dable is fish'vars1="dable is fish"console.log(s0===s1)// true jvzquC41dnuh0lxfp0tfv8P568Q46?4ctvodnn4fgvgjn|4334;52;:4
7.英语标点符号有两种主要风格,那么引号中的引号是单引号还是双引号你也可以在引号中使用引号——也就是说,你可以把引号放在其他引号周围,你可以放在它们自己的引号里面或外面。 一、引号的类型 在英语语法中,我们有基本的引号类型:单引号、哈佛引用格式和双引号。 单引号放在其他文本中,而双引号将整个短语括起来。哈佛引用格式的引号将整个句子括起来,应始终与其他标点符号一起使用jvzquC41yy}/5?5fqe4dp8ftvkimg862;3694=94a36:39=4668/j}rn
8.双引号和单引号有什么区别呢?佰草伐双引号和单引号有什么区别呢? 1.双引号解析变量,但是单引号不解析变量。 2.在双引号里面插入变量,变量后面如果有英文或中文字符,它会把这个字符和变量拼接起来,视为一整个变量。一定要在变 量后面接上特殊字符,例如空格等分开。 3.如果在双引号里面插变量的时候,后面不想有空格,可以拿大括号将变量包起来。大理石jvzquC41yy}/ewgnqiy/exr1hwxvkqzc1r5249;285?/j}rn
9.python中单引号和双引号的区别是什么?在Python中,单引号和双引号在性能上没有区别。2.我应该在代码中统一使用单引号还是双引号吗?较好是在项目中选择一种风格并坚持使用,以保持代码的一致性和可读性。3.三引号与单引号和双引号有何不同?三引号(”’或”””)用于定义多行字符串,而单引号和双引号则用于定义单行字符串。4.如何在单引号或双引号字符串中使用相同jvzq<84yyy4nqknngvxbkw3qti5bdxzv1DHT1;6247
10.python中的单引号和双引号的区别和用法因此通过这种方式,在合适的场景下采用单引号,或者双引号,就可以非常有效的避免转义字符的使用,并且可以使代码看起来更加简洁清晰。 参考文献: 链接:link. 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规jvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk04:;798:
11.python中单引号和双引号的区别是什么–PingCode在Python编程语言中,单引号(’)和双引号(”)主要用于定义字符串,它们在功能上没有本质区别。本文将讨论它们在定义方式、使用场景、与其他语言的一致性、转义字符的使用等方面的细微差异。例如,在定义包含引号的字符串时,可以使用双引号包裹单引号,或使用单引号包裹双引号,以避免使用转义字符。正文将对这些情况进行更jvzquC41fqit0ynpieueg7hqo1gtm89;;5
12.Python中单引号双引号和三引号具体的用法及注意点python在Python中,引号内的内容都是字符串类型的。而引号又有单引号、双引号、三引号,具体的用法以及注意点如下: 一、单引号、双引号交叉使用 单引号和双引号都是用来表示字符串,在一般情况下两者没有任何差别,下面两句输出的结果都是 今天天气真好! 1 2 jvzquC41yy}/lk:30pku1y~vjqt04B72826hc7mvo
13.C语言中双引号和单引号有什么区别在C语言中,双引号(”“)和单引号(’‘)有以下区别: 字符串字面量 vs 字符字面量: 双引号(”“)用于表示字符串字面量(String Literal),即由多个字符组成的序列。例如:”Hello, World!” 单引号(’‘)用于表示字符字面量(Character Literal),即只包含一个字符的常量。例如:’A’, ‘5’ jvzq<84yyy4nqknngvxbkw3qti5bdxzv1DHT1;:539=/j}rn