OracleEBSForm个性化地项目的应用实例.docx
《OracleEBSForm个性化地项目的应用实例.docx》由会员分享,可在线阅读,更多相关《OracleEBSForm个性化地项目的应用实例.docx(44页珍藏版)》请在冰豆网上搜索。
![OracleEBSForm个性化地项目的应用实例.docx](https://file1.bdocx.com/fileroot1/2023-6/15/cf9261ea-a88f-48c4-86e8-493817fef8df/cf9261ea-a88f-48c4-86e8-493817fef8df1.gif)
OracleEBSForm个性化地项目的应用实例
FORM个性化的应用实例
文档作者:
YangHe
创建日期:
5/20/2007
最近更新:
4/28/2022
控制编号:
FORM个性化V1.0
文档版本:
1.0
审批:
松下
富士通
汉得
拷贝数_____
文档控制
变更记录
日期
作者
版本
变更参考
5/20/2007
YangHe
1
新创建的文档
审阅
姓名
职位
分发
拷贝数
姓名
地点
1
1
1
1
(9-Dec-96)
(9-Dec-96)
概述
FORM个性化是.10新增的功能。
通过个性化设置,我们可以不必去修改ORACLE的FORM源码而实现FORM标准功能的修改,因为个性化代码是独立储存在数据库表中的,FORM的升级均对此无影响。
所以在项目上要对FORM进行修改时,如果能行,最好还是用FORM个性化来实现
这里顺便提下两个预置文件,一个是’HideDiagnosticsmenuentry’,用来控制help菜单下的Diagnostics是否隐藏,默认为不隐藏。
一个是’Utilities:
Diagnostics’用来控制进入诊断模式时是否需要apps密码,默认为需要密码。
根据具体需要看是否设置。
FORM个性化触发器事件有五个FORM自带的触发器动作:
WHEN-NEW-FORM-INSTANCE、WHEN-NEW-BLOCK-INSTANCE、WHEN-NEW-RECORD-INSTANCE、WHEN-NEW-ITEM-INSTANCE、WHEN-VALIDATE-RECORD以及MENU、SPECIAL(点击自定义的菜单动作,最后的例子中我们可以看到)。
通过这些触发器事件,我们可以实现改变ITEMS\BLOCKS\CANVASES\WINDOWS\REGIONS等的属性及值、执行FORM的内置函数、显示错误\警告\MESSAGE信息、显示DEBUG信息、自定义一个菜单项来执行应用中的某功能、创建一个全局变量来传递信息等。
FORM个性化操作起来比较简单,ORACLE有一个专门的文档对其进行介绍的,详见METALINKNote:
279034.1。
这里简单介绍一下在实际项目中的几个应用。
安装环境
硬件平台:
IBM
操作系统及版本:
OracleRDBMS版本:
9.2.0.6.0
OracleEBS版本:
11.5.10.2
安装前准备
以上操作,如有疑问,请向系统管理员寻求帮助。
阅读说明及约定
❑本文中蓝色字体为需要注意的内容。
❑本文中红色字体为特别重要的内容。
❑本文中黑色粗体10号字为输入的命令。
(2-Dec-96)
(2-Dec-96)
(9-Dec-96)
FORM个性化
以下介绍的几个FORM个性化应用大部分是基于上海协亨信息科技有限公司ERP项目的实际开发。
协亨项目ORACLE销售订单录入控制
项目背景及业务需求:
协亨手机连锁销售集团是一家主要经营手机销售的连锁零售企业。
其在全国有几百家门店,当门店的POS系统上线后,日常销售都是在POS系统中完成的,通过接口传给ORACLE自动生成销售订单,在ORACLE中我们禁止手工录入这个门店的销售订单。
具体的控制方法是:
把订单头的销售员设置成必录字段。
在离开该字段的时候添加校验:
根据销售员查找门店信息,若找不到,表示这是跟门店无关的销售,不控制。
若找到,则判断该门店是否已经POS上线,如果已经是POS上线的并且POS控制类型=现实门店,那么就不能通过验证。
否则可以通过。
销售超级用户职责/订单;退货/销售订单/帮助/诊断/自定义代码/个性化
在Oracle的订单录入界面,禁止录入这个门店的销售订单。
在销售订单FORM下进入FORM个性化:
FORM个性化界面
条件伪代码:
销售员id在客户化表XH_SHOP_INFO中有对应的有效门店,且POS上线日期非空,且门店类型为现实门店。
序号
说明
触发器事件
触发器对象
条件
10
FORBIDSOIMP0RT
WHEN-VALIDATE-RECORD
ORDER
:
ORDER.SALESREP_IDIN(SELECTSALESREP_IDFROMXH_SHOP_INFOWHERENVL(END_DATE_ACTIVE,SYSDATE+1)>TRUNC(SYSDATE))
AND(SELECTPOS_ONLINE_DATEFROMXH_SHOP_INFOWHERENVL(END_DATE_ACTIVE,SYSDATE+1)>TRUNC(SYSDATE)
ANDSALESREP_ID=:
ORDER.SALESREP_ID)ISNOTNULL
AND(SELECTPOS_CONTROL_TYPEFROMXH_SHOP_INFOWHERENVL(END_DATE_ACTIVE,SYSDATE+1)>TRUNC(SYSDATE)
ANDSALESREP_ID=:
ORDER.SALESREP_ID)='REAL'
活动
符合条件的记录在保存时报以下错误:
该销售员对应的门店POS已上线,不允许在ORACLE录入订单
序号
类型
消息类型
消息文本
10
消息
错误
该销售员对应的门店POS已上线,不允许在ORACLE录入订单
同时对订单行也要进行限制
序号
说明
触发器事件
触发器对象
条件
10
FORBIDSOIMP0RTLINE
WHEN-VALIDATE-RECORD
LINE
:
ORDER.SALESREP_IDIN(SELECTSALESREP_IDFROMXH_SHOP_INFOWHERENVL(END_DATE_ACTIVE,SYSDATE+1)>TRUNC(SYSDATE))
AND(SELECTPOS_ONLINE_DATEFROMXH_SHOP_INFOWHERENVL(END_DATE_ACTIVE,SYSDATE+1)>TRUNC(SYSDATE)
ANDSALESREP_ID=:
ORDER.SALESREP_ID)ISNOTNULL
AND(SELECTPOS_CONTROL_TYPEFROMXH_SHOP_INFOWHERENVL(END_DATE_ACTIVE,SYSDATE+1)>TRUNC(SYSDATE)
ANDSALESREP_ID=:
ORDER.SALESREP_ID)='REAL'
活动
序号
类型
消息类型
消息文本
10
消息
错误
该销售员对应的门店POS已上线,不允许在ORACLE录入订单
看实际中的应用情况:
录入销售订单,销售人员为’1112073曹杨二店’,该店POS_ONLINE_DATE不为空,且POS_CONTROL_TYPE=‘REAL’,即POS上线日期非空,且门店类型为现实门店。
新增一条规则,设置销售人员为必需字段
序号
说明
触发器事件
触发器对象
条件
10
设置销售人员为必输字段
WHEN-NEW-RECORD-INSTANCE
ORDER
活动
序号
类型
对象类型
目标对象
特性名称
值
10
特性
项目
ORDER.SALESREP_MIR
REQUIRED(APPLICATIONSCOVER)
真
看实际中的应用情况:
当我们新建一个销售订单,可以看到,销售人员变成了必输字段。
协亨项目ORACLE子库存转移控制
业务需求:
协亨门店的POS上线前,直接在ORACLE中做子库存转移。
POS系统上线后,所有的调拨业务都是在POS中进行的,通过接口传给ORACLE自动做子库存转移,在ORACLE中禁止手工录入该门店对应的子库转移。
库存超级用户职责/事务处理/子库存转移/事务处理行/帮助/诊断/自定义代码/个性化
在子库存转移界面,在[子库存]及[目标子库存]两个字段上,在离开该字段的时候添加校验:
根据子库存的门弹性域查找门店信息,判断该门店是否已经POS上线,如果已经是POS上线的并且POS控制类型=现实门店,那么就不能通过验证。
否则可以通过。
即如果在对应门店已上线的子库做子库存转移,在保存时会出现以下错误:
序号
说明
触发器事件
触发器对象
条件
10
FORBIDSUBINVTRANSFER
WHEN-VALIDATE-RECORD
MTL_TRX_LINE
(SELECTPOS_ONLINE_DATEFROMXH_SHOP_INFOXS
WHERENVL(END_DATE_ACTIVE,SYSDATE+1)>TRUNC(SYSDATE)
ANDXS.SHOP_NUMBER=(SELECTMSI.ATTRIBUTE1FROMMTL_SECONDARY_INVENTORIESMSI
WHERENVL(MSI.DISABLE_DATE,SYSDATE)>TRUNC(SYSDATE)
ANDMSI.SECONDARY_INVENTORY_NAME=:
MTL_TRX_LINE.SUBINVENTORY_CODE))ISNOTNULL
AND(SELECTPOS_CONTROL_TYPEFROMXH_SHOP_INFOXS
WHERENVL(END_DATE_ACTIVE,SYSDATE+1)>TRUNC(SYSDATE)
ANDXS.SHOP_NUMBER=(SELECTMSI.ATTRIBUTE1FROMMTL_SECONDARY_INVENTORIESMSI
WHERENVL(MSI.DISABLE_DATE,SYSDATE)>TRUNC(SYSDATE)
ANDMSI.SECONDARY_INVENTORY_NAME=:
MTL_TRX_LINE.SUBINVENTORY_CODE))='REAL'
活动
序号
类型
消息类型
消息文本
10
消息
错误
子库存对应的门店POS已上线,不允许在ORACLE中进行子库存转移
序号
说明
触发器事件
触发器对象
条件
10
FORBIDSUBINVTRANSFER2
WHEN-VALIDATE-RECORD
MTL_TRX_LINE
(SELECTPOS_ONLINE_DATEFROMXH_SHOP_INFOXS
WHERENVL(END_DATE_ACTIVE,SYSDATE+1)>TRUNC(SYSDATE)
ANDXS.SHOP_NUMBER=(SELECTMSI.ATTRIBUTE1FROMMTL_SECONDARY_INVENTORIESMSI
WHERENVL(MSI.DISABLE_DATE,SYSDATE)>TRUNC(SYSDATE)
ANDMSI.SECONDARY_INVENTORY_NAME=:
MTL_TRX_LINE.TRANSFER_SUBINVENTORY))ISNOTNULL
AND(SELECTPOS_CONTROL_TYPEFROMXH_SHOP_INFOXS
WHERENVL(END_DATE_ACTIVE,SYSDATE+1)>TRUNC(SYSDATE)
ANDXS.SHOP_NUMBER=(SELECTMSI.ATTRIBUTE1FROMMTL_SECONDARY_INVENTORIESMSI
WHERENVL(MSI.DISABLE_DATE,SYSDATE)>TRUNC(SYSDATE)
ANDMSI.SECONDARY_INVENTORY_NAME=:
MTL_TRX_LINE.TRANSFER_SUBINVENTORY))='REAL'
序号
类型
消息类型
消息文本
10
消息
错误
目标子库存对应的门店POS已上线,不允许在ORACLE中进行子库存转移
协亨项目ORACLE杂项事务处理控制
业务需求:
协亨门店的POS上线前,可以直接在ORACLE中做杂项事务处理。
POS系统上线后,门店的盘点是在POS中做的,通过接口传给ORACLE自动做杂项事务处理。
此时在ORACLE中禁止手工录入该门店对应的杂项事务处理。
库存超级用户职责/事务处理/杂项事务处理/事务处理行/帮助/诊断/自定义代码/个性化
在杂项库存事务处理界面,在[子库存]字段上,在离开该字段的时候添加校验:
根据子库存的门弹性域查找门店信息,判断该门店是否已经POS上线,如果已经是POS上线的并且POS控制类型=现实门店,那么就不能通过验证。
否则可以通过。
即如果在对应门店已上线的子库做子库存转移,在保存时会出现以下错误:
序号
说明
触发器事件
触发器对象
条件
10
FORBIDMISCELLTRANSFER
WHEN-VALIDATE-RECORD
MTL_TRX_LINE
(SELECTPOS_ONLINE_DATEFROMXH_SHOP_INFOXS
WHERENVL(END_DATE_ACTIVE,SYSDATE+1)>TRUNC(SYSDATE)
ANDXS.SHOP_NUMBER=(SELECTMSI.ATTRIBUTE1FROMMTL_SECONDARY_INVENTORIESMSI
WHERENVL(MSI.DISABLE_DATE,SYSDATE)>TRUNC(SYSDATE)
ANDMSI.SECONDARY_INVENTORY_NAME=:
MTL_TRX_LINE.SUBINVENTORY_CODE))ISNOTNULL
AND(SELECTPOS_CONTROL_TYPEFROMXH_SHOP_INFOXS
WHERENVL(END_DATE_ACTIVE,SYSDATE+1)>TRUNC(SYSDATE)
ANDXS.SHOP_NUMBER=(SELECTMSI.ATTRIBUTE1FROMMTL_SECONDARY_INVENTORIESMSI
WHERENVL(MSI.DISABLE_DATE,SYSDATE)>TRUNC(SYSDATE)
ANDMSI.SECONDARY_INVENTORY_NAME=:
MTL_TRX_LINE.SUBINVENTORY_CODE))='REAL'
活动
序号
类型
消息类型
消息文本
10
消息
错误
子库存对应的门店POS已上线,不允许在ORACLE中进行杂项事务处理
添加菜单项调用系统功能
同时对订单行也要进行限制
以下是个性化的执行效果。
在tools菜单里增加了一个菜单项Executable,点击可以调出该并发程序所对应的可执行界面。
调出结果如下:
整体逻辑:
打开并发程序定义界面,在Tools菜单栏下新加一个菜单项。
点击该菜单时,如果并发程序名为空,则报一个错误。
如果可执行名非空,增加一个全局变量,储存可执行的名称。
点击新增的菜单项,可以打开可执行FORM。
当打开可执行FORM时,对上述定义的全局变量进行初始化。
进入查询模式。
将全局变量的值赋予可执行名称项值。
进行查询。
清除全局变量的值。
以下是step_by_step编辑详情
1、打开并发程序定义界面,再打开FORM个性化界面,定义一个名为Executable的个性化规则,对应的触发器事件为WHEN-NEW-FORM-INSTANCE
2、在Actions里,增加一个Menu类型,其中MenuEntry选择’SPECIAL1’(SPECIAL1至15是在Tools菜单下,16至30是在Reports菜单下,31至45在Actions菜单下),MenuLabel输入’Executable’(即菜单项标签),IconName为’CONC_PROG’即并发程序FORM对应的BLOCK
3、保存,打开可执行界面,可以看到新增的菜单项,点击,没有事件发生。
4、在可执行界面下,打开FORM个性化界面,我们增加一个事件为,如果可执行的名称为空,则报一个错误’PleaseEnterExecutableName!
’
新增一个个性化规则CheckExecutableName,TriggerEvent为SPECIAL1,条件为可执行名称为空。
即’:
CONC_PROG.EXECUTABLE_NAMEISNULL’
5、在Actions下,设置一个Meassage类型,MessageType为Error,MessageText为PleaseEnterExecutableName!
6、保存。
打开并发程序定义界面,ExecutableName项为空,直接点击Executable。
7、出现错误信息:
PleaseEnterExecutableName!
8、在并发定义界面下,打开FORM个性化界面。
我们先定义一个全局变量,储存可执行的名称,在后面中要用到。
新增一个名为ExcutableEntered的个性化规则,TriggerEvent为SPECIAL1,条件为:
CONC_PROG.EXECUTABLE_NAMEisnotnull
9、在Actions里加入一个Property类型,ObjectType为GlobalVariable即全局变量,变量名为XX_XH_EXECUTABLE_NAME,为了便于区分,我们FORM个性化的全局变量全部以XX_开头。
PropertyName为VALUE,Value为=:
CONC_PROG.EXECUTABLE_NAME(前面有=号,如果不加等号的话,会被赋值为’:
CONC_PROG.EXECUTABLE_NAME’)。
10、再增加一个Builtin类型,BuiltinType为LunchaFunction即调用一个功能,FunctionCode为FND_FNDCPMFE即可执行对应的功能,FunctionName会被自动调出。
11、保存。
打开并发程序界面,查找一个并发程序,点击Tools>Executable,可以看到可执行定义界面被调出,但是没有数据。
12、关闭并发请求界面,打开可执行界面,再打开FORM个性化界面。
新增加一个FORM个性化规则INITXX_XH_EXECUTABLE_NAME,触发器事件为WHEN-NEW-FORM-INSTANCE。
我们做这个个性化规则的目的是初始化全局变量INITXX_XH_EXECUTABLE_NAME。
13、在Actions下,增加一个Property类型,ObjectType为GlobalVariable,变量名为XX_XH_EXECUTABLE_NAME。
PropertyName为INITIALVALUE(注意与VALUE的区别,VALUE是直接赋值,而INITIALVALUE为如果该变量为null或未被创建,会被赋初值,如果有值的话,则不会覆盖),Value为=null。
这个个性化的目的是为了直接打开该FORM时,后面定义的用到此全局变量的个性化规则有效。
14、新增一条名为EnterQuery的个性化规则。
触发器的事件为WHEN-NEW-FORM-INSTANCE,条件为:
global.XX_XH_EXECUTABLE_NAMEisnotnull。
即上面定义的那个全局变量的值不为空时才会执行。
15、在Actions,设置一个Builtin类型,BuiltinType为DO_KEY,就像在FORM中直接执行的语句。
设置Argument为ENTER_QUERY即进入查询模式。
16、新增一条名为’ExecuteQuery’个性化规则,触发器项为WHEN-NEW-RECORD-INSTANCE,对象为FND_EXECUTABLES,条件为:
global.XX_XH_EXECUTABLE_NAMEisnotnull。
ProcessingMode改为OnlyinEnter-QueryMode。
主要是能在查询模式下继续执行该代码,如果不改在并发程序界面调出可执行界面时,可执行会停在查询模式里。
17、在Actions里,设置type为Property,ObjectType为Item,TargetObject为FND_EXECUTABLES.EXECUTABLE_NAME,PropertyName为VALUE,Value为=:
global.XX_XH_EXECUTABLE_NAME。
18、增加一个Builtin类型,BuiltinType为DO_KEY,Argument为EXECUTE_QUERY。
即进行FND_EXECUTABLES.EXECUTABLE_NAME的值等于全局变量的查询。
19、新增一条名为ClearXX_XH_EXECUTABLE_NAMEValue个性化规则。
触发器事件为WHEN-NEW-RECORD-INSTANCE,对象为FND_EXECUTABLES,条件为:
global.XX_XH_EXECUTABLE_NAMEisnotnull
20、在Actions里,设置Type为Property,ObjectType为GlobalVariable,TargetObjectXX_XH_EXECUTABLE_NAME,PropertyName为VALUE,Value为=null,即查询完之后将该全局变量的值清空。
21、以下是执行情况。
已解决和未解决的问题
未解决问题
编号
问题
解决方法
责任人
完成日期
影响
已解决问题
编号
问题
解决方法
责任人
完成日期
影响
(9-Dec-96)