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) ;

posted @ 2023-03-09 15:14  胖大海527  阅读(372)  评论(0)    收藏  举报