在oracle EBS的report客户化开发中,fnd_profile.value('RESP_ID')无效,百思不解。后研究发现,在report中使用fnd_profile.value的oracle标准方法:
1. 添加用户参数p_conc_request_id;
2. 在BeforeReport和AfterReport两个report trigger中,添加srw.user_exit('FND SRWEXIT')即可在report中正常使用fnd_profile.value;
分类目录归档:EBS Report开发
Oracle EBS XML报表中数字的处理(Excel输出)
不知大家是否遇到这样一个情况,报表中输出数字过大或者以“0”字符开头的时候(仅指在Excel输出中),会以科学计数法的形式显示或者省略0的形式显示,显然这样的效果不是客户想要的结果。相信大家的第一想法就是将数字转化为字符的格式,的确我们可以有不同的方法做这样的处理,自己对项目上出现此类的情况提供一些两种处理方式,均在rtf模板中处理(一般建议第一种方式):
1. 在对应的XML标签中的窗体域中写如下代码(此方法对金额格式财务化也有借鉴作用)
<fo:bidi-override direction="ltr" unicode-bidi="bidi-override"><?AMOUNT?> </fo:bidi-override>
2. 对有比较大数字的列,在单元格中加上Excel的T()函数,比如,=T("AMOUNT"),窗体域与T函数之间不能有空格
3. 在程序里面控制,类似:select '''' || '0000' from dual;(针对数字型)
4. html版本的类似处理:
.context td{
border:1px solid black;
padding:0.2mm 0.2mm 0.2mm 0.2mm;
white-space:nowrap;
font-size: 9.5pt;
mso-number-format:"\@";
}
同时需<TD nowrap align="left"> 变为 <TD nowrap align="left" x:str>
5. 当然如果查看报表的人员愿意自己格式化来查看,那也不失为一种解决方法,不过从对甲方人员的了解来看,他们不太会愿意去多点击一下鼠标
说明:
上面1、2、3、4种方式都会有一个明显的弊端,即无法对单元格数据进行计算。因此如果需要对单元格进行计算,则不能选择以上两种方式;如果能够确定数据的量级大小,则可选择直接数字输出,不作任何处理。
同时,对于应用方式1出的excel报表,仔细观察你会发现,字符的首尾都多出一个空字符,如下图标记处所示:
延伸思考1:Excel内自带有货币形式的显示,看能不能将此方式在rtf模板里面函数化,以此达到想要的效果。
附上金额财务化函数:
–转换金额输出格式-字符
Function Get_Amount_Format(p_amount in number) return varchar2 is
l_amout_value varchar2(9999);
Begin
if p_amount <> 0 then
select trim(to_char(p_amount, '999,999,999,999,999,999.99'))
into l_amout_value
from dual;
return l_amout_value;
else
l_amout_value := '0.00';
return l_amout_value;
end if;
Exception
When others Then
Log_Msg('p_amount change format error:' || p_amount || '=' ||
sqlerrm);
return null;
End Get_Amount_Format;
以下是效果图(数据均为测试数据):
延伸思考2:通过html标签强制转化为excel输出的报表,如果控制非文本项,比如0120,如果不做处理,将会输出120;2017-07将会输出JUL-17。
只需要在td标签中加入以下属性即可:
<td style="vnd.ms-excel.numberformat:@">