




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Oracle ERPE-BUSINESS SUITEForm开发总结文档作者:何云创建日期: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分发人员编码姓名地点和位置签名1234目录文档控制ii1.1更新记录ii1.2审阅记录ii1.3分发人员ii1.前言42.基本步骤52.1 环境设置52.2 新建fmb52.3 添加对象52.4 建立主体对象62.5 初始化参
2、数72.6 标准代码92.7 ITEM调整112.8 界面调整122.9 实现增删改锁132.10 手电筒查询182.11 上传编译193.常用功能203.1 TAB页Folder203.2 弹性域233.3 LOV253.4 Form个性化263.5 弹出窗口居中263.6 警告263.7 Onetime_where与Default_where273.8 启动功能283.9 退出form283.10 工具栏283.11 保存点及回滚294.其他功能304.1 消息等级304.2 颜色属性304.3 CASE_INSENSITIVE_QUERY304.4 Clear_block304.5 禁用
3、历史记录305.附件325.1 触发器执行顺序326.参考资料33EBS Form开发总结1.前言在学习form的过程中,平时有在写一些关于form开发的笔记,不过内容都比较零散,没有归纳成一篇较为全面的总结文档。在此基础上,写下一份针对form开发较为系统的个人总结。本次总结主要以我目前所做过的form开发为基础,内容未必覆盖form开发的全部内容,部分功能的实现方法和步骤的先后顺序也未必最佳,日后将不断完善。以下出现的代码中,浅蓝色部分为在实际开发需要变化的部分。2.基本步骤以下为开发一个普通头行结构,带有非TAB 的Folder功能的Form的基本步骤。2.1 环境设置仅在第一次开发EB
4、S R12 FORM时进行此步。从安装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 添加
5、对象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。
6、在form级触发器pre-form中添加以下代码:app_window.set_window_position('MAIN', 'FIRST_WINDOW');有时候自己做的form运行时跑出来的界面却不是自己做的界面,很可能就是因为没有删除BLOCKNAME对象且没有修改以上这句代码中的第一个参数。2.画布删除模板自带画布BLOCKNAME并新建画布,主CANVAS建议起名为MAIN,便于维护。为主画布设置窗口,并把子类设置为CANVAS。为实现folder功能,还至少需要一个用来放置非固定列的画布,子类选择CANVAS_STACKED。画布的上下顺序对堆叠的
7、效果有影响,将置于底层的画布放置在上方。3.数据块删除模板自带数据块BLOCKNAME。先在数据库中创建好需要的视图,需要带有基表的ROWID,并起别名为ROW_ID。一般较少直接使用基表,这样会降低程序的灵活性。再使用数据库创建向导建立对应的数据块。Header块及Line块的固定列放置在主画布上,Line块的非固定列放置在堆叠画布上。Line块需要有滚动条,且滚动条放置于MAIN画布上。在Header块中找到刚创建的关系,在属性中把防止无主记录操作选成是。手动创建一个数据块CONTROL(一般按钮放于此),属性中的数据库数据块选择否。手动创建一个提示数据块(folder需要),属性中的数据
8、库数据块选择否。Header块的导航,导航器样式选择改变数据块,前一个数据块选择自身,后一个数据块选择Line块,使用户能从Header导航至Line。Line块的导航,导航器样式选择改变记录,前一个数据块选择Header块,后一个数据块选择自身,使用户能从一行导航至下一行。将全部块的子类设置为BLOCK。根据需要对Header块和Line块的数据库属性,包括允许查询、允许插入、允许更新和允许删除等,做出调整。注意点:1.块名长度不可大于22。2. 头行结构设置级联删除时,系统会自动添加一个pre-delete触发器代码。2.5 初始化参数1.库存组织参数如果form中的操作不需要区别不同的库
9、存组织,可以跳过此步。增加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(&
10、#39;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
11、= '|:parameter.ORG_ID|' ');From后续开发中使用ORG_ID区别不同库存组织。2.配置文件参数如果form功能不涉及配置文件,可以跳过此步。创建参数用以保存配置文件的值,参数初始值设置为当配置文件值为空时所希望的缺省值。如item_ updatability_control,初始为N。在form级触发器PRE-FORM中添加以下代码:if fnd_profile.VALUE('CUX_XXX_XXX_CONTROLS') is not null then:parameter.item_updatability_control:
12、=fnd_profile.VALUE('CUX_XXX_XXX_CONTROLS');end if;form后续功能开发通过此类参数达到配置文件控制的作用。3.业务实体参数如果form中的操作不需要区别不同的业务实体,可以跳过此步。实际上,业务实体参数是一个名称为“ORG_ID”的特定的配置文件参数。创建参数用以保存业务实体ID,一般起名为ORG_ID。在form级触发器PRE-FORM中添加以下代码:if fnd_profile.VALUE('ORG_ID') is not null then:parameter.ORG_ID:=fnd_profile.VAL
13、UE(' ORG_ID ');end if;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头里定义如下procedur
14、e:procedure event_handler(event varchar2);form级触发器里的代码都建议写在这个event_handler内,尤其是行数多于3行时。在package body里添加以下代码(不用folder可以跳过):PROCEDURE event_handler(event VARCHAR2) ISBEGIN IF event = 'WHEN-NEW-FORM-INSTANCE' THEN app_folder.define_folder_block('FOLDER_NAME', 'LINE_BLOCKNAME', &
15、#39;LINE_PROMPT_BLOCKNAME', 'FOLDER_STACKED_CANVAS', 'MAIN', NULL, NULL, NULL); app_folder.event('INSTANTIATE'); END IF;END event_handler;3.FORM级触发器 以下代码均为实现folder。 名称代码When-window-resizedif :system.event_window in ('MAIN') thenapp_folder.event('WHEN-WINDOW-RE
16、SIZED');end if;FOLDER_ACTIONapp_folder.event(:global.folder_action);KEY-CLRFRMapp_folder.event('KEY-CLRFRM');WHEN-NEW-FORM-INSTANCEFORM_NAME.event_handler('WHEN-NEW-FORM-INSTANCE');注意点:如果When-window-resized中的window名不正确,在form实际运行时会发现folder区域不会随窗口宽度的变化而变化。4.BLOCK级触发器为实现folder功能,一共需
17、要在Line块添加BLOCK级触发器14个:触发器名称代码WHEN-NEW-RECORD-INSTANCEapp_folder.event('WHEN-NEW-RECORD-INSTANCE');WHEN-NEW-BLOCK-INSTANCEapp_folder.event('WHEN-NEW-BLOCK-INSTANCE');PRE-QUERYapp_folder.event('PRE-QUERY');POST-QUERYapp_folder.event('POST-QUERY');app_globe.event('PO
18、ST-QUERY');PRE-BLOCKapp_folder.event('PRE-BLOCK');POST-BLOCKapp_folder.event('POST-BLOCK');KEY-ENTQRYapp_folder.event('KEY-ENTQRY');KEY-EXEQRYapp_folder.event('KEY-EXEQRY');KEY-PREV-ITEMapp_folder.event('KEY-PREV-ITEM');KEY-NEXT-ITEMapp_folder.event('K
19、EY-NEXT-ITEM');KEY-PRVRECapp_folder.event('KEY-PRVREC');KEY-NXTRECapp_folder.event('KEY-NXTREC');KEY-CLRRECapp_folder.event('KEY-CLRREC');KEY-CLRBLKapp_folder.event('KEY-CLRBLK');2.7 ITEM调整1.Header Item增加需要的非数据库项。ROW_ID项的子类选择ROW_ID。所有显示的项都需要设置对应的子类,以保持与EBS一致的风格。对各
20、项的细节,如是否可更新、项导航顺序、数据有效性、初始值、数字格式和提示文字等,做出调整。2.Line Item增加需要的非数据库项。ROW_ID项的子类选择ROW_ID。所有显示的项都需要设置对应的子类,以保持与EBS一致的风格。删除所有folder显示项的提示文字。对各项的细节,如是否可更新、项导航顺序、数据有效性、初始值和数字格式等,做出调整。增加以下两个项:名称子类画布FOLDER_SWITCHERSWITCHERFOLDER的堆叠画布CURRENT_RECORD_INDICATORCURRENT_RECORD_INDICATORMAIN并且分别在它们的项级触发器WHEN-NEW-ITE
21、M-INSTANCE中添加以下代码:app_folder_move_cursor('1');3.提示块Item从LINE块复制全部使用folder的项至提示块,子类全都选择FOLDER_PROMPT_MULTIROW,初始值分别设置为相应的列标题。注意项序保持与LINE块一致。增加以下六个项:名称子类画布ORDER_BY1FOLDER_ORDERBYFOLDER的堆叠画布ORDER_BY2FOLDER_ORDERBYFOLDER的堆叠画布ORDER_BY3FOLDER_ORDERBYFOLDER的堆叠画布FOLDER_DUMMYFOLDER_DUMMYTOOLBARFOLDER
22、_TITLEDYNAMIC_TITLEMAINFOLDER_OPENFOLDER_OPENMAIN4.CONTROL块Item按照需求添加相应的控制组件,多为按钮。按钮的子类:BUTTON。按钮的标签:显示文本(&快捷键字母),如清除(&C)。注意:导航到一个数据块上时,如果块上一个可导航的项都没有,将出现画面死机的BUG。2.8 界面调整以下仅考虑Header项皆位于Line项上方、Control项皆位于Line项下方、带folder的情况。1.Folder堆叠画布 在画布属性中设置显示水平滚动条。 参考下面表格做出调整。名称坐标/数值提示项和ORDER_BY项(0,0)Li
23、ne块的内容项(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区域坐标及高宽。参考以下
24、表格做出调整。名称坐标/数值画布高度窗口高度画布宽度窗口宽度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的增删改锁操作需要我们添加代码完成。以下程序包代码可以通过
25、汉得的公共程序包HAND_PLSQL_AUTOCREATE自动生成。注意点:HAND_PLSQL_AUTOCREATE切忌小写。 首先创建以下两个程序包规格:名称内容Header_BlockName_privatePACKAGE Header_BlockName_private IS PROCEDURE insert_row; PROCEDURE lock_row;PROCEDURE update_row;PROCEDURE delete_row;END Header_BlockName_private;Line_BlockName_privatePACKAGE Line_BlockName_
26、private IS PROCEDURE insert_row; PROCEDURE lock_row;PROCEDURE update_row;PROCEDURE delete_row;END Line_BlockName_private;再创建对应的程序包主体,Header与Line相似,以下仅列出Header_BlockName_private主体代码:PACKAGE BODY header_blockname_private IS /*= * PROCEDURE: insert_row() *=*/ PROCEDURE insert_row IS CURSOR row_id IS SE
27、LECT ROWID FROM header_table_all WHERE header_table_primary_key = :header_blockname.header_table_primary_key; BEGIN fnd_standard.set_who; IF :header_blockname.header_table_primary_key IS NULL THEN SELECT header_table_all_s.nextval INTO :header_blockname.header_table_primary_key FROM sys.dual; END IF
28、; INSERT INTO header_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,
29、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.h
30、eader_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, :heade
31、r_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, :
32、header_blockname.attribute15); OPEN row_id; FETCH row_id INTO :header_blockname.row_id; IF (row_id%NOTFOUND) THEN CLOSE row_id; RAISE no_data_found; END IF; CLOSE row_id; END insert_row; /*= * PROCEDURE: lock_row() *=*/ PROCEDURE lock_row IS CURSOR c_row IS SELECT * FROM header_table_all WHERE ROWID
33、 = :header_blockname.row_id FOR UPDATE OF header_table_primary_key NOWAIT; rec c_row%ROWTYPE; i NUMBER := 0; BEGIN LOOP BEGIN i := i + 1; OPEN c_row; FETCH c_row INTO rec; IF (c_row%NOTFOUND) THEN CLOSE c_row; fnd_message.set_name('FND', 'FORM_RECORD_DELETED'); fnd_message.error; RAI
34、SE form_trigger_failure; END IF; CLOSE c_row; IF (rec.creation_date = :header_blockname.creation_date) OR (rec.creation_date IS NULL) AND (:header_blockname.creation_date IS NULL) AND (rec.created_by = :header_blockname.created_by) OR (rec.created_by IS NULL) AND (:header_blockname.created_by IS NUL
35、L) AND (rec.last_updated_by = :header_blockname.last_updated_by) OR (rec.last_updated_by IS NULL) AND (:header_blockname.last_updated_by IS NULL) AND (rec.last_update_date = :header_blockname.last_update_date) OR (rec.last_update_date IS NULL) AND (:header_blockname.last_update_date IS NULL) AND (re
36、c.last_update_login = :header_blockname.last_update_login) OR (rec.last_update_login IS NULL) AND (:header_blockname.last_update_login IS NULL) AND (rec.header_table_primary_key = :header_blockname.header_table_primary_key) AND (rec.header_table_col1 = :header_blockname.header_table_col1) OR (rec.he
37、ader_table_col1 IS NULL) AND (:header_blockname.header_table_col1 IS NULL) AND (rec.header_table_col2 = :header_blockname.header_table_col2) OR (rec.header_table_col2 IS NULL) AND (:header_blockname.header_table_col2 IS NULL) AND (rec.header_table_col3 = :header_blockname.header_table_col3) OR (rec.
38、header_table_col3 IS NULL) AND (:header_blockname.header_table_col3 IS NULL) AND (rec.attribute_category = :header_blockname.attribute_category) OR (rec.attribute_category IS NULL) AND (:header_blockname.attribute_category IS NULL) AND (rec.attribute1 = :header_blockname.attribute1) OR (rec.attribut
39、e1 IS NULL) AND (:header_blockname.attribute1 IS NULL) AND (rec.attribute2 = :header_blockname.attribute2) OR (rec.attribute2 IS NULL) AND (:header_blockname.attribute2 IS NULL) AND (rec.attribute3 = :header_blockname.attribute3) OR (rec.attribute3 IS NULL) AND (:header_blockname.attribute3 IS NULL)
40、 AND (rec.attribute4 = :header_blockname.attribute4) OR (rec.attribute4 IS NULL) AND (:header_blockname.attribute4 IS NULL) AND (rec.attribute5 = :header_blockname.attribute5) OR (rec.attribute5 IS NULL) AND (:header_blockname.attribute5 IS NULL) AND (rec.attribute6 = :header_blockname.attribute6) O
41、R (rec.attribute6 IS NULL) AND (:header_blockname.attribute6 IS NULL) AND (rec.attribute7 = :header_blockname.attribute7) OR (rec.attribute7 IS NULL) AND (:header_blockname.attribute7 IS NULL) AND (rec.attribute8 = :header_blockname.attribute8) OR (rec.attribute8 IS NULL) AND (:header_blockname.attr
42、ibute8 IS NULL) AND (rec.attribute9 = :header_blockname.attribute9) OR (rec.attribute9 IS NULL) AND (:header_blockname.attribute9 IS NULL) AND (rec.attribute10 = :header_blockname.attribute10) OR (rec.attribute10 IS NULL) AND (:header_blockname.attribute10 IS NULL) AND (rec.attribute11 = :header_blo
43、ckname.attribute11) OR (rec.attribute11 IS NULL) AND (:header_blockname.attribute11 IS NULL) AND (rec.attribute12 = :header_blockname.attribute12) OR (rec.attribute12 IS NULL) AND (:header_blockname.attribute12 IS NULL) AND (rec.attribute13 = :header_blockname.attribute13) OR (rec.attribute13 IS NUL
44、L) AND (:header_blockname.attribute13 IS NULL) AND (rec.attribute14 = :header_blockname.attribute14) OR (rec.attribute14 IS NULL) AND (:header_blockname.attribute14 IS NULL) AND (rec.attribute15 = :header_blockname.attribute15) OR (rec.attribute15 IS NULL) AND (:header_blockname.attribute15 IS NULL)
45、 THEN RETURN; ELSE fnd_message.set_name('FND', 'FORM_RECORD_CHANGED'); fnd_message.error; RAISE form_trigger_failure; END IF; EXCEPTION WHEN app_exception.record_lock_exception THEN app_exception.record_lock_error(i); END; END LOOP; END lock_row; /*= * PROCEDURE: update_row() *=*/ PR
46、OCEDURE update_row IS BEGIN fnd_standard.set_who; UPDATE header_table_all SET creation_date = :header_blockname.creation_date, created_by = :header_blockname.created_by, last_updated_by = :header_blockname.last_updated_by, last_update_date = :header_blockname.last_update_date, last_update_login = :h
47、eader_blockname.last_update_login, header_table_primary_key = :header_blockname. header_table_primary_key, header_table_col1 = :header_blockname.header_table_col1, header_table_col2 = :header_blockname.header_table_col2, header_table_col3 = :header_blockname.header_table_col3, attribute_category = :
48、header_blockname.attribute_category, attribute1 = :header_blockname.attribute1, attribute2 = :header_blockname.attribute2, attribute3 = :header_blockname.attribute3, attribute4 = :header_blockname.attribute4, attribute5 = :header_blockname.attribute5, attribute6 = :header_blockname.attribute6, attribute7 = :header_blockname.attribute7, attribute8 = :header_blockname.attribute8, attribute9 = :header_blockname.attribute9, attribute10 = :header_b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 海洋气象观测数据的质量控制与保障考核试卷
- 罐头食品企业环境保护与绿色生产考核试卷
- 煤炭市场结构优化与产业发展考核试卷
- 煤炭洗选工艺设计与实践考核试卷
- 吉林省辽源市第五中学2024-2025学年高三下期末质量检查生物试题理试题含解析
- 山东省乐陵市花园镇达标名校2025届初三实验班第一次质检数学试题试卷含解析
- 江苏省淮安市洪泽县2024-2025学年初三下学期第二次模拟考试语文试题试卷含解析
- 内蒙古呼和浩特市2024-2025学年高三第二学期期终学习质量调研测试历史试题含解析
- 吉林省长春市榆树市2024-2025学年高三第五次模拟考试数学试题试卷含解析
- 西藏拉萨市墨竹工卡县2025届小升初全真模拟数学检测卷含解析
- 经济法第三版试卷及答案
- 古诗词诵读《拟行路难(其四) 》课件统编版高二语文选择性必修下册
- 《甲烷吸附储存技术》课件
- 2025年的房屋租赁合同书模板
- 冠心病气阴两虚
- 中国铁路发展史课件
- 银行车贷合同范本
- DB32T 5083-2025江苏省公共体育设施基本标准
- 小学数学新人教版一年级下册欢乐购物街第2课时《买卖我做主》教案(2025春)
- 湖南新高考教学教研联盟暨长郡二十校联盟2025届高三年级第二次联考英语试题及答案
- 《体重管理指导原则(2024年版)》解读课件
评论
0/150
提交评论