存档

‘BIRT’ 分类的存档

在Jboss portal 上开发birt

2009年4月15日 2 条评论

谁知道在wordpress 下只用syntax 插件之后使用<pre lang=”xml”> 为什么xml 展现不正确,请留言告知.

 

java 的portal 技术在展现上还是具有非常大的优势的,虽然jsr 268 并没能完全统一各portal 之间的不标准性. 但是在portal 上开发展现的东西还是非常有意思的,尤其是dnd (拖拽portlet) 和partial refresh (也可以定时自动部分刷新) 特性还是非常华丽的.

BIRT 作为最好的报表框架,对于分析展现数据具有很大优势,这篇文章就解释一下如何在jboss portal 上部署birt . 在官方的birt wiki 上有一篇介绍portal 上部署birt 的,不过那个文章太老了,基于birt 2.1 的, 尤其是它的portal 容器是apache pluto , 里面还有pluto 专有的api .  这篇文章介绍的是通用portal api. 只不过特定部署在jboss portal 上,如果你想要部署在其他portal 容器也可以,修改一下portal 的部署描述符就够了,代码不用改.

ok, let’s start

任何birt 要运行起来首先要实例化一个BirtEngine (org.eclipse.birt.report.engine.api.IReportEngine) , 所以首先还是写一个util 类, 用来取得BirtEngine.

import java.util.logging.Level;
import javax.portlet.PortletContext;
 
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.report.engine.api.IReportEngineFactory;
 
public class BirtEngine {
 
	private static IReportEngine birtEngine = null;
 
	public static synchronized IReportEngine getBirtEngine(PortletContext pc) {
		if (birtEngine == null) {
			EngineConfig config = new EngineConfig();
			config.setLogConfig(&quot;D:/birt&quot;, Level.FINEST);
			config.setEngineHome(&quot;E:/java/birt/birt-runtime-2_3_2/birt-runtime-2_3_2/ReportEngine/&quot;);
			//IPlatformContext context = new PlatformPortletContext(pc);
			//config.setPlatformContext(context);
 
			try {
				Platform.startup(config);
			} catch (BirtException e) {
				e.printStackTrace();
			}
 
			IReportEngineFactory factory = (IReportEngineFactory) Platform
					.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
			birtEngine = factory.createReportEngine(config);
 
		}
		return birtEngine;
	}
 
	public static synchronized void destroyBirtEngine() {
		if (birtEngine == null) {
			return;
		}
		birtEngine.destroy();
		Platform.shutdown();
		birtEngine = null;
	}

 

import java.util.logging.*;
import javax.portlet.*;
 
 
import java.io.IOException;
 
//+++++++++++++BIRT
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.HTMLServerImageHandler;
 
public class JbossBirtPortlet extends GenericPortlet {
 
	private static final long serialVersionUID = 1L;
 
	/**
	 * Constructor of the object.
	 */
	private IReportEngine birtReportEngine = null;
	protected static Logger logger = Logger.getLogger(&quot;org.eclipse.birt&quot;);
 
	public JbossBirtPortlet() {
		super();
	}
 
	/**
	 * Destruction of the portlet.
	 */
	public void destroy() {
		super.destroy();
		BirtEngine.destroyBirtEngine();
	}
 
	protected void doView(RenderRequest rRequest, RenderResponse rResponse)
			throws PortletException, IOException, UnavailableException {		
		rResponse.setContentType(&quot;text/html&quot;);
		this.birtReportEngine = BirtEngine.getBirtEngine(rRequest
				.getPortletSession().getPortletContext());
 
		IReportRunnable design;
		try {
			// Open report design
			design = this.birtReportEngine.openReportDesign(rRequest
					.getPortletSession().getPortletContext().getRealPath(
							&quot;/reports/a.rptdesign&quot;));
			// create task to run and render report
			IRunAndRenderTask task = birtReportEngine
					.createRunAndRenderTask(design);
 
			// set output options
			HTMLRenderOption options = new HTMLRenderOption();
			options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
			options.setImageHandler(new HTMLServerImageHandler());
			options.setOutputStream(rResponse.getPortletOutputStream());
			options.setBaseImageURL(rRequest.getContextPath() + &quot;/images&quot;);
			options.setImageDirectory(rRequest.getPortletSession()
					.getPortletContext().getRealPath(&quot;/images&quot;));
 
			task.setRenderOption(options);
 
			// run report
			task.run();
			task.close();
 
		} catch (Exception e) {
 
			e.printStackTrace();
			throw new javax.portlet.PortletException(e);
		}
	}
 
	/**
	 * Initialization of the portlet.
	 * 
	 * @throws PortletException
	 *             if an error occure
	 */
	public void init() throws javax.portlet.PortletException {		
	}
}

 

通用的 portal 描述文件 portlet.xml

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
<portlet -app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd">
   </portlet><portlet>
      </portlet><portlet -name>JbossBirtPortlet</portlet>
      <portlet -class>a.JbossBirtPortlet</portlet>
      <supports>
         <mime -type>text/html</mime>
         <portlet -mode>VIEW</portlet>
      </supports>
      <portlet -info>
 
      </portlet>

描述jbossbirt-object.xml 名字可以随便叫,对应一个自定义的portal 就行了

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
<deployments>
	<deployment>
		<if -exists>overwrite</if>
		<parent -ref>default.mysql</parent>
		<context>
			</context><context -name>dashboard</context>
			<properties>
				<property>
					<name>theme.dyna.partial_refresh_enabled
					</name>
					<value>true</value>
				</property>
				<property>
					<name>theme.dyna.dnd_enabled</name>
					<value>true</value>
				</property>
			</properties>
 
		<supported -mode>
			<mode>view</mode>
			<mode>edit</mode>
			<mode>help</mode>
		</supported>
		<window>
			</window><window -name>JbossBirtPortletWindow
			</window>
			<instance -ref>JbossBirtPortletInstance
			</instance>
			<region>center</region>
			<height>1</height>
 
	</deployment>
</deployments>

 

单个portal instance 的定义 portlet-instances.xml

&lt;?xml version=&quot;1.0&quot; standalone=&quot;yes&quot;?&gt;
<deployments>
	<deployment>
		<instance>
			</instance><instance -id>JbossBirtPortletInstance
			</instance>
			<portlet -ref>JbossBirtPortlet</portlet>
 
	</deployment>
	<preferences>
		<preference>
			<name>abc</name>
			<value>def</value>
		</preference>
	</preferences>
</deployments>

 

单个portal 当然也需要web.xml 描述符,如果你没使用任何servlet,listerner,filter 的话,留空就行了

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
<web -app xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" />

 

上述代码中最奇怪的算是

config.setEngineHome("E:/java/birt/birt-runtime-2_3_2/birt-runtime-2_3_2/ReportEngine/"); 

这是因为在jboss portal 里面没有办法取到ServletContext 对象,jboss portal 是跟jboss 绑定的, 其他的一些portal 容器一般都跟应用容器无关, 像是liferay, jetspeed 等基本都可以部署到jetty,tomcat等任意java应用容器, 其他容器都可以取到ServletContext 对象,(一般都是从RenderRequest 里面). 所以只好把birt engine 的位置放在一个操作系统上的绝对位置. 部署的时候需要包括birt runtime 下面的lib 包放在这个portal 的WEB-INF/lib 下 ,但是不需要platform 或者plugin 下的其他包, 你的EngineHome 设置的是正确的就行了. 如果泥启动的时候遇到了can’t startup osgi platform xxx , 就证明目录有问题. 确保是设置在birt runtime 下面的reportengine 目录下.

 

 

http://birtworld.blogspot.com/2008_08_01_archive.html

另一篇关于如何在jboss portal 上部署birt 的文章, 使用的是PlatformContext 方法,不过我没运行起来,jboss 总是指向一个它运行时候的临时目录,newsgroup 上也讨论了这个问题,最后还是设置的绝对目录.

如果本身需要把birt 集成到rcp , 或者一个什么特定的servlet 容器环境下,这种自定义PlatformContext 的方法还是值得参考的, 但如果没运行起来,绝对目录的方法最简单.

还是建议不要使用jboss portal 比较好,现在觉得apache 的jetspeed 不错,够轻量级. 还支持maven.

警告: 本文在jboss portal 2.6.8 上测试通过,并且确定与2.7.2 不兼容.

 

写这篇文章的目的是在做一个使用portal 与birt 集成的监控系统,主要面向多台主机的复杂环境,不做数据收集,只做数据展现.  放在

http://code.google.com/p/portal-monitor/

现在还什么都没有. 估计会选用jetspeed , birt  主要监控mysql , oracle , 会参考oracle 的OEM 和 cacti-mysql-template (percona 那个,cacti 报表的那个版本控制简直是要人命). 其他的比如jboss , jvm , memcache 说不定哪天抄其他人的代码也弄一个的.

 

参考资料:

http://birtworld.blogspot.com/2008_08_01_archive.html

 

http://www.birt-exchange.com/devshare/deploying-birt-reports/460-jboss-birt-portlet/

分类: BIRT 标签: , , ,

使用Birt制作Dashboard 和Mashup

2009年4月5日 没有评论

在eclipsecon 大会上 Rob Murphy 介绍了一个 Mashing up Data in Web Applications with BIRT 的小技巧 , 真的是很老的一个小技巧了,主要是用birt 2.2 的jsp tag 将页面HTML元素固定在某一区域,从而使一个页面可以嵌入多个birt reportletbirtmashup

上图就是一个典型的四reportlet组成的dashboard. reportlet , 每个reportlet 可以通过交互事件与其他reportlet 进行互动(基于birt 里面的bookmark , 也就是html 里面的id), 并且可以控制UI元素大小.

另外每一部分都有html 里面的iframe 组成,你也可以部分刷新某一区域,这个演讲里面有个示例,所以不多废话了.

 

顺便ggyy 一句,很多其他BI “领导厂商”的dashboard 总喜欢用flash 来做, 一个是学习起来成本比html 要高(等于是完全学习一个新的报表制作方式),一个是交互性很复杂和难以控制 ( 不要只看到外表的帅), 其实深层的技术原因是html 的展现功力非常的不到家. 基础问题都没有被解决.

 

当你要使用这种方式制作很多dashboard , 尤其可能要重用很多UI ,甚至是要让用户自己选择组建他自己想要看的页面,别用这种方式,使用java porlet 技术,那个才是重用UI 和用户完全动态的解决方案.

普通的用户需求慢慢提高,提供用户完全的动态性才是王道 . datacenter 里面系统监控图可能会比较想要这种技术.(啥时oracle grid control 搞个这个版本就好了)

 

 

Actuate Mashboard 简介

之所以说java portal 技术是解决report  重用和用户完全动态性的根本,就在于java portal 里面可以让用户完全自己选择, 关于java portal 你可以随便下个jboss portal 或liferay portal all-in-one 包自己体验一下就懂了.

Actuate Mashboard 是基于Actuate 商业产品, Mashboard 本身暂时是免费的(估计以后会直接打进iServer Express 包里面), 基本方式跟java portal 里面集成birt 差不多. 由于要让用户自己选择,所以必须要有一个repository 的概念,选用Actuate 的商业产品也就是一定的了.  如果你想自己开发类似的东西,你可以自己选个java portal 来开发. 免费的,就是看你开发的功力了(pentaho 以前的版本就是这样, gwt 化之后就不搞这个了)

看图说话吧

DASHBLURB 

利用仪表盘图表来表现参数页面一直都是一件很有意思的展现方式,不是吗?

DASH_DEMOLETTE_bg

以前这两个都是flash 演示的,我看到现在有gif 的版本,随便就放在自己站点上好让更多人了解

上面演示的mashboard 其实还算是轻量级的, Actuate 其实还有一个performance scordcard 商业产品,演示中好像比这个更强,不知道什么时候能有机会见见.

 

 

你想下载eclipsecon2008 全部的演讲ppt 在eclipsecon.org/2008 站点下载那个all-in-one 包,一般人我不告诉他. 2009 年的他们估计还要整理一下.

 

参考资料:

http://www.birt-exchange.com/devshare/deploying-birt-reports/798-eclipsecon-2009-birt-mashup-with-jsp-tags/#description

birt maskup eclipsecon 演讲的下载

 

http://www.birt-exchange.com/devshare/deploying-birt-reports/801-mashboard/?WT.mc_id=10019#description

actuate mashboard 简介

 

http://www.birt-exchange.com/devshare/deploying-birt-reports/802-actuate-javascript-api-tutorial/?WT.mc_id=10019#description

actuate jsapi ,看看那个flash 演示就够了.

 

http://www.birt-exchange.com/devshare/deploying-birt-reports/792-eclipsecon-2009-integrating-birt/#description

如何在任何环境下集成birt 是今后birt 永恒的主题.

分类: BIRT 标签: , ,

Birt 在eclipsecon 大会上的ppt 下载

2009年4月1日 没有评论

birt 在eclipsecon 大会上算是最耀眼的了,所涉及到的演讲题目从最基本的简单介绍开始到高级的定制报表在到用户案例介绍, 算是最全面的介绍了. 关于birt 在2009 年全部的演讲题目你可以到下面地址查看:

http://www.eclipsecon.org/2009/sessions?category=Frameworks%20-%20Reporting

所有的演讲稿基本都已上传到了birt-exchange 上, 如果你有兴趣的话,可以自行下载:

EclipseCon 2009 Integrating BIRT

 

EclipseCon 2009 BIRT Mashup with JSP Tags

 

EclipseCon 2009 – Who is BIRT? Solving Your Data Visualization Needs with Open Source Reporting

 

EclipseCon 2009 – Using and Extending Eclipse Data Tools (DTP)

 

最后一个讲dtp 的也不错,如果你打算使用birt 做类似ad-hoc query 的话,这可以算是一个很好的参考范例(可惜没有代码demo )

birt 2.5 应该会有一个全新的dtp query builder 集成, 算是一个桌面版的ad-hoc query 吧,birt 2.3 版没来的急集成进去,毕竟IBM 07 年才把query builder 捐给dtp. 期待呀.

 

如果你喜欢观看eclipsecon 大会其他的演讲, 你可以到

http://www.gpublication.com/

分类: BIRT 标签: , ,

从php 调用BIRT 报表

2009年3月4日 没有评论

BIRT 最近公布了一个从php 调用birt 报表的示例,从而使php 开发环境具备了一个高水准的报表框架,后台执行引擎还是java 的,使用了php-java-bridge 这样一个开源框架,一直都听说各种基于JVM 的动态语言框架如雨后竹笋出现,还有什么java 与.net 互通的成功案例,从来都不知道java 可以和php 互通的(自己孤陋寡闻而已),而这个php-java-bridge 通过php 引擎向java web 容器(tomcat 等) 发送XML-RPC 请求,所以需要你的环境能够即支持java web 环境又支持php 开发环境. 一般典型情况是这样:

你的php 仍然使用apache 作为web server , 使用端口80,它仍将达到或电子邮件时,在 http://cn.partypoker.com/相同的结果。在PHP与Apache有很几个问题。

你的tomcat 使用8080 端口作为java web container 来处理实际的BIRT 报表任务. 并且你的tomcat 里面已经部署了它提供的JavaBridge.war 应用, 里面默认是包含BIRT Runtime Engine 2.2.2 的, 里面跟BIRT Runtime 基本都一样,除了以前的jsp 文件现在变成了php 文件.

image

当有一个请求到达你的php 环境调用报表的时候, 它就会请求后台的tomcat 来实际执行这个报表,并把结果返回给php 这边. 在php 里面使用如下的代码:

<?php
define ("JAVA_HOSTS", "127.0.0.1:8080");
define ("JAVA_SERVLET", "/JavaBridge/JavaBridge.phpjavabridge");
require_once("java/Java.inc");

echo java("java.lang.System")->getProperties();
?>

当然,如果你喜欢在tomcat 里面开发php 程序,我们也不拦着你.

从上面代码看的出来,可以是多php 程序调用同一个tomcat 实例,也就是说多个普通的php + apache 的环境连接一台java+tomat 的机器就够了.

 

兼容性

这种从php 代码里面调用BIRT 报表的方式肯定是不会有100% 的兼容性的,不过目前对于常用的BIRT 功能都已经提供了对应的php class ,常用的BIRT 功能都是支持的:HTML ,Excel  ,PDF ,WORD 的输出,图片的生成,library 的使用,drill-through , javascript 的事件等。

目前已知的是它不包括那个birt open source viewer , 可以简单理解为那个长得不太好看的导航条部分,它主要提供运行参数的UI , TOC 的控制, 导出数据 和打印的功能,因为那个部分是jsp + prototype.js 做的,如果你需要做参数页面的话, 你要自己用html + php 脚本来做,设置参数就是用

$task->setParameterValue("Top Count", new java("java.lang.Integer", 6));

这样的语句就可以了.

其他的关于BIRT 功能性上的兼容性还未知,

关于java 方面的兼容性根据php-java-bridge 网站上给出的信息是:支持jsp , jsf 或其他框架,J2EE 后台的容器和apache 的load balance.

 

性能

BIRT 报表本身的性能是非常快的,使用了这个php-java-bridge 之后,从php 调用BIRT 报表也同样非常的快,根据我自己实际测试的结果是比从java 调用BIRT 快一点点.

从JAVA 调用BIRT 的第一次执行会比较慢,主要是因为要生成Document 文件,第二次或之后的速度就是正常的速度. 一般考虑性能指标都不算第一次的时间。

而这个php 版的BIRT 第一次执行BIRT 报表的时候就会非常快,跟第二次或之后的速度差不多,而即使是第二次执行,php 版的还是比java 版的要快一点点,0.5秒左右.

 

应用

我对php 开发语言是完全不懂的,不过从google 出来的结果看,好像php 没有一个很强力的报表框架 , 大多数报表需求还是使用比较低层的API , (从http://www.oschina.net/project/lang/22?tag=133 了解到的),如果说的不对还请高手指出.

这次从Actuate 放出的php 版的BIRT 在很大层度上强化了php 的报表分析需求,Zend 跟Actuate 有合作开发一个商业版的php birt 框架,具体比这个开源版的强在哪些方面还不知道,我估计是有一个php 版的Actuate BIRT Viewer , (就是那个有动态交互功能的商业版) . 不过由于这毕竟不是纯php 版,而且php 开发人员也不一定会很想用一个java 环境的报表框架,尤其很重要的是企业在关键应用上使用这种php + java 的混合模式应该还是持保守态度(我猜的,除非功能需求真的很重要), 至于php 的传统领域WEB 上,应该前台还是比较少,后台是最大的应用领域,毕竟后台的统计分析需求还是比较多的, 而且服务器的环境容易控制,应该还是会受到一定程度支持的. 无论像是论坛,博客,在线社区等等这些php 的应用后台一般都是在公司内部使用,统计分析需求还是会很容易选择这项技术的.

另外一个我猜测的应用领域应该是服务器管理监控,像是不少的服务器监控领域都是使用的php , python , perl 之类的语言开发的,而且服务器管理监控的数据分析需求会远大于语言的限制, 图表,下转,动态性都是这类服务器管理领域重要的需求,尤其是一些大的互联网公司要开发满足自己管理需求的特定服务器管理软件,估计这种需求会远大于语言本身的限制.

不过要求php 开发人员知道有这样一个可选项估计Actuate 公司还有很长的路要走. php 程序员和报表开发员会需要更多的综合性知识. 至于应用怎么样,还需要时间去检验.

 

参考资料:

http://www.theserverside.com/tt/articles/article.tss?l=IntegratingBIRTwithPHP

Jason Weathersby 在TSS 上发表的关于怎样在php 中集成BIRT 的详细文章.

 

http://www.birt-exchange.com/devshare/deploying-birt-reports/743-calling-birt-from-php/#description

下载它提供的集成包,一个war 文件,部署在tomcat 里面就可以用了, 里面提供了php 的文件和BIRT 报表.

注意看具体文档.

 

http://php-java-bridge.sourceforge.net/pjb/

php-java-bridge 的主页.

分类: BIRT, Report 标签: , ,

BIRT 2.3.2发布于BIRT 2.5 预览

2009年2月28日 没有评论

BIRT 2.3.2 已经于09年2月25号发布了, 这是一个bug fix 版,主要是修复2.3 版中的一些bug , 并不添加任何的新功能. 根据BIRT 开发的习惯, 每一个版本发布后都会发布至少两个版本的bug fix 版, 比如2.3.1 和2.3.2 , 之后到下一版本发布前的两三个月才会添加新的功能进入测试. 2.3.1 版本主要是修复一些关于BIDI 方面的有关bug , 2.3.2 修复bug 则比较多方面,如果你感兴趣,可以到它的bugzilla 去查, 地址如下:

https://bugs.eclipse.org/bugs/buglist.cgi?classification=BIRT&product=BIRT&target_milestone=2.3.2

其中列几个我敢兴趣的:

247126250609  修复关于debug 时候断点不能正确执行的问题.

249914   crosstab 中report-column-header 没正确执行

251656   Shortcut key (Ctrl+S) doesn’t work when switching to Script/XML source view

 

BIRT 2.5 版仍然还是和eclipse 的Galileo 版一同发行,应该还是在6月28号. 这次BIRT 2.5 版提供的新功能不算很激动人心, 主要是在易用性方面继续下功夫. 如果你敢兴趣的话可以去 http://www.eclipse.org/projects/project-plan.php?projectid=birt 看一下, 或者你有什么特定的需求也可以自己去提.

BIRT 2.5 新功能将主要集中在Report Layout , Page Aggregate , Page Break ,designer usability,Parameter usability,Chart usability,Data Access usability,Scripting usability,Performance Improvements,Charting improvements,Crosstab improvements,XML Data Source Improvements,Improve Bidirectional (Bidi) ,

Improve stylesheets

其中有几个我比较关心的. 比如

Incorrect image size in generated pdf [241194]

Image appears enlarged in pdf report [234432]

Provide ability to scale big image ot fit a page for PDF [240805]

Enhancement: add DPI property in report design [237426]

Newspaper Page Layout [133218] (简单来说就是像报纸布局一样,两栏或更多栏输出)

 

Add support for page aggregates / page totals [159857] (有很多财务报表需要这种,不过很难做)

Allow master page header and footer to access contents in report page [212837] (这个蛮有用的)

 

Removing Formatting from the GUI [211518]

 

Support to set multiple default values when create list-box parameter[0705] [203940] (这个用script 也可以做,不过现在在GUI上提高了易用性)

 

Set table / chart to hide when no data [204922]  ( 估计很多人都想要这个功能)

Ability to warn when a chart is empty [218034]

 

Support Union Data Set. [166331] (现在是one dataset joint one dataset , 这个需求是一次性join 多个dataset).

[Joindataset] choose more than one field to join two datasets [211747] (target milestone: 2.5.0) (现在通过computed column 也能够做到, 这个功能是简化一点)

 

Improvements to Java script API – Report item level operations not easy to perform [262949] (这个对写script 很有帮助,建议看一下)

 

Right mouse click trigger condition [200607] (鼠标事件分的真细)

 

Xtab filter should allow filtering on any cube dimension [190722] (很有用的一个功能)

Crosstab: Add the Rank function in the aggregations [206152]  (很有用的一个功能)

 

nowrap not working [254933] (长文本字符串不换行的问题)

 

 

如果你使用2.3 版本并且遇到了一些bug 的话,还是建议升级到新的bug fix 版本2.3.2 (先看一下是不是你遇到的bug fix 了), 等BIRT 出新的2.5 版本吧

 

 

参考资料

http://www.eclipse.org/birt

birt 主页

 

http://download.eclipse.org/birt/downloads/

2.3.2 下载地址

 

http://www.eclipse.org/projects/project-plan.php?projectid=birt

BIRT 2.5 的一些功能预览

分类: BIRT, Report 标签:

报表交互性和Actuate Interactive View简介

2009年2月20日 没有评论

为了增强用户分析数据的功能, 用户往往希望在查看报表的同时能够修改报表,一般把这种功能叫做交互式报表, 不少BI 厂商都提供了这种在线交互式分析的能力, Actuate 在Open Source Birt  View的基础上也提供一个商业版的Interactive View,

主要提供修改表头标题, label , 改变分页数大小, 修改聚合分组列 ,隐藏显示列, 添加计算列 过滤数据 . 改变样式,对齐方式

对于图标则支持过滤数据,改变图标的子类型, 修改图标的标题,大小等样式.

这些动态交互性其实在上一篇文章中http://www.gemini5201314.net/?p=287  都有提高, 其中有些动态功能也可以使用一些script 完成, 但是这些功能都需要大量添加script , 并且不能把修改后的报表保存成新的格式以便满足不同角度的分析需要.

sshot-9

    图1: 对列的操作

 

sshot-10

    图2: 聚合分组

 

sshot-11

    图3: 过滤数据 , 支持集合逻辑操作, 同时满足和满足部分要求

 

sshot-12

    图4: 添加计算列

 

sshot-1

    图5: 图表过滤数据

 

所有这些特性都是因为BIRT 具有良好的API , 你可以通过API 来修改报表的行为, 当然目前的Interactive View 还没有完全实现所有BIRT API 支持的操作, 对比一下BIRT API 就可以看出, 另一些暂时没实现的功能比如有: 基于条件的隐藏列或行, 基于条件的高亮行(目前只是列), Mapping 功能完全没有(比如一个人年龄是10-20 ,显示出来的就是青年,>50 就是老年) , TOC ,bookmark , 改变Data Binding值, 动态添加hyperlink 或drill through ,添加tooptip 和事件 ,图标里的interactive 一个都没有.

不过总的来说,interactive view 还是非常能满足一个普通用户分析报表的需求, 尤其是操作起来简单和修改后的报表可保存.

而且很容易和其他项目集成, 集成步骤基本跟birt 一样. 价格好像是2500美元/服务器, 如果要服务的话就是4500美元, 基本还是很便宜的. 不知道国内买打多少折.

 

参考资料

http://www.birt-exchange.com/products/interactive-viewer/#features

interactive view 官方简介.

 

http://www.gemini5201314.net/?p=287

部分动态功能可以通过脚本实现的方法

BIRT 报表的动态交互性

2009年2月18日 2 条评论

birt 提供了不少报表交互性, 像是TOC (table of content) , Bookmark , Hyperlink , 图标的交互性和一些script 能够完成的工作. 但是有时候用户可能更需要的不是一开始把报表做成某种形式,而是查看了数据之后,觉得可能要自己来简单的更改一下报表的样式,并且保存下来, 随着数据的不同,同一个报表可能最后会随着分析角度的不同而出现不同的报表展现形式, 其中主要的用户交互性有: 动态排序, 动态过滤, 动态聚合,动态分组,动态显示隐藏列, 改变列的位置, 改变样式. 图表数据过滤,图表样式或格式的改变 (饼图变成柱状图之类的).

在开始介绍怎么样制作BIRT 的动态交互报表之前, IBM developerwork 上有一篇文章介绍BIRT的提示与技巧的文章建议大家先看看(看下面的参考资料) ,

1. 动态排序.

这个功能恐怕任何一个程序都会要求有的, 现在不少ajax 的table 基本上都有能够点击表头进行排序的功能.使用birt 制作动态排序的报表有几种方式. 有两种已经在IBM 上那篇文章介绍了, 一种方式是在表头上加链接,连接到另一个表,并且传递参数怎么排序的, 一种方式是改变sql 语句, 在where clause 后加sort by . 另外我还有两种动态排序的方式: 一种是通过客户端javascript 排序, 一种是通过BIRT API 在运行时排序. 客户端javascript 排序方式其实已经很普遍了, 不少Ajax 库都具有这种table 插件, 象是jquery 的jsgrid 或是flexigrid 插件,YUI 的table 插件也支持不少排序方式. 这种方式只要导入几个js 文件, 一两行代码就可以了,而且还有不少漂亮的样式. 另一种通过BIRT API 在运行时改变排序行为的方式也只需要几行script 就可以完成: 在table 的onPrepare() 事件加上以下代码:

importPackage (Packages.org.eclipse.birt.report.model.api.simpleapi);
if ( params["paramSortOrder"].value != null ){
var sortCondition = SimpleElementFactory.getInstance().createSortCondition();
switch (params["paramSortOrder"].value){
case “city” :
sortCondition.setKey(“row[\"CITY\"]“);
break;
case “state” :
sortCondition.setKey(“row[\"STATE\"]“);
break;
}
sortCondition.setDirection(“asc”);
this.addSortCondition(sortCondition);
}

里面使用的是table 的 addSortCondition 函数 , 当运行的时候,你可以输入你想要排序的列,报表在运行的时候根据你输入列的名称来排序,这种排序方式对于大数据量可能不适合,它不是在sql 里面加的排序条件,而是取出来之后排序的数据. 后面会附上一个实例报表,运行一下就知道了.

2. 动态过滤,动态聚合,动态分组

动态创建过滤条件,动态聚合,动态分组的方法跟上面的script 差不多,就是API 用的不一样, 在这里就不多介绍了,当然也可以通过建立参数过滤数据,建立分组条件来达到同样目的(虽然不是动态交互的).

3.,动态显示隐藏列,

创建一个控制显示一列的boolean 参数, 在column 的visibility 上填这个参数就够了.

4.改变列的位置

通过改变data binding 的方式, 改变Data元素的data binding.

5.改变样式

这个见的最多了,this.style.xxx = xxx 改变样式.

动态隐藏
动态排序
参考资料

http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0708tomlyn/

IBM 的developerwork BIRT 提示与技巧.

http://www.birt-exchange.com/devshare/designing-birt-reports/675-birt-interactivity/#description

介绍BIRT 交互性的, 基于BIRT 2.1

http://birtworld.blogspot.com/2007_03_01_archive.html

介绍怎么样动态隐藏table column 和 chart 数据的.

http://www.flexigrid.info/

jquery 的一个table 插件, 支持排序,显示隐藏列,调整列的高度宽度等

http://developer.yahoo.com/yui/datatable/

YUI的table 插件,支持多种排序方式.

BIRT 中定时刷新报表

2009年2月13日 没有评论

HTML 中如果我们要定时刷新某一个部分, 可以使用DOM api window对象的settimeout方法, BIRT 中当然可以直接使用html 的script , 当然主要是看刷新之后报表还是跟原来一样,参数都正确处理了.

所以在报表中加入一个text 元素, 然后选html 类型, 在其onPrepare() 方法里面加上下列代码就可以在查看报表的时候按照执行的时间进行刷新或者你也可以手工点 “refresh” 按钮进行刷新

//Build a string that contains all the parameters and their values
var paramsString = “”;
var paramDefs = reportContext.getDesignHandle().getAllParameters();
for (i = 0; i < paramDefs.size(); i++ ) {
var paramDef = paramDefs.get(i);
if (paramDef.getClass().toString() == “class org.eclipse.birt.report.model.api.ScalarParameterHandle”) {
var paramVal = reportContext.getParameterValue(paramDef.getName())
if (paramVal == null || paramVal == “null”) {
paramVal = “”;
} else if (paramVal.length > 0) {
var paramValTmp = “”;
for (j = 0; j < paramVal.length; j++) {
if (paramVal[j] != null && paramVal[j] != “null”) {
if (j > 0)
paramValTmp += “|”;
paramValTmp += encodeURIComponent(paramVal[j]);
}
}
paramVal = paramValTmp;
} else {
paramVal = encodeURIComponent(paramVal);
}
paramsString += “&” + paramDef.getName() + “=” + paramVal;
}
}

this.content=”<form name=’input’ onSubmit=’return reloadPage();’>”
+”<input type=’submit’ value=’refresh report’ onclick=’reloadPage()’>refresh manual</input></form>”
+”<script type=text/javascript’>”
+”function reloadPage() {”
//alert( targetURL );
+”    var targeturl = window.location+’”+paramsString+”‘;”
+”    location.replace(targeturl);”
+”    return false;”
+”}”
+”timer=setTimeout(‘reloadPage()’, 20000);”
+”</script>”

第一部分主要是取得当前报表的参数, 并把参数变成 &param1=value1 这种形式,因为这种形式的URL 可以被直接使用, 如果是一个参数可以接受多个值的话, 中间就是 |  来连接, 比如 1|2|3 , 最后拼接成一个总的paramsString .

第二部分主要是html 的部分, location.replace(url) ; 就是提交当前的url , 也就是刷新了.

然后使用DOM 的window.setTimeout() 方法, 其中间隔是20 秒, 不过其中也有个按钮可以手工刷新,调用的同样也是reloadPage() 这个html script .

附上报表:  .reload_test

参考资料:

http://www.birt-exchange.com/devshare/designing-birt-reports/714-reusable-library-for-reloading-a-report/#description

这个有个自动刷新的library , 不过代码只适合iportal .

http://www.w3school.com.cn/htmldom/dom_obj_location.asp

http://www.w3school.com.cn/js/jsref_encodeURIComponent.asp

w3school 的几个dom api . 中文的. 这个站点的资源一项不错,google 才知道搞了个中文站点.

BIRT 新ODA驱动 Hibernate Data Source

2009年1月3日 没有评论

jboss tools 在新的3.0 版本中推出了一个更好的跟TPTP 和 BIRT 集成的计划, 下面主要介绍它添加的新的birt 功能

 

1. 新的oda 驱动, hibernate data source.

    在你安装完了birt all in one + jboss tools 之后,如果你创建报表,你会发现多了一个hibernate data source 可以作为数据源了.

HbDataSource1

 

HbDataSource2

如果你不是用JNDI 控制数据源,就不用填JNDI URL. 注意其中的Configuration 是选的Hibernate Console Configuration. 你要先创建hibernate console configuration. 它真正的参数也就是在hibernate.cfg.xml 里面读取的.

 

2. Hibernate Data Set.

    有了hibernate data source 当然有配套的hibernate data set了.  只不过这次选的不是table 和sql 了. 而是你程序里面的对象和HQL .

HbDataSet

 

如果你喜欢jboss 的seam 框架, 它也有一个新的seam 标签包装了birt .不知道是不是全部属性都包括了, 大家可以去看看.

 

参考资料:

http://docs.jboss.org/tools/whatsnew/birt/birt-news-1.0.0.Alpha1.html

jboss tools 3.0 的一部分新功能

 

http://docs.jboss.org/tools/movies/

告诉你怎么样使用jboss tools 的flash demo, 里面有教你怎么生成代码和创建console configuration的.

分类: BIRT 标签:

BIRT 一些基础问题解答

2008年12月29日 5 条评论

本来跑去birt-exchange.com 去下一个关于birt 用store procedure 作dataset 的文档, 看到有个中文版,就跑去actuatechina.com 下, 结果还要注册(我讨厌下东西的时候注册,我特别懒,最讨厌注册这种事) , 后来就注了个册,然后随便看了几个帖子,发现都是一些基础问题,因为很多时候BIRT的文档不可能集中在一个地方, 所以的确给很多喜欢BIRT 的朋友学习造成了一些麻烦,也有朋友抱怨说BIRT文档不好, 其实不是BIRT 文档不好,而是有很多问题都是实际的应用一个一个去解决,不可能有一份文档告诉你所有BIRT问题该怎么解决, 这就像我给你一份Java 的api 文档,你不可能知道所有java 代码该怎么写一样,还是要一个一个具体问题对应的解决, 最重要的是有示例 , 一个例子顶千言,这就是为什么需要BIRT的newsgroup , birt-exchange.com , actuatechina.com 这些资源去回答问题的, 所以没有什么必要抱怨什么没有文档, 我给你一份oracle 的参考大全,你就能成为最牛的DBA吗? 肯定不可能呀 .

下面列出一些常见的问题.

1. 作者: wc188996

希望能够在 BIRT CHART 的 category Series 上也能够实现钻取功能。有点时候在很多工程里category Series会包含很多内容,但是图片上的信息也不能完全显示,需要在category Series 上实现带参数的钻取功能。category Series可以很轻松的包含十几个甚至几十个项目,所以这点还是很实用的。
例如:在我的附件中饼图的这些个乱码上的位置,能否添加钻取功能。客户需要,郁闷啊。

birtchartdrill

答: BIRT的交互功能和script 一向是我最喜欢的, 图表的交互功能我个人认为可能是报表中最强的,(有希望打败它的可能只能在flash 图表里面找,它商业版里也有支持flash 对象的).   在一个chart 的y series 里面点击interactivity , 里面列出所有事件,选启动的mouse click 或mouse double click .Action 选Hyperlink, 然后连接你的另一个报表. 我前一个在BIRT里面高亮行的例子中http://www.gemini5201314.net/?p=151 ,那个图表就是选的Action –>Invoke Script.   如果你不是点饼图,而是点旁边的数值,就选Legend里面的interactivity , 注意Legend 还有一个Behavior 属性, 反正你都点着试一下就知道了.

 

作者: mjianguo

在birt2.3中,我用JDBC连数据库,创建数据集,创建参数(注:我用的是list box,Dynamic,此时没有选Allow Multiple Values),然后edit数据集,在Query中加入?,
在Paremeters中加入参数,Preview results ,没有问题。
此时我将一个参数中的Allow Multiple Values选中,Preview results时报表中就没有值了?
查看原因:edit数据集,点击Parmeters进入查看参数时,在上面显示此行错误:The report parameter ‘ipadd’ allows multiple values, which can not be used to link with data set parameter.
请问我该如何使用Allow Mulitple Values此选项?在SQL中要做什么变化吗?
不知说清楚了没有,请各位大侠指点迷经。。。先谢谢了

答: Query中的参数不支持link到allow multiple value的parameter 其中有个bug 跟它相关(2.3.1 以修正),

https://bugs.eclipse.org/bugs/show_bug.cgi?id=235252

这个bug 修正的是UI上要提示dataset 里面不能用parameter link 上UI要有提示的.

你的query 里面不能link multiple values 是因为java.sql.PreparedStatement 里面不可能setParameter(position,String[] params) 接受数组这种参数, 如果你要接受多个参数值可以:
1. dataset 的filter 里面加 xxx in params["allow multiple values"]
2. 或者在property binding 里面写 this.query.text="手工把params["multiple"]拼起来的sql"

 

作者: sanegod

我有这样一个需求,如附件need.jpg所示:
表格里有嵌套表!每个表绑定不同的数据集;
我有5个数据集,数据集1绑定在外层表,其他是4数据集绑定在内部的嵌套表上
z_in,z_out,z_in_cz,z_out_cz;
每个表格都一个结果,现在我想要实现:
z_in-z_out-z_in_cz-z_out_cz他们想减的结果放在aihaochazhi那个表里;
由于是四个数据集,不知道怎么实现!请大家帮忙!
把是个数据集的语句弄到一个数据这个办法考虑过,实现不了我的需求,我一定要用到4个数据集的!谢谢大家了!

答: 使用joint data set 把四个dataset 连起来,
你虽然知道每个结果肯定只有一个值,但是dataset 不可能知道呀,要是一dataset 有3个值,一个dataset 有5个值,你说最后的表格怎么画出来的.
只要你的四个dataset 使用的是同一个数据源,肯定可以用一个sql 跑出来, joint data set 一般用在不同的数据源直接dataset 连接

 

作者: iskytek

。。。。。。。。。。。。。。 交叉报表怎么没有分页选项

答 : 在crosstab 的row area 和column area 里面都有page break 选项呀, 分别是竖直分页和水平分页

 

1,birt导出PDF,如果内容是字母或数字过长,就会被截掉,怎么解决??
2,birt的WEB预览页面跟导出的PDF或打印出的样子不一样,那预览还有什么用?

答 1. 你在advanced tab 里面指定它的width 属性.
    2. 它的WEB 预览是html 的呀, 你pdf 当然是不一样的.

 

作者: qxyang007

目前我用的MVC框架,现在要用spring在后台调用birt,请问一下,该如何调用?网上说要重载一个方法renderMergedOutputModel,但,又没有实例,请教高手,能说明一下吗?急啊!谢谢了!

答 : 可以参考一下springside 的方法.
http://www.springside.org.cn/docs/reference/Birt.htm

 

我在googlecode 上建的一个收集report 示例的项目. 目前主要是birt-exchange.com 上的

http://code.google.com/p/birtdemo/

 

参考资料

http://www.birt-exchange.com/devshare/designing-birt-reports/588-create-data-source-on-stored-procedure-in-birt/#description    使用store procedure 做dataset.

http://www.actuatechina.com/thread838.html#post4250    四dataset

http://www.actuatechina.com/thread40.html    交叉报表

http://www.actuatechina.com/thread782.html     link multile values

http://www.actuatechina.com/thread852.html

分类: BIRT, Report 标签: