(以前的日志摘录)最近遇到一个很头疼的事情,客户马上要接受保监会的验收,但是他们对Oracle EBS系统中的财务三大报表的格式不满意。我们项目组考虑在很短的时间内要写出三个报表,是要花费大量精力的,同时现在考虑到人力有限,所以,我们商量在标准报表的基础上修改,看客户能否接受。
修改标准的FSG模板真不好弄,里面的代码我们是看不到的,要控制格式只能通过不断的对FSG定义上和利用FSG标准模板上的窗体域写入代码来尝试。千回百转,当我们第一次将雏形打印出来拿给客户看的时候,客户说可以接受。由于工作原因,项目经理去另一个项目上去,剩下我一个人在客户公司,客户最近不断地要求我更改格式,主要遇到以下几个问题:
1. 标准的“发布 FSG 报表”本身是不带边框的,客户要求对报表的每一项都要用边框;
2. 标准的三大财务报表(损益表、资产负债表、现金流量表)的项目条目中有不带数值的行,客户需要不带数值的行也要有边框;
3. 标准的FSG报表的输出数值只能超过千位的数字有标示位".00",客户需要所有数值都要有".00"标示,比如,1034,332,32.00 230.00 1.00的格式;
4. 列名需要加粗黑体并且居中
大体上就上面四个要求,刚听到客户提这些需求的时候,我还觉得很简单的,我们项目经理说这个可能不好弄。在确定用更改标准FSG模板的前提下,从服务器上下载模板名为“FSGXML 基本模板”的模板,开始着手更改。
对要求1,我们在标准模板的相应地方加上边框,更新模板(这时发现此模板不能更新,于是终止此模板,重新定义新的模板),将加上边框后的模板上传至新定义的模板上,跑请求看结果。效果是这样的,整个正文内容部分是加上了边框,但是对没有数值的地方,边框不会自动添加,就显示出“缺省”的地方,十分不美观,客户也不能接受。之前我是这样解决的,对原来不需要显示的地方用"0"填充或者用多项的和填充,的确这样做了以后,不再用空缺的行,相对之前是好看了许多,于是我打印出来给客户看这部分的效果,客户说:“这个样子改比之前那种“缺省”的外观来说是好美观了,但是却犯了一个原则的性才错误,比如资产负债表中,第一行是项目,按照你的做法是将项目这行的数值设为所有的条目的和(我自己以为是正确的),但是保监会要求的不会有这样的显示,项目这行在任何情况下都是不能有数值的。”于是重新思考方式来满足要求1。因为不是客户化的功能,很难从细节上控制格式,万般无奈的时候,我试着将整个表格外面再加一层表格,上传测试,奇迹般的在“缺省的”地方竟然加上了外边框。这间单元格的边框线目前未能解决,客户已经接受此部分的修改。
对要求2的解决方法在第一步已经顺带解决,在解决这个要求的时候,对FSG的定义一定要很熟悉,这对格式的修改非常重要,一个空格,对少缩进,都需通过设置设定,同时目前报表列头采用的是左对齐,且用trim()函数去掉空格。
对要求3,我咨询过老的功能顾问,他说这个系统默认对千位以上的数字会自动加上,如果客户实在要将千位以下的数字也显示成那样的效果,可以在定义FSG报表的时候,在定义列集的时候,有个数字格式,在里面加上任意一个字符即可,但是这个字符会在报表中显示出来,于是经过测试,的确是这样,但是沟通后客户不同意这样做,于是继续找方法,对定义FSG报表任何一个选项都反复测试,发现在定义行集的时候,在显示选项中,有个系数设置,感觉像是控制此问题的,但是结果不是,目前还在寻找方法。
对要求4,正寻找方法中……
未完待续……
最后还是完美解决。
所有由小潘发布的文章
Oracle EBS R12币种分隔符的使用
理解Oracle EBS中设置并发程序的不兼容
前几天天同事在群里问到这个问题的时候,说实话,当然还真不是理解很深刻,后来经过一番讨论,终于理解了。
这里举个例子,比如我们的客户化程序“CUX:三栏账打印”,里面的逻辑就是要往头和行的表中插入数据,然后从这两个表中取数展示数据,但是如果是有多个机构的公司,比如北京总部、浙江分公司两个机构(当然这两个机构都是用的一套EBS系统)。北京总部在跑“CUX:三栏账打印”这个请求的时候,恰巧浙江分公司也要跑“CUX:三栏账打印”这个请求,这无疑会造成数据的紊乱,因此Oracle提供了这样的解决方式,并发程序的不兼容性设置(对自身的不兼容),如果在不兼容性里面的名称栏设为“CUX:三栏账打印”,那么,当北京总部在跑这个程序的时候,浙江分公司只能处于等待状态,这样就能避免数据紊乱。
如何设置通过任务栏文字及颜色区分Oracle EBS环境
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:@">