BIEE 10g 二次开发整理

 

    近半年在公司做某个项目的时候,主要使用到了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服务即可。

   

 

 

 

 

posted @ 2014-02-17 20:39  蓦然回手  阅读(1104)  评论(0编辑  收藏  举报