Cognos报表开发技巧整理
- 格式:doc
- 大小:1.15 MB
- 文档页数:31
Cognos汇总cognos学习笔记第⼆部分 Query Studio介绍 (p15)在Query Studio中创建⾃助式报表。
选择“包(Packege)”:使⽤Query Studio 和Report Studio操作报表之前都要先选择⼀个“包”。
“包”事先由技术⼈员在Framework Manager中打好并发布。
进⼊门户后可以看到已经发布的“包”。
“包”中只含有数据结构⽽不含数据本⾝。
Query Studio 界⾯:menu: insert data,edit data,change layout,run report,manage fileedit data:filter过滤,sort排序,summarize,format格式,calculate计算,rename重命名change layout:chart,edit title,set web page size,set page breaks,group,pivotrun report:run with all data,preview with no data,view in PDF/excel 2000/CSV/XML format,advanced query optionsmanage file: new report,save,save as查询主题和查询项:模型是来⾃⼀个或多个数据库的数据结构的业务展现。
模型含有若⼲查询主题(query subject),查询主题包含⼀些能够添加到报表中的查询项(query item)。
模型的数据内容来⾃Framework Manager发布的“包”(Package)。
结构如下:模型-->查询主题-->查询项。
查询主题类似“表”,查询项类似“字段”。
Query Studio ⼯具栏 (p21)删除、撤消、重做、运⾏、过滤、排序、汇集、计算、图表、分组、交叉表、去分组、设段、交换、组收缩、组展开给⾃助式报表添加数据:⽅式有:双击(查询项),拖拽(查询项)、(选中查询项)按Insert data。
1COGNOS的使用1.1模型定义1,打开Frame Manager程序,如下图:2,新建一个项目,建完后,打开该项目,如下图:3,在界面左边中选择“Packages”,然后单击右键新建一个包。
按照提示一步步做,其中有一步是从数据库的表选所要用到的表,打勾为选用。
4,点击”Diagram”显示表,但表之间还没有建立联接关系,通过建立各表关系后如下图5,然后将该包发布,点击右键该包选择“Publish Package”将其发布。
1.2模型的物理和逻辑定义1,模型定义的规范:将模型分为2个部分,分别为物理层和逻辑层,物理层为从数据源引入表的物理定义和连接关系,逻辑层为业务视角下的逻辑定义。
2,物理层的建立:根据数据分析,设计模型中需创建的物理表,以便尽可能的提高查询语句的运行效率(比较理想的结构是星形结构,一个中间表和多个物理维表)。
在根名字空间(和数据源同名)下,建立一个名为物理层的目录,在物理层文件夹下执行Run Metedate Wizard将数据源中相关的物理表引入这个目录,然后将这些表建立连接关系,建议不要有Orphan表。
如下图:3,逻辑层的定义:在根名字空间下,建立一个名为逻辑层的目录,在逻辑层文件夹下生成Query Subject,Query Subject的字段都是根据业务逻辑从物理层从引入,建议字段名都为中文。
逻辑层中的表为事实表和维表的结构,在事实表中包含维度的编码值和指标的值,维表中包括每个维度上编码值和其名称的对应关系。
也可以根据需要建立Regular Dimension(3.4说明),在逻辑层中不要建立逻辑表之间的关系。
如下图:4,物理层和逻辑层的建立是灵活的,上面说的只是简单的结构,可以根据需要建立多层次的名字空间,不同的名字空间定义不同的物理层和逻辑层。
1.3模型设计的一些技术要点1,首先要了解数据库表的定义和业务需求,以便将报表设计所关联的物理表引入到物理层中。
2,在物理层建立关系要清楚了解表中KEY值的定义和维表与中间表之间的关系,关系中的对应(1对多、多对多)要设置清楚,可以通过察看Determinants来决定,最好咨询数据库设计人员。
常用控件、功能、方法介绍1、页面:在COGNOS report studio系统中,页面分为两种,一种是报表页面,即是报表运行最后要显示数据的页面,是必需的。
另一种是提示页面,是为用户选择过滤条件提供的一个页面,如果报表中同时包含这两种页面,则运行后先显示提示页面,供用户选择条件后,再转到报表页面,而报表页面显示的数据则是经过从提示页面的选择条件过滤后的数据。
查看页面的情况可将鼠标放到“页面资料管理器”面板上,即弹出,如下图:2、查询:“查询”图标如下图:“查询”为数据的显示提供了一个结构,在报表中显示的数据是通过“查询”从数据源中获取数据的,类似于数据库中视图的概念,打开一个查询,结构如下图:左边红圈中是该查询中的数据结构,或理解为一个表中的字段,而右边红圈中是一些过滤的条件,类似于查询语句中的where句中的条件。
3、变量:分为三种变量,第一种是布尔变量,只有两种取值,第二种是字符串变量,可有多个取值,第三种是语言种类变量。
一般来说,前面两种用得比较多。
其实,这里“变量”的概念与提示页面中传给报表页面的“参数变量”是完全不同的,也和程序设计中的变量有所不同。
如下图:通常变量中有一个表达式,变量的取值就是根据表达式的结果等到的,如上图选中的是布尔变量,有“是”与“否”两个值。
例如表达式为“帐面收入“度量值>2000元,那么当结果为真是取值“是”,反之取“否”。
同理,在字符串变量中,各个取值是事先由用户输入的,这点与布尔变量不同,而表达式中的结果有可能与其中一个取值相同。
总的来说,通过“变量”可以控制控件、页面等的显示和隐藏,显示的样式等。
4、列表与交叉表:两者相同的地方就是都是用于显示数据,一般与“查询”联系起来,其实列表与交叉表只是提供一种显示的格式,而真正获取数据的还是“查询”。
两者不同的地方就是数据表达的形式不一样。
下面举个例,如下图:要显示的数据是:部门,产品,帐面收入。
分别用两种表显示,其实功能是一样的,只是表示的格式不同,交叉表交叉的单元格就是确定某一部门某一产品的帐面收入。
C o g n o s的高级报表制作技巧--V a r i a b l eCognos的高级报表制作技巧--Variables【IT168 技术】IBM Cognos 商业智能系列软件提供了专业报表的制作平台,尤其在报表之间的关联分析上有着很强大的功能。
本文从基于条件的动态报表制作和报表之间的穿透钻取两个方面介绍如何用 IBM Cognos 商业智能软件制作出专业的报表。
基于条件制作动态报表在使用报表时,用户往往希望某些“异常数据”能够突出显示,以便其更快速了解数据的总体状态。
如:性能数据一旦超过设定的阀值,则突出显示为黄色或者红色;在其他情况下显示为绿色。
IBM Cognos Report Studio 就提供了这样一种机制,在用户生成报表的时候,能够自动根据开发人员事先设定好的条件以及显示格式,对报表进行动态显示。
在制作基于条件的动态报表时,需要注意三要素。
第一个要素是条件,条件是用以判断的规则,通常为一个变量表达式及其一系列取值,如,上面的性能数据超过阀值。
第二个要素是用于和条件绑定的特定数据项 (Data Item),条件表达式只有和具体的数据项相关,以数据项运行时的取值作为条件输入,才能达到动态显示报表的目的,如,上面提到的性能数据。
第三个要素条件格式,即在条件表达式的某一特定取值下,报表显示的格式,如字体,颜色,阴影等。
总得来说,基于条件的动态报表的实现就是根据某特定数据项在报表运行时的取值,计算变量表达式的取值,并根据变量表达式的取值,决定报表的显示格式。
Cognos 支持三种类型的变量:字符串变量,布尔变量和语言变量。
以下的三小节将分别介绍使用这三种变量制作动态报表的过程。
使用字符串变量制作动态报表在 2.1 节中,我们将介绍简单的使用字符串变量的制作动态报表的过程。
我们希望实现根据项目状态的取值,动态显示报表中“项目状态”单元格的背景颜色:当项目状态为R(Red) 时,项目状态单元格的背景显示为红色;当项目状态为 Y(Yellow) 时,项目状态单元格的背景显示为黄色;当项目状态为 G(Green) 时,项目状态单元格的背景显示为绿色;当项目状态为 C (Complete) 时,项目状态单元格的背景显示为蓝色。
制作钻取报表(报表与报表之间的钻取)
1,该方法涉及到两张报表,一张报表为源表,另一张为被钻取后的报表,即目标表。
2,创建一个新的目标报表,并创建一个LIST,输入相关数据,如下图(数据内容可自定):
3,然后新建一个filter并设置表达式,如下图:
表达式中选择一个数据项作为两张报表间相互关联的依据,例子中选择了“用户名”作为钻取的依据,并给它一个参数,该参数用于传递从源报表得来的数值。
4,保存该报表为“目标报表”。
5,创建另一个报表作为源报表,这里可插入一个LIST,为了简化,这里只插入“用户
名”数据项,然后选定“用户名”数据项,点击图标,弹出对话框如下图:
栏中选择刚才建立的目标报表。
然后再点击下方的图标,弹出对话框如下图:
7,在Method一项中选”pass data item”,在value中选择“用户名”数据项,即与
刚才目标报表中的参数对应。
8,保存为“源报表”,然后运行,点击在源报表中的“用户名”项下的任一数据项,例如用户李四,系统即会根据李四这个人的资料转到目标报表显示关于李四这个人的相关信息,这些显示的内容就是在目标报表中设计的。
Cognos 交叉表的自定义排序Cognos的排序大家都是知道的,只能升序,降序,编辑布局排序。
但是编辑布局排序其实也只是拉其他字段进行升序,降序而已。
但是有时候我们往往想按照我们的想法排序,这些排序不是简单的升序,降序。
那怎么办呢?下面来看看我的想法。
一.问题背景描述我做报表遇到这样的情况:我需要给TP_BUSS_ID惊醒排序,TP_BUSS_ID的代码和对应意思分别是:410101 现金,410201 固定资产,410301 在建工程,410401 抵债资产,410501 长期待摊费用,410601 贷款应收利息。
现在我要按照:现金(410101),固定资产(410201),贷款应收利息(410601),抵债资产(410401),在建工程(410301),长期待摊费用(410501 )。
好了,按照正常情况,这个顺序既不能按照汉子名称的升序降序,也不能按照数字ID 进行排序。
二.解决办法1,在查询里拖入两个TP_BUSS_ID。
2,对TP_BUSS_ID1惊醒重新编排顺序。
IF ( [FTP业务视图].[机构非生息资产表-按机构展示].[TP_BUSS_ID]='410101' ) THEN ( 1 )ELSE( IF ( [FTP业务视图].[机构非生息资产表-按机构展示].[TP_BUSS_ID]='410201' ) THEN(2 )ELSE( IF ( [FTP业务视图].[机构非生息资产表-按机构展示].[TP_BUSS_ID]='410601' ) THEN( 3)ELSE( IF ( [FTP业务视图].[机构非生息资产表-按机构展示].[TP_BUSS_ID]='410401' ) THEN( 4 )ELSE( IF ( [FTP业务视图].[机构非生息资产表-按机构展示].[TP_BUSS_ID]='410301' ) THEN( 5 )ELSE(6 ) ) ) ))3,在TP_BUSS_ID中给他们命名。
1实现行属性的目录树展开功能。
1.1在LIST报表中的现实1.拖入6个字段,并且对产品系列、产品类型分组,如下图:2.添加产品系列、产品类型的页眉3.拆分产品系列、产品类型的单元格4.将产品系列、和产品类型的汇总拖到产品名称处5.删除产品系列,产品类型6.打开列表的锁7.按住CTRL,拖动数量、单位成本、单价到产品类型,产品系列的页眉处8.在report page中插入HTML控件,然后拷贝如下代码进去,下面代码主要是定义了两个函数,一个用于目录树的展开与缩进,另一个用于页面初始化时隐藏一些数据,下面代码只支持到2层目录,更详细的含义可参考的在交叉表中实现目录树功能的注释。
代码如下:<script>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 < tbl.rows.length; i++ ){var trCurrent = 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( "minus" ) == -1 ){trCurrent.cells(0).getElementsByTagName("IMG").item(0).src = "../pat/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;}}}function 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项目插入到产品系列与产品类型单元格前面,修改成查询项目,并修改表达式产品系列中HTML控件代码如下:'<img onclick=''ExpandCollapse(this)'' src=''../pat/images/PropertyGroup_plus.gif'' style=''cursor:hand; vertical-align:middle; margin-right:2px''/><span onclick=''ExpandCollapse(this.previousSibling)'' style=''cursor:hand''>'+ [gosales_goretailers].[产品].[产品系列] + '</span>'产品类型中HTML控件代码如下:'<img onclick=''ExpandCollapse(this)'' src=''../pat/images/PropertyGroup_plus.gif'' style=''cursor:hand; vertical-align:middle; margin-right:2px''/><span onclick=''ExpandCollapse(this.previousSibling)'' style=''cursor:hand''>'+ [gosales_goretailers].[产品].[产品类型] + '</span>'10.删除掉产品系列和产品类型11.设置产品类型的填充为左侧20,设置产品名称的填充为左侧4012.增加列表页脚(注意,这里的HTML控件一定要放入表页脚里面,否则不能实现隐藏数据的功能),并拷贝HTML代码,删除掉列表页脚几个字代码如下:<img onload='StartHidden(this)' src='../pat/images/blank.gif'/>13.选择列表,并设置列表每页行数为9999(这样就不用再翻页了)14.这样一个树状报表就做好了,剩下就是调整颜色,样式的工作了1.2交叉表实现在交叉表中现实目录树有两种方法,第一种主要技术是通过UNION等方法首先实现类似分组的功能,然后再利用HTML代码实现,第二种的主要技术是建立在一定的前提下,前提是:在制作报表前已对数据模型进行了特殊的设计。
下面介绍第二种方法。
1,在报表中插入的数据如下图所示:界面中分别插入了三个HTML控件,与在LIST表中位置一样。
由于在交叉表中不能对数据进行分组,所以不能采用在LIST表中的实现方法,但是原理是一样的。
主要不同之前要对数据模型进行设计。
paddingLeft 属性设置元素的左内边距。
padding 属性定义元素边框与元素内容之间的空间。
1、页头中的HTML代码如下:<script>/*纵向折叠*/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 < 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(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" )){/*隐藏当前目录下的行记录。