我现在要在已有的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 ...
有相似设计的童鞋可以找我讨论
>>2.birt jsp传参数
解决方案:拼自符串传到报表里对参数进行处理吧。
那现在这个集合通过什么方式传,是放到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()方法
public void beforeOpen(IDataSetInstance dataSet,
IReportContext reportContext) throws ScriptException,在这个方法中可以拿到reportContext,但是好像只能取到在URL中定义的且同时在report parameters中定义的参数,而在report parameters中未定义的无法取到.
此外还想再请教一下
1.web viewer中的报表创建过程在哪里?或者说像DesignEngin,DesignConfig,PlatForm等对象是在哪里初始化的?
2.如果抛弃web Viewer,那么它所提供的打印/导出等按钮的功能能否自己实现?
~~~~~~~~~~~~~~~~
谢谢各位~
你要取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文件位置及更多信息的标识,根据这个标识来加入权限管理等更多功能.
~~~~~~~~~~~~~~~~~~~~~~~
谢谢~
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。