ebs form开发总结Word下载.docx
《ebs form开发总结Word下载.docx》由会员分享,可在线阅读,更多相关《ebs form开发总结Word下载.docx(27页珍藏版)》请在冰豆网上搜索。
第一步:
使用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
~~
FOLDER_TITLE
DYNAMIC_TITLE
FOLDER_OPEN
FOLDER_DUMMY
TOOLBAR
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'
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'
IFcurr_canvas_name!
=current_tabTHEN
set_canvas_property('
topmost_tab_page,curr_canvas_name);
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('
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('
--使菜单灰显(失效)
app_special.enable('
--启用菜单
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)
block_name---字符串
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表示范围结束
block_item_name–数据块对应的item项
Copy(qf_item,block_item)
类似于第二种,不是范围查找,针对某一个数据块
do_key
使用如下代码,不直接调用execute_query。
parameter.g_query_find:
TRUE'
do_key('
execute_query'
:
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'
REPL_LINES'
p_insert_flag=>
IF:
repl_headers.status_codeIN('
1NEW'
ELSIF:
repl_headers.status_code='
4REJECT'
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('
)等时,屏蔽一些小错误,将等级下调至10.
ifevent='
WHEN-BUTTON-PRESSED'
then--在ebsform中
l_message_level:
=:
system.message_level;
:
system.message_level:
=10;
go_block('
approve_action'
clear_block;
do_key('
=l_message_level;
endif;
9.分段排序
实现:
晚于当前系统时间的item排在前面,升序。
早于当前系统时间的item排在后面,升序
使用union的原因:
Union:
对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
UnionAll:
对两个结果集进行并集操作,包括重复行,不进行排序;
10.编译刚定义好的消息
刚定义好的消息要通过编译才能显示详细说明,不然只会显示简码。
编译消息-应用开发员职责-->
其他-->
请求-->
运行复制按钮,选择‘生成消息’行,(如果自己选择,则需要输入参数信息)
11.提示:
FND_MESSAGE
Question的使用:
'
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;
定义变量接受返回值即可l_question_rt为number类型,根据返回值执行逻辑。
例子:
第二种使用方法:
fnd_message.set_name('
SZA_EAM_TXN_CANCEL_LIN'
SPECIAL5'
fnd_message.get);
使用fnd_message.get取出栈内的消息
12.提示:
set_alert_property
使用set_alert_property来设置提示的信息,可以用字符串连接来输出信息,比FND_MESSAGE方便
13.屏蔽错误
如果碰到无法解决的错误,但是错误对程序并不影响。
在ON-ERROR触发器中,用一下代码替代
app_standard.event('
ON-ERROR'
IFERROR_CODE=41016THEN
NULL;
ELSE
app_standard.event('
END;
14.关于list的一些函数
clear_listadd_list_element配合使用在pro