ebs form开发总结.docx
- 文档编号:7403549
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:27
- 大小:649.45KB
ebs form开发总结.docx
《ebs form开发总结.docx》由会员分享,可在线阅读,更多相关《ebs form开发总结.docx(27页珍藏版)》请在冰豆网上搜索。
ebsform开发总结
1.前言
这是在深航2期项目期间学习form的过程中总结出来的一些东西,但内容比较零散,不包含form开发的完整过程。
1.开发规范
1.1命名规范
文件命名:
一般将源码放在….\SVN\05.客户化开发\05.源代码\目录下,文件的格式参考该目录下的代码包模板:
开发编号-开发项名称文件夹,该文件夹命名如:
EAM010_资产报废计划
EAM代表模块,010和资产报废计划是由开发文档给出,不需要自己取编号。
路径:
05.源代码\代码包模板:
开发编号-开发项名称\SZAXXXXX\code中,SZAXXXXX也有自己的命名规范,一般取表名称的前6个字符,即应用名+模块名,在取表名后的5-6字符作为后缀,例如:
表名是SZA_EAM_RETIRE_PLAN,则取SZAEAMREPLAN,该文件夹名称与form名称保持一致。
SVN模板目录:
Sql:
注册弹性域的plsql代码块,名称与表名一致
Table:
建表脚本
View:
建视图脚本
Pck:
基于视图的增删改form,在hss_public_util程序包中,Table_Handle_Pkg这个过程生成的代码要在数据库中执行,并且代码保存在package文件夹下,并以.pck保存。
Form_Table_Handle这个过程是要放在form中
Form规范
1.Form的命名:
例如表名SZA_INV_TST_DOC_TYPES,选取前6个字符SZAINV,加上后面字符串的5-6个字符,SZAINVTSTDOCTP.
2.块名命名:
SZA_INV_TST_DOC_TYPES选表中间字段TST_DOC
3.窗口查询的块QUERY_FIND的名称:
块名+QF,对应的FIX和STK画布名字也要保持一致,但是QUERY_FIND触发器名称不能修改。
4.在ebs上注册表单,功能,弹性域时,form表单,功能和弹性域名称:
SZAINV:
+中文解释,例如:
SZAINV:
单据类型定义。
因为这些名称都是用户在查找时给用户看的。
5.在窗口查询中,一般用id来作为查询字段,一般在id字段建立索引,查询速度更快,所以应该有消除依赖的代码
6.LOV的显示:
id字段一般不显示出来,可以设置id字段的displaywidth为0即可。
2.常用开发组件和功能
1.无TAB的Folder功能
一般情况下,将不随横向滚动条移动的列放置在FIX画布上,变成固定列,固定列是没有拖动效果的。
画布:
MAIN,FOLDER_FIX,FOLDER_STK
第一步:
使用datablockwizard创建块
第二步:
ROW_ID项的子类名设置为ROW_ID。
其他需要显示在画布上的项设置子类,另设置显示在STK画布上的属性:
第三步:
将数据块中显示在STK上的项复制到PROMT块中,并设置数据块中的trigger(模板中的FOLDER块有现成的trigger)
PRE-QUERY//POST-QUERY
WHEN-NEW-BLOCK-INSTANCE//WHEN-NEW-RECORD-INSTANCE…
提示项的itemtype为display,子类为FOLDER_PROMT_MULTIROW
第四步:
在when-new-form-instance初始化form。
使用app_folder.define_folder_block
如果用到了FIX画布,需要使用参数8
第五步:
在画布上调整布局
设置块的ScroolBarCanvas在fix画布上
注意:
ITEM名称
画布
子类
FOLDER_SWITCHER
FIX
SWITCHER
DRILLDOWN_RECORD_INDICATOR
~~
DRILLDOWN_RECORD_INDICATOR
FOLDER_TITLE
DYNAMIC_TITLE
FOLDER_OPEN
FOLDER_OPEN
FOLDER_DUMMY
TOOLBAR
FOLDER_DUMMY
ORDER_BY1
STK
FOLDER_ORDERBY
第六步:
在WHEN-WINDOW-RESIZED触发器内
if:
system.event_windowin('MAIN','DOC','TXN_DETAILS')then
app_folder.event('WHEN-WINDOW-RESIZED');
endif;
2.TAB页的Folder功能
原理:
与无tab页不同就是创建画布时,我们会选择创建一个tab_canvas类型的画布
假如你要显示的item都来自一个block,则我们只需要一个fix画布;如果画布上的item来自多个block,则需要多个fix画布。
我们通过when-tab-changed触发器和show_view(hide_view)来控制画布的显示与隐藏
2.1首先要创建类型为Tab的画布,在画布下添加两个子类为Tab_page的画布,注意的是最好使得这两个画布的名称和将来放在两画布上的stacked画布名称一致。
如下图左
2.2画布建好以后,我们来看如何布局。
首先将MAIN_TAB画布,堆叠在MAIN画布上,再将图中TAX画布(fix和stacked画布)和BASE画布(同上)堆叠在MIAN_TAB画布,尽量保持TAX和BASE重合,就是说x和y坐标相同。
2.3接下来就是在formbuilder中写显示和隐藏的代码
FORM级的WHEN-TAB-PAGE-CHANGED
以下的两个过程是为了防止bug
参考(\桌面\ebs常用文档大全\FOLDER)
1.在FORM触发器内
ELSIF(event='FOLDER_RETURN_ACTION')THEN
if(:
global.folder_action='CONFIRM-HIDE-FIELD')THEN
if:
global.folder_filed='ADDITION1'THEN
:
global.folder_action_allowerd:
='FALSE';
ENDIF;
endif;
2.在block触发器
elsifevent='WHEN-NEW-ITEM-INSTANCE'then
curr_canvas_name:
=get_item_property(name_in('SYSTEM.CURSOR_ITEM'),item_canvas);
current_tab:
=get_canvas_property('MAIN_TAB',topmost_tab_page);
tab_canvas_name:
=name_in('SYSTEM.EVENT_CANVAS');
IFcurr_canvas_nameIN('TAX_STK','BASE_STK')THEN
IFcurr_canvas_name!
=current_tabTHEN
set_canvas_property('MAIN_TAB',topmost_tab_page,curr_canvas_name);
ENDIF;
ENDIF;
3.说明性弹性域
第一步:
在实际开发中(暂时做过的项目中),会提供给你注册的plsql块(保存在sql中),
执行后,就会在ebs中注册。
第二步:
在数据块中创建item,取名DF,类型textitem,子类TEXT_ITEM_DESC_FLEX
第三步:
在DF项下,创建两个触发器
WHEN-VALIDATE-ITEM--override
代码:
FND_FLEX.EVENT(‘WHEN-VALIDATE-ITEM’)
WHEN-NEW-ITEM-INSTANCE--before
代码:
FND_FLEX.EVENT(‘WHEN-NEW-ITEM-INSTANCE’)
第四步:
修改DF所在数据块的trigger,添加完成后初始化弹性域
添加此代码:
FND_FLEX.EVENT(‘..’)
使用fnd_descr_flex.define初始化弹性域
第五步:
启用弹性域
1.先是查找出注册好的弹性域
2.进入段设置界面
Open弹性域
3.
然后保存
4.
最后保存。
4.关键性弹性域
下面讲解的是核算科目账户对应的键弹性域的创建方法
4.1创建三个item项,设置相应属性
CODE_COMBINATION:
显示项(称为账户项),字段长度设置2000,显示核算科目的数字组合。
LOV为ENABLE_LIST_LAMP,验证为NO
COMBINATION_DESC:
显示项,字段长度设置2000,显示核算科目的中文描述组合
GL_CCID:
数据库表项,存储的是核算科目对应的ID
4.2为账户项添加两个触发器
WHEN-NEW-ITEM-INSTANCE:
触发器执行层次设置为Before
WHEN-VALIDATE-ITEM
为两个触发器添加代码:
fnd_flex.event('WHEN-NEW-ITEM-INSTANCE');
4.3为这三个item所在的block块添加触发器
PRE-QUERYPOST-QUERYPRE-INSERTPRE-UPDATEWHEN-VALIDATE-RECORD
触发器代码:
fnd_flex.event('PRE-INSERT');
4.4在pre-form触发器获取账户结构ID
selectb.CHART_OF_ACCOUNTS_ID
fromgl_sets_of_booksb
whereb.SET_OF_BOOKS_ID=fnd_profile.value('GL_SET_OF_BKS_ID')
4.5初始化键弹性域
fnd_key_flex.define(
block=>'DETAIL',
field=>'CODE_COMBINATION',
appl_short_name=>'SQLGL',--注册的应用简称
code=>'GL#',--弹性域的注册代码
id=>'GL_CCID',
description=>'COMBINATION_DESC',
num=>':
parameter.CHARTS_ACCOUNT_ID');--4.4得到的账户结构ID
4.6遇到的奇葩问题
1).建好弹性域以后,如果我们为账户项赋了值以后,会自动获取数据库表项的值(GL_CCID),如果你有自己的函数来为数据库表项赋值(在系统自动获取之前),那就会被自动获取的值覆盖,关键是这个自动获取的值还有可能是错误的,所以在PRE-INSERT触发器之前,重新赋值即可。
4.单选框和复选框
ValuewhenChecked:
Y
ValuewhenUnchecked:
N
CheckBoxMappingofOtherValues:
Unchecked因为复选框除了选中,被选中外,还有一个null值状态,所以要设置null状态下的值是多少。
获得复选框的值:
块名.复选框名–>YorN
单选框:
是一个单选组,组里有单选按钮
单选组:
子类---RadioGroup
单选按钮:
子类---RadioButton
RadioButtonValue—这个属性必须有值
5.手电筒窗口查询
1.打开一个模板APPSTAND,将ObjectGroups下的QUERY_FIND对象拖到自己的form中,点击copy。
将在block,canvases,windows下生成对应名称为QUERY_FIND的对象。
2.将new和find按钮,QUERY_FIND数据块下的key-nxtblock代码修改
New:
新建的数据块名称
Find:
查询的数据块名称
key-nxtblock:
查询数据块的名称
3.设置query_find查询块的
属性为主界面块,这样关闭query_find的时候,就会显示主界面块。
4.在主界面块内创建query_find触发器,名称不能修改,添加如下代码:
App_find.query_find(main_win,query_find_win,query_find_block);
参数1:
main_win—查询窗口显示在哪个窗口上
参数2:
query_find_win---查询窗口界面对应的窗口
参数3:
query_find_block–查询窗口对应的块名称
5.在主界面块中的pre-query内添加查询代码
Copy,app_find.query_range等
6.主界面块的when-new-record-instace触发器ExecutionHierarchy设置为After
注意:
在其他窗口上调用出手电筒
若该窗口有两个块。
则在两个块上建立query_find触发器,代码为app_find.query_find
6.菜单栏
通过这种方法来设置菜单的名称(when-new-form-instance)
fnd_message.set_name('SQLSZA',
'SZA_PA_010_BUDGET_CHECK')/*;消息内容:
预算检查(&B)*/
app_special.instantiate('SPECIAL1',
fnd_message.get);
app_special.disable('SPECIAL1');--使菜单灰显(失效)
app_special.enable('SPECIAL1');--启用菜单
7.主从块
7.启用功能
fnd_function.execute(function_nameINVARCHAR2,
open_flagINVARCHAR2DEFAULT'Y',
session_flagINVARCHAR2DEFAULT'SESSION',
other_paramsINVARCHAR2DEFAULTNULL,
activateINVARCHAR2DEFAULT'ACTIVATE',
browser_targetINVARCHAR2DEFAULTNULL);
关于详细介绍请查看
8.行指示器打开记录
1).更改行指示器的子类,如图
2.在Item触发器when-item-instance内
CURRENT_RECORD_INDICATOR名称改成DRILLDOWN_RECORD_INDICATOR
三.Form开发中常用的技巧
1.关闭窗口
如何正确的关闭非主窗口(A是主窗口块,B是非主窗口块)
在APP_CUSTOM.close_window这个过程内,if语句内注册window的关闭事件,代码为
clear_block;
go_item(‘A.Item_name’);
第二种方法是:
设置B的previousnavigateblock为A,建议使用
在form触发器WHEN-WINDOW-RESIZED中的代码作用:
folder能否随着窗口大小变化而变化。
2.lov查找
为item(lov)赋初值,初值在lov中存在多个。
在这中情况下,当你做其他操作时,lov会自动弹出让你选择某一个值。
如果lov中数据过多,需要先在查找中先输入字符,然后在匹配查找的方法:
不显示lov项可以设置显示项的宽度为0即可
3.得到dml语句错误信息
在on-insert触发器内,加入如下代码:
exception
whenothersthen
fnd_message.debug(sqlerrm);
可以得到触发器的具体信息。
4.clear_block函数
一般在form的插入或更新模式下,clear_blcok会引发是否保存当前内容的系统提示,如果不希望提示,可以使用clear_block(NO_VALIDATE)
5.查询函数的使用
app_query.append(block_name,sql)
参数1:
block_name---字符串
参数2:
sql---字符串,一条查询语句
app_find.query_range(qf_block_name.item_name1,qf_block_name2,block_item_name)
参数qf_block_name.item_name1,qf_block_name2:
因为该函数适用于范围查找,所以参数1表示范围开始,参数2表示范围结束
参数3:
block_item_name–数据块对应的item项
Copy(qf_item,block_item)
类似于第二种,不是范围查找,针对某一个数据块
do_key
使用如下代码,不直接调用execute_query。
:
parameter.g_query_find:
='TRUE';
do_key('execute_query');
:
parameter.g_query_find:
='FALSE';
app_query.reset('TRACK');
6.设置头块和行块的增删改属性
尽量不设置insert_allowed和update-allowed属性,insert属性一般只设置行块,头块都是可以新增的,update属性通过设置item的能否输入来实现。
当查询后重新在when-new-block-instance调用一下刷新按钮以及块状态的过程。
一般都会在过程中先把块的delete_allowed和insert_allowed设置为NO,然后再根据逻辑去该状态。
这样就不会出错。
示例代码:
PROCEDUREset_repl_statusIS
BEGIN
sza_set_block_property(p_block_name=>'REPL_HEADERS',
p_delete_flag=>'N');
sza_set_block_property(p_block_name=>'REPL_LINES',
p_delete_flag=>'N',
p_insert_flag=>'N');
IF:
repl_headers.status_codeIN('1NEW')THEN
sza_set_block_property(p_block_name=>'REPL_HEADERS',
p_delete_flag=>'Y');
sza_set_block_property(p_block_name=>'REPL_LINES',
p_delete_flag=>'Y',
p_insert_flag=>'Y');
ELSIF:
repl_headers.status_code='4REJECT'THEN
sza_set_block_property(p_block_name=>'REPL_LINES',
p_delete_flag=>'Y',
p_insert_flag=>'Y');
ENDIF;
app_standard.synchronize;
ENDset_repl_status;
7.设置窗口的标题
在when-new-form-instance设置
app_window.set_title('RETIRE_PLAN',:
PARAMETER.ORG_CODE);
8.跳转块或者查询块的正确方法(system.message_level)
在ebsform中,消息是有等级的,为了clear_block,do_key('execute_query')等时,屏蔽一些小错误,将等级下调至10.
ifevent='WHEN-BUTTON-PRESSED'then--在ebsform中
l_message_level:
=:
system.message_level;
:
system.message_level:
=10;
go_block('approve_action');
clear_block;
:
parameter.g_query_find:
='TRUE';
do_key('execute_query');
:
parameter.g_query_find:
='FALSE';
:
system.message_level:
=l_message_level;
endif;
9.分段排序
实现:
晚于当前系统时间的item排在前面,升序。
早于当前系统时间的item排在后面,升序
使用union的原因:
Union:
对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
UnionAll:
对两个结果集进行并集操作,包括重复行,不进行排序;
10.编译刚定义好的消息
刚定义好的消息要通过编译才能显示详细说明,不然只会显示简码。
编译消息-应用开发员职责-->其他-->请求-->运行复制按钮,选择‘生成消息’行,(如果自己选择,则需要输入参数信息)
11.提示:
FND_MESSAGE
Question的使用:
fnd_message.set_name('SQLSZA','SZA_EAM_DRAW_RETURN_SAVE_TIP');
//用于显示在选择框的内容提示(set_string也可以)
l_question_rt:
=fnd_message.question('YES',
'NO',
'CANCEL',
1,
3,
'question');
ifl_question_rt<>1then
raiseform_trigger_failure;
endif;
定义变量接受返回值即可l_question_rt为number类型,根据返回值执行逻辑。
例子:
第二种使用方法:
fnd_message.set_name('SQLSZA','SZA_EAM_TXN_CANCEL_LIN');
app_special.instantiate('SPECIAL5',fnd_message.get);
使用fnd_message.get取出栈内的消息
12.提示:
set_alert_property
使用set_alert_property来设置提示的信息,可以用字符串连接来输出信息,比FND_MESSAGE方便
13.屏蔽错误
如果碰到无法解决的错误,但是错误对程序并不影响。
在ON-ERROR触发器中,用一下代码替代
app_standard.event('ON-ERROR');
BEGIN
IFERROR_CODE=41016THEN
NULL;
ELSE
app_standard.event('ON-ERROR');
ENDIF;
END;
14.关于list的一些函数
clear_listadd_list_element配合使用在pro
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ebs form开发总结 form 开发 总结