Cognos制作报表基本范例_第1页
Cognos制作报表基本范例_第2页
Cognos制作报表基本范例_第3页
Cognos制作报表基本范例_第4页
Cognos制作报表基本范例_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、1 COGNOS的使用1.1 模型定义1, 打开Frame Manager程序,如下图:2, 新建一个项目,建完后,打开该项目,如下图:3,在界面左边中选择“Packages”,然后单击右键新建一个包。按照提示一步步做,其中有一步是从数据库的表选所要用到的表,打勾为选用。4,点击”Diagram”显示表,但表之间还没有建立联接关系,通过建立各表关系后如下图5,然后将该包发布,点击右键该包选择“Publish Package”将其发布。1.2 模型的物理和逻辑定义1, 模型定义的规范:将模型分为2个部分,分别为物理层和逻辑层,物理层为从数据源引入表的物理定义和连接关系,逻辑层为业务视角下的逻辑定

2、义。2, 物理层的建立:根据数据分析,设计模型中需创建的物理表,以便尽可能的提高查询语句的运行效率(比较理想的结构是星形结构,一个中间表和多个物理维表)。在根名字空间(和数据源同名)下,建立一个名为物理层的目录,在物理层文件夹下执行Run Metedate Wizard将数据源中相关的物理表引入这个目录,然后将这些表建立连接关系,建议不要有Orphan表。如下图:3, 逻辑层的定义:在根名字空间下,建立一个名为逻辑层的目录,在逻辑层文件夹下生成Query Subject,Query Subject的字段都是根据业务逻辑从物理层从引入,建议字段名都为中文。逻辑层中的表为事实表和维表的结构,在事实

3、表中包含维度的编码值和指标的值,维表中包括每个维度上编码值和其名称的对应关系。也可以根据需要建立Regular Dimension(3.4说明),在逻辑层中不要建立逻辑表之间的关系。如下图: 4, 物理层和逻辑层的建立是灵活的,上面说的只是简单的结构,可以根据需要建立多层次的名字空间,不同的名字空间定义不同的物理层和逻辑层。1.3 模型设计的一些技术要点1, 首先要了解数据库表的定义和业务需求,以便将报表设计所关联的物理表引入到物理层中。2, 在物理层建立关系要清楚了解表中KEY值的定义和维表与中间表之间的关系,关系中的对应(1对多、多对多)要设置清楚,可以通过察看Determinants来决

4、定,最好咨询数据库设计人员。如下图,CCB_COGNOS_FTCOMP_DV的唯一值的字段是COMP3_CODE:3, 有时因为数据库数据或者报表需求的原因,维表和中间表的对应关系可能不是最底层,报表产生的数据可能就会有重复累加值。例如一个维表company有2种和中间表对应关系,表company有3层,其中2层、3层都分别对应中间表(可能不同表),这时最好在数据源中引入2次company,一个只引入2层字段,一个引入3层字段,分别在物理层中和中间表建立关系,这时引入2层字段的维表就会产生重复值,这时就需要在维表company的Determinants中的对应字段进行Group by。也可以在

5、SQL中加入distinct。如图:Distinct 过滤:4, 逻辑层表的逻辑字段的添加:有时,数据库表的现有字段不能满足报表设计的要求,例如日期维表month有3个字段month、quarter、year,month为KEY,报表设计中需要计算上月、上季末月、上年同期月等等,针对这种情况,我们在month中增加上月、上季末月、上年同期月等字段,在reportnet用交叉查询来计算上月、上季末月、上年同期月的数据,framework提供了丰富的函数帮我们增加逻辑字段。如图:5,2种SQL settingCognos sql是模型默认的类型,当数据库表从源引入时默认。Cognos sql 支持

6、多数据源,它不是当前数据库的标准SQL,但能与COGNOS良好结合,它对于不同的数据库是透明的。一般情况下,不用改变这个模式。Native sql是当前数据库SQL,cognos直接将sql发送到当前数据库中运算,Native sql 不支持多数据源。Native sql 运行效率比较高,我们可以编辑SQL。可以将一些维表改成Native以提高效率。1.4 层次模型的定义1, 打开FrameWork Manager系统,然后右键点击已建立的数据源,选择create,再选择regular dimention项,如下图:2, 弹出对话框,如下图,然后从左边的Dimension项面板中将要建立的层次

7、数据项依次用鼠标拖到右边的Hierarchies面板中,假设以机构部门为例,先将总行机构拖进去,然后将各省分行拖进去,依此类推,从高层次到低层次。3, 分别选中刚才拖进去的数据项,然后分别在下方中的Role项中点击,弹出对话框如下图:4, 将_businessKey项打上勾,注意,刚才拖进去的数据项都要依次这样设置。5, 点击OK完成。1.5 在COGNOS Report Studio中制作报表1.5.1 常用控件、功能、方法介绍1、 页面:在COGNOS report studio系统中,页面分为两种,一种是报表页面,即是报表运行最后要显示数据的页面,是必需的。另一种是提示页面,是为用户选择

8、过滤条件提供的一个页面,如果报表中同时包含这两种页面,则运行后先显示提示页面,供用户选择条件后,再转到报表页面,而报表页面显示的数据则是经过从提示页面的选择条件过滤后的数据。查看页面的情况可将鼠标放到“页面资料管理器”面板上,即弹出,如下图:2、 查询:“查询”图标如下图:“查询”为数据的显示提供了一个结构,在报表中显示的数据是通过“查询”从数据源中获取数据的,类似于数据库中视图的概念,打开一个查询,结构如下图:左边红圈中是该查询中的数据结构,或理解为一个表中的字段,而右边红圈中是一些过滤的条件,类似于查询语句中的where句中的条件。3、 变量:分为三种变量,第一种是布尔变量,只有两种取值,

9、第二种是字符串变量,可有多个取值,第三种是语言种类变量。一般来说,前面两种用得比较多。其实,这里“变量”的概念与提示页面中传给报表页面的“参数变量”是完全不同的,也和程序设计中的变量有所不同。如下图:通常变量中有一个表达式,变量的取值就是根据表达式的结果等到的,如上图选中的是布尔变量,有“是”与“否”两个值。例如表达式为“帐面收入“度量值>2000元,那么当结果为真是取值“是”,反之取“否”。同理,在字符串变量中,各个取值是事先由用户输入的,这点与布尔变量不同,而表达式中的结果有可能与其中一个取值相同。总的来说,通过“变量”可以控制控件、页面等的显示和隐藏,显示的样式等。4、 列表与交叉

10、表:两者相同的地方就是都是用于显示数据,一般与“查询”联系起来,其实列表与交叉表只是提供一种显示的格式,而真正获取数据的还是“查询”。两者不同的地方就是数据表达的形式不一样。下面举个例,如下图:要显示的数据是:部门,产品,帐面收入。分别用两种表显示,其实功能是一样的,只是表示的格式不同,交叉表交叉的单元格就是确定某一部门某一产品的帐面收入。当然,两种表的区别远不止这么简单,这里只为了说明两种表的特点。5、 查询的运算:和SQL语句中的运算类似,在COGNOS中也提供几种运算,分别是联接、并集、交集、排除,另外还可以直接写SQL语句和MDX语句。在解决实际问题的时候可以灵活运用,去弥补COGNO

11、S系统提供显示数据格式的不足。下图为并集运算的图标:6、“生成变量”属性:对于报表里的控件、模块等可通过生成变量来控制自身的显示和隐藏,如下图:7、“样式变量”属性:对于报表里的控件、模块等可通过生成变量来控制自身的显示样式,与“生成变量”有点不同,样式变量可以根据变量的取值去设置样式,如下图:为某一控件或部件的“生成样式”与一个事先创建好的变量关联后,就可对其进行样式的设置了,例如对于布尔变量的取值,可分别对“是”和“否“两种取值设置不同的显示样式。如下图:假设将“小计”数据模块设置样式,当选择布尔变量后,点击“是”取值后,红框中界面已变为绿色,此时表明当变量取值为“是”的时候要显示的格式,

12、接下来就可设置红圈中模块的格式了,与此类推,可再次重复以上步骤设置变量为“否”时的显示格式。1.5.2 简单报表的制作举例1, 打开浏览器,进入在IIS中设置的网页,如下图:2, 点击”Report Studio”超链接,进入对报表的操作,页面会显示出刚才已发布的包,如下图:3, 点击该包后进入报表管理工具。如下图:4, 左上角显示所需要用到的表,右边为工作编辑区,可以从左边的表中的字段拖到右边作为报表输出。如下图:点击运行图标如下图:1.5.3 提供用户选择条件的报表制作1, 新建一张报表,然后插入数据项(可自定义)。如下图:2, 为显示期望的报表而制作条件,点击新建Prompt Page图

13、标(位置大约在右上角),然后将会显示一张新页面,该页面即是Prompt Page页而不是原来的Page,例如通过一个下拉列表框供用户选择后,报表的生成根据选择条件去显示出相应的信息。3, 在左边的工具箱中找到value prompt ,如下图:双击或拖到右边,然后向导对话框会弹出,如下图:框中”create a new parameter” 意思是产生一个新的变量,由于显示条件选项与显示报表结果分别在不同页面,所以要用到参数变量来传递条件的值,单击下一步。4, 在”create a parameterized filter”项中的”Package item”一行中选择某个表中的某个字段,其实该

14、字段即为最后显示报表根据的条件。例如字段为“姓名“,那么结果显示的报表将会显示与“姓名”某个人相匹配的记录,单击下一步,5, 在弹出的对话框中保持默认值,单击下一步。6, 在”create query”项中的”value to use”与”value to display”行中选择对应的字段,前者为报表显示所依据的条件字段,后者为控件中显示给用户看的字段,其实这两个字段是相对应的。例如分别选择“姓名编号“与”姓名“,当然在报表页中也要相应有“姓名编号”这一项数据,相互对应。单击完成。7, 运行查看结果。当选择完后条件后,单击下方的完成按钮即可显示报表结果。1.5.4 实现行属性的目录树展开功能

15、。1.5.4.1 在LIST报表中的现实1.拖入6个字段,并且对产品系列、产品类型分组,如下图:2添加产品系列、产品类型的页眉3拆分产品系列、产品类型的单元格4将产品系列、和产品类型的汇总拖到产品名称处5删除产品系列,产品类型6打开列表的锁7按住CTRL,拖动数量、单位成本、单价到产品类型,产品系列的页眉处8在report page中插入HTML控件,然后拷贝如下代码进去,下面代码主要是定义了两个函数,一个用于目录树的展开与缩进,另一个用于页面初始化时隐藏一些数据,下面代码只支持到2层目录,更详细的含义可参考的在交叉表中实现目录树功能的注释。代码如下:<script>functio

16、n 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.s

17、rc = "./pat/images/PropertyGroup_" + ( el.src.indexOf( "minus" ) = -1 ? "minus" : "plus" ) + ".gif"for ( var i = tr.rowIndex + 1; i < tbl.rows.length; i+ )var trCurrent = tbl.rows( i );if ( trCurrent.cells( 0 ).firstChild && trCurrent.cell

18、s( 0 ).getElementsByTagName( "IMG" ).length )if ( tr.cells(0).style.paddingLeft ="" && trCurrent.cells(0).style.paddingLeft ="20px" )if (el.src.indexOf( "minus" ) = -1 )trCurrent.cells(0).getElementsByTagName("IMG").item(0).src = "./pat/

19、images/PropertyGroup_plus.gif"else break;if ( tr.cells(0).style.paddingLeft ="" && trCurrent.cells(0).style.paddingLeft ="40px" && el.src.indexOf( "minus" ) >0 )trCurrent.style.display = sDisplayReverse;else trCurrent.style.display = sDisplay;fun

20、ction StartHidden(el)var tbl=el.parentElement.parentElement.parentElement.parentElement;for (var i = 0; i < tbl.rows.length; i+)var trCurrent = tbl.rows(i);if (trCurrent.cells(0).style.paddingLeft.indexOf("px") > -1)trCurrent.style.display = "none"</script>9拖入两个HTML项目

21、插入到产品系列与产品类型单元格前面,修改成查询项目,并修改表达式产品系列中HTML控件代码如下:'<img onclick=''ExpandCollapse(this)'' src=''./pat/images/PropertyGroup_plus.gif'' style=''cursor:hand; vertical-align:middle; margin-right:2px''/><span onclick=''ExpandCollapse(this.

22、previousSibling)'' style=''cursor:hand''>'+ gosales_goretailers.产品.产品系列 + '</span>'产品类型中HTML控件代码如下:'<img onclick=''ExpandCollapse(this)'' src=''./pat/images/PropertyGroup_plus.gif'' style=''cursor:hand; verti

23、cal-align:middle; margin-right:2px''/><span onclick=''ExpandCollapse(this.previousSibling)'' style=''cursor:hand''>'+ gosales_goretailers.产品.产品类型 + '</span>'10删除掉产品系列和产品类型11设置产品类型的填充为左侧20,设置产品名称的填充为左侧4012增加列表页脚(注意,这里的HTML控件一定要放入表页脚里面

24、,否则不能实现隐藏数据的功能),并拷贝HTML代码,删除掉列表页脚几个字代码如下:<img onload='StartHidden(this)' src='./pat/images/blank.gif'/>13选择列表,并设置列表每页行数为9999(这样就不用再翻页了)14这样一个树状报表就做好了,剩下就是调整颜色,样式的工作了1.5.4.2 交叉表实现在交叉表中现实目录树有两种方法,第一种主要技术是通过UNION等方法首先实现类似分组的功能,然后再利用HTML代码实现,第二种的主要技术是建立在一定的前提下,前提是:在制作报表前已对数据模型进行了特殊

25、的设计。下面介绍第二种方法。1,在报表中插入的数据如下图所示:界面中分别插入了三个HTML控件,与在LIST表中位置一样。由于在交叉表中不能对数据进行分组,所以不能采用在LIST表中的实现方法,但是原理是一样的。主要不同之前要对数据模型进行设计。6、 页头中的HTML代码如下:<script>/*纵向折叠*/function ExpandCollapse1( el )if ( el.src.indexOf( "blank" ) >0 ) return;var tr = el.parentElement.parentElement;var tbl = tr.

26、parentElement;/*判断加减号*/el.src = "./pat/images/PropertyGroup_" + ( el.src.indexOf( "minus" ) = -1 ? "minus" : "plus" ) + ".gif"/*判断层次*/*每一个最外层的if实现一级目录的展开与缩进*/if(tr.cells(0).style.paddingLeft ="20px")/*”20px“表示是第一级目录。*/*循环读取并判断表中每一条记录。*/for

27、( var i = tr.rowIndex + 1; i < tbl.rows.length; i+ )var trCurrent=tbl.rows(i);if(trCurrent.cells(0).style.paddingLeft ="20px") /*如果是当前目录则退出循环不作处理*/break;if ( el.src.indexOf( "minus" ) >0 ) /*判断是否图标为“-”号,如果是则有可能是其已经展开了的子目录,但现还不能确定是否是其子目录,有可能是同一级的已展开了的目录*/ if(trCurrent.cells(

28、0).style.paddingLeft ="40px" )/*判断是否为当前目录的子目录。若是则展开,因为”minus“标记表明已经由”plus“转变过来。即点击了”+“号。*/*表示可以显示*/trCurrent.style.display = "" /*并将”-“号图标变为”+“号以表明目录已展开,方便下次判断*/trCurrent.cells(0).getElementsByTagName("IMG").item(0).src = "./pat/images/PropertyGroup_plus.gif"/

29、*以下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"

30、; /*以下模块功能和上面差不多。*/if(tr.cells(0).style.paddingLeft ="40px")for ( var i = tr.rowIndex + 1; i < tbl.rows.length; i+ )var trCurrent=tbl.rows(i);if(trCurrent.cells(0).style.paddingLeft ="40px") break;if ( el.src.indexOf( "minus" ) >0 ) if(trCurrent.cells(0).style.pad

31、dingLeft ="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" ) |(trCurr

32、ent.cells(0).style.paddingLeft ="80px" ) trCurrent.style.display = "none"if(tr.cells(0).style.paddingLeft ="60px")for ( var i = tr.rowIndex + 1; i < tbl.rows.length; i+ )var trCurrent=tbl.rows(i);if(trCurrent.cells(0).style.paddingLeft ="60px") break;if ( e

33、l.src.indexOf( "minus" ) >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"/*该函数实现初始化

34、页面时隐藏一些记录。*/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;j<trCurrent2.cells.length;j+)if(trCurrent2.cells(j).childr

35、en(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).inn

36、erText.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.

37、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.paddingLe

38、ft ="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.di

39、splay = "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

40、(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 =

41、 "./pat/images/blank.gif"</script>2,表中(即中间)的HTML代码如下:'<img onclick=''ExpandCollapse1(this)'' src=''./pat/images/PropertyGroup_plus.gif'' style=''cursor:hand; vertical-align:middle; margin-right:2px''/>'7、 最后的HTML代码如下:<i

42、mg onload='StartHidden(this)' src='./pat/images/blank.gif'/> 1.5.5 如何在交叉表中的对某一行或某一列进行汇总1, 如下图格式所示:图中的“合计”字段是在每一行中对所有列进行总计,经验证,对交叉表的度量值进行汇总,只要对该度量值利用函数进行计算就行了,不用涉及到非度量值属性。具体方法如下:在控件面板中将query calculation控件拖到要汇总的某行或列中,然后会弹出相应对话框,可根据要汇总的需要而编写相应的汇总函数即可。1.5.6 创建模板的方法1,在COGNOS中新建一个报表文件,其实就是普通的报表文件,然后对需要用到的模板格式进行编辑,例如下图:3,编辑完后,选中文件菜单中的convert to template项将普通文件转换为模板文件,最后保存该模板即可。4,当应用这个模板时,在COGNOS中新建一个报表文件,在弹出的新建对话框中如下图:选择”existing.”项,然后选择刚才创建的模板。1.5.7 制作钻取报表(报表与报表之间的钻取)1, 该方法涉及到两张报表

温馨提示

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

评论

0/150

提交评论