对COGNOS有一定了解以后,经理逐渐发现COGNOS的强大之处,特别的立方体模型使数据仓库更有条理而且访问速度更快。但是也了解到了COGNOS的劣势,应该说是IBM整体的劣势,也就是界面太丑。虽然COGNOS也包含了几乎所有的图表,样式也可以调整。但是对COGNOS的界面调整太复杂,几乎看的比较好的COGNOS显示界面都要有HTML对象来调,更或者无论你怎么调也是基于HTML,在色彩和动画方面不会有很大的空间了。
于是经理在想,是不是可以把只用COGNOS对数据的抓取优势而在显示层用别的方式呈现呢(比如flex或者别的)?如果COGNOS能开发更多的前端显示接口固然好,但这是不可能的,当然,经理知道这样做会损失一部分性能,但是对现在大多对界面都很挑剔的客户,这肯定是一条比较好的路。
OK,那么现在经理把做的一个java调用cognos端直接返回XML字节流的例子和大家分享下。
一、环境
硬件环境:主屏2.0Hz+内存3gb+系统32位
软件环境:cognos 8.41+Myeclipse8.5ga+sqlserver2000sp4
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic2010080521.jpg)
二、IBM Cognos Connection部分
首先,我用framework做了了一个灰常简单的包(所谓非常简单就是里面完全没有维度和亮度,直接隐射的数据库表列),并把他发布到公共文件夹,名为test_sdk_paser
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805212.jpg)
然后在这个包下用report studio做了一个灰常简单的报表,名为test
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805221.jpg)
这个报表就是我们之后要在java中获取其数据的报表。
三、COGNOS SDK调用程序
0.准备步骤.
我们先要把sdk所需要的包考到项目中来。必要包的位置在D:\cognos\c8\sdk\java\lib\下,先给大家看看我的目录结构
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805220.jpg)
1.我建立了一个config.properties文件用来存放congos服务器的ip和端口
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805222.jpg)
在java中对应写一个从properties中获取数据的方法
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805223.jpg)
2.弄清楚报表的xpath
这个xpath我们可以在报表的 设置属性-->常规 找到
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805224.jpg)
xpath是十分重要的,其实报表ID也十分重要,这个经理以后会跟大家写。
3.连接cognos服务器
经理这里用ReportService_ServiceLocator对象的getreportService方法来获得一个ReportService_Port对象。
getreportService需要一个参数,是cognos服务器地址,http://localhost/p2pd/servlet/dispatch
ReportService_Port是报表操作对象,我们就是用这个对象的run方法来运行cognos端报表。
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805225.jpg)
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805226.jpg)
4.设置cognos认证信息
经理这里的cognos设置了NTML认证,那么是需要在sdk代码中设置认证信息的。
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805227.jpg)
用CAM方式进行登陆
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic2010080522.jpg)
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic2010080523.jpg)
5.设置report的参数
本例中用HashMap来传递report的参数,用循环的方式把外界的参数从HashMap中取出来,设置到ParameterValue的value中去。
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic2010080524.jpg)
6.cognos运行报表设置
每项代表什么经理已经把注释写的很清楚了。
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic2010080525.jpg)
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic2010080526.jpg)
这里尤其提醒大家注意的一点是,RunOptionEnum.prompt这个参数一定要设置,设置这个参数是当cognos运行有参数的report时候,不弹出html提示窗口。经理之前就是没有设置这个参数,所以在测试带参数报表的时候搞了一天都没搞出来。
那么这个option到底还有多少参数呢?经理给大家看啊看你cognos sdk的官方API
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic2010080527.jpg)
大家看到了吧,官方的API只是把枚举值做了一个罗列,具体他们是做什么的?有什么作用?什么都没说。经理当然也看了sdk的源码,希望能在源码中找到一点注释,结果是:sdk的java文件没有一行注释代码。
经理在这里不想骂人,现在终于知道为什么cognos sdk这个领域这么弱了。
7.运行cognos报表并返回xml数据
经理在这里统计了一下用sdk返回数据的时间。
之前讲过用ReportService_Port的run方法可以让report运行,然后返回一个叫AsynchReply的对象,这个对象中有details[]属性,这个里面基本上包含了report返回的所有信息。而他的status属性则标识了此次请求是否成功。
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic2010080529.jpg)
OK,现在代码都解释完了,现在来测试下。
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805211.jpg)
经理在这里写了一个简单的测试例子,用之前讲到的test_sdk_paser包中的test进行测试
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805213.jpg)
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805214.jpg)
下面再测试一个带参数的报表
把之前的那个报表加一个参数
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805215.jpg)
然后在这里输入一个1
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805216.jpg)
得到这样的数据
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805217.jpg)
稍微改动下代码,然后run一下
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805218.jpg)
然后得到结果是这样的
![](/images/blogjava_net/zhangyuan/cognos/sdk/idx2/pic20100805219.jpg)
正好和刚刚的结果一样~~
sdk取数据关键的也就是上面说的7个步骤。最后依然要BS一下cognos的开发者,居然在源码中一行注释都没有,帮助文档也不全面。
所以还是集结大家的力量一起研究一起分享研究后的成果。
欢迎大家一起来博客上讨论。
谢谢~
posted on 2010-08-05 21:41
张元Won 阅读(6179)
评论(16) 编辑 收藏 所属分类:
Cognos