Cognos报表开发技巧整理Word下载.docx
《Cognos报表开发技巧整理Word下载.docx》由会员分享,可在线阅读,更多相关《Cognos报表开发技巧整理Word下载.docx(33页珍藏版)》请在冰豆网上搜索。
el.src="
../pat/images/PropertyGroup_"
+(el.src.indexOf("
)==-1?
plus"
)+"
.gif"
for(vari=tr.rowIndex+1;
i<
tbl.rows.length;
i++)
{
vartrCurrent=tbl.rows(i);
if(trCurrent.cells(0).firstChild&
&
trCurrent.cells(0).getElementsByTagName("
IMG"
).length)
{
if(tr.cells(0).style.paddingLeft=="
&
trCurrent.cells(0).style.paddingLeft=="
20px"
)
{
if(el.src.indexOf("
)==-1)
{
trCurrent.cells(0).getElementsByTagName("
).item(0).src="
../pat/images/PropertyGroup_plus.gif"
}
}
else{
break;
}
if(tr.cells(0).style.paddingLeft=="
40px"
el.src.indexOf("
)>
0)
trCurrent.style.display=sDisplayReverse;
else{
trCurrent.style.display=sDisplay;
}
}
functionStartHidden(el)
vartbl=el.parentElement.parentElement.parentElement.parentElement;
for(vari=0;
i++)
vartrCurrent=tbl.rows(i);
if(trCurrent.cells(0).style.paddingLeft.indexOf("
px"
)>
-1)
trCurrent.style.display="
/script>
9.拖入两个HTML项目插入到产品系列与产品类型单元格前面,修改成查询项目,并修改表达式
产品系列中HTML控件代码如下:
'
imgonclick='
ExpandCollapse(this)'
src='
../pat/images/PropertyGroup_plus.gif'
style='
cursor:
hand;
vertical-align:
middle;
margin-right:
2px'
/>
spanonclick='
ExpandCollapse(this.previousSibling)'
hand'
>
+[gosales_goretailers].[产品].[产品系列]+'
/span>
产品类型中HTML控件代码如下:
+[gosales_goretailers].[产品].[产品类型]+'
10.删除掉产品系列和产品类型
11.设置产品类型的填充为左侧20,设置产品名称的填充为左侧40
12.增加列表页脚(注意,这里的HTML控件一定要放入表页脚里面,否则不能实现隐藏数据的功能),并拷贝HTML代码,删除掉列表页脚几个字
imgonload='
StartHidden(this)'
../pat/images/blank.gif'
13.选择列表,并设置列表每页行数为9999(这样就不用再翻页了)
14.这样一个树状报表就做好了,剩下就是调整颜色,样式的工作了
1.2交叉表实现
在交叉表中现实目录树有两种方法,第一种主要技术是通过UNION等方法首先实现类似分组的功能,然后再利用HTML代码实现,第二种的主要技术是建立在一定的前提下,前提是:
在制作报表前已对数据模型进行了特殊的设计。
下面介绍第二种方法。
1,在报表中插入的数据如下图所示:
界面中分别插入了三个HTML控件,与在LIST表中位置一样。
由于在交叉表中不能对数据进行分组,所以不能采用在LIST表中的实现方法,但是原理是一样的。
主要不同之前要对数据模型进行设计。
paddingLeft属性设置元素的左内边距。
padding属性定义元素边框与元素内容之间的空间。
1、页头中的HTML代码如下:
/*纵向折叠*/
functionExpandCollapse1(el)
if(el.src.indexOf("
blank"
0)return;
vartbl=tr.parentElement;
/*判断加减号*/
/*判断层次*/
/*每一个最外层的if实现一级目录的展开与缩进*/
if(tr.cells(0).style.paddingLeft=="
)
/*”20px“表示是第一级目录。
*/
/*循环读取并判断表中每一条记录。
for(vari=tr.rowIndex+1;
vartrCurrent=tbl.rows(i);
if(trCurrent.cells(0).style.paddingLeft=="
)
/*如果是当前目录则退出循环不作处理*/
{break;
if(el.src.indexOf("
0)
/*判断是否图标为“-”号,如果是则有可能是其已经展开了的子目录,但现还不能确定是否是其子目录,有可能是同一级的已展开了的目录*/
if(trCurrent.cells(0).style.paddingLeft=="
/*判断是否为当前目录的子目录。
若是则展开,因为”minus“标记表明已经由”plus“转变过来。
即点击了”+“号。
/*表示可以显示*/
trCurrent.style.display="
/*并将”-“号图标变为”+“号以表明目录已展开,方便下次判断*/
/*以下if语句实现展开后缩进*/
if((trCurrent.cells(0).style.paddingLeft=="
||(trCurrent.cells(0).style.paddingLeft=="
60px"
80px"
))
/*隐藏当前目录下的行记录。
trCurrent.style.display="
/*以下模块功能和上面差不多。
{trCurrent.style.display="
/*该函数实现初始化页面时隐藏一些记录。
vartbl=el.previousSibling;
vartrCurrent2=tbl.rows(0);
varsubnum;
vari,j,jj;
/*判断层次,*/
/*若要显示总数,则消除下面这条语句的注释。
/*trCurrent2.cells(trCurrent2.cells.length-1).children(0).innerText="
合计"
for(varj=1;
j<
trCurrent2.cells.length;
j++){
if((trCurrent2.cells(j).children(0).innerText.indexOf("
)==0)
&
(trCurrent2.cells(j).children(0).innerText.indexOf("
)!
=0)){
trCurrent2.cells(j).style.paddingTop="
10px"
continue;
vartrCurrent1;
/*tbl.rows
(1).cells(0).children
(1).innerText="
tbl.rows
(1).cells(0).getElementsByTagName("
../pat/images/blank.gif"
/*从表中第二条记录开始判断子目录是否展开了,若展开了则隐藏。
第一条为合计汇总。
for(i=2;
i++){
trCurrent1=tbl.rows(i);
if((trCurrent1.cells(0).children
(1).innerText.indexOf("
(trCurrent1.cells(0).children
(1).innerText.indexOf("
trCurrent1.cells(0).style.paddingLeft="
/*trCurrent1.style.display="
trCurrent1.style.display="
trCurrent1.cells(0).getElementsByTagName("
2,表中(即中间)的HTML代码如下:
ExpandCollapse1(this)'
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])
2'
THENcaption([erpfdb].[CCB_COGNOS_FTACCT_DV1].[CCB_COGNOS_FTACCT_DV].[ACCT2_DESC])
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("
}/*取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;
tbl.rows(i).style.dis