trCurrent1=tbl.rows(i);
if((trCurrent1.cells(0).children
(1).innerText.indexOf("")==0)
&&(trCurrent1.cells(0).children
(1).innerText.indexOf("")!
=0)){
trCurrent1.cells(0).style.paddingLeft="20px";
/*trCurrent1.style.display="none";*/
continue;
}
if((trCurrent1.cells(0).children
(1).innerText.indexOf("")==0)
&&(trCurrent1.cells(0).children
(1).innerText.indexOf("")!
=0)){
trCurrent1.cells(0).style.paddingLeft="40px";
trCurrent1.style.display="none";
continue;
}
if((trCurrent1.cells(0).children
(1).innerText.indexOf("")==0)
&&(trCurrent1.cells(0).children
(1).innerText.indexOf("")!
=0)){
trCurrent1.cells(0).style.paddingLeft="60px";
trCurrent1.style.display="none";
}
if((trCurrent1.cells(0).children
(1).innerText.indexOf("")==0)
&&(trCurrent1.cells(0).children
(1).innerText.indexOf("")!
=0)){
trCurrent1.cells(0).style.paddingLeft="80px";
trCurrent1.style.display="none";
trCurrent1.cells(0).getElementsByTagName("IMG").item(0).src="../pat/images/blank.gif";
}
}
}
2,表中(即中间)的HTML代码如下:
'hand;vertical-align:
middle;margin-right:
2px''/>'
2、最后的HTML代码如下:
2报表开发技巧整理
2.1树形列表
要点:
首先通过对数据项进行分组实现将各层次的数据项放在同一列中,子层被嵌套在父层中,然后对各层都设置一个标记以区别于其它层的数据,这里通过在数据项前面的缩进距离作为标记,然后利用在页面中嵌入脚本代码控件数据的展开显示和隐藏,其实当报表刚打开时,报表的所有数据包括父级与子级的数据都显示出来,只不过是通过代码将其隐藏而已,当用户单击展开目录按钮时代码通过一个循环语句显示出某一级别的数据,而其中一个终止循环的条件就是判定某一行的前面缩进的距离,而缩进目录的原理也是类似。
(具体制作过程可参考上面)
2.2树形交叉表
要点:
由于在交叉表中不能像LIST表中一样实现分组,所以要通过利用层次各级数据项建立一种数据联接关系,目的是将父级与子级目录的内容通过嵌套显示出来,效果其实与分组一样,所以可以在数据模型定义的时候对数据的格式进行特殊处理,例如不同层次的数据前面可以插入不同长度的空格,以识别其它层次,那么这样在代码处理方面就可以类似在列表中一样操作。
其实当报表刚打开时,报表的所有数据包括父级与子级的数据显示出来,只不过是通过代码将其隐藏而已,另外,在各子级目录的开始可通过设置不同空格的长度而让代码识别内容所在的级别。
当用户单击展开目录按钮时代码通过一个循环语句显示出某一级别的数据,而其中一个终止循环的条件就是判定某一行的前面缩进的距离,而缩进目录的原理也是类似。
(具体制作过程可参考上面)
2.3科目层次选择
特点:
科目层次选择
功能:
选择科目层次,然后下面自动出现该科目的所有成员列表框供选择
分摊表,科目按层次显示
1、下拉框选择显示的层次,保存在参数p_level中(使用静态成员,如1、2、3……)
2、在“条件资源管理器”中定义条件变量,读取的是参数p_level
3、对于多个科目层次,使用多个列表框,每个列表框设置其生成变量(RenderVariable),对应条件变量中的具体值(即选择该值则生成该列表框)
4、层次选择下拉框要自动提交;列表框要cascade到p_level
5、Query中使用科目时,需要通过case来控制显示的层,如:
CASE?
科目层次?
WHEN'1'THENcaption([erpfdb].[CCB_COGNOS_FTACCT_DV1].[CCB_COGNOS_FTACCT_DV].[ACCT1_DESC])
WHEN'2'THENcaption([erpfdb].[CCB_COGNOS_FTACCT_DV1].[CCB_COGNOS_FTACCT_DV].[ACCT2_DESC])
WHEN'3'THENcaption([erpfdb].[CCB_COGNOS_FTACCT_DV1].[CCB_COGNOS_FTACCT_DV].[ACCT3_DESC])
END
6、而Query中的条件,则需要给每个供选择的层次的科目都添加条件,条件使用“可选(optional)”即可
2.4多列树状折叠
特点:
多列折叠
示例报表:
分摊表3
要点:
第一列只在所在行有效,所以从如图中所示,“行政条线”跟“产品合计”在同一行上,所以“行政条线”对象的表示方法为“rows(i).cells(0)”,即属于第0个cell,而“产品合计”则属于第1个cell(“rows(i).cells
(1)”);
下来一行,“行政条线”列就不起效了,所以“默认2”就属于第1列了,表示为“rows(i+1).cells(0)”。
在js脚本上使用的技巧是将“行政条线”列退格5px,然后进行判断
if(trCurrent1.cells(0).style.paddingLeft=="5px"){/*如果是“行政条线”列*/
trCurrent1.cells
(1).getElementsByTagName("IMG").item(0).src="../pat/images/blank.gif";
}/*取cells
(1)对象*/
else{
if((trCurrent1.cells(0).children
(1).innerText.indexOf("")==0)/*否则取cells(0)对象*/
……
其他跟上述折叠报表技巧类似
2.5全部展开、折叠功能
效果如下图:
报表上添加了“全部展开”按钮,点击可以将所有折叠的项都展开;
1、修改原来的js代码:
/*纵向折叠*/
vartbl;
functionallWrap(el)
{
if(el.value=="全部展开"){
for(i=2;itbl.rows(i).style.dis