微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

birt家园里面看到的关于birt底层操作的原理

>>1. birt 与 ssh &动态生成参数页面

我现在要在已有的ssh项目中加入报表功能

大致包括上传报表,运行报表

基本思路是:上传时直接把文件内容存入数据库;运行时从数据库取出来,通过String获得inputStream提供给task运行。
主要代码片段:
InputStream is=   new ByteArrayInputStream(bytes);// bytes 就是从DB从取出来的内容
IReportRunnable design = birtReportEngine.openReportDesign(is);
IRunAndRenderTask task = birtReportEngine.createRunAndRenderTask(design);
task.run();

到目为止,如上功能已经实现,运行结果能在jsp上的iframe显示出来。

但参数问题一直没解决,我看到有用标签 <birt:parameterPage  来生成参数页面,但报找不到标签类的错误
而且用标签好像需要直接指定报表文件的路径( reportDesign="/mytest.rptdesign"),而我的报表是以String存放在数据库中的。

求高手帮我解决参数问题,也就是怎样动态生成参数界面

 

即使用El取,也是一个文件路径,
而我是把整个报表文件内容以字节形式存到数据库了(因为不希望把文件直接上传到项目中,做到程序和用户内容分开),
所以,现在发现不适合用标签了。

后来发现这个ParametersTask.java(官网API中),可以解析出每个参数,得到一个Map ...  

有相似设计的童鞋可以找我讨论

 

只要拿到ReportDesignHandle,就很容易取到相关的报表参数信息。可以调用BIRT Viewer的相关代码,或者直接通过BIRT engine的相关task去获取。可以看一下BIRT Viewer tag的相关源码。很简单的。

 

>>2.birt jsp传参数

我在jsp页面已经做好数据筛选了,最后返回一个集合或者数组要传给报表,请问报表该怎么接受,处理这个参数绑定到数据集上呢???

解决方案:拼自符串传到报表里对参数进行处理吧。

你是说报表得到这儿集合进行遍历拼动态sql让报表查询并且展现。。。
那现在这个集合通过什么方式传,是放到session里面,还有什么方式。。
jsp页面发送一个action请求,这个请求该怎么写???才能到报表

 

>>3.在DataSet的EventHandler中如何获取参数

大家好,向各位高手请教一个问题:
一个报表中新建Scripted Data Source和Scripted Data Set,并为这个DataSet编写了一个继承自ScriptedDataSetEventAdapter的java类,
在public void open(IDataSetInstance idatasetinstance) throws ScriptException函数查询数据库,
产生一个用户的List,
在public boolean fetch(IDataSetInstance dataSet,IUpdatableDataSetRow row) throws ScriptException中遍历上面的List中的用户
调用row.setColumnValue("name1","value1");进行填充.
(类似"呼唤"在前面教程中提到的使用java对象做为数据源).
现报表已能正确生成.请问如何在上面的open方法中得到URL中的查询条件?
(如URL为/myProject/frameset?__report=userReport.rptdesgin&username=tom,
我希望在open方法查询数据库前把username=tom添加sql中).


~~~~~~~~~~~~~~~~~~~~~~~~~~
谢谢~
这时候有没有reportContext对象,你输入这个对象,点一下,看能不能点出getParameterValue()方法

 

感谢呼唤的回复.我就是想在这里拿到reportContext~
貌似不行~

 

感谢呼唤的提醒,刚才试了一下,可以实现
public void beforeOpen(IDataSetInstance dataSet,
            IReportContext reportContext) throws ScriptException,在这方法中可以拿到reportContext,但是好像只能取到在URL中定义的且同时在report parameters中定义的参数,而在report parameters中未定义的无法取到.
此外还想再请教一下
1.web viewer中的报表创建过程在哪里?或者说像DesignEngin,DesignConfig,PlatForm等对象是在哪里初始化的?
2.如果抛弃web Viewer,那么它所提供的打印/导出等按钮的功能能否自己实现?

~~~~~~~~~~~~~~~~
谢谢各位~

 

关于取参数,reportContext取的是报表里定义的参数,这是肯定的。
你要取url参数,试着使用reportContext.getHttpServletRequest,得到request,再取参数。
关于初始化,你也许把runtime和viewer混淆了。你说的那个是在runtime里,自己使用api来生成和运行报表时操作的对象。而如果使用了web viewer,他主要是使用了viewservlet来处理的。
如果不使用web viewer,你可以在runtime里调用运行报表,但是没有打印/导出的按钮。你当然可以自己实现那些功能。他也是使用的prototypejs来实现前台的ajax功能的。

 

非常感谢"呼唤",您的技术和人品都让我非常钦佩!
仔细看了一下reportContext的API,几乎能从这个对象取到需要的所有东西,所以问题基本解决,再次感谢您的回复.
关于另外两个问题,我觉得都与Web Viewer的实现相关,不知道您是否熟悉Web Viewer的体系结构,根据<Integerating and extending birt>里介绍,Web Viewer用到了SOAP,Axis,prototype等,我想达到的效果就是找到并控制Web Viewer与Runtime的交互,因为我传给ViewerServlet的URL很可能不是BIRT能识别的格式,比如没有用__report=myRpt.rptdesign来指定报表文件的位置,而是传进来一个能代表report文件位置及更多信息的标识,根据这个标识来加入权限管理等更多功能.

~~~~~~~~~~~~~~~~~~~~~~~
谢谢~

 

花时间分析了一下birt的ajax调用,实现方式没以SOAP与Axis实现的WebService交换数据,其中,WebService的处理器为org.eclipse.birt.report.soapengine.processor.BirtDocumentProcessor,在此类的handleGetPage方法中完成report的创建并写入到response中,之后由客户端的js解析并展示到页面. 在handleGetPage方法中,使用org.eclipse.birt.report.service.actionhandler.BirtGetPageActionHandler类封装GetPage事件的调用,在此类内部,由继承关系可以分析出它要使用ReportService的getPage方法来得到一个ByteOutputStream,这个stream中,即为最终产生的报表输出流,将它写入到response中即可. 有不对的地方,望各位指正,谢谢~

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐