EBS Form开发总结.docx
- 文档编号:4690247
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:41
- 大小:39.80KB
EBS Form开发总结.docx
《EBS Form开发总结.docx》由会员分享,可在线阅读,更多相关《EBS Form开发总结.docx(41页珍藏版)》请在冰点文库上搜索。
EBSForm开发总结
OracleERP
E-BUSINESSSUITE
Form开发总结
文档作者:
何云
创建日期:
2012-02-12
更新日期:
2015-02-10
文档编码:
MD070
当前版本:
1.1
审批者:
用户项目经理:
信息部项目经理:
外包方项目经理:
文档控制
1.1.更新记录
日期
作者
版本
变更参考
2012-02-12
何云
1.0
建立
2015-02-10
何云
1.1
更新
1.2.审阅记录
姓名
职位
签字
1.3.分发人员
编码
姓名
地点和位置
签名
1
2
3
4
1.前言
在学习form的过程中,平时有在写一些关于form开发的笔记,不过内容都比较零散,没有归纳成一篇较为全面的总结文档。
在此基础上,写下一份针对form开发较为系统的个人总结。
本次总结主要以我目前所做过的form开发为基础,内容未必覆盖form开发的全部内容,部分功能的实现方法和步骤的先后顺序也未必最佳,日后将不断完善。
以下出现的代码中,浅蓝色部分为在实际开发需要变化的部分。
2.基本步骤
以下为开发一个普通头行结构,带有非TAB的Folder功能的Form的基本步骤。
2.1环境设置
仅在第一次开发EBSR12FORM时进行此步。
从安装EBS的服务器上下载resource文件夹,路径位于$AU_TOP/resource。
从安装EBS的服务器上下载fmb文件,路径位于$AU_TOP/form/ZHS和$AU_TOP/form/US。
在注册表中,将以上3个路径写到Forms_Path(在注册表中搜索即可找到)中,格式是:
resource路径;form的ZHS路径;form的US路径。
2.2新建fmb
复制模板TEMPLATE.fmb创建一个新的fmb文件,改名为:
3位应用简称+3位模块简称+2位功能简称,名称最好不长于11位字符。
名称不可使用小写字母,否则在ebs中运行会出错。
2.3添加对象
1.STANDARD_FOLDER
如果不用forlder可以跳过此步,但考虑到日后对form布局的维护,一般情况下的多行块都建议做成folder形式。
从APPSTAND.fmb中复制STANDARD_FOLDER对象组至在开发中的form,复制时选择子类,不可修改。
2.APPFLDR
如果不用forlder可以跳过此步。
在附加的库中添加APPFLDR.pll,选择移除绝对路径。
2.4建立主体对象
1.窗口
删除模板自带窗口BLOCKNAME并新建窗口,主WINDOW建议起名为MAIN或MAIN_WIN,便于维护。
为主WINDOW设置窗口名称、最小化窗口名称和主画布,并把子类设置为WINDOW。
在form级触发器pre-form中添加以下代码:
app_window.set_window_position('MAIN','FIRST_WINDOW');
有时候自己做的form运行时跑出来的界面却不是自己做的界面,很可能就是因为没有删除BLOCKNAME对象且没有修改以上这句代码中的第一个参数。
2.画布
删除模板自带画布BLOCKNAME并新建画布,主CANVAS建议起名为MAIN,便于维护。
为主画布设置窗口,并把子类设置为CANVAS。
为实现folder功能,还至少需要一个用来放置非固定列的画布,子类选择CANVAS_STACKED。
画布的上下顺序对堆叠的效果有影响,将置于底层的画布放置在上方。
3.数据块
删除模板自带数据块BLOCKNAME。
先在数据库中创建好需要的视图,需要带有基表的ROWID,并起别名为ROW_ID。
一般较少直接使用基表,这样会降低程序的灵活性。
再使用数据库创建向导建立对应的数据块。
Header块及Line块的固定列放置在主画布上,Line块的非固定列放置在堆叠画布上。
Line块需要有滚动条,且滚动条放置于MAIN画布上。
在Header块中找到刚创建的关系,在属性中把防止无主记录操作选成是。
手动创建一个数据块CONTROL(一般按钮放于此),属性中的数据库数据块选择否。
手动创建一个提示数据块(folder需要),属性中的数据库数据块选择否。
Header块的导航,导航器样式选择改变数据块,前一个数据块选择自身,后一个数据块选择Line块,使用户能从Header导航至Line。
Line块的导航,导航器样式选择改变记录,前一个数据块选择Header块,后一个数据块选择自身,使用户能从一行导航至下一行。
将全部块的子类设置为BLOCK。
根据需要对Header块和Line块的数据库属性,包括允许查询、允许插入、允许更新和允许删除等,做出调整。
注意点:
1.块名长度不可大于22。
2.头行结构设置级联删除时,系统会自动添加一个pre-delete触发器代码。
2.5初始化参数
1.库存组织参数
如果form中的操作不需要区别不同的库存组织,可以跳过此步。
增加4个参数:
number型的ORG_ID;
char型的ORG_CODE;
char型的ORG_NAME;
number型的CHART_OF_ACCOUNTS_ID。
可以手动创建。
也可以从INVSTAND.fmb的对象组中将INV_PARAMS拖到正在开发的form的对象组中,选择子类。
在form级触发器pre-form中添加以下代码:
FND_ORG.CHOOSE_ORG;
用户在打开form前就需要选择库存组织,库存组织的相应信息会被保存在以上4个参数中。
在form级触发器when-new-form-instance中添加以下代码:
app_window.set_title('QUERY_FIND',name_in('PARAMETER.ORG_NAME'));
app_window.set_title('MAIN',name_in('PARAMETER.ORG_NAME'));
使form中的窗口名称后面都带上库存组织名称,便于用户操作。
例如:
交货平台(中弹组织)。
在Header块级触发器when-new-block-instance中添加以下代码:
set_block_property('HEADER_BLOCKNAME',DEFAULT_WHERE,'ORGANIZATION_ID='||:
parameter.ORG_ID||'');
From后续开发中使用ORG_ID区别不同库存组织。
2.配置文件参数
如果form功能不涉及配置文件,可以跳过此步。
创建参数用以保存配置文件的值,参数初始值设置为当配置文件值为空时所希望的缺省值。
如item_updatability_control,初始为N。
在form级触发器PRE-FORM中添加以下代码:
iffnd_profile.VALUE('CUX_XXX_XXX_CONTROLS')isnotnullthen
:
parameter.item_updatability_control:
=fnd_profile.VALUE('CUX_XXX_XXX_CONTROLS');
endif;
form后续功能开发通过此类参数达到配置文件控制的作用。
3.业务实体参数
如果form中的操作不需要区别不同的业务实体,可以跳过此步。
实际上,业务实体参数是一个名称为“ORG_ID”的特定的配置文件参数。
创建参数用以保存业务实体ID,一般起名为ORG_ID。
在form级触发器PRE-FORM中添加以下代码:
iffnd_profile.VALUE('ORG_ID')isnotnullthen
:
parameter.ORG_ID:
=fnd_profile.VALUE('ORG_ID');
endif;
From后续开发中使用ORG_ID区别不同业务实体。
2.6标准代码
1.APP_CUSTOM
在程序单元app_custom.close_window中修改以下代码:
if(wnd='MAIN')then
app_window.close_first_window;
表现的效果是:
当用户点击MAIN窗口右上方的叉,整个form会退出;而当用户点击form的其他窗口右上方的叉,仅会隐藏当前窗口。
2.FORM同名PACKAGE
在程序单元中增加一个与form同名的package,package头里定义如下procedure:
procedureevent_handler(eventvarchar2);
form级触发器里的代码都建议写在这个event_handler内,尤其是行数多于3行时。
在packagebody里添加以下代码(不用folder可以跳过):
PROCEDUREevent_handler(eventVARCHAR2)IS
BEGIN
IFevent='WHEN-NEW-FORM-INSTANCE'THEN
app_folder.define_folder_block('FOLDER_NAME',
'LINE_BLOCKNAME',
'LINE_PROMPT_BLOCKNAME',
'FOLDER_STACKED_CANVAS',
'MAIN',
NULL,
NULL,
NULL);
app_folder.event('INSTANTIATE');
ENDIF;
ENDevent_handler;
3.FORM级触发器
以下代码均为实现folder。
名称
代码
When-window-resized
if:
system.event_windowin('MAIN')then
app_folder.event('WHEN-WINDOW-RESIZED');
endif;
FOLDER_ACTION
app_folder.event(:
global.folder_action);
KEY-CLRFRM
app_folder.event('KEY-CLRFRM');
WHEN-NEW-FORM-INSTANCE
FORM_NAME.event_handler('WHEN-NEW-FORM-INSTANCE');
注意点:
如果When-window-resized中的window名不正确,在form实际运行时会发现folder区域不会随窗口宽度的变化而变化。
4.BLOCK级触发器
为实现folder功能,一共需要在Line块添加BLOCK级触发器14个:
触发器名称
代码
WHEN-NEW-RECORD-INSTANCE
app_folder.event('WHEN-NEW-RECORD-INSTANCE');
WHEN-NEW-BLOCK-INSTANCE
app_folder.event('WHEN-NEW-BLOCK-INSTANCE');
PRE-QUERY
app_folder.event('PRE-QUERY');
POST-QUERY
app_folder.event('POST-QUERY');
app_globe.event('POST-QUERY');
PRE-BLOCK
app_folder.event('PRE-BLOCK');
POST-BLOCK
app_folder.event('POST-BLOCK');
KEY-ENTQRY
app_folder.event('KEY-ENTQRY');
KEY-EXEQRY
app_folder.event('KEY-EXEQRY');
KEY-PREV-ITEM
app_folder.event('KEY-PREV-ITEM');
KEY-NEXT-ITEM
app_folder.event('KEY-NEXT-ITEM');
KEY-PRVREC
app_folder.event('KEY-PRVREC');
KEY-NXTREC
app_folder.event('KEY-NXTREC');
KEY-CLRREC
app_folder.event('KEY-CLRREC');
KEY-CLRBLK
app_folder.event('KEY-CLRBLK');
2.7ITEM调整
1.HeaderItem
增加需要的非数据库项。
ROW_ID项的子类选择ROW_ID。
所有显示的项都需要设置对应的子类,以保持与EBS一致的风格。
对各项的细节,如是否可更新、项导航顺序、数据有效性、初始值、数字格式和提示文字等,做出调整。
2.LineItem
增加需要的非数据库项。
ROW_ID项的子类选择ROW_ID。
所有显示的项都需要设置对应的子类,以保持与EBS一致的风格。
删除所有folder显示项的提示文字。
对各项的细节,如是否可更新、项导航顺序、数据有效性、初始值和数字格式等,做出调整。
增加以下两个项:
名称
子类
画布
FOLDER_SWITCHER
SWITCHER
FOLDER的堆叠画布
CURRENT_RECORD_INDICATOR
CURRENT_RECORD_INDICATOR
MAIN
并且分别在它们的项级触发器WHEN-NEW-ITEM-INSTANCE中添加以下代码:
app_folder_move_cursor('1');
3.提示块Item
从LINE块复制全部使用folder的项至提示块,子类全都选择FOLDER_PROMPT_MULTIROW,初始值分别设置为相应的列标题。
注意项序保持与LINE块一致。
增加以下六个项:
名称
子类
画布
ORDER_BY1
FOLDER_ORDERBY
FOLDER的堆叠画布
ORDER_BY2
FOLDER_ORDERBY
FOLDER的堆叠画布
ORDER_BY3
FOLDER_ORDERBY
FOLDER的堆叠画布
FOLDER_DUMMY
FOLDER_DUMMY
TOOLBAR
FOLDER_TITLE
DYNAMIC_TITLE
MAIN
FOLDER_OPEN
FOLDER_OPEN
MAIN
4.CONTROL块Item
按照需求添加相应的控制组件,多为按钮。
按钮的子类:
BUTTON。
按钮的标签:
显示文本(&快捷键字母),如清除(&C)。
注意:
导航到一个数据块上时,如果块上一个可导航的项都没有,将出现画面死机的BUG。
2.8界面调整
以下仅考虑Header项皆位于Line项上方、Control项皆位于Line项下方、带folder的情况。
1.Folder堆叠画布
在画布属性中设置显示水平滚动条。
参考下面表格做出调整。
名称
坐标/数值
提示项和ORDER_BY项
(0,0)
Line块的内容项
(0,0.25)
高度
0.25*(Line块显示的记录数+1)
宽度
窗口宽度-固定列区域宽度(无固定列时为0)-0.5
视图端口高度
0.25*(Line块显示的记录数+1)
视图端口宽度
窗口宽度-固定列区域宽度(无固定列时为0)-0.5
视图端口的X轴位置
0.25+固定列区域宽度
视图端口的Y轴位置
按实际情况设置(一般保持与Header区域相差0.25)
注意点:
1.提示项与内容项的宽度保持一致。
2.内容项最好与提示项在Y轴方向上紧贴,如果离得过远(大于0.1),在多行记录滚动时会出现内容项移位的bug。
2.MAIN画布
对Header项的位置做适当调整,确定Header区域坐标及高宽。
参考以下表格做出调整。
名称
坐标/数值
画布高度
窗口高度
画布宽度
窗口宽度
FOLDER_OPEN
(0.25,Header区域Y坐标+Header区域高度)
FOLDER_TITLE
(0.5,Header区域Y坐标+Header区域高度+0.05)
CURRENT_RECORD_INDICATOR
(0.15,Header区域Y坐标+Header区域高度+0.5)
Line块滚动条
(窗口宽度-0.25,Header区域Y坐标+Header区域高度+0.5)
Control项置于Line区域与窗口下边界之间,做适当调整。
2.9实现增删改锁
基于视图的form的增删改锁操作需要我们添加代码完成。
以下程序包代码可以通过汉得的公共程序包HAND_PLSQL_AUTOCREATE自动生成。
注意点:
HAND_PLSQL_AUTOCREATE切忌小写。
首先创建以下两个程序包规格:
名称
内容
Header_BlockName_private
PACKAGEHeader_BlockName_privateIS
PROCEDUREinsert_row;
PROCEDURElock_row;
PROCEDUREupdate_row;
PROCEDUREdelete_row;
ENDHeader_BlockName_private;
Line_BlockName_private
PACKAGELine_BlockName_privateIS
PROCEDUREinsert_row;
PROCEDURElock_row;
PROCEDUREupdate_row;
PROCEDUREdelete_row;
ENDLine_BlockName_private;
再创建对应的程序包主体,Header与Line相似,以下仅列出Header_BlockName_private主体代码:
PACKAGEBODYheader_blockname_privateIS
/*=====================================
**PROCEDURE:
insert_row()
**=====================================*/
PROCEDUREinsert_rowIS
CURSORrow_idIS
SELECTROWID
FROMheader_table_all
WHEREheader_table_primary_key=:
header_blockname.header_table_primary_key;
BEGIN
fnd_standard.set_who;
IF:
header_blockname.header_table_primary_keyISNULLTHEN
SELECTheader_table_all_s.nextval
INTO:
header_blockname.header_table_primary_key
FROMsys.dual;
ENDIF;
INSERTINTOheader_table_all
(creation_date,
created_by,
last_updated_by,
last_update_date,
last_update_login,
header_table_primary_key,
header_table_col1,
header_table_col2,
header_table_col3,
attribute_category,
attribute1,
attribute2,
attribute3,
attribute4,
attribute5,
attribute6,
attribute7,
attribute8,
attribute9,
attribute10,
attribute11,
attribute12,
attribute13,
attribute14,
attribute15)
VALUES
(:
header_blockname.creation_date,
:
header_blockname.created_by,
:
header_blockname.last_updated_by,
:
header_blockname.last_update_date,
:
header_blockname.last_update_login,
:
header_blockname.header_table_primary_key,
:
header_blockname.header_table_col1,
:
header_blockname.header_table_col2,
:
header_blockname.header_table_col3,
:
header_blockname.attribute_category,
:
header_blockname.attribute1,
:
header_blockname.attribute2,
:
header_blockname.attribute3,
:
header_blockname.attribute4,
:
header_blockname.attribute5,
:
header_blockname.attribute6,
:
header_blockname.attribute7,
:
header_blockname.attribute8,
:
header_blockname.attribute9,
:
header_blockname.attribute10,
:
header_blockname.attribute11,
:
header_blockname.attribute12,
:
header_blockname.attribute13,
:
header_blockname.attribute14,
:
header_blockname.attribute15);
OPENrow_id;
FETCHrow_id
INTO:
header_blockname.row_id;
IF(row_id%NOTFOUND)THEN
CLOSErow_id;
RAISEno_data_found;
ENDIF;
CLOSErow_id;
ENDinsert_row;
/*=====================================
**PROCEDURE:
lock_row()
**=====================================*/
PROCEDURElock_rowIS
CURSORc_rowIS
SELECT*
FROMheader_table_all
WHEREROWID=:
header_b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EBS Form开发总结 Form 开发 总结
![提示](https://static.bingdoc.com/images/bang_tan.gif)