1.RPD 相关
1.1增加序号
需求 :客户想在报表展现的数据前增加“序号”一列。
解决方案:使用OBIEE 10g的管理工具打开RPD,在“Business Model and Mapping”下面,右键单击需要添加“序号”列的逻辑表,选择“New Object”→“Logical Column...”,弹出逻辑列对话框,在“Name”后面输入“序号”,然后选中“Use existing logical columns as the source”,然后在下面输入“Rsum(1)”,或者单击右边的“...”按钮弹出“Expression Builder”对话框,在左下方选择“Functions”→“Display functions”→“Rsum”后,双击或者单击“Insert”后,会在上面的表达式编辑框显示“Rsum(<<numExpr>>)”,把括号中的值换为1即可。然后单击“OK”→“确定”保存。在Answers页面,直接拖此列使用。
这里也可以使用函数将请求中不存在重复数据的的某列如下图所示处理一下作为报表的序号
1.2增加包含固定值的列
需求:数据库中存储了建筑物数量,并没有存储此数量的计量单位“座”。客户想要把计量单位也展现出来,并单独成一列。
解决方案:按照上面的步骤增加逻辑列,选中“Use existing logical columns as the source”,在下面下拉输入座,并使用英文单引号引起来,保存。在Answers页面,直接拖此列使用。也可以在Answers编辑页面进行修改,随便拖一个字段,在该字段下面有四个小图标,单击第二个类型于函数的图标,弹出“编辑列公式”对话框,在“列公式”后面的编辑框里输入座,并使用英文单引号引起来也行。
2.展现报表 相关
2.1调整仪表盘提示样式
需求:OBIEE 10g默认的仪表盘提示是提示文字在上面,下拉列表框或者文本编辑框在下面,客户觉得这种样式不好看,想让提示文字在下拉列表框或者文本编辑框前面,并水平居中对齐。
解决方案:在仔细研究生成的报表页面的源HTML代码后发现有如下JavaScript代码
<script language="javascript">
function NQOnLoadEvent()
{
NQOnWindowLoadsaw_1651_1();
NQOnWindowLoadsaw_1651_2();
NQOnWindowLoadsaw_1651_3();
};
window.onload = NQOnLoadEvent;
</script>
<script language="javascript">
function NQOnWindowLoadsaw_1651_2()
{
saw.dashboard.reload();
}
</script>
看到这个后,立马灵光一现,嘿嘿,感觉春天来了。页面加载完成后会调用NQOnLoadEvent,于是在OBIEE安装目录疯狂寻找“saw.dashboard.reload”事件。结果还真找到了,在“/OBIEEInstallDir/OracleBI/oc4j_bi/j2ee/home/applications/analytics/analytics/res/b_mozilla/dashboards/portalscript.js”文件中。根据CSS class的名称定位到仪表盘提示的文字所在的table,因为提示文字和下拉列表或者文本编辑框在此table的第一个tr的第一个td中,删掉该td的innerHTML中的“<br>”即可实现不换行。
示例js代码如下:
<span style="font-size:14px;"> var tSpan=tSpans[i];
//去掉仪表盘提示中的BR
if(tSpan.className=="GFPCaption")
{
var tempNode=tSpan.parentNode;
tempNode.innerHTML=tempNode.innerHTML.replace("<BR>","<b>:</b> ");
tempNode.innerHTML=tempNode.innerHTML.replace("<br>","<b>:</b> ");
bRemoveBR=true;
}</span>
2.2把总计行放到报表数据域第一行
需求:客户觉得总计放在报表最后一行要下翻报表,才能看到。想放在第一行,先看总计,然后再看数据。
解决方案:按照2.1的步骤修改portalscript.js文件,定位到展现报表的table,并使用js把最后的总计一行放到第一行。示例js如下:
//把总计移动到表第一行if(targetTable.className=="ResultsTable GreenBar") { var secondRow=targetTable.rows[1]; if(secondRow.cells[0].className!="grandtotal") { var lastRow=targetTable.rows[targetTable.rows.length-1]; if(lastRow.cells[0].className=="grandtotal"||lastRow.cells[0].className=="grandfact") { var newRow; if(secondRow.cells[0].className=="TableHdg") { newRow=targetTable.insertRow(2); } else { newRow=targetTable.insertRow(1); } for(var j=0;j<lastRow.cells.length;j++) { var tempCell=newRow.insertCell(j); tempCell.className=lastRow.cells[j].className; tempCell.colSpan=lastRow.cells[j].colSpan; tempCell.style.textAlign=lastRow.cells[j].style.textAlign; } targetTable.deleteRow(targetTable.rows.length-1); bMoveTotal=true; } }
2.3增加分页
需求:OBIEE 10g默认显示当前的记录的开始条数和结束条数,并不展现当前第几页,共多少页。客户想要这个分页的效果
解决方案:编辑需要分页的报表的Request,随便拖一列,然后单击下面四个小图标中的第一个图标(像小手),弹出“列属性”对话框,单击“列格式”选项卡,选中“隐藏”,单击“确定”保存退出。单击下面四个小图标中的第二个图标(像函数),弹出“编辑列公式”对话框,在“列公式”后面输入“MAX(RCOUNT(1))”(不带双引号),单击“确定”保存退出。这一隐藏的列,存储了一共有多少条记录。然后添加一个“叙述”视图,在“叙述”后面添加内容“@1 ”(不带双引号),其中“@”后面的数字是存储记录数的隐藏列的索引,从1开始。如果是第一列就是“@1 ”,第二列就是“@2 ”,依此类推。在“要显示的行”后面输入1。前台工作完成,然后修改portalscript.js文件,得到叙述视图里面所记载的总记录数,根据总记录数、每页显示的记录数和当前页显示的记录范围,可以计算当前第几页及共多少页。示例js代码如下:
<span style="font-size:14px;">if(targetTable.rows&&targetTable.rows[0].cells&&targetTable.rows[0].cells[0].innerHTML.indexOf("叙述")>=0&&targetTable.rows[0].cells[0].innerText&&targetTable.rows[0].cells[0].innerText.length<=8) { var recordCount=parseInt(targetTable.rows[0].cells[0].innerText); targetTable.style.display="none"; if(bGetRecord) { var first=parseInt(spanTapeDeckRecords.innerText.split(" ")[1]); var last=parseInt(spanTapeDeckRecords.innerText.split(" ")[3]); var currentPage; if(first<=20) { currentPage=1; } else { currentPage=Math.floor(first/20)+1; } var totalPage; if(last==recordCount&&first==1) { totalPage=1; } else { totalPage=Math.ceil(recordCount/20); } spanTapeDeckRecords.innerText="当前第"+currentPage+"页/共"+totalPage+"页"+" 共"+recordCount+"条记录"; bCalculated=true; } }</span>
关于使用修改js的方法实现特定功能先写到这里,可以类推。
2.4修改仪表盘提示的按钮显示的文字
需求:OBIEE 10g默认的仪表盘提示的按钮为“执行”,客户想改为“查询”。
解决方案:“/OBIEEInstallDir/OracleBI/web/msgdb/l_zh/messages/globalfiltermessages.xml”,找到“<WebMessage name="kmsgGFPGo"><TEXT>执行</TEXT></WebMessage>”,把其中的“执行”改为“查询”,清除缓存重启BIEE服务即可。