Cognos报表开发技巧整理_第1页
Cognos报表开发技巧整理_第2页
Cognos报表开发技巧整理_第3页
Cognos报表开发技巧整理_第4页
Cognos报表开发技巧整理_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 实现行属性的目录树展开功能。1.1 在LIST报表中的现实1.拖入6个字段,并且对产品系列、产品类型分组,如下图:2添加产品系列、产品类型的页眉3拆分产品系列、产品类型的单元格4将产品系列、和产品类型的汇总拖到产品名称处5删除产品系列,产品类型6打开列表的锁7按住CTRL,拖动数量、单位成本、单价到产品类型,产品系列的页眉处8在report page中插入HTML控件,然后拷贝如下代码进去,下面代码主要是定义了两个函数,一个用于目录树的展开与缩进,另一个用于页面初始化时隐藏一些数据,下面代码只支持到2层目录,更详细的含义可参考的在交叉表中实现目录树功能的注释。代码如下:function ExpandCollapse( el )var tr = el.parentElement.parentElement;var tbl = tr.parentElement.parentElement;var sDisplay = ( el.src.indexOf( minus ) = -1 ) ? : none;var sDisplayReverse = ( el.src.indexOf( minus ) = -1 ) ? none : ;el.src = ./pat/images/PropertyGroup_ + ( el.src.indexOf( minus ) = -1 ? minus : plus ) + .gif;for ( var i = tr.rowIndex + 1; i 0 )trCurrent.style.display = sDisplayReverse;else trCurrent.style.display = sDisplay;function StartHidden(el)var tbl=el.parentElement.parentElement.parentElement.parentElement;for (var i = 0; i -1)trCurrent.style.display = none;9拖入两个HTML项目插入到产品系列与产品类型单元格前面,修改成查询项目,并修改表达式产品系列中HTML控件代码如下:+ gosales_goretailers.产品.产品系列 + 产品类型中HTML控件代码如下:+ gosales_goretailers.产品.产品类型 + 10删除掉产品系列和产品类型11设置产品类型的填充为左侧20,设置产品名称的填充为左侧4012增加列表页脚(注意,这里的HTML控件一定要放入表页脚里面,否则不能实现隐藏数据的功能),并拷贝HTML代码,删除掉列表页脚几个字代码如下:13选择列表,并设置列表每页行数为9999(这样就不用再翻页了)14这样一个树状报表就做好了,剩下就是调整颜色,样式的工作了1.2 交叉表实现在交叉表中现实目录树有两种方法,第一种主要技术是通过UNION等方法首先实现类似分组的功能,然后再利用HTML代码实现,第二种的主要技术是建立在一定的前提下,前提是:在制作报表前已对数据模型进行了特殊的设计。下面介绍第二种方法。1,在报表中插入的数据如下图所示:界面中分别插入了三个HTML控件,与在LIST表中位置一样。由于在交叉表中不能对数据进行分组,所以不能采用在LIST表中的实现方法,但是原理是一样的。主要不同之前要对数据模型进行设计。paddingLeft 属性设置元素的左内边距。padding 属性定义元素边框与元素内容之间的空间。1、 页头中的HTML代码如下:/*纵向折叠*/function ExpandCollapse1( el )if ( el.src.indexOf( blank ) 0 ) return;var tr = el.parentElement.parentElement;var tbl = tr.parentElement;/*判断加减号*/el.src = ./pat/images/PropertyGroup_ + ( el.src.indexOf( minus ) = -1 ? minus : plus ) + .gif;/*判断层次*/*每一个最外层的if实现一级目录的展开与缩进*/if(tr.cells(0).style.paddingLeft =20px)/*”20px“表示是第一级目录。*/*循环读取并判断表中每一条记录。*/for ( var i = tr.rowIndex + 1; i 0 ) /*判断是否图标为“-”号,如果是则有可能是其已经展开了的子目录,但现还不能确定是否是其子目录,有可能是同一级的已展开了的目录*/ if(trCurrent.cells(0).style.paddingLeft =40px )/*判断是否为当前目录的子目录。若是则展开,因为”minus“标记表明已经由”plus“转变过来。即点击了”+“号。*/*表示可以显示*/trCurrent.style.display = ; /*并将”-“号图标变为”+“号以表明目录已展开,方便下次判断*/trCurrent.cells(0).getElementsByTagName(IMG).item(0).src = ./pat/images/PropertyGroup_plus.gif;/*以下if语句实现展开后缩进*/if ( el.src.indexOf( plus ) 0 ) if(trCurrent.cells(0).style.paddingLeft =40px ) |(trCurrent.cells(0).style.paddingLeft =60px ) |(trCurrent.cells(0).style.paddingLeft =80px ) /*隐藏当前目录下的行记录。*/ trCurrent.style.display = none; /*以下模块功能和上面差不多。*/if(tr.cells(0).style.paddingLeft =40px)for ( var i = tr.rowIndex + 1; i 0 ) if(trCurrent.cells(0).style.paddingLeft =60px )trCurrent.style.display = ;trCurrent.cells(0).getElementsByTagName(IMG).item(0).src = ./pat/images/PropertyGroup_plus.gif;if ( el.src.indexOf( plus ) 0 ) if(trCurrent.cells(0).style.paddingLeft =60px ) |(trCurrent.cells(0).style.paddingLeft =80px ) trCurrent.style.display = none;if(tr.cells(0).style.paddingLeft =60px)for ( var i = tr.rowIndex + 1; i 0 ) if(trCurrent.cells(0).style.paddingLeft =80px )trCurrent.style.display = ;if ( el.src.indexOf( plus ) 0 ) if(trCurrent.cells(0).style.paddingLeft =80px ) trCurrent.style.display = none;/*该函数实现初始化页面时隐藏一些记录。*/function StartHidden(el)var tbl=el.previousSibling;var trCurrent2=tbl.rows(0);var subnum;var i,j,jj;/*判断层次,*/*若要显示总数,则消除下面这条语句的注释。*/*trCurrent2.cells(trCurrent2.cells.length-1).children(0).innerText=合计;*/for(var j=1;jtrCurrent2.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;if(trCurrent2.cells(j).children(0).innerText.indexOf( )=0) &(trCurrent2.cells(j).children(0).innerText.indexOf( )!=0)trCurrent2.cells(j).style.paddingTop=20px;continue;/*纵向折叠*/*若要显示总数,则消除下面这条语句的注释。*/var trCurrent1;/*tbl.rows(1).cells(0).children(1).innerText=合计;*/tbl.rows(1).cells(0).getElementsByTagName(IMG).item(0).src = ./pat/images/blank.gif;/*从表中第二条记录开始判断子目录是否展开了,若展开了则隐藏。第一条为合计汇总。*/for ( i = 2; i tbl.rows.length; i+ )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代码如下:2、 最后的HTML代码如下: 2 报表开发技巧整理2.1 树形列表要点:首先通过对数据项进行分组实现将各层次的数据项放在同一列中,子层被嵌套在父层中,然后对各层都设置一个标记以区别于其它层的数据,这里通过在数据项前面的缩进距离作为标记,然后利用在页面中嵌入脚本代码控件数据的展开显示和隐藏,其实当报表刚打开时,报表的所有数据包括父级与子级的数据都显示出来,只不过是通过代码将其隐藏而已,当用户单击展开目录按钮时代码通过一个循环语句显示出某一级别的数据,而其中一个终止循环的条件就是判定某一行的前面缩进的距离,而缩进目录的原理也是类似。(具体制作过程可参考上面)2.2 树形交叉表要点:由于在交叉表中不能像LIST表中一样实现分组,所以要通过利用层次各级数据项建立一种数据联接关系,目的是将父级与子级目录的内容通过嵌套显示出来,效果其实与分组一样,所以可以在数据模型定义的时候对数据的格式进行特殊处理,例如不同层次的数据前面可以插入不同长度的空格,以识别其它层次,那么这样在代码处理方面就可以类似在列表中一样操作。其实当报表刚打开时,报表的所有数据包括父级与子级的数据显示出来,只不过是通过代码将其隐藏而已,另外,在各子级目录的开始可通过设置不同空格的长度而让代码识别内容所在的级别。当用户单击展开目录按钮时代码通过一个循环语句显示出某一级别的数据,而其中一个终止循环的条件就是判定某一行的前面缩进的距离,而缩进目录的原理也是类似。(具体制作过程可参考上面)2.3 科目层次选择特点:科目层次选择功能:选择科目层次,然后下面自动出现该科目的所有成员列表框供选择分摊表,科目按层次显示1、下拉框选择显示的层次,保存在参数 p_level 中(使用静态成员,如1、2、3)2、在“条件资源管理器”中定义条件变量,读取的是参数 p_level3、对于多个科目层次,使用多个列表框,每个列表框设置其生成变量(Render Variable),对应条件变量中的具体值(即选择该值则生成该列表框)4、层次选择下拉框要自动提交;列表框要cascade到 p_level5、Query中使用科目时,需要通过case来控制显示的层,如:CASE ?科目层次? WHEN 1 THEN caption(erpfdb.CCB_COGNOS_FTACCT_DV1.CCB_COGNOS_FTACCT_DV.ACCT1_DESC)WHEN 2 THEN caption(erpfdb.CCB_COGNOS_FTACCT_DV1.CCB_COGNOS_FTACCT_DV.ACCT2_DESC)WHEN 3 THEN caption(erpfdb.CCB_COGNOS_FTACCT_DV1.CCB_COGNOS_FTACCT_DV.ACCT3_DESC)END6、而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)对象*/elseif(trCurrent1.cells(0).children(1).innerText.indexOf( )=0)/*否则取cells(0)对象*/其他跟上述折叠报表技巧类似2.5 全部展开、折叠功能效果如下图:报表上添加了“全部展开”按钮,点击可以将所有折叠的项都展开;1、修改原来的js代码:/*纵向折叠*/var tbl;function allWrap(el)if(el.value=全部展开)for ( i = 2; i tbl.rows.length; i+ )tbl.rows(i).style.display = ;if(tbl.rows(i).cells(0).style.paddingLeft !=80px)tbl.rows(i).cells(0).getElementsByTagName(IMG).item(0).src = ./pat/images/PropertyGroup_minus.gif;el.value=全部折叠;return;if(el.value=全部折叠)for ( i = 2; i 0 ) return;var tr = el.parentElement.parentElement;/*var tbl = tr.parentElement;*/*判断加减号*/el.src = ./pat/images/PropertyGroup_ + ( el.src.indexOf( minus ) = -1 ? minus : plus ) + .gif;/*判断层次*/if(tr.cells(0).style.paddingLeft =20px)for ( var i = tr.rowIndex + 1; i 0 ) if(trCurrent.cells(0).style.paddingLeft =40px )trCurrent.style.display = ;trCurrent.cells(0).getElementsByTagName(IMG).item(0).src = ./pat/images/PropertyGroup_plus.gif;if ( el.src.indexOf( plus ) 0 ) if(trCurrent.cells(0).style.paddingLeft =40px ) |(trCurrent.cells(0).style.paddingLeft =60px ) |(trCurrent.cells(0).style.paddingLeft =80px ) trCurrent.style.display = none;if(tr.cells(0).style.paddingLeft =40px)for ( var i = tr.rowIndex + 1; i 0 ) if(trCurrent.cells(0).style.paddingLeft =60px )trCurrent.style.display = ;trCurrent.cells(0).getElementsByTagName(IMG).item(0).src = ./pat/images/PropertyGroup_plus.gif;if ( el.src.indexOf( plus ) 0 ) if(trCurrent.cells(0).style.paddingLeft =60px ) |(trCurrent.cells(0).style.paddingLeft =80px ) trCurrent.style.display = none;if(tr.cells(0).style.paddingLeft =60px)for ( var i = tr.rowIndex + 1; i 0 ) if(trCurrent.cells(0).style.paddingLeft =80px )trCurrent.style.display = ;if ( el.src.indexOf( plus ) 0 ) if(trCurrent.cells(0).style.paddingLeft =80px ) trCurrent.style.display = none;function StartHidden(el)/*var*/ tbl=el.previousSibling;var trCurrent2=tbl.rows(0);var subnum;var i,j,jj;/*判断层次,*/*trCurrent2.cells(trCurrent2.cells.length-1).children(0).innerText=合计;*/for(var j=1;jtrCurrent2.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;if(trCurrent2.cells(j).children(0).innerText.indexOf( )=0) &(trCurrent2.cells(j).children(0).innerText.indexOf( )!=0)trCurrent2.cells(j).style.paddingTop=20px;continue;/*纵向折叠*/var trCurrent1;/*tbl.rows(1).cells(0).children(1).innerText=合计;*/tbl.rows(1).cells(0).getElementsByTagName(IMG).item(0).src = ./pat/images/blank.gif;for ( i = 2; i tbl.rows.length; i+ )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;对比该js脚本,与之前脚本不同的地方是添加了allWrap(el)函数,该函数即实现了“全部折叠”、“全部展开”的功能。2、添加一个HTML ITEM,代码如下:2.6 在交叉表中实现类似列表中页眉的效果1, 效果如下图:2, 在报表中插入一个交叉表,如下图:3, 在“可插入对象”面板中选择“交叉表空间“控件,如下图:4, 将其拖到表的上方,效果如下图:5, 给刚插入的空行插入一个标题,先解锁,将“文本“控件拖入空行中,如下图:6, 当交叉表中的多列时,可以为每一列分别在其上或下面放若干个“交叉表空间“控件,然后可以根据实际格式修改,例如边框等。7, 如果报表中包含javascript代码,要注意涉及到引用表元素的下标问题,因为“交叉表空间“控件也作为一行或一列。2.7 如何通过一列控制另一列数据的展开与缩进下面以业务报表1为例,通过“部门名称”控制“产品名称”,并且以部门对产品进行分组,为每一个部门中的产品作一个小计。1, 在“部门名称“字段前插入html代码,如下:2,对部门和产品进行分组,并设置部门的页脚和列表的整体页脚,并通过一系格式列调整后,如上图所示。3, 将“产品名称”单元格、“小计”单元格和“小计”左边的单元格的“填充”属性设为左缩进5px。4, 并在页眉和列表下面添加HTML代码,如下图所示:5, 页眉处的javascript代码是关键,代码如下: var img_pls = PropertyGroup_plus.gif; var img_min = PropertyGroup_minus.gif; var img_blk = blank.gif; var img_pth = ./pat/images/; var tab_obj; var cell_num=24; /设置交换列数 var begin_line=2; /开始行下标 var leftpad=5px; /缩进距离function StartHidden(obj) /初始化函数。 tab_obj = obj.previousSibling; var row_len=tab_obj.rows.length; var row_index; /tab_obj.rows(row_len-1).cells(1).getElementsByTagName(IMG).item(0).src =img_pth + img_blk; /将“总计”前面的“+”号去去掉。 for(var i=begin_line;irow_len-1;i+) /-调整名称 if(tab_obj.rows(i).cells(1).innerText=非经营性部门) tab_obj.rows(i).cells(1).children(1).innerText=非经营部门; tab_obj.rows(i).cells(24).children(0).innerText=非经营部门; var str5=tab_obj.rows(i).cells(1).innerText; if(str5.substr(0,6)=经营部门合计) tab_obj.rows(i).cells(1).getElementsByTagName(IMG).item(0).src =img_pth + img_blk; /- if(tab_obj.rows(i).cells(1).style.paddingLeft =leftpad) /如果为产品” tab_obj.rows(i).style.display = none; else /等于部门或经营部门合计。 row_index=tab_obj.rows(i).rowIndex; /记录当前部门的行下标 /-移动单元格,目的是将“小计”行的数据与部门的第一行进行调换。 var str4=tab_obj.rows(row_index).cells(1).innerText; if(tab_obj.rows(i+1).cells(1).style.paddingLeft !=leftpad & str4.substr(0,6)!=经营部门合计)/一个部门的数据以判断是否到小计为末尾,如为经营部门合计则不处理。 var temp; for(var j=2;jcell_num;j+) /交换 temp=tab_obj.rows(row_index).cells(j).innerText; tab_obj.rows(row_index).cells(j).innerText=tab_obj.rows(i).cells(j).innerText; tab_obj.rows(i).cells(j).innerTex

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论