Cognos制作報表基本范例_第1頁
Cognos制作報表基本范例_第2頁
Cognos制作報表基本范例_第3頁
Cognos制作報表基本范例_第4頁
Cognos制作報表基本范例_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1 COGNOS的使用1.1 模型定義1, 打開Frame Manager程序,如下圖:2, 新建一個項目,建完后,打開該項目,如下圖:3,在界面左邊中選擇“Packages”,然后單擊右鍵新建一個包。按照提示一步步做,其中有一步是從數據庫的表選所要用到的表,打勾為選用。4,點擊”Diagram”顯示表,但表之間還沒有建立聯接關系,通過建立各表關系后如下圖5,然后將該包發(fā)布,點擊右鍵該包選擇“Publish Package”將其發(fā)布。1.2 模型的物理和邏輯定義1, 模型定義的規(guī)范:將模型分為2個部分,分別為物理層和邏輯層,物理層為從數據源引入表的物理定義和連接關系,邏輯層為業(yè)務視角下的邏輯定

2、義。2, 物理層的建立:根據數據分析,設計模型中需創(chuàng)建的物理表,以便盡可能的提高查詢語句的運行效率(比較理想的結構是星形結構,一個中間表和多個物理維表)。在根名字空間(和數據源同名)下,建立一個名為物理層的目錄,在物理層文件夾下執(zhí)行Run Metedate Wizard將數據源中相關的物理表引入這個目錄,然后將這些表建立連接關系,建議不要有Orphan表。如下圖:3, 邏輯層的定義:在根名字空間下,建立一個名為邏輯層的目錄,在邏輯層文件夾下生成Query Subject,Query Subject的字段都是根據業(yè)務邏輯從物理層從引入,建議字段名都為中文。邏輯層中的表為事實表和維表的結構,在事實

3、表中包含維度的編碼值和指標的值,維表中包括每個維度上編碼值和其名稱的對應關系。也可以根據需要建立Regular Dimension(3.4說明),在邏輯層中不要建立邏輯表之間的關系。如下圖: 4, 物理層和邏輯層的建立是靈活的,上面說的只是簡單的結構,可以根據需要建立多層次的名字空間,不同的名字空間定義不同的物理層和邏輯層。1.3 模型設計的一些技術要點1, 首先要了解數據庫表的定義和業(yè)務需求,以便將報表設計所關聯的物理表引入到物理層中。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發(fā)送到當前數據庫中運算,Native sql 不支持多數據源。Native sql 運行效率比較高,我們可以編輯SQL。可以將一些維表改成Native以提高效率。1.4 層次模型的定義1, 打開FrameWork Manager系統(tǒng),然后右鍵點擊已建立的數據源,選擇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系統(tǒng)中,頁面分為兩種,一種是報表頁面,即是報表運行最后要顯示數據的頁面,是必需的。另一種是提示頁面,是為用戶選擇

8、過濾條件提供的一個頁面,如果報表中同時包含這兩種頁面,則運行后先顯示提示頁面,供用戶選擇條件后,再轉到報表頁面,而報表頁面顯示的數據則是經過從提示頁面的選擇條件過濾后的數據。查看頁面的情況可將鼠標放到“頁面資料管理器”面板上,即彈出,如下圖:2、 查詢:“查詢”圖標如下圖:“查詢”為數據的顯示提供了一個結構,在報表中顯示的數據是通過“查詢”從數據源中獲取數據的,類似于數據庫中視圖的概念,打開一個查詢,結構如下圖:左邊紅圈中是該查詢中的數據結構,或理解為一個表中的字段,而右邊紅圈中是一些過濾的條件,類似于查詢語句中的where句中的條件。3、 變量:分為三種變量,第一種是布爾變量,只有兩種取值,

9、第二種是字符串變量,可有多個取值,第三種是語言種類變量。一般來說,前面兩種用得比較多。其實,這里“變量”的概念與提示頁面中傳給報表頁面的“參數變量”是完全不同的,也和程序設計中的變量有所不同。如下圖:通常變量中有一個表達式,變量的取值就是根據表達式的結果等到的,如上圖選中的是布爾變量,有“是”與“否”兩個值。例如表達式為“帳面收入“度量值>2000元,那么當結果為真是取值“是”,反之取“否”。同理,在字符串變量中,各個取值是事先由用戶輸入的,這點與布爾變量不同,而表達式中的結果有可能與其中一個取值相同??偟膩碚f,通過“變量”可以控制控件、頁面等的顯示和隱藏,顯示的樣式等。4、 列表與交叉

10、表:兩者相同的地方就是都是用于顯示數據,一般與“查詢”聯系起來,其實列表與交叉表只是提供一種顯示的格式,而真正獲取數據的還是“查詢”。兩者不同的地方就是數據表達的形式不一樣。下面舉個例,如下圖:要顯示的數據是:部門,產品,帳面收入。分別用兩種表顯示,其實功能是一樣的,只是表示的格式不同,交叉表交叉的單元格就是確定某一部門某一產品的帳面收入。當然,兩種表的區(qū)別遠不止這么簡單,這里只為了說明兩種表的特點。5、 查詢的運算:和SQL語句中的運算類似,在COGNOS中也提供幾種運算,分別是聯接、并集、交集、排除,另外還可以直接寫SQL語句和MDX語句。在解決實際問題的時候可以靈活運用,去彌補COGNO

11、S系統(tǒng)提供顯示數據格式的不足。下圖為并集運算的圖標:6、“生成變量”屬性:對于報表里的控件、模塊等可通過生成變量來控制自身的顯示和隱藏,如下圖:7、“樣式變量”屬性:對于報表里的控件、模塊等可通過生成變量來控制自身的顯示樣式,與“生成變量”有點不同,樣式變量可以根據變量的取值去設置樣式,如下圖:為某一控件或部件的“生成樣式”與一個事先創(chuàng)建好的變量關聯后,就可對其進行樣式的設置了,例如對于布爾變量的取值,可分別對“是”和“否“兩種取值設置不同的顯示樣式。如下圖:假設將“小計”數據模塊設置樣式,當選擇布爾變量后,點擊“是”取值后,紅框中界面已變?yōu)榫G色,此時表明當變量取值為“是”的時候要顯示的格式,

12、接下來就可設置紅圈中模塊的格式了,與此類推,可再次重復以上步驟設置變量為“否”時的顯示格式。1.5.2 簡單報表的制作舉例1, 打開瀏覽器,進入在IIS中設置的網頁,如下圖:2, 點擊”Report Studio”超鏈接,進入對報表的操作,頁面會顯示出剛才已發(fā)布的包,如下圖:3, 點擊該包后進入報表管理工具。如下圖:4, 左上角顯示所需要用到的表,右邊為工作編輯區(qū),可以從左邊的表中的字段拖到右邊作為報表輸出。如下圖:點擊運行圖標如下圖: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“表示是第一級目錄。*/*循環(huán)讀取并判斷表中每一條記錄。*/for

27、( var i = tr.rowIndex + 1; i < tbl.rows.length; i+ )var trCurrent=tbl.rows(i);if(trCurrent.cells(0).style.paddingLeft ="20px") /*如果是當前目錄則退出循環(huán)不作處理*/break;if ( el.src.indexOf( "minus" ) >0 ) /*判斷是否圖標為“-”號,如果是則有可能是其已經展開了的子目錄,但現還不能確定是否是其子目錄,有可能是同一級的已展開了的目錄*/ if(trCurrent.cells(

28、0).style.paddingLeft ="40px" )/*判斷是否為當前目錄的子目錄。若是則展開,因為”minus“標記表明已經由”plus“轉變過來。即點擊了”+“號。*/*表示可以顯示*/trCurrent.style.display = "" /*并將”-“號圖標變?yōu)椤?“號以表明目錄已展開,方便下次判斷*/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 創(chuàng)建模板的方法1,在COGNOS中新建一個報表文件,其實就是普通的報表文件,然后對需要用到的模板格式進行編輯,例如下圖:3,編輯完后,選中文件菜單中的convert to template項將普通文件轉換為模板文件,最后保存該模板即可。4,當應用這個模板時,在COGNOS中新建一個報表文件,在彈出的新建對話框中如下圖:選擇”existing.”項,然后選擇剛才創(chuàng)建的模板。1.5.7 制作鉆取報表(報表與報表之間的鉆取)1, 該方法涉及到兩張報表

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論