EBS 开发技巧 常用代码
Form 开发技巧 常用代码
Form中的变量
Form中用到的变量,总结如下:
变量定义位置 | 作用域,由低到高 | 访问方法 | 引用方式 |
---|---|---|---|
各层触发器中的变量 | 该触发器 | Form PL/SQL | 变量名 |
Program Units中的变量 | 该Form的Session | Form PL/SQL | 包名.变量名 |
DB存储过程中的变量 | 该Form的Session | Form PL/SQL+DB PL/SQL | 包名.变量名 |
Block中的Item | 该Form的Session | Form PL/SQL+界面录入、修改 | :块名.变量名 |
Parameters中的Item | 该Form的Session | Form PL/SQL+EBS定义Function传初值 | :parameter.变量名 |
SYSTEM变量 | 该Form的Session | Form PL/SQL,只读,不能定义和修改值 | :SYSTEM.变量名 |
GLOBAL变量 | 整个应用 | Form PL/SQL,不用明确定义 | :GLOBAL.变量名 |
初始值 格式掩码
ITEM 的初始值属性:
当前日期:$$dbdate$$
当前时间:$$dbdatetime$$
下一序列::sequence.<sequence_name>.nextval
引用参数::parameter.<parameter_name>
引用字段::<block_name>.<item_name>
在OU层获取本位币:
思路是根据财务选项视图(屏蔽OU)连接SOB表取:
SELECT sob.currency_code
INTO :parameter.g_default_currency
FROM financials_system_parameters fsp, gl_sets_of_books sob
WHERE fsp.set_of_books_id = sob.set_of_books_id
货币格式
思路是根据字段长度、预制文件设置的货币格式智能设置掩码:
set_item_property('<Block_Name>.<Item_Name>',
format_mask,
fnd_currency.get_format_mask(:parameter.g_default_currency,
get_item_property('<Block_Name>.<Item_Name>',
max_length)));
获得账户结构
思路是根据预知文件的账套:
SELECT sob.set_of_books_id, sob.chart_of_accounts_id
FROM gl_sets_of_books sob
WHERE sob.set_of_books_id = fnd_profile.VALUE('GL_SET_OF_BKS_ID')
消息处理
调式
fnd_message.debug('Message');
出错消息
fnd_message.set_name('<APP_SHORT_NAME>','<Message_CODE>') ;
fnd_message.error;
提示消息
fnd_message.set_name('<APP_SHORT_NAME>','<Message_CODE>') ;
fnd_message.show;
询问信息
fnd_message.set_name('<APP_SHORT_NAME>', '<Message_CODE>');
if fnd_message.question('YES','NO',NULL,1,2) = 1 then
--do something
else
--do something
end if;
Special菜单
触发器When-New-Form-Instance
Form级app_special.instantiate('SPECIAL1','<Prompt>');
触发器Pre_Block
app_special.enable('SPECIAL1',property_on);
触发器SPECIAL1
Form级写实际代码。
库存组织访问
拷贝标准对象组
从INVSTAND.fmb的对象组中拖INV_PARAMS到我们Form的对象组中,并用Subclass,这样会生成4个参数。
Form触发器
Pre-Form中编写:Fnd_Org.Choose_Org;
问题
如果指责只有一个菜单,那么进入这个职责将自动打开Form。这个时候问题来了,如果用户在其他职责切换过组织,那么这个时候,这里将不再切换了,而是从前面的职责直接带过来,不管“合法不合法”。
MFG_ORGANIZATION_ID相关问题
无法自动切换
如果指责只有一个菜单,那么进入这个职责将自动打开Form。这个时候问题来了,如果用户在其他职责切换过组织,那么这个时候,这里将不再切换了,而是从前面的职责直接带过来,不管“合法不合法”。
请求的参数
背景:定义并发程序的时候,默认库存组织参数为Profile MFG_ORGANIZATION_ID,必须,不显示;用户通过View菜单提交请求;职责A组织访问为101,职责B组织访问为102。
问题:在职责A提交请求,如果没有Change Organization,报错,这个正常;Change Organization后,再提交请求,OK,参数里面的组织为101;切换到职责B,直接提交请求,OK,参数里面的组织为101,而用户以为是在102组织!
原因:MFG_ORGANIZATION_ID,会从前面的职责带过来,不像其他的Profile。
解决:把请求放入菜单,这样可以要求选组织;通过View不让提交
MFG_ORGANIZATION_ID的读取
Profile MFG_ORGANIZATION_ID是在用户选择切换组织的时候设置的,我们在请求参数和值集中经常会用到。这个没有问题。
但是如果想在数据库端用fnd_profile.VALUE('MFG_ORGANIZATION_ID'),有时候就取不到(Bug 4142205);而在form中用fnd_profile.VALUE('MFG_ORGANIZATION_ID')就有值。
这里面包含了两个问题:
1、 数据库中有fnd_profile这个package,pll中也有fnd_profile,两者并非完全等价;类似的还有fnd_message等等
2、 绕过Bug 4142205的办法,必须在Form中用apps.fnd_profile.put('MFG_ORGANIZATION_ID', :parameter.org_id),而不能用fnd_profile.put('MFG_ORGANIZATION_ID', :parameter.org_id)
常用内置过程
显示、隐藏画布
hide_view并没有真正hide一个画布,只是放到最下层,所以如果上层的画布没有完全覆盖下层画布,下层的画布很可能用户还看得到;show_view则是把画布放在最上层。
hide_view(‘View_Name’);
show_view(‘View_Name’);
取得查询到的记录数
没有属性指明Block的记录数,但可以通过函数取得查询到的记录数:
GET_BLOCK_PROPERTY(‘Block_Name’, QUERY_HITS) ;