近半年在公司做某个项目的时候,主要使用到了Oracle BIEE 10g这套工具。刚开始的时候,对OBIEE是七窍通了六窍,还是一窍不通。
现在已经摸索出些许门道,特整理出来:一来,备忘;二来,供大家参考。如果有更优的解决办法,欢迎批评指正。
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代码
1 <script language="javascript"> 2 function NQOnLoadEvent() 3 { 4 NQOnWindowLoadsaw_1651_1(); 5 NQOnWindowLoadsaw_1651_2(); 6 NQOnWindowLoadsaw_1651_3(); 7 }; 8 window.onload = NQOnLoadEvent; 9 </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代码如下:
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; }
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代码如下:
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; } }
关于使用修改js的方法实现特定功能先写到这里,可以类推。
2.4 修改仪表盘提示的按钮显示的文字
需求 :OBIEE 10g默认的仪表盘提示的按钮为“执行”,客户想改为“查询”。
解决方案:“/OBIEEInstallDir/OracleBI/web/msgdb/l_zh/messages/globalfiltermessages.xml”,找到“<WebMessage name="kmsgGFPGo"><TEXT>执行</TEXT></WebMessage>”,把其中的“执行”改为“查询”,清除缓存重启BIEE服务即可。