利用js做cognos交叉表的特殊汇总

浏览: 4020

交叉表表样:

JS01.jpg

图1.交叉表表样(图片太长,后面有个升级率没出来)

简单介绍一下模型:

JS02.jpg

背景:

这是一张某银行数据中心私人银行项目的一张报表,该行有自己的半成熟性的“产品”,就是所有报表通过一个通用存储过程建模。(优点是表与表的逻辑在数据库处理好了,最后生成的结果表就是报表所需要的所有数据,可以简化cognos建模的工作。缺点一大堆,还不肯改!)

报表难点:

在不能动模型的情况下,对于【稳定率】、【升级率】、【降级率】的汇总,也就是最后一行的数据不好计算。

图暂时去掉!

稳定率=交叉表中所有天蓝色表格的值的总计/合计(上图红色的数值)*100/%

升级率=交叉表中所有粉红色表格的值的总计/合计(上图红色的数值)*100/%

降级率=交叉表中所有浅绿色表格的值的总计/合计(上图红色的数值)*100/%

在能自由建立模型的情况下,我们可以通过增加纬度或者提前计算好汇总值的方法正确填入数值。但是目前不能,这使我相当烦恼!

后面在群里一位大神【白帝舞剑行】提供的灵感下,我使用js成功定位到各个颜色部分进行汇总。下面我分享一下代码和方法。

JS03.jpg

JS04.jpg

1.在交叉表外包用一个span标签将交叉表对象包裹住。给一个唯一的ID

2.在每个什么什么率的单元格选中,然后自定义内容改为是,然后解锁。拖两个HTML项目过去,中间夹一个空的文本对象。两个HTML也是使用span对象将文本对象给包裹住。给一个唯一的ID。

3.然后在包裹住div的结束HTML标签后,再加一个html,用来写JS代码。

Js内容如下:

<script type="text/script">

var targetTable = document.getElementById("a2");//得到包裹交叉表的span对象。

targetTable.firstChild.id="rsTable";//得到span对象下面的第一个对象,就是交叉表对象,然后给交叉表对象赋一个ID。

targetTable.firstChild.name="rsTable";//给交叉表对象赋一个name。可以不写!

var tableObj1 = document.getElementById("rsTable");

//通过ID获取交叉表对象。

var countcolor=0;//给绿色部分汇总降级率一个初始值

var heji=0;//给合计汇总一个初始值

var tianlan=0;//给蓝色部分汇总稳定率一个初始值

var fenhong=0;//给粉红色部分汇总升级率一个初始值

var gaoduanlv=0;//给高端汇总率一个初始值

//遍历单元格,将各颜色单元格的值进行汇总

for(var i=0;i<tableObj1.rows.length;i++)//遍历行

{

for(var j=0;j<tableObj1.rows[i].cells.length;j++)//遍历列

{

if(tableObj1.rows[i].cells[j].style.backgroundColor=="#99cc66")//绿色部分,当然这个颜色代码是由我控制的,在每一列显示什么颜色是由条件样式控制的。

{

countcolor+=parseInt(tableObj1.rows[i].cells[j].innerText);//累积汇总绿色部分的值。

}

else if(tableObj1.rows[i].cells[j].style.backgroundColor=="#c0c0c0"){

heji=parseInt(tableObj1.rows[i].cells[j].innerText);

//合计部分,只有一个单元格。所以不用+=。颜色也是定死的。

}

else if(tableObj1.rows[i].cells[j].style.backgroundColor=="#99ffff")//稳定率部分

{

tianlan+=parseInt(tableObj1.rows[i].cells[j].innerText); //累积汇总天蓝色部分的值

}

else if(tableObj1.rows[i].cells[j].style.backgroundColor=="#ffccff")

{

fenhong+=parseInt(tableObj1.rows[i].cells[j].innerText); //累积汇总粉红色部分的值

}

else if(tableObj1.rows[i].cells[j].style.backgroundColor=="#cccccc")//高端率汇总

{

gaoduanlv+=parseInt(tableObj1.rows[i].cells[j].innerText);//高端率汇总

}

}

}

//刚刚上面的循环会计算好各个颜色部分的汇总值,

这一步是汇总行里的包裹住的文本项目赋值。也就是我们要将计算好的总值填到对应的单元格。

var gaoduan1=document.getElementById("gaoduanlv");//高端率汇总行里的span对象

gaoduan1.firstChild.id="gaoduanwenben";//给span包裹住的文本项目指定ID

gaoduan1.firstChild.name="gaoduanwenben";

var gaoduanwenben=document.getElementById("gaoduanwenben");//得到该文本对象

gaoduanlv=(gaoduanlv/heji*100).toFixed(2);//计算好百分比

gaoduanwenben.innerText=gaoduanlv+"%";//给文本对象赋值

//同上

var wending1=document.getElementById("wending");

wending1.firstChild.id="wendingwenben";

wending1.firstChild.name="wendingwenben";

var wendingwenben=document.getElementById("wendingwenben");

tianlan=(tianlan/heji*100).toFixed(2);

wendingwenben.innerText=tianlan+"%";

var shengji1=document.getElementById("shengji");

shengji1.firstChild.id="shengjiwenben";

shengji1.firstChild.name="shengjiwenben";

var shengjiwenben=document.getElementById("shengjiwenben");

fenhong=(fenhong/heji*100).toFixed(2);

shengjiwenben.innerText=fenhong+"%";

var jiangji1=document.getElementById("jiangji");

jiangji1.firstChild.id="jiangjiwenben";

jiangji1.firstChild.name="jiangjiwenben";

var jiangjiwenben=document.getElementById("jiangjiwenben");

countcolor=(countcolor/heji*100).toFixed(2);

jiangjiwenben.innerText=countcolor+"%";

</script>

这段JS主要的用法是利用div或者说span对象,得到交叉表对象。然后通过js给交叉表动态赋值。可以精确到任何一个单元格。

推荐 1
本文由 H_Elsker 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册