EBS常用开发整理

1、 通过值集code编号查询到值集的name名称
–取flex_value描述
FUNCTION get_flex_value_desc(p_flex_value_set_name IN VARCHAR2,–值集代码
p_flex_value IN VARCHAR2)
RETURN VARCHAR2 IS
v_flex_value_desc fnd_flex_values_vl.description%TYPE;
BEGIN
SELECT v.description
INTO v_flex_value_desc
FROM fnd_flex_values_vl v, fnd_flex_value_sets s
WHERE v.flex_value_set_id = s.flex_value_set_id
AND s.flex_value_set_name = p_flex_value_set_name
AND v.flex_value = p_flex_value;

RETURN v_flex_value_desc;

EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END get_flex_value_desc;
2、 公共代码维护的作为lov
select MEANING,DESCRIPTION
from fnd_lookup_values t
where t.lookup_type = ‘SSC_VENDOR_TYPE’
AND LANGUAGE=’ZHS’ AND ENABLED_FLAG=’Y’
3、 值集维护的作为lov
SELECT ffvv.FLEX_VALUE_MEANING, ffvv.description
FROM fnd_flex_value_sets ffvs, fnd_flex_values_vl ffvv
WHERE ffvs.flex_value_set_name = ‘SSC_EMPLOYEE_POST_STATUS’
AND ffvv.flex_value_set_id = ffvs.flex_value_set_id

4、 资产所属责任中心、机构等常用关联表
From
gl_code_combinations gcc,
fa_distribution_history fdh
where
AND gcc.code_combination_id=fdh.code_combination_id
AND (v_respon_from IS NULL OR TO_NUMBER(gcc.segment2) >= v_respon_from)
AND (v_respon_to IS NULL OR TO_NUMBER(gcc.segment2) <= v_respon_to)

5、 调用EBS 日期控件
首先将ITEM 的LOV 属性设置为“ENABLE_LIST_LAMP”、列表验证属性设置为“否”
在ITEM 的“KEY-LISTVAL”解发器下加入对下代码:
BEGIN
calendar.show();
END;
注意:ITEM 对应数据库类型必须是DATE 类型,
6、 涉及到资产的变动、报废、新增等操作的关联表
fa_transaction_headers
7、 获取资产小类名称,与资产大类关联
FUNCTION cux_get_flex_desc2(v_flex_set VARCHAR2,
v_flex_value VARCHAR2,
v_flex_value2 VARCHAR2) RETURN VARCHAR2 IS
v_description VARCHAR2(240);
BEGIN
SELECT ffvv.description
INTO v_description
FROM fnd_flex_value_sets ffvs, fnd_flex_values_vl ffvv
WHERE ffvs.flex_value_set_name = v_flex_set
AND ffvv.flex_value = v_flex_value
AND ffvv.flex_value_set_id = ffvs.flex_value_set_id
– AND FFVV.PARENT_FLEX_VALUE_LOW = v_flex_value2
AND FFVV.ENABLED_FLAG = ‘Y’;
RETURN v_description;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END cux_get_flex_desc2;

–调用 cux_get_flex_desc2(‘FA_MIN’, fc.segment2, fc.segment1) cate_small_desc

8、 设置有上下文关联关系的值集
set_of_books_id=nvl(:FLEX.cux_sob_id,set_of_books_id) 或者 set_of_books_id=nvl(:FLEX.cux_sob_id:NULL,set_of_books_id) 这样两个值集就关联起来了。 我们仔细看上面的2个语句,差别在于第二个语句多了一个(:NULL),他的作用是当用户不选择他的父参数时,可以先选择他自己,反之,如果没有:NULL则用户必须选择完其父参数
9、 自动生成编号补齐指定位数

select count(1)
into v_count
from SSC_EXPENSE_HEADER h
where to_char(h.creation_date, ‘yyyy-mm-dd’) =
to_char(sysdate, ‘yyyy-mm-dd’)
AND H.ORG_CODE=:EX_JC_H.ORG_CODE
and h.status not in (‘NEW’,’CANCEL_SUBMIT’);
if v_count > 0 then
select lpad((max(substr(h.expense_header_code, 12, 4)) + 1), 4, 0)
into v_sqe
from SSC_EXPENSE_HEADER h
where to_char(h.creation_date, ‘yyyy-mm-dd’) =
to_char(sysdate, ‘yyyy-mm-dd’)
AND H.ORG_CODE=:EX_JC_H.ORG_CODE
and h.status not in (‘NEW’,’CANCEL_SUBMIT’);
else
v_sqe := ‘0001’;
end if;
EXCEPTION
WHEN OTHERS THEN
v_sqe := ‘0001’;
END ;

10、 用于无提示框提交
PROCEDURE DO_COMMIT IS
OLD_LEVEL VARCHAR2(2);
BEGIN
OLD_LEVEL:=NAME_IN(‘SYSTEM.MESSAGE_LEVEL’);
COPY(‘5’,’SYSTEM.MESSAGE_LEVEL’);
COMMIT;
COPY(OLD_LEVEL,’SYSTEM.MESSAGE_LEVEL’);
END DO_COMMIT;

11、 Forms里客制的触发器里做完增删改后,需要加入commit;才会执行到数据库中。On-insert,on-update等系统form触发器里的增删改语句不需要
12、 Form-LOV 相互之间有引用相互关系的
SELECT 。。。。。 FROM 。。。。
WHERE FVV.FLEX_VALUE like nvl(substr(:QUERY_FIND.ASSET_CATEGORY_SEGMENT2,1,3), ‘%’)
13、 Pl/sql中输出异常语句
exception
when others then
insert into testinfo values(dbms_utility.format_error_backtrace);
commit;

或者
dbms_output.put_line(l_sql); –测试的时候可以输出

14、 PL/SQL测试的时候如果需要初始化参数
在PL、SQL的程序入口处begin敲入如下代码:
FND_GLOBAL.APPS_INITIALIZE(user_id =>1130 ,resp_id =>50724 ,resp_appl_id =>20003);
里面参数具体值,可以在form界面的诊断里查询出。
15、 根据职责配置功能权限控制
(1)新建职责,在 应用产品——功能,新建一个“权限”功能。这个功能是一个“虚功能”,也就是没有对应的form。
(2)在职责对应的菜单中,新增权限功能。注意:“提示”信息需要为空。
(3)form中通过FND_FUNCTION.TEST 就能判断出这个职责菜单下是否有某一权限功能(职责跟菜单是一 一对应的)。然后根据获得的功能,编写控制语句
例:
IF FND_FUNCTION.TEST(‘CUX_FA_QUERY’) THEN
—块控制
SET_BLOCK_PROPERTY(‘FEE_AVERAGE’,INSERT_ALLOWED,PROPERTY_FALSE) SET_BLOCK_PROPERTY(‘FEE_AVERAGE’,update_ALLOWED,PROPERTY_FALSE); SET_BLOCK_PROPERTY(‘FEE_AVERAGE’,delete_ALLOWED,PROPERTY_FALSE);
–按钮控制
Set_Item_Property(‘EDIT.BTN_OK’,ENABLED ,Property_false);–不可操作
Set_Item_Property(‘EDIT.BTN_OK’, DISPLAYED,Property_false);–不可见

   根据配置文件设置功能权限
(1)新建配置文件,系统管理员——定义配置文件选项

SQL=”select DESCRIPTION NAME,lookup_code CODE
into :visible_option_value, :profile_option_value
from fnd_lookup_values t
where lookup_type=’SSC_VENDOR_RIGHT’
and t.language = ‘ZHS’
order by name”
COLUMN=”NAME(30)”
HEADING=”\”操作权限\”(30)”
(2)配置文件——系统
选择职责,配置文件,查询——然后配置相应权限
(3)代码中使用,例:
v_value := fnd_profile.value(‘SSC_VENDOR_RIGHT_PRO’);
if v_value=’CREATE_ONLY’ then –新增权限

16、 FORM 之间的调用
APP_NAVIGATE.EXECUTE 或FND_FUNCTION.EXECUTE
例:FND_FUNCTION.EXECUTE(‘CUXFEEAVERAGE’,’Y’,’N’,’EXPENSE_HEADER_ID=’||:EX_JC_H.EXPENSE_HEADER_ID||’ EXPENSE_LINE_ID=’||:EX_JC_L.EXPENSE_LINE_ID);
然后在被打开的form中,新增parameter参数。
在when-new-form-insstanse增加
IF :PARAMETER.vendor_id IS NOT NULL THEN
GO_BLOCK(‘SSC_VENDOR_INTERNAL_V’);
EXECUTE_QUERY;

在块的属性where中接收传入的参数(或者通过set_block_property(‘CUX_PO_HEADERS_ADD_MESSAGE’,DEFAULT_WHERE,’PO_HEADER_ID=’||lv_default);
)。
其中APP_NAVIGATE.EXECUTE 与FND_FUNCTION.EXECUTE 的区别:
APP_NAVIGATE.EXECUTE 只打一个FORM,而FND_FUNCTION.EXECUTE 调用多少次,就打开多少
个。

17、 遍历数据块
go_block(‘BLOCKNAME’);
first_record;
IF :SYSTEM.block_status <> ‘NEW ’ THEN
Loop

–do something

if :system.last_record = ‘TRUE’ then
exit;
else
next_record;
end if;
end loop;
end if;

18、
Fnd_Profile 的常用方法
begin
fnd_message.debug(‘user_id= ’ || fnd_profile.value(‘user_id’)); –取当前登录EBS 用户ID
fnd_message.debug(‘user_name= ‘||fnd_profile.value(‘USERNAME’)); –取当前登录EBS 用户名
fnd_message.debug(‘FND_Global.User_Name=’|| FND_Global.User_Name); –取当前登录EBS 用户名
fnd_message.set_string(‘GL_SET_OF_BKS_ID=’||fnd_profile.value(‘GL_SET_OF_BKS_ID’));
fnd_message.show; –取当前帐套
end;
19、 Ora-01403:no data found错误
Select 。。。into 为空置引起的,可以 select max(..) into
20、 Form界面用于数据项合计功能
条件:用于合计的字段项和重复行的项必须处于同一个block中。
Block的属性——查询所以记录——是。
合计项的属性——显示的项数——1;
项的计算模式设置为“概要”,设置汇总函数、汇总块、汇总项

21、 Block为视图时,需要增删改操作的两种做法
1、 设置视图触发器
2、 在form中做增删改操作。
22、 数据传传账流程
数据插入——分录表——取分录表数据插入“接口临时表”——插入接口表——插入日记账——自动过账。
23、 数据库为视图时,设置属性
查询所有记录:是
键模式:可更新
24、 新建并使用序列
新建序列:– Create sequence
create sequence SSC.SSC_EXPENSE_LINES_S
minvalue 1
maxvalue 9999999999999999999999999999
start with 2647
increment by 1
cache 20;

使用序列: select ssc_expense_lines_s.NEXTVAL into l_line_id from dual;
创建同义词:create public synonym table_name for user.table_name;

25、 FORM开发规范
1、 对form的item等赋值的操作不要放在when-new-form-instance里,这样会导致即使block是query状态也会出现提示保存窗口。
2、 如果需要使用序列作为插入表的唯一值,放在pre-insert里生成,不要在on-insert的同时生成值再插入。
3、 Post-query触发器里的逻辑,如果没有查询出数据是不执行的。
4、

26、 数字格式掩码设置:FM999,999,999,990.00
27、 判断数据块状态
if :System.Form_Status = ‘CHANGED’ then —NEW,QUERY
cuxapp.msgstop(‘当前记录未保存请先保存!’);
return;
end if;
判断记录状态::system.RECORD_STATUS

28、 Form触发器WHEN-WINDOW-ACTIVATED
当窗口切换时出发,可以用来作为关闭一个form后,出发另一个form事件的逻辑
29、 终止执行接下来的触发器
raise form_trigger_failure;
如果用retrun,仅仅是跳出当前逻辑,接下的触发器还是会执行。

30、 app_query里面的一些函数,做了如下笔记。
app_query.append (‘块名’,user_where_clause): 在form中,给数据块查询添加新的where语句。
where语句里面字节必须《2000,当大于这个字节数就会发生溢出。
31、 EBS常用查询方式
1、要在参数中定义G_Query_find参数,此参数是标准参数,只要用下面的代码就可以把数据块置为查询状态。
:parameter.G_query_find := ‘TRUE’;
app_find.find(‘CUXIPDCOLOR’);
:parameter.G_query_find := ‘FALSE’;

2、执行查询的方法有如下几种
A、app_find.find(‘CUXIPDCOLOR’);
B、execute_query;
用此方法时一定要指定当前数据块
C、app_find.query_find(‘WEIGHTS’,
‘QUERY_FIND’,
‘QUERY_FIND’);

3、添加查詢條件的方法。
A app_query.append(:system.trigger_block,’ITEM_NUMBER>=”’||NAME_IN(‘QUERY_FIND.P_ITEM_NUMBER_FROM’)||””);
函数解析:
参数一:要查询的数据块
参数二:查询语句

B
app_find.query_range(:ORDERS_QF.order_number_from,:ORDERS_QF.order_number_to,’QF_ORDERS.order_number’);
函数解析:

参数一:查询条件取值从
参数二:查询条件取值至
参数三:要查询的栏位
C
copy(:ORDERS_QF.AGENT_ID,’QF_ORDERS.AGENT_ID’);
函数解析:
参数1:复制来源
参数2:复制目的地

D
set_block_property(‘CUX_PACKING_HEADERS_ALL_V’,default_where,’FILE_ID =’|| :COPY.NEW_FILE_ID);
函数解析:
参数1:要查询的数据块
参数2:固定常量
参数3:语句
这个方法用之前和用完后要把default_where清空,如下
set_block_property(‘CUX_PACKING_HEADERS_ALL_V’,default_where,’’);
如果要多个条件,用中间变量叠加生成查询条件语句,如下:
v_where:=v_where +’’
set_block_property(‘CUX_PACKING_HEADERS_ALL_V’,default_where,v_where);
32、 安全性视图,取当前机构
CREATE OR REPLACE VIEW CUX_FND_ORG_V AS
SELECT DISTINCT FFVV.FLEX_VALUE AS org_code,
FFVV.DESCRIPTION AS org_name
FROM FND_FLEX_VALUES_VL FFVV, FND_FLEX_VALUE_SETS FFVS
WHERE FFVV.FLEX_VALUE_SET_ID = FFVS.FLEX_VALUE_SET_ID
AND FFVS.FLEX_VALUE_SET_NAME = CUX_GL_COMMON_PKG.get_flex_value_set_name(NULL,NULL,’SEGMENT1’)
AND FFVV.FLEX_VALUE <= ‘Z’
AND ((EXISTS (SELECT 1
FROM fnd_flex_value_rule_lines
WHERE flex_value_rule_id =
(SELECT flex_value_rule_id
FROM fnd_flex_value_rule_usages
WHERE responsibility_id = fnd_global.resp_id
AND flex_value_set_id = ffvs.flex_value_set_id)
AND include_exclude_indicator = ‘I’
AND flex_value_high >= flex_value
AND flex_value_low <= flex_value) AND NOT EXISTS
(SELECT 1
FROM fnd_flex_value_rule_lines
WHERE flex_value_rule_id =
(SELECT flex_value_rule_id
FROM fnd_flex_value_rule_usages
WHERE responsibility_id = fnd_global.resp_id
AND flex_value_set_id = ffvs.flex_value_set_id)
AND include_exclude_indicator = ‘E’
AND flex_value_high >= flex_value
AND flex_value_low <= flex_value)) OR NOT EXISTS
(SELECT 1
FROM fnd_flex_value_rule_lines
WHERE flex_value_rule_id =
(SELECT flex_value_rule_id
FROM fnd_flex_value_rule_usages
WHERE responsibility_id = fnd_global.resp_id
AND flex_value_set_id = ffvs.flex_value_set_id)))
order by FFVV.FLEX_VALUE;

33、 根据请求号查找日志文件和输出文件位置。(可根据存放位置从ftp下载,然后查看具体错误信息)
SELECT * FROM FND_CONCURRENT_REQUESTS WHERE REQUEST_ID=
输出到日志: fnd_file.put_line(fnd_file.LOG, p_string);
34、 报表问题综合
流程:1、PL/SQL里编写存储过程
3、 应用开发员——注册并发请求,(输出改成XML)可执行和程序,注册参数。注意简称要一致,且区分大小写。
4、 注册功能、程序、菜单。功能的表单选“运行报表”。
5、 参数为:
CONCURRENT_PROGRAM_NAME=”CUXFACATSUM” PROGRAM_APPL_SHORT_NAME=”CUX” SUBMIT_ONCE=”Y”

CONCURRENT_PROGRAM_NAME为之前注册的功能名。
6、 打开菜单,输出XML文件。
7、 新建word,加载XML,生成.rtf
8、 Xml publisher管理员——数据定义——创建模板
如果输出报表遇到问题,可以通过系统管理员——并发——经理——内部冲突管理器或输出处理等来查看日志。

(1) 解决数字太长,导致科学计数法:
在。Rtf模板,找到那一列属性——添加帮助文字——

<think>好的,我现在需要帮助用户解决在Oracle EBS表单中实现网页跳转的问题。首先,用户的问题比较具体,涉及到EBSForms以及网页跳转的实现。我需要先回忆一下Oracle EBS的相关知识,尤其是Forms开发部分。 首先,Oracle EBSForms通常是基于Oracle Forms Builder开发的,运行在Java applet或者HTML环境中。在Web环境下,实现页面跳转可能需要不同的方法。常见的跳转方式可能有几种:使用WebUtil调用外部浏览器,或者通过Forms的HOST命令,或者利用JavaScript在客户端执行跳转。 接下来,我需要确认这些方法是否仍然适用,尤其是在较新版本的EBS中。比如,WebUtil是一个常用的工具,但需要确保它已经正确配置和启用。此外,使用HOST命令可能依赖于客户端的设置,可能存在安全限制,特别是在浏览器中运行时可能不被允许。 另外,用户可能需要通过参数传递或者调用EBS的并发程序来生成URL,然后进行跳转。例如,使用FND_FUNCTION.EXECUTE函数来调用EBS的功能,或者生成URL并通过客户端的脚本来打开新窗口。 我还需要考虑安全性问题,比如跨站脚本(XSS)或者EBS的安全策略是否允许这样的跳转。在实现时可能需要配置白名单或者调整安全设置,例如引用中提到的URL防火墙配置[^1],这可能涉及到DMZ区域的设置,确保跳转的URL被允许。 此外,用户的问题中提到RDA数据收集的引用[^2],这可能与系统配置或环境有关,但暂时不确定如何直接关联到表单跳转的实现,可能需要进一步信息,但当前可以忽略,除非涉及到系统权限或环境配置的问题。 现在,我需要整理出几种可能的实现方法,并详细说明步骤。例如,使用WebUtil的CLIENT_HOST函数来启动浏览器,或者使用UTL_HTTP包生成重定向。另外,JavaScript可以通过Forms的客户端事件触发,比如按钮按下时执行脚本。 需要提醒用户注意不同方法的适用环境,比如客户端是否允许执行宿主命令,或者是否需要启用特定的Java权限。同时,还要考虑EBS版本差异,比如在R12或更高版本中可能推荐的方法。 最后,生成相关问题,帮助用户进一步解决可能遇到的障碍,比如性能优化、安全配置或调试方法。</think>在Oracle EBS Forms中实现网页跳转可通过以下方法实现,需根据具体需求选择合适方案: ### 方法1:使用WebUtil调用浏览器 1. **启用WebUtil配置** 在`webutil.cfg`文件中添加目标域名白名单,例如: ```ini [HOST_ACCESS] *.oracle.com=ENABLED ``` 确保DMZ防火墙允许目标URL访问[^1]。 2. **在Form中添加WebUtil库** ```plsql WEBUTIL_HOST('cmd /c start https://www.example.com'); ``` 此方法通过客户端执行系统命令打开浏览器,需确保Java安全策略允许外部调用。 ### 方法2:使用JavaScript注入 ```plsql WEB.SHOW_DOCUMENT('javascript:window.open("https://www.example.com");', '_blank'); ``` 此方法直接通过Forms内置函数执行客户端脚本,但可能受浏览器弹窗拦截限制。 ### 方法3:参数化URL跳转 在Form中创建按钮触发器: ```plsql DECLARE v_url VARCHAR2(200) := 'https://ebsapp/oa_media/jsp/redirect.jsp?param=123'; BEGIN FND_FUNCTION.EXECUTE(FUNCTION_NAME => 'FND_URL', OPEN_FLAG => 'Y', SESSION_FLAG => 'Y', OTHER_PARAMS => 'p_url=' || v_url); END; ``` 需在EBS中配置`FND_URL`功能映射到目标页面。 ### 调试注意事项 1. 使用RDA工具检查中间层配置: ```shell [oracle@vrh8 rda]$ ./rda.sh -p DB11g -T "Web Config" ``` 可验证HTTP监听器设置 2. 在`formsweb.cfg`中增加`baseHTMLjpi=your_custom_html.htm`覆盖模板
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值