對COGNOS有一定了解以后,經(jīng)理逐漸發(fā)現(xiàn)COGNOS的強大之處,特別的立方體模型使數(shù)據(jù)倉庫更有條理而且訪問速度更快。但是也了解到了COGNOS的劣勢,應該說是IBM整體的劣勢,也就是界面太丑。雖然COGNOS也包含了幾乎所有的圖表,樣式也可以調(diào)整。但是對COGNOS的界面調(diào)整太復雜,幾乎看的比較好的COGNOS顯示界面都要有HTML對象來調(diào),更或者無論你怎么調(diào)也是基于HTML,在色彩和動畫方面不會有很大的空間了。
于是經(jīng)理在想,是不是可以把只用COGNOS對數(shù)據(jù)的抓取優(yōu)勢而在顯示層用別的方式呈現(xiàn)呢(比如flex或者別的)?如果COGNOS能開發(fā)更多的前端顯示接口固然好,但這是不可能的,當然,經(jīng)理知道這樣做會損失一部分性能,但是對現(xiàn)在大多對界面都很挑剔的客戶,這肯定是一條比較好的路。
OK,那么現(xiàn)在經(jīng)理把做的一個java調(diào)用cognos端直接返回XML字節(jié)流的例子和大家分享下。
一、環(huán)境
硬件環(huán)境:主屏2.0Hz+內(nèi)存3gb+系統(tǒng)32位
軟件環(huán)境:cognos 8.41+Myeclipse8.5ga+sqlserver2000sp4

二、IBM Cognos Connection部分
首先,我用framework做了了一個灰常簡單的包(所謂非常簡單就是里面完全沒有維度和亮度,直接隱射的數(shù)據(jù)庫表列),并把他發(fā)布到公共文件夾,名為test_sdk_paser

然后在這個包下用report studio做了一個灰常簡單的報表,名為test

這個報表就是我們之后要在java中獲取其數(shù)據(jù)的報表。
三、COGNOS SDK調(diào)用程序
0.準備步驟.
我們先要把sdk所需要的包考到項目中來。必要包的位置在D:\cognos\c8\sdk\java\lib\下,先給大家看看我的目錄結(jié)構(gòu)

1.我建立了一個config.properties文件用來存放congos服務器的ip和端口

在java中對應寫一個從properties中獲取數(shù)據(jù)的方法

2.弄清楚報表的xpath
這個xpath我們可以在報表的 設置屬性-->常規(guī) 找到

xpath是十分重要的,其實報表ID也十分重要,這個經(jīng)理以后會跟大家寫。
3.連接cognos服務器
經(jīng)理這里用ReportService_ServiceLocator對象的getreportService方法來獲得一個ReportService_Port對象。
getreportService需要一個參數(shù),是cognos服務器地址,http://localhost/p2pd/servlet/dispatch
ReportService_Port是報表操作對象,我們就是用這個對象的run方法來運行cognos端報表。


4.設置cognos認證信息
經(jīng)理這里的cognos設置了NTML認證,那么是需要在sdk代碼中設置認證信息的。

用CAM方式進行登陸


5.設置report的參數(shù)
本例中用HashMap來傳遞report的參數(shù),用循環(huán)的方式把外界的參數(shù)從HashMap中取出來,設置到ParameterValue的value中去。

6.cognos運行報表設置
每項代表什么經(jīng)理已經(jīng)把注釋寫的很清楚了。


這里尤其提醒大家注意的一點是,RunOptionEnum.prompt這個參數(shù)一定要設置,設置這個參數(shù)是當cognos運行有參數(shù)的report時候,不彈出html提示窗口。經(jīng)理之前就是沒有設置這個參數(shù),所以在測試帶參數(shù)報表的時候搞了一天都沒搞出來。
那么這個option到底還有多少參數(shù)呢?經(jīng)理給大家看啊看你cognos sdk的官方API

大家看到了吧,官方的API只是把枚舉值做了一個羅列,具體他們是做什么的?有什么作用?什么都沒說。經(jīng)理當然也看了sdk的源碼,希望能在源碼中找到一點注釋,結(jié)果是:sdk的java文件沒有一行注釋代碼。
經(jīng)理在這里不想罵人,現(xiàn)在終于知道為什么cognos sdk這個領(lǐng)域這么弱了。
7.運行cognos報表并返回xml數(shù)據(jù)
經(jīng)理在這里統(tǒng)計了一下用sdk返回數(shù)據(jù)的時間。
之前講過用ReportService_Port的run方法可以讓report運行,然后返回一個叫AsynchReply的對象,這個對象中有details[]屬性,這個里面基本上包含了report返回的所有信息。而他的status屬性則標識了此次請求是否成功。

OK,現(xiàn)在代碼都解釋完了,現(xiàn)在來測試下。

經(jīng)理在這里寫了一個簡單的測試例子,用之前講到的test_sdk_paser包中的test進行測試


下面再測試一個帶參數(shù)的報表
把之前的那個報表加一個參數(shù)

然后在這里輸入一個1

得到這樣的數(shù)據(jù)

稍微改動下代碼,然后run一下

然后得到結(jié)果是這樣的

正好和剛剛的結(jié)果一樣~~
sdk取數(shù)據(jù)關(guān)鍵的也就是上面說的7個步驟。最后依然要BS一下cognos的開發(fā)者,居然在源碼中一行注釋都沒有,幫助文檔也不全面。
所以還是集結(jié)大家的力量一起研究一起分享研究后的成果。
歡迎大家一起來博客上討論。
謝謝~
posted on 2010-08-05 21:41
張元Won 閱讀(6216)
評論(16) 編輯 收藏 所屬分類:
Cognos