转载自:https://blog.csdn.net/z1012890225/article/details/37815947

选择数据资源管理器(Data Explorer)。如果使用缺省报表设计透视图,则数据资源管理器位于布局编辑器的左边,在画板(Palette)的旁边,如图所示。如果它尚未打开,则选择窗口->显示视图->数据资源管理器。

图3-1 数据资源管理器

右键单击Data Sources然后从上下文菜单中选择新建数据源。新建数据源显示可以创建的数据源的类型,如图所示。

图3-2 新建数据源

Classic Models Inc.Sample DataBase ———上面说过是BIRT样本数据库。

Flat File Data Source ———从CSV、SSV、TSV、PSV四种格式的平面文件获取数据源。

JDBC Data Source ——— 通过配置jdbc连接数据库。

Script Data Source ——— 通过编写脚本获取数据源。

Web Services Data Source ——— 通过web service方式获取数据源。

XML Data Source ——— 从xml文件获取数据源。

3.1 JDBC数据源

在数据源上新建数据源,出现如下对话框,

图3-3 新建JDBC数据源

图3-4 配置JDBC数据源

图3-5 测试JDBC数据源

各参数含义如下:

驱动程序类:JDBC 驱动类名。该列表默认会有“org.apache.derby.jdbc.EmbeddedDriver (Apache Derby Embedded Driver)”、“org.eclipse.birt.report.data.oda.sampledb.Driver (Classic Models Inc. 示例数据库驱动程序)”两个选项,分别对应于Derby数据库和BIRT 自带的示例数据库。用户可点击“管理驱动程序…”来添加/删除JDBC 驱动包(jar或zip),该包中的所有JDBC 驱动类类名将被添加到此列表供用户选择。用户添加的JDBC驱动包将被复制到“\\plugins\org.eclipse.birt.report.data.oda.jdbc_xxx\drivers”目录下(其中“xxx”代表版本号)。

驱动程序URL:JDBC连接URL。各JDBC 驱动有其对应的URL格式,可参考具体JDBC 驱动的文档。

用户名:数据库登录名。

密码:数据库登录密码。

JNDI URL:如果JDBC连接信息是以JNDI 数据源的方式配置在部署报表的应用服务器上,此处为应用服务器上该JNDI 数据源的URL。例如,Tomcat上JNDI 数据源的URL格式为“java:/comp/env/jdbc/xxx”(其中“xxx”为JNDI 数据源名)。

注意:如果提供JNDI URL,只在把报表部署到应用服务器后才生效。在设计报表时,使用的<驱动程序类,驱动程序URL,用户名, 密码>组合。

可点击“测试连接…”来测试能否使用输入的<驱动程序类,驱动程序URL,用户名, 密码>与数据库连接成功。

在XML中会出现如下的配置信息:

<oda-data-source extensionID=”org.eclipse.birt.report.data.oda.jdbc” name=”MyDatasource” id=”187”>

<text-property name=”displayName”></text-property>

<property name=”odaDriverClass”>oracle.jdbc.driver.OracleDriver</property>

<property name=”odaURL”>jdbc:oracle:thin:@182.64.254.194:1521:vbsdev</property>

<property name=”odaUser”>wfl</property>

<encrypted-property name=”odaPassword” encryptionID=”base64”>d2Zs</encrypted-property>

</oda-data-source>

</data-sources>

其中birt designer自带的数据库配置如下图:

图3-6 示例数据库配置

如果测试连接未通过,除了Database URL可能不对之外,用户名,密码都可能不对。另外,驱动程序找不到也可能导致测试未通过。这个时候需要管理驱动程序。

图3-7 oracle数据库JDBC数据库驱动程序管理

各个数据库的Database URL大多不同,

derby的URL:jdbc:derby://【host】:1527/【database】,

oracle的URL:jdbc:oracle:thin:@【host】:1521:【database】,

mysql的URL:jdbc:mysql://【host】:port/【database】,

DB2的URL:jdbc:db2://【host】:port/【database】

其它的数据库连接具体参考各自的说明。

我们在开发报表的时候,是使用jdbc链接数据库的,但为提高报表的运行效率和稳定性,使用连接池进行管理比较好。比较简便和低耦合的解决办法,使用jndi连接池。

jdbc和jndi的区别:

JDBC -最基本的连接数据库的方式, 每次对数据库打交道的时候 ,连接数据库是需要实例下你实现连接数据库的方法或者类。 
JNDI DataSource 英文全称是:Java Naming and Directory Interface java 命名接口,当服务启动时 事先把连接数据库的已经连好多条,具体多少条你可以设置,存放在tomcat容器里,用的时候可以直接使用, 不用再实例化得到连接,相对与jdbc效率要快点

在eclipse设计报表的时候,我们使用jdbc链接数据库做测试,当到了tomcat运行环境中切换到jndi连接池,这是比较方便的开发方法。

1.tomcat配置jndi连接池

在 {tomcat目录}\webapps\{项目名}\META-INF 中新增context.xml文件,配置代码如下
<?xml version=”1.0” encoding=”UTF-8”?>
<Context>
 <Resource
 auth=”Container”
   name=”jdbc/travel_agency”
 type=”javax.sql.DataSource”
 maxIdle=”5”
 maxWait=”-1”
 driverClassName=”com.mysql.jdbc.Driver”
 username=”itravel”
 password=”709394”
 url=”jdbc:mysql://192.168.1.100/travel_agency?useUnicode=true&characterEncoding=UTF-8”
 maxActive=”10”/>
</Context>

2.在web.xml中加入配置
<resource-ref>
 <description>Database Source</description>
 <res-ref-name>jdbc/travel_agency</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

3.实例报表中数据源代码

<data-sources>
 <oda-data-source extensionID=”org.eclipse.birt.report.data.oda.jdbc” name=”数据源“ id=”227”>
<property name=”odaDriverClass”>com.mysql.jdbc.Driver</property> 
 <property name=”odaURL”>jdbc:mysql://192.168.1.100/travel_agency</property> 
<property name=”odaUser”>itravel</property>
<encrypted-property name=”odaPassword” encryptionID=”base64”>NzA5Mzk0</encrypted-property>
 <property name=”odaJndiName”>java:comp/env/jdbc/travel_agency</property>
 </oda-data-source>
</data-sources>

除了第7行 <property name=”odaJndiName”>java:comp/env/jdbc/travel_agency</property>,其余是我们的之前的配置。用了第7行的代码,表示该报表支持jndi数据源,birt在运行报表的时候,会先用jndi去连接,如果失败了再用jdbc链接,这样做的好处就是,我们在开发报表的时候,没有放到web环境中,可以使用jdbc,当放到tomcat中,因为有了第7行的配置。默认采用jdni连接。

如果是weblogic,一般都事先配置好了JNDI,我们只需要在报表运行的路径下的WEB-INF中添加context.xml,

图3-8 context.xml的位置

内容如下即可

<resource-ref>
 <description>Database Source</description>
 <res-ref-name>jdbc/wfl</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

然后再配置BIRT数据源的JNDI

图3-9 JNDI数据源的配置

在XML中会出现以下配置信息:

<oda-data-source extensionID=”org.eclipse.birt.report.data.oda.jdbc” name=”数据源“ id=”8”>

<property name=”odaDriverClass”>oracle.jdbc.driver.OracleDriver</property>

<property name=”odaURL”>jdbc:oracle:thin:@182.64.254.111:1521:vbsdev</property>

<property name=”odaUser”>wfl</property>

<encrypted-property name=”odaPassword” encryptionID=”base64”>d2Zs</encrypted-property>

<property name=”odaJndiName”>java:comp/env/jdbc/wfl</property>

</oda-data-source>

</data-sources>

连接的顺序:先连接JNDI,如果找不到就连接公共数据源,如果再找不到就连接自定义数据源。

另外一种降低耦合性的方法便是调用平台的配置文件,从配置文件中读取JNDI,URL,DriverClass,User,Password等等信息

birt用脚本javascript创建数据源,并从配置文件中读数据库信息

图3-10 用脚本配置数据源

可以定义一个参数去指定properties文件的路径,然后创建datasource。

在datasource的script中编辑beforeOpen事件,参考下面的代码:

importPackage( Packages.java.io );

importPackage( Packages.java.util );

fin = new java.io.FileInputStream( new String(params[“propFile”]) );

props = new java.util.Properties( );

props.load(fin);

extensionProperties.odaURL = new String(props.getProperty(“url”));

extensionProperties.odaDriverClass = new String(props.getProperty(“driver”));

extensionProperties.odaUser = new String(props.getProperty(“userid”));

extensionProperties.odaPassword = new String(props.getProperty(“password”));

fin.close();

这样就可以从properties文件中动态读取数据源配置信息。

你可以把配置文件在代码里写死,也可以定义为报表参数,请注意params[“propFile”]这里。

这里的代码只支持绝对路径,在deployment的情况下可能不太适用,可以修改一下支持相对路径,相对于你发布的应用根目录。

importPackage( Packages.java.io,Packages.java.util,Packages.java.net );

importPackage( Packages.javax.servlet.http );

req = reportContext.getHttpServletRequest( );

propPath = new String(params[“propFile”]);

if ( propPath.charAt(0) != ”/” )

propPath = ”/” + propPath;

url = req.getSession( ).getServletContext( ).getResource( propPath );

if ( url != null )

{

props = new java.util.Properties( );

props.load( url.openStream( ) );

extensionProperties.odaURL = new String(props.getProperty(“url”));

extensionProperties.odaDriverClass = new String(props.getProperty(“driver”));

extensionProperties.odaUser = new String(props.getProperty(“userid”));

extensionProperties.odaPassword = new String(props.getProperty(“password”));

}

说明,下面这一段必须在runtime中测试,否则req = reportContext.getHttpServletRequest( );取值为空,不能获取数据源。

或者还有另外一种写法如下,:

this.setExtensionProperty(“odaURL”, props.getProperty(“url”));

this.setExtensionProperty(“odaDriverClass”, props.getProperty(“driver”));

this.setExtensionProperty(“odaUser”, props.getProperty(“userid”));

this.setExtensionProperty(“odaPassword”, props.getProperty(“password”));
配置后,重新启动,无任何问题,报表生成成功。

3.2在BIRT中使用存储过程

概述

存储过程和函数都是包含了一系列的SQL语句的集合体。通常来说,存储过程可以用来执行一系列的操作或是调用某些函数去计算一个值。因此,我们可以把存储过程看作是一个无返回值的方法调用,而函数则可以看作是一个有返回值的方法调用。

由于各个关系型数据库对存储过程支持程度的差别,以及输出结果返回方式的不同,用户需要有一个通用的方式来访问存储过程。BIRT(BIRT报表) 提供了一个简单,易用的方式来支持对存储过程数据的获取,方便的让用户将存储过程作为数据源来定制自己的报表。

本文演示了如何使用BIRT 2.3.0创建存储过程数据源。

BIRT支持的存储过程返回值类型

BIRT支持5种类型的存储过程返回值:

单结果集

结果集通常是通过使用SELECT语句选择数据产生的。结果集可以从永久表,临时表或者局部变量中产生。

输出参数

输出参数经常用来从存储过程中检索出的结果。输出参数可以是整型,或是字符型等数据类型。

RETURN参数返回状态

这是一种从存储过程返回错误码的方法。存储过程会返回一个整型的状态值。用户可以使用RETURN语句返回自己的状态。

游标

某些 DBMS允许从存储过程中返回游标的一个引用,JDBC并不支持这个功能,但是Oracle, Postgre SQL和DB2等都支持这种返回类型。我们同样可以通过BIRT来访问这些数据类型。

多数据集

这种结果是指返回结果包含多个结果集或游标。

BIRT调用存储过程的语法

JDBC API 提供了一套存储过程SQL转义语法,该语法允许对所有的关系型数据库使用标准方式调用存储过程。它的调用方式有两种,一种是带有返回值的调用,另一种是不含返回值的调用

{?= call <procedure-name>[<arg1>,<arg2>, …]}

{call <procedure-name>[<arg1>,<arg2>, …]}

在BIRT中,所有的对存储过程的调用遵循JDBC3.0规范。所以以上语法适用于BIRT,在这里<arg1>…参数可以用占位符或者是默认值来代替。

创建存储过程数据源/集

创建存储过程数据源的过程如下.

创建一个JDBC的数据源。

当创建数据源时,选择SQL存储过程数据类型。

建立存储过程查询语句。

如图所示:

图3-11 JDBC调用SQL存储过程

在BIRT中使用存储过程

本章讨论如何在BIRT里使用不同类型的存储过程返回结果。

在示例1,2,3中用到的数据库是Sybase数据库,示例中用的的表是Customers表,它记录了所有用户的信息。 由于Sybase不支持游标,所以在示例4,5中,我们将使用到Oracle数据库。在存储过程4中,我们会调用到OFFICES表,通过游标来返回该表的所有信息。在示例5中,我们会调用到CUSTOMERS表。对该表进行若干次的查询定义来返回多个结果集。

调用返回单结果集的存储过程。

示例1:存储过程定义如下:

CREATE PROCEDURE get_All_Customers

AS

SELECT * FROM Customers

GO

该存储过程返回CUSTOMERS表中的所有记录。使用BIRT调用方法如下:

调用语句: { call get_All_Customers () }

下图给出了上述存储过程在BIRT数据集编辑器中的结果:

图3-12 JDBC调用SQL存储过程

调用一个含有参数的存储过程,并且有输出参数。

在存储过程中用户通过输入参数,想选择出满足条件的结果集。比如:我们想查找某一ID用户的所有信息。定义的存储过程如下:

CREATE PROCEDURE get_Cursotermer_ByID

(@id int, @name varchar(50)  output,@phone varchar(50)  output)

AS

SELECT @name=customerName,@phone=phone

FROM Curstomers

WHERE customerNumber =@id

GO

调用语句:{ call get_Cursotermer_ByID (?,?,?)}

图3-13 JDBC调用SQL存储过程

在“参数”项里,我们可以看到BIRT会自动列出来的所有的参数。用户只需填入输入参数的默认值,就可以直接预览结果了。在某些特殊情况下,由于数据库驱动驱动/数据连接的一些内部问题而无法正确获取参数列表,用户也可以手动添加所需用到的参数,也一样可以达到相同效果。

调用含有RETURN参数的存储过程

在2中,我们同样可以得到该存储过程的RETURN参数。

调用语句:{ ?=call dbo.get_Cursotermer_ByID (?,?,?) }, 这里和2中唯一的不同是,在“参数”页面中,可以看到自动增加了一个 “@RETURN_VALUE”的参数,一般情况下,如果用户需要调用函数,则可以通过这种方式获取函数的返回值。

调用返回游标的存储过程

并不是所有的DBMS都支持游标类型。这里我们用ORACLE数据库中的存储过程为例。

在ORACLE中我们创建存储过程实例如下:

CREATE OR REPLACE PAGKAGE TESTPACKAGE AS

TYPE TEST_CURSOR IS REF CURSOR;

END TESTPACKAGE;

CREATE OR REPLACE PROCEDURE TESTLIN2 ( TEST_CUSROR OUT TESTPACKAGE.TEST_CURSOR) AS

BEGIN

OPEN TEST_CURSOR FOR SELECT * FROM OFFICES;

END TESTLIN2

由于JDBC标准中,并没有支持游标这一数据类型,因此,我们对游标类型是以java.sql.Types.Others类型来处理。对于上面的这个存储过程,我们调用过程如图所示:

调用返回多个结果集的存储过程

存储过程实例如下:

CREATE OR REPLACE PROCEDURE TESTMULTIPLE

(

P_CUSTOMERNUMBER IN NUMBER,

P_CUSTOMERCURSOR1 OUT SYS_REFCURSOR,

P_CUSTOMERCURSOR2 OUT SYS_REFCURSOR,

P_CUSTOMERNAME OUT VARCHAR2,

P_COUNTRY OUT VARCHAR2

)

AS

BEGIN

OPEN P_CUSTOMERCURSOR1 FOR

SELECT * FROM CUSTOMERS

WHERE CUSTOMERNUMBER>P_CUSTOMERNUMBER;

SELECT COUNTRY INTO P_COUNTRY

FROM CUSTOMERS

WHERE CUSTOMERNUMBER=P_CUSTOMERNUMBER;

OPEN P_CUSTOMERCURSOR2 FOR

SELECT * FROM CUSTOMERS;

SELECT CUSTOMERNAME INTO P_CUSTOMERNAME

FROM CUSTOMERS

WHERE CUSTOMERNUMBER=P_CUSTOMERNUMBER;

END;

调用语句为:{ CALL TESTMULTIPLE(?,?,?,?,?) }

图3-11 JDBC调用SQL存储过程

3.3 XML数据源

一. 新建XML文件

1. 自定义XML文件一定要遵循XML1.0的标准和规范.具体信息见:

http://www.w3.org/TR/REC-xml/

2. 新建以后缀名为xml的 文件,名称为XmlSource.

3. XmlSource.xml文件的内容为:

<?xml version=”1.0” encoding=”utf-8” ?>

<root>

<user>

<name>henry</name>

<email>herny.zhang@chinasystems.com</email>

</user >

<user>

<name>john</name>

<email>john.zhong@chinasystems.com</email>

</user >

</root>

二. 新建XML数据源

1. 在birt资源管理器的左上方选择数据源,新建数据源.

2. 选中xml数据源,数据源名称为XmlDataSource.

3. 点击Next,选择xml文件路径.

4. 如图选择XmlSource.xml文件路径:

5.点击完成.

三. 新建XML数据集

1. 新建数据集,名称为XmlDataSet,选择刚才新建的数据源XmlDataSource.

2. 点击Next.

3. 在XPath表达式中输入/root/user,如图:

4. 点击Next.

5. 映射字段,选择name字段,点击小箭头按钮.

6. 选择name的字段的类型,字符串类型.如图:

7. 点击确定,然后把eamil字段也相同映射.

8. 点击完成.

四. 预览效果

1. 把数据集XmlDataSet拖入到报表编辑页面,点击预览,就可看到效果.如图:

3.4脚本化数据源

我们新建一个报表application_session_integrationBF.rptdesign,用来把浏览器的参数对封装成脚本数据源在报表中显示出来。

新建数据源-选择脚本数据源,名称为setScript

在大纲视图下,我们单击application_session_integrationBF.rptdesign,在报表编辑器的脚本中,我们在beforeFactory下拉款选项中输入以下内容:

// Create a hash table which will contain lists of other lists

var topMap = new Packages.java.util.Hashtable();

// Request Attributes

var request = reportContext.getHttpServletRequest();

var requestAttrMap = new Packages.java.util.Hashtable();

var attrNames = request.getAttributeNames();

do {

var aName = attrNames.nextElement();

requestAttrMap.put(aName, request.getAttribute(aName).toString());

} while (attrNames.hasMoreElements())

topMap.put(“requestAttributes”, requestAttrMap);

// Request Parameters

var requestParamMap = new Packages.java.util.Hashtable();

var paramIter = request.getParameterMap().entrySet().iterator();

do{

var entry = paramIter.next();

requestParamMap.put(entry.getKey(), (entry.getValue()[0]));

} while (paramIter.hasNext())

topMap.put(“requestParameters”,requestParamMap);

// Session Attributes

var sessionAttrMap = new Packages.java.util.Hashtable();

var session = request.getSession();

// Insert a variable on the session

session.setAttribute(“ReportAttribute”, “arbitrary value to pass to container”);

var sessionAttrNames = session.getAttributeNames();

var i = 0;

do  {

i ++;

var aaa = sessionAttrNames.nextElement();

sessionAttrMap.put(aaa, session.getAttribute(aaa));

} while (sessionAttrNames.hasMoreElements())

topMap.put(“sessionAttributes”, sessionAttrMap);

// Get the system properties

topMap.put(“systemProps”, Packages.java.lang.System.getProperties());

// Store top map as a global

reportContext.setPersistentGlobalVariable(“topMap”, topMap);

然后我们新建数据集setEnvironmentVars,选择数据源setScript,在输出列中添加三列

报表编辑区的XML编辑区中我们会看到如下内容:

<list-property name=”resultSetHints”>

<structure>

<property name=”position”>1</property>

<property name=”name”>propName</property>

<property name=”dataType”>string</property>

</structure>

<structure>

<property name=”position”>2</property>

<property name=”name”>propValue</property>

<property name=”dataType”>string</property>

</structure>

<structure>

<property name=”position”>3</property>

<property name=”name”>propType</property>

<property name=”dataType”>string</property>

</structure>

</list-property>

预览以下是没有结果集的,因为我们还没有编写数据集的open和fetch方法,在大纲视图中选中数据集setEnvironmentVars,在报表编辑区的脚本编辑区,我们输入以下内容

aMap = reportContext.getPersistentGlobalVariable(“topMap”);

topIter = aMap.entrySet().iterator();

if (topIter == null)

{

topIterator = new Packages.java.util.Iterator();

Packages.java.util.logging.Logger.getLogger(“”).info(“OPEN NULL ” );

}

innerIter = null;

do

{

if (innerIter == null || innerIter.hasNext() == false)

{

if (topIter.hasNext())

{

outerObject = topIter.next();

innerIter = outerObject.getValue().entrySet().iterator();

}

else

{

return false;

}

}

}

while (innerIter.hasNext() == false)

innerObject = innerIter.next();

row[“propName”] = innerObject.getKey();

row[“propValue”] = innerObject.getValue().toString();

row[“propType”] = outerObject.getKey();

return true;

在大纲视图的脚本设计里面我们会看到

之后我们可以切换到画板中开始设计报表的布局。

添加分组

设置适当的格式,在web查看器中查看报表,我们可以看到如下的结果

更常用的用法是,我们在脚本数据源里调用JavaBean,通过Java的方式来获取数据集,一般是在beforeFactory中创建JavaBean,在open中通过数据库连接绑定JavaBean和数据库值,在fetch中指定row。还可以通过指定事件处理函数来指定外部的数据源类,详细的用法见后文——BIRT的事件处理机制。

Web Services 技术是一套标准,它定义了应用程序如何在 Web 上实现互操作。用户可以使用任何语言,在不同的平台下编写 Web Services,然后通过 Web Services 的标准来对这些服务进行注册、查询和访问。BIRT 可以方便的帮助用户访问基于 SOAP 的 Web Services,并且使用 SOAP 响应作为生成报表的数据。

支 持 使 用 WSDL 文 件 定 义 数 据 源 和 数 据 集 。 WSDL 文 件 是 一 种 常 用 的 WebServices 服务描述语言。BIRT 可以解析 WSDL 文件,帮助用户定义 SOAP 查询和使用 SOAP 响应包含的信息生成报表。用户可以为一个 Web Services 数据集定义参数并在 SOAP 请求中使用有一些案例,BIRT 使用 WSDL 自动生成的 SOAP 请求模板是无效的,这时用户可以对模板进行手工修改用户可以提供一些实现了 BIRT 定义的连接和查询接口的 Java 类作为数据源。SOAP 响应使用 XML 格式,用户可以可视化的把 XML 格式的 SOAP 响应映射为一个表结构。具体的操作与定义 XML 数据集的操作相同。

选择数据源类型

指定 Web Services 的连接属性

WSDL URL 或位置用户指定要连接的 Web Services 的 WSDL。本文例子用的是 Google 提供的 WebServices。SOAP 终结点(End Point) 和自定义驱动类SOAP 终结点是一个接收 servlet,具体的作用可以参考参考文献[4]。

如果用户指定了自定义驱动类,BIRT 就会使用它来连接访问 Web Services。在这种情况下,SOAP End Point 可以为空;如果 SOAP 终结点不为空,它将作为一个连接属性被传递给用户指定的驱动的 connect 方法。如果自定义驱动类为空并且 SOAP 终结点不为空,BIRT 将使用 SOAP 终结点建立SOAP/HTTP 连接。自定义驱动类是一个 Java 类的全名,这个 Java 类必须在应用的 class path 上或者驱动程序类路径指定的 class path 上,另一种办法是把所需要的 Java 文件放在 BIRTplugins “org.eclipse.datatools.enablement.oda.ws”的 lib 目录中。这个类必须实现下面的方法来建立 Web Services 连接。

测试连接按钮可以用来测试用户输入的连接当前是否是可以连通的。

建立一个 Web Services 数据集

选择在 WSDL 中定义的操作

这个对话框显示一个树结构,包含所有在 WSDL 中定义的操作。用户可以选择一个操作,并在以后的步骤中创建基于该操作的 SOAP 请求模板,如果用户没有指定 WSDL本步骤将被跳过。本文选择的操作是 doGoogleSearch,选择需要的参数

这些参数是 BIRT 根据上一步选择的操作解析 WSDL 文件得到的。选中的参数会出现在下一步的 SOAP 请求模板中,没选中的参数则不会出现在 SOAP 请求模板中。编辑 SOAP 请求模板

用户可以对 BIRT 自动生成的 SOAP 请求 模板进行修改SOAP 信息必须通过 XML 进行编码,具体的语法可以参考 SOAP 语法方面的文档。参数名的格式为“&?参数名?&”。用户可以使用插入参数按钮给 SOAP 请求 参数设置缺省值。清除按钮可以用来清除整个模板文本。定义 SOAP 响应

用户可以使用这个对话框定义 SOAP 响应架构(schema)和选择一个 SOAP 响应消息的例子。指定 SOAP 响应 架构是把 SOAP 响应消息映射为表格式的数据集的先决条件。用户可以选择在 WSDL 文件中定义的响应 架构,这是缺省选项。用户也可以选择一个外部的 XML 架构(XSD)文件作为响应 架构。在 SOAP 终结点查询 Web Services 指定一个 Web Services 查询来获得一个 SOAP 响应消息作为示例数据来源。使用外部示例文件是允许用户选择一个外部文件来提供一个例子 SOAP 响应消息。示

例文件必须是用 XML 格式编码,只需要包含 SOAP 响应消息的数据部分就可以了。把 SOAP 响应消息映射为表格式的数据集

从这个步骤开始与定义 XML 数据集的相关步骤是相同的。

3.6 文本数据源

一. 新建文本数据

1. 新建文本数据文档,文档后缀名可以是txt,或者是csv.在这里我们来建立一个后缀名为txt的文本文件,名称为TextSource.txt.

2. 文本数据格式:

第一行是字段名称,每个字段之间必须用逗号隔开.

第二行是字段类型,每个类型名称之间必须用逗号隔开.

第三行是字段内容,每个内容之间必须用逗号隔开,如果是字符串类型的,就用双引号括起来.

每行之间不能有空行,必须一行结束后,紧接着另一行.例如:

3. 文本数据格式举例:

Name,Sex,Age,Address,Date

STRING,STRING,INT,STRING,TIME

“xiaozheng”,” female”,520,”Monthly”,01/31/2003/ 09:59:59 AM

“xiaodan”,” female”,520,”Monthly”,01/31/2003/ 09:59:59 AM

“lianglaing”,”male”,66666,”Monthly”,01/31/2003/ 09:59:59 AM

二. 新建数据源

1. 在birt左上方的资源管理器中选择新建数据源,选择平面文件数据源.

2. 数据源名称为TextDataSource,点击Next,选择你的文本文件所在文件夹,字符集默认.

3. 点击测试连接.

三. 新建数据集

1. 在birt左上方的资源管理器中选择新建数据集,选择TextDataSource数据源.

2. 数据集名称为TestDataSet,点击Next.选择文件筛选中的*.txt.因为我们建立的数据文本是txt的.

3. 选择TextSource.txt文本文件.

4. 选择后,在右边会出现文本数据的字段名称,全部选中到左边,点击完成.

5. 如图:

四. 预览文本数据效果

1. 将新建的TextDataSet数据集拖动到报表编辑页面中,然后预览,就可看到效果.

2. 如图:

3. 最终效果如图:

3.7 平面文件数据源

1 平面文件数据源的类型

在这里,对于我们正在介绍的BIRT而言,可以接受作为数据源的平面文件类型共有4种: *.CSV, *.SSV,*.PSV,*.TSV。

2 四种平面文件类型的区别

2.1 CSV文件

CSV文件——comma separated value,也叫逗号(,)分隔值文件,即文件内容用逗号来分割数值。

文件定义格式示例如下:

2.2 SSV文件

SSV文件——semicolon separated value,也叫分号(;)分隔值文件,即文件内容用分号来分割数值。

文件定义格式示例如下:

2.3 PSV文件

PSV文件——pipe separated value,也叫pipe符号(|)分隔值文件,即文件内容用pipe符号来分割数值。

文件定义格式示例如下:

2.4 TSV文件

TSV文件——tab separated value,也叫tab符号分隔值文件,即文件内容用tab符号来分割数值。

文件定义格式示例如下:

从以上的定义就可以发现,这四种文件的主要不同之处在于定义时所用来分割数值的分隔符不同。

3 BIRT 定义的平面文件格式和规则

下面我们介绍一下BIRT对于合法平面文件的的格式和规则要求。

首先,除了分隔符可以不同之外,其余的必须遵循CSV文件的规范。

关于CSV文件的一些详细介绍,请参考技术文档:

http://en.wikipedia.org/wiki/Comma-separated_values

其次,必须遵循BIRT的特殊规定:

每一行的数据,列的数量必须一致,但列的内容可以为空。

对定义的数据类型有一定的限制,对各数据类型的数据定义格式也有一定的要求和限制。

4 BIRT 平面文件驱动支持的数据类型

对于BIRT 平面文件驱动而言,其支持的数据类型有:整数, 浮点, 字符串, 日期, 日期时间,时间,小数, 布尔。

5 平面文件中可定义的数据类型

在作为数据源的平面文件中,BIRT支持的数据类型有更加广泛的定义方式。

下表向用户直观地描述了平面文件中定义的数据类型和BIRT驱动支持的数据类型之间的转换关系。

平面文件中定义的数据类型

转换成BIRT支持的数据类型

CHAR, VARCHAR, STRING, LONGVARCHAR, CLOB, BLOB,ANY, BINARY, VARBINARY, LONGVARBINARY

字符串

BIT, INT, INTEGER, SMALLINT, TINYINT

整数

BIGINT, DECIMAL, BIGDECIMAL, NUMERIC

小数

FLOAT, DOUBLE, REAL

浮点

TIMESTAMP, DATETIME

日期时间

DATE

日期

TIME

时间

BOOLEAN

布尔

6 一些特殊数据类型的数据定义格式

BIRT的数据类型

平面文件数据的解析规则

源数据示例

日期

先根据ISO8601标准进行解析,如果无法解析则根据本机JRE的locale设置来解析,如果仍无法解析再根据美国的locale解析。合法的源数据最后将被解析构造成一个java.util.Date对象。

2006-6-12;

2006-8-12

时间

先按照上述日期类型的解析规则将源数据解析成一个java.util.Date对象;如果解析成功则获取此对象的时分秒信息得到一个java.sql.Time对象;如果无法解析,则按照【时:分:秒】或者【时:分:秒 AM/PM】的格式来解析并获取源数据的时、分、秒数值,构造成一个java.sql.Time对象。

2006-6-12 2:04:00;

11:25:39

日期时间

1.如果源数据的格式符合

【yyyy-mm-dd hh:mm:ss.fffffffff】格式,则直接用java.sql.TimeStamp.valueOf(stringValue) 来得到一个java.sql.TimeStamp对象;

2.如果源数据为长整型,则直接用new java.sql.TimeStamp( longValue ) 得到一个java.sql.TimeStamp对象;

3.按照上述日期类型的解析规则解析源数据并得到一个java.util.Date对象,然后通过

new java.sql.TimeStamp

(java.util.Date.getTime())

方法得到一个java.sql.TimeStamp对象。

328000000;

2006-6-12 11:25:39

7. 使用BIRT创建平面文件数据源

7.1 新建平面文件数据源

用户在“数据资源管理器”视图上选择新建一个平面文件数据源的时候,需要指定所选定的平面文件的文件类型以及此文件所在的目录。BIRT可以接受本地磁盘目录或者是其它符合文件协议的目录。另外,用户还需要选择一个和此平面文件相应的编码方式。

操作界面如图4-1所示。

图 4-1 新建平面文件,指定文件夹及其它属性

7.2 设定平面文件的映射规则

从图 4-1,用户也应注意到新建平面文件数据源的界面上有两个选项可供选择:

将第一行用作列名称指示器。

将第二行用作数据类型指示器。

7.2.1将第一行用作列名称指示器

勾选此项BIRT将会把平面文件的第一行作为结果集的字段名来处理。

否则,第一行的数据将会被视作结果集第一条记录的值进行映射。

需要注意的是,如果此项未被勾选,则第二个选项将不开放操作,即平面文件里的第二行数据将被视作结果集第二条记录的值进行映射,而非各字段的数据类型。

7.2.2将第二行用作数据类型指示器

勾选此项BIRT将会把平面文件的第二行作为结果集的各字段数据类型来处理。

否则,第二行的数据将被视作结果集第一条记录的值进行映射,而非各字段的数据类型。

7.3 测试平面文件的连接

在设定完所有的选项之后,可以通过“测试连接”按钮测试所指定的文件目录是否存在。

8.  编辑平面文件数据源

假设我们已经建立了一个名为“数据源1”的平面文件数据源,可以在“数据资源管理器”视图区域选择它进行编辑。

打开编辑对话框之后,用户将会看到左边的导航栏提示有三个类别的操作:

平面文件数据源连接属性

连接配置文件

属性绑定

8.1平面文件数据源连接属性

这个操作页面类似于新建平面文件数据源的界面和操作,用户可以修改各选项,重新定义属性。此时当先前指定的平面文件路径不存在的时候,在对话框的上部将会显示错误信息。如图 5-1 所示。

图 5-1 编辑平面文件的连接属性时,因指定的路径非法而显示错误信息 1

此时,如果通过“测试连接”按钮进行连接测试,将会得到“Ping失败”的结果提示。

8.2属性绑定

这个页面提供给用户修改连接属性的途径,部分类似于在“平面文件数据源连接属性”页面的同类功能。操作界面如图4所示。

下面介绍一下此页面各个属性的含义和输入规范。

注意:所有的输入必须符合JavaScript的表达式规范,如果值是个字符串,必须加上双引号。

主文件夹:找到平面文件的路径。

CSV类型:平面文件的类型;可选填4种平面文件的类型之一。

字符集:通过java.nio.charset.Charset.availableCharsets( )获取所有Java虚拟机支持的字符集,具体的字符集列表可参考技术文档:

http://www.iana.org/assignments/character-sets

值得注意的是,Unicode规范中有一个较为特殊BOM的概念。BOM——Byte Order Mark,就是字节序标记。UTF-8、UTF-16编码往往会包含BOM这种特殊的字符,其中UTF-16 BOM又分为两种形式:

UTF-16:le(Little- Endian) 和UTF-16:be(Big- Endian)。

现在许多软件不予以支持BOM,而BIRT在这一点上却提供了良好的支持。BIRT在读取源文件时会主动识别其是否为UTF-16LE(不使用BOM)或者UTF-16BE(不使用BOM)编码。如果是其中之一则直接将字符集名作为参数传给java.io.FileInputStream对象,如果不是,则将编码方式设为默认的UTF-8。在使用UTF-8编码方式时,BIRT会主动识别源文件是否为UTF-8 BOM编码,如果包含BOM,将会对于读入的字节流做特殊处理,以保证读取数据的正确性。

使用第一行用作列名称指示器:输入true,表示使用第一行用作列名称指示器,反之输入false。

使用第二行用作数据类型指示器:输入true,表示使用第二行用作数据类型指示器,反之输入false。

图 5-2 编辑平面文件数据源的属性绑定

如图 5-2 所示,在属性绑定页面里在各个属性的对应文本编写区域内手动输入了一些JavaScript表达式。在真正运行报表时,这些属性值将起作用。

换句话说,在平面文件数据集的编辑页面预览结果时,这些属性的设置并不起作用,仍然采用“平面文件数据源连接属性”的设置。但在BIRT的“布局”区域真正设计报表、绑定此数据集,并且进行预览时,这些值才会工作。

9. 平面文件数据集

9.1 新建平面文件数据集

现在有一个已经建好的平面文件“chart.csv”,放在“D:\BIRT DEV\CSV”目录下,其内容如下:

ONumber,StartDate,EndDate,Status,Pnumber,Value1,Value2,High,Close,Low,Open

INT,DATE,DATE,STRING,INT,Double,Double,Double,Double,Double,Double

,2006-6-12,2006-8-12,,363,15.29,,27.7,27.3,26.9,27.1

101,2006-4-22,2006-5-22,b,128,14.53,156.55,28,26.4,26,27.1

102,2006-5-18,,c,,32.55,95.25,25.41,25.28,25.13,25.19

新建平面文件数据源“数据源”,把“D:\BIRT DEV\CSV”设为主目录。

新建平面文件数据集,进入“选择表”的页面之后,可以自由选择指定查找的文件夹路径下的所有符合指定文件类型的合法平面文件。

我们选择“chart.csv”,之后在左边区域的表中会列出此文件内的所有合法字段,用户可以单选或多选所需字段,映射到右边的表格中,作为新建的平面文件数据集的字段。

如图 6-1-1如果用户选择不使用平面文件的第一行作为数据集的字段名,那么BIRT将会依次给作为数据源的平面文件和数据集的字段按照column_[index]的规则命名。

图 6-1-1 不使用第一行作为列名指示器

在图 6-1-2所示的界面中,我们可以看到右边的表里面有3个字段,分别是名称, 原始名称以及类型。

名称:当前的平面文件数据集的各个字段名,允许用户在不重名的条件下修改。

原始名称:在作为数据源的平面文件中,被选择映射的字段名,这是不可修改的。

类型:经过BIRT转换之后的各字段数据类型,允许用户通过下拉菜单重新选择数据类型。

图 6-1-2 为数据集选择列 1

图 6-1-3 数据集的名称可编辑修改

如图 6-1-3所示,用户可以在不重名的条件下修改数据集的列名称。

如图 6-1-4所示,用户可以在不重名的条件下修改数据集各列的数据类型。

图 6-1-4 数据集的类型可通过下拉框重新选择 1

如果所指定的文件夹路径下并不包含任何合法的平面文件,在页面的上部也会做相应的信息提示。如图 6-1-5所示。

图 6-1-5 指定文件夹不包含合法的平面文件

完成之后,一个基本的平面文件数据集就建成了。

9.2 编辑平面文件数据集

现在,已经建好了一个名为“数据集1”的平面文件数据集,用户之后可以打开进行一些编辑操作,例如添加筛选器,或者是计算列,之后可预览结果。如图 6-2-1所示。

图 6-2-1 预览数据集的结果

9.3平面文件数据源不同映射规则的预览结果比较

在这里,我们给用户展示一下之前对平面文件数据源不同映射规则设定下,预览结果的不同,以期给用户一个更加直观的理解。

假设有这样一个平面文件table-semicolon.ssv,其内容格式定义如下:

INT0_COL;DOUBLE0_COL;STRING_COL;DATE_COL;TIME_COL;TIMESTAMP_COL;

INT;DOUBLE; STRING; DATE; TIME; TIMESTAMP;

0;0.22077730306828824;S0.43336868;2000-1-1;00:04:00;250000000

1;0.03296764101523675;S0.70705503;2001-2-2;01:04:00;250000000

2;0.6608755794157164;S0.6333958;2002-3-3;02:04:00;250000000

3;0.38373945059170766;S0.8294698;2003-4-4;03:04:00;250000000

4;0.16351305975663322;S0.73003954;2004-5-5;04:04:00;265000000

9.3.1 “将第一行用作列名称指示器”选项

新建名为“数据源1”平面文件数据源,将此平面文件(table-semicolon.ssv)所在目录设为查找目录。在平面文件数据源的属性设置页面中,勾选“将第一行用作列名称指示器”,如图 6-3-1所示。

图 6-3-1勾选“将第一行用作列名称指示器”

我们再建立一个名为“数据集1”的平面文件数据集,以“数据源1”作为其数据源。并选择“able-semicolon.ssv”做列映射。我们可以看到此时将会把able-semicolon.ssv文件中的第一行作为列名来处理。

图 6-3-2 将第一行作为列名来映射

如图 6-3-2所示,此时第一行数据将会被作为列名来映射。其预览结果如图 6-3-3所示。

图 6-3-3 将第一行作为列名来映射的数据集预览结果

我们重新回到“数据源1”的属性编辑页面,勾除“将第一行用作列名称指示器”,如图 6-3-4所示。

图 6-3-4 勾除“将第一行用作列名称指示器”

打开相应的数据集“数据集1”, 我们将会看到此时的列名遵循【COLUMN_INDEX】的形式来定义。初始的数据类型均为字符串类型。如图 6-3-5 所示。

图 6-3-5 勾除“将第一行用作列名称指示器时”的列名

预览结果,我们将会看到平面文件中定义的第一行数据作为了“数据集1”的第一条记录值进行映射。如图 6-3-6 所示。

图 6-3-6 勾除将第一行用作列名称指示器时的预览结果

9.3.2 “将第二行用作数据类型指示器”选项

如图 6-3-7所示,将“数据源1”的平面文件数据源属性中勾除“将第二行用作数据类型指示器”选项。

图 6-3-7 勾除 将第二行用作数据类型指示器选项

新建一个以“数据源1”为数据源的平面文件数据集“数据集2”,此时可以在如图 6-3-8中看到平面文件的第一行作为了数据集的列名来映射,而数据类型均设为默认的“字符串”类型。

图 6-3-8 平面文件数据集的列选择

此时预览结果,可以看到平面文件中的第二行数据并没有作为数据类型指示器,而是映射成为了结果集的第一条记录值,如图 6-3-9 所示。

图 6-3-9 预览结果,第二行数据作为字段的值显示

图 6-3-10 勾选将第二行用作数据类型指示器

回到“数据源1”的属性编辑页面,勾选“将第二行用作数据类型指示器”,如图 6-3-10所示,之后新建一个平面文件数据集“数据集3”,仍然以“数据源1”作为数据源。我们可以看到平面文件的第二行数据作为数据类型映射至数据集,如图 6-3-11所示。

图 6-3-11 勾选“将第二行用作数据类型指示器”的数据类型映射

预览结果如图 6-3-12所示,不难发现,平面文件的第二行数据没有出现在数据集的记录中。

值得注意的是,比较图 6-3-9 和图 6-3-12,我们可以看到 “TIMESTAMP_COL”一栏的数据显示的不同。如果用户没有勾选“将第二行用作数据类型指示器”,BIRT给予默认数据类型“字符串”,如果用户也没有手动进行修改,则最后显示的就是平面文件中的数据;而当用户勾选这一项之后,第二行数据类型发生作用,此时“TIMESTAMP_COL”的数据类型“日期时间”从平面文件的第二行数据映射而得,在经过BIRT的重新解析和转换之后最终在结果集中以“日期时间”的格式显示。

图 6-3-12 第二行数据没有成为结果集的记录值

3.8 Excel数据源

新建Excel Data Source,取名Excel _birt,

把要当做数据源的excel放置到同一个工程下,注意excel必须是单一的表格,不是包含嵌套表格或者图表的表格,但可以包括多个sheet。

创建数据集,选择一个sheet,并选择需要作为数据集的属性列:

定义相应的格式:

预览结果:

则该数据源建立完毕。其它的配置同平面文件数据源。

3.9 profile数据源

在JAVA EE的视图打开窗口,选择Database Development视图,我们在这个视图的Database Development窗口,创建profile数据源

则该数据源建立完毕。其它的配置同平面文件数据源。

把Connection URL复制到ODA数据源新建的JDBC数据源的编辑框中,取名birt_demo2

测试连接完成。

切换到BIRT 数据资源管理器,新建数据源,选择从profile store中获取数据源,下一步,如果已经建立过则直接从项目文档中选取

否则就新建一个

示例数据库的profile数据源的建立过程同下图所示

切换到birt数据资源管理器新建数据源-从profile store中获取

由于profile数据源文件可以复制,所以我们可以把一个工程中的数据源复制到另一个工程中,然后在birt中用从profile中创建数据源的方式创建数据源,这样就避免了数据源的重复建设。后文中还会讲到如何在一个工程中使用公共数据源。

3.10 在BIRT中访问Hibernate POJO

1.概述

BIRT是基于Eclipse的开源报表平台,特别适合于Java/J2EE Web应用程序。

本文演示如何通过BIRT脚本数据源(Scripted Data Source)访问Hibernate POJOs(Plain Old Java Objects)。关于Hibernate,可参考http://www.hibernate.org 。

使用的BIRT版本为2.3.1,Hibernate版本为3.3.1.GA。

2.问题描述

一家名为“Classic Models”的公司(经典汽车模型零售商)决定采用ORM(Object-relational mapping)改进它的一个现有应用系统以增强其可维护性。

ORM选用Hibernate;原来通过JDBC数据源直连后台MySQL数据库、执行SQL提取数据的BIRT报表要修改为从Hibernate获取数据。

3.Hibernate相关准备

为使大家有一个共同的演示数据库,将BIRT示例数据库“ClassicModels”导入到MySQL,作为该公司的数据库。具体导入步骤,请参考:http://www.eclipse.org/birt/phoenix/db/#mysql。

以数据库中一个名为“customers”的表为例,先编写与之对应的POJO类:

[java] view plaincopy
  1. package net.roger.hibernatedemo.model;
  2. public class Customer
  3. {
  4. private int customerNumber;
  5. private String customerName;
  6. private String contactLastName;
  7. private String contactFirstName;
  8. private String phone;
  9. private String addressLine1;
  10. private String addressLine2;
  11. private String city;
  12. private String state;
  13. private String postalCode;
  14. private String country;
  15. private Integer salesRepEmployeeNumber;
  16. private double creditLimit;
  17. /**
  18. * @return the customerNumber
  19. */
  20. public int getCustomerNumber( )
  21. {
  22. return customerNumber;
  23. }
  24. /**
  25. * @param customerNumber the customerNumber to set
  26. */
  27. public void setCustomerNumber( int customerNumber )
  28. {
  29. this.customerNumber = customerNumber;
  30. }
  31. //other getters and setters
  32. .
  33. .
  34. .

再提供其Hibernate 映射文件Customer.hbm.xml:

[html] view plaincopy
  1. <?xml version=“1.0”?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. ”-//Hibernate/Hibernate Mapping DTD 3.0//EN”
  4. “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
  5. <hibernate-mapping>
  6. <class name=“net.roger.hibernatedemo.model.Customer” table=“customers”>
  7. <id name=“customerNumber” column=“customerNumber”>
  8. <generator class=“native”/>
  9. </id>
  10. <property name=“customerName”/>
  11. <property name=“contactLastName”/>
  12. <property name=“contactFirstName”/>
  13. <property name=“phone”/>
  14. <property name=“addressLine1”/>
  15. <property name=“addressLine2”/>
  16. <property name=“city”/>
  17. <property name=“state”/>
  18. <property name=“postalCode”/>
  19. <property name=“country”/>
  20. <property name=“salesRepEmployeeNumber”/>
  21. <property name=“creditLimit”/>
  22. </class>
  23. </hibernate-mapping>

然后,提供Hibernate配置文件hibernate.cfg.xml以定义如何连接后台MySQL数据库及列出所有映射文件等,如下所示:

[html] view plaincopy
  1. <?xml version=‘1.0’ encoding=‘utf-8’?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. ”-//Hibernate/Hibernate Configuration DTD 3.0//EN”
  4. “http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd”>
  5. <hibernate-configuration>
  6. <session-factory>
  7. <!– Database connection settings –>
  8. <property name=“connection.driver_class”>com.mysql.jdbc.Driver</property>
  9. <property name=“connection.url”>jdbc:mysql://spmdb/ClassicModels</property>
  10. <property name=“connection.username”>root</property>
  11. <property name=“connection.password”>root</property>
  12. <!– JDBC connection pool (use the built-in) –>
  13. <property name=“connection.pool_size”>1</property>
  14. <!– SQL dialect –>
  15. <property name=“dialect”>org.hibernate.dialect.MySQLDialect</property>
  16. <!– Enable Hibernate’s automatic session context management –>
  17. <property name=“current_session_context_class”>thread</property>
  18. <!– Disable the second-level cache  –>
  19. <property name=“cache.provider_class”>org.hibernate.cache.NoCacheProvider</property>
  20. <!– Echo all executed SQL to stdout –>
  21. <property name=“show_sql”>true</property>
  22. <mapping resource=“net/roger/hibernatedemo/model/Customer.hbm.xml”/>
  23. </session-factory>
  24. </hibernate-configuration>

至此,Hibernate相关映射及配置工作完成。

下一步,编写一个CustomerList类,它的如下所示的listCustomers( )方法负责根据传入的HQL 语句通过Hibernate返回一个存有Customer实例的列表:

[java] view plaincopy
  1. public List listCustomer( String hql )
  2. {
  3. Session hSession = HibernateUtil.getSessionFactory( ).getCurrentSession( );
  4. hSession.beginTransaction( );
  5. List result = hSession.createQuery( hql ).list( );
  6. hSession.getTransaction( ).commit( );
  7. return result;
  8. }

上述listCustomers( )中的HibernateUtil类改自Hibernate官方教程中提供的同名类http://www.hibernate.org/hib_docs/v3/reference/en-US/html/tutorial-firstapp.html#tutorial-firstapp-helpers,用于方便获取Hinernate会话(Session)。

listCustomers( )方法的参数“hql”代表一个HQL查询语句,稍后你将看到,其具体值将由BIRT传入。

将Hibernate Jar包、MySQL JDBC驱动mysql-connector-java-3.1.10-bin.jar及与Hibernate.3.3.1.GA匹配的slf4j-jdk14-1.5.2.jar(可从http://www.slf4j.org下载)添加到工程的classpath。该工程各文件布局如下图所示:

可以编写一个简单测试方法,用于检测CustomerList的listCustomer( )方法是否正常工作,如下所示:

[java] view plaincopy
  1. CustomerList cl = new CustomerList( );
  2. List<Customer> customers = cl.listCustomer( ”from Customer” );
  3. for ( Customer c : customers )
  4. {
  5. System.out.print(  ”Number: ” + c.getCustomerNumber( ) + “; ”);
  6. System.out.println(  ”Name: ” + c.getCustomerName( ) );
  7. }
  8. HibernateUtil.getSessionFactory( ).close( );

其运行结果为:

[plain] view plaincopy
  1. Number: 103; Name: Atelier graphique
  2. Number: 112; Name: Signal Gift Stores
  3. Number: 114; Name: Australian Collectors, Co.
  4. Number: 119; Name: La Rochelle Gifts
  5. Number: 121; Name: Baane Mini Imports
  6. Number: 124; Name: Mini Gifts Distributors Ltd.
  7. Number: 125; Name: Havel & Zbyszek Co
  8. Number: 128; Name: Blauer See Auto, Co.
  9. Number: 129; Name: Mini Wheels Co.
  10. .
  11. .
  12. .

4.制作BIRT报表

下面演示如何在BIRT中通过脚本数据源(Scripted Data Source)访问CumtomerList、获取Customer实例列表。

首先,将上述工程的编译结果及Customer.hbm.xml和hibernate.cfg.xml按在工程中的目录结构打包成hibernateDemo.jar。

再将hibernateDemo.jar、Hiberante Jar包,MySQL驱动及slf4j-jdk14-1.5.2.jar复制到BIRT的\\plugins\org.eclipse.birt.report.viewer_XXX\birt\scriptlib目录下(“XXX”为版本号):

至此,就可以在BIRT中编写访问CustomerList和Customer类的脚本了。

假设要制作一份列出所有Customer的报表。首先创建一个名为“Hibernate”的脚本数据源:

再创建一个基于“Hibernate”数据源的脚本数据集“customersFromHibernate”:

点击“Next >”开始添加该数据集的输出列,如下图所示:

点击“Finish”完成该数据集的创建。

在“Data Explorer”下,选中“customersFromHibernate”数据集,在右侧主页面下方选择“Script”,再选择“open”函数,输入如下脚本:

然后,选择“fetch”函数,输入如下脚本:

之后,选择“close”函数,输入如下脚本:

至此,“customersFromHibernate”数据集编辑完毕,你可以预览它的数据结果,如下图所示:

如果你想使该数据集只返回特定条件的Customer,你可以为该数据集添加相应“Filter”,如下图所示:

你也可以通过修改其“open”函数的脚本,达到同样的效果,如:

总结

完整的演示了如何通过BIRT脚本数据源访问Hibernate POJO。必须注意到,在示例报表中,为简单起见,每当“customersFromHibernate”数据集的open()被调用时都去新建一个Hibernate SessionFactory,而当它的close()被调用时则去关闭该SessionFactory。在实际应用项目中,Hibernate的启停及会话管理完全可以在应用程序处理,而应用程序只需要暴露给BIRT一个POJO提供类,以使得在BIRT中可以编写脚本从之获取POJO即可。

由BIRT脚本数据源可以制作任何数据来自Java POJO的报表。

3.11 birt script数据源pojo配置

1、建立一个java project,作为pojo待用,本例中有两个java文件:

2、建立Report Project,在其中新建report,然后在Data Explorer中新建Data Sources,数据源类型选择scripted data source,如下图所示:

点击完成。

3、 新建Data Sets,选择Data Source Name如图所示:

1) 点击Next设置列名、数据类型、显示名称,如图所示:

4、 编写数据访问脚本

在Data Sets中选择我们建立的数据集,然后在报表编辑视图选择Script,分别编辑open和fetch,如图所示:

1) Open脚本

2) Fetch脚本

设计视图,在视图中选择layout,简单的将我们建立的data set拖到报表视图中即可,完成这步以后可以在preview中查看预览效果了。

二、java生成数据集数据

1)继承 ScriptedDataSetEventAdapter适配器类,生成新的Handler,覆盖其中的fetch、open、close方法:

使用java生成数据集数据前,

1.新建个脚本数据源;

2. 新建School类;

3. 再新建ContactListFactory类;

1)按上Pojo数据源配置:

如果是有url传参

这样就可以直接得到request参数了

2) 在Property Editor视图的EventHandlerClass中指定上面生成的类DataSetHandler:

完成这步以后可以在preview中查看预览效果了。

尽管如此,为使用户更易使用,BIRT正在开发POJO数据源,使得用户不用编写任何脚本,就可以轻松做数据来自于POJO的报表。

3.12 数据源的属性绑定

在新建数据源或者编辑数据源的时候,有一页选项-属性绑定

这意味着你可以在报表运行的过程中指定JDBC URL,用户名,地址和JNDI URL,profile或者其他的配置信息,只要你在报表中新建报表参数,然后用右侧的表达式生成器去绑定

另外一种情况是,如果你的报表是用来显示日志信息的,也就是把其他工程或者项目的日志信息以一种丰富的形象化的方式显示出来,这个时候你的数据源是一个动态的地址的动态生成的文本文件。

比如一个工程的日志文件的地址为:

C:/Logs/2012-08-01

C:/Logs/2012-08-02

C:/Logs/2012-08-03

C:/Logs/2012-08-04

那么我们在构建文本文件或者平面文件数据源的时候,就可以通过属性绑定来动态指定Home folders

内容如下:

function DF(n) {

return (n > 9 ? n : ‘0’ + n);

}

var d = new Date();

shortDate = (d.getFullYear() + ’-‘ + DF(d.getMonth() + 1) + ’-‘

+ DF(d.getDate()));

HomeFolder = “C:/Logs/”+shortDate;

第三章 BIRT数据源的配置相关推荐

  1. 三、BIRT数据源的配置

    选择数据资源管理器(Data Explorer).如果使用缺省报表设计透视图,则数据资源管理器位于布局编辑器的左边,在画板(Palette)的旁边,如图所示.如果它尚未打开,则选择窗口->显示视 ...

  2. [Django学习]第三章 视图和url配置

    2019独角兽企业重金招聘Python工程师标准>>> 在上一章使用django-admin.py startproject tests制作的项目中的tests文件夹里,创建一个vi ...

  3. 第三章 最小化SpringXml 配置

    自动装配(autowiring):有助于减少甚至消除<property>元素和<constructor-arg>元素,让spring自动识别如何装配Bean的依赖关系. 自动检 ...

  4. 第三章 测试驱动演示配置

    缺省安装完成后,开箱即用,你会发现FreeSWTCH已经能够完成许多令人惊讶的事情了!我们花费很多精力在编写演示模板,缺省情况下,安装完成后,FreeSWITCH就已经配置为一个强大的演示原型.当我们 ...

  5. 【STM32CubeMx你不知道的那些事】第三章:STM32CubeMx串口配置(中断接收)

    在嵌入式环境中,串口通信是必不可少的通信方式,这一章我们主要是讲解一下HAL库怎么应用串口外设做收发功能. 一.准备工作 1.使用我们第一章配置好工程文件.如图 2.明确原理图上面所需要的串口,这里我 ...

  6. jboss eap mysql_JBOSS EAP 6 系列三 Oracle、Mysql数据源的配置(驱动)—认识模块的使用...

    本文介绍JBOSS EAP 6.2中Oracle数据源的配置方式.结合之前JBOSS EAP 6.2新功能,本文初识JBOSS模块申明式容器这一特性. 模块申明式容器:JBOSS EAP不再有lib的 ...

  7. 深入浅出pytorch笔记——第三章,第四章

    文章目录 第三章 深度学习组成部分 配置环境 数据读取与加载 模型设计 损失函数 优化器 训练与评估 第四章(FMN分类实战) 4.1导入包 4.2配置训练环境和超参数 4.3数据读入与加载(Data ...

  8. 第十二章 BIRT报表的部署与配置

    12.1 报表的工作模式以及相应的部署和配置 虽然为了示例的需要,在前文的第二章讲过BIRT的配置,以及在文本类报表,网格报表,图表中用过birt jsp tag,也做过一些说明.但报表的工作模式,不 ...

  9. DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描...

    DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描 liuyuhang原创,未经允许禁止转载    系列目录连接 DB数据源之Spr ...

最新文章

  1. 博士生起诉学校,因核心期刊发文数不够申请学位被拒,一审判决胜诉!
  2. 一个事务中 可以查询自己未提交的数据吗_数据库事务的方方面面
  3. c 语言 多进程,VC++中进程与多进程管理的方法详解
  4. gevent queue应用1
  5. 如何获得CSDN访问量和积分
  6. 从月薪8K的分析师到月薪2W,只因我有了这份工具清单!
  7. asp.net 初步入门使用正则抓取网页信息
  8. JSON解析中获取不存在的key
  9. SLAM GMapping(5)运动模型
  10. 5种方式,判断一个数组中是否包含某个元素
  11. Google DeepMind 团队发布新算法,下一个被 AI 虐哭的是谁?
  12. 034 Maven中的dependencyManagement和dependencies区别
  13. 单片机是什么?单片机编程怎么入门?
  14. labview温度采集系统,温度计正负范围内显示,附加温度预警操作部分(初学者~)
  15. Vue+Webpack打造todo应用(慕课学习笔记)
  16. Java期末复习基础知识整理(有点长)
  17. uniapp实现自定义相机
  18. 4月10日服务器例行维护公告,4月10日服务器例行维护公告
  19. 通过装疯卖傻 委曲求全
  20. python快速入门系列_十五分钟快速入门系列:Python基础

热门文章

  1. 虚拟内存与物理内存的联系与区别
  2. UCOS-Ⅲ:信号量
  3. 基于UDP的简易多人聊天室
  4. java批量上传图片预览_SpringMVC批量上传图片,实现上传前图片预览
  5. 读《淘宝数据魔方技术架构解析》有感
  6. 使用jsmpegjs前,先把利用 ffmpeg 将 MP4 格式的文件转换为 ts 格式
  7. springboot笔记08——整合swagger2
  8. 工作轻松了,我就变懒了......
  9. 增值税专用发票抬头开错的处理方法
  10. 计算机管理员账户停用,win7管理员账户被停用了怎么办