一、创建报表和配置数据源
新建一个报表,改好自己的名字,然后next进行下一步。
选择一个空白报表(Blank Report),单击finish完成。
新建数据源,这里使用的是协同数据库,选择Date Explore标签 右键单击Data Sources 新建一个数据源。选择JDBC Data Source 命名为 clmpdemo 然后单击next
利用JDBC链接数据源,然后点击测试链接,提示成功后,点击finish完成。
注:在应用里面,可以设置为JNDI链接。具体是在报表文件中,增加一列JNDI设置,如下所示:
<data-sources> <oda-data-source extensionID="org.eclipse.birt.report.data.oda.jdbc" name="clmpdemo" id="7"> <text-property name="displayName"></text-property> <list-property name="privateDriverProperties"> <ex-property> <name>contentBidiFormatStr</name> <value>ILYNN</value> </ex-property> <ex-property> <name>metadataBidiFormatStr</name> <value>ILYNN</value> </ex-property> </list-property> <property name="odaDriverClass">oracle.jdbc.driver.OracleDriver</property> <property name="odaURL">jdbc:oracle:thin:@127.0.0.1:1521:eccl</property> <property name="odaUser">clmp</property> <encrypted-property name="odaPassword" encryptionID="base64">ZWNjbDIwMDk=</encrypted-property> <!--新增JNDI设置--> <property name="odaJndiName">java:/comp/env/clmp</property> </oda-data-source> </data-sources>
建立一个新的数据集,New data sets ,命名为clmprfq,点击next。
构建数据集的sql语句,如下所示:
Sql语句内容如下:
select CLMP.QTLINE.QTL_NAME,
CLMP.QTLINE.QTL_MODEL,
CLMP.QTLINE.QTL_BIDPRICE,
CLMP.QTLINE.QTL_BIDQUANTITY,
CLMP.QTLINE.QTL_REMARK,
CLMP.QUOTATION.QT_VD_ID,
CLMP.QUOTATION.QT_VD_NAME,
CLMP.QUOTATION.QT_US_ID,
CLMP.QUOTATION.QT_US_NAME
from CLMP.QUOTATION,CLMP.QTLINE
where CLMP.QTLINE.QTL_QT_ID=CLMP.QUOTATION.QT_ID
and CLMP.QUOTATION.QT_RFQ_ID=?
创建一个报表参数,命名为rfqID。如下
创建一个总价的计算列:
然后再数据集clmprfq中引用这个参数,如下图所示:
数据集到此配置完毕,预览结果如下:
配置Data Cubes
新建Data Cubes,右键new data cubes
为cubes命名,并设置数据集
创建分组和汇总字段
创建之后形成的多维数据集如下图所示:
设计报表主体
先切换到Palette标签,然后拖拽一个Grid(网格)到空白报表中:
网格选取的是1行2列的,如下所示:
在第一行中输入该报表的标题,在第二行中拖拽一个交叉表:
切换到Data Explorer 选项卡上,将维度,及度量源依次拖拽到相应的交叉表中:
然后增加总价一列,左击(或者右击)在出现的选项中有Totals一项,如下图:
并勾选行和列需要总计的字段,如下图:
完成后的报表设计如下:
到此,已经基本上完成了,我们可以预览看下结果
实际上我们还能增加行和列的统计功能,以及增加统计的维度。
新建报表cross.rptdesign,使用示例数据库,SQL选择查询数据源,新建数据集data set:
select * from CLASSICMODELS.PAYMENTS
增加计算列year,month
year的表达式如下:
var v = row["PAYMENTDATE"];
v = v.toString();
v = v.substring(0, 4);
v;
month的表达式如下
var s="";
var v= row["PAYMENTDATE"];
v=v.toString();v=v.substring(5,7);
function aaa(v){
var s="";
if(v=="01" || v=="02" || v=="03")s=" 一季度";
if(v=="04" || v=="05" || v=="06")s=" 二季度";
if(v=="07" || v=="08" || v=="09")s="三季度";
if(v=="10" || v=="11" || v=="12")s="四季度";
return s;
}
s=aaa(v);
s;
新建多维数据集:
我们把customernumber和year作为一级交叉列,把month作为year的二级交叉列,新建交叉表,分别把组和组1放置在交叉表的列头上:
选中交叉表,在下面的交叉表属性选项卡下,有行区域和列区域,可以增加统计和小计:
做适当的布局和美化,如下图所示:
预览结果如下:
当然,交叉报表也可以增加映射,过滤器,突出显示属性,例如我们增加一个参数
静态文本框参数persionId
过滤组1/year,筛选条件为data[“year”]不等于params["persionId"].value
运行时,我们过滤掉2003年的数据,则预览效果如下:
排序和突出显示和普通网格报表类似,不作更多案例。
关于表头斜线的绘制,方法有两个:
第一个是插入一个已经绘制好的图片:
效果如下:
另一种是用BIRT的方法绘制:
我们新建一个报表diagonal.rptdesign,使用示例数据库,空白模板,sql选择查询数据源,我们新建数据集data set:
SELECT CLASSICMODELS.PRODUCTS.PRODUCTLINE, CLASSICMODELS.PRODUCTS.PRODUCTNAME,
(CLASSICMODELS.ORDERDETAILS.PRICEEACH * CLASSICMODELS.ORDERDETAILS.QUANTITYORDERED) AS TOTAL
FROM CLASSICMODELS.PRODUCTS, CLASSICMODELS.ORDERDETAILS
WHERE CLASSICMODELS.PRODUCTS.PRODUCTCODE = CLASSICMODELS.ORDERDETAILS.PRODUCTCODE
然后新建多维数据集:
行列组分别为productline,productname数据集属性列,摘要为TOTAL
布局如下:
我们在表头插入一个1行1列的网格,在网格单元格的属性中,我们可以看到对角线属性:
修改,增加两条黑色细实线。
然后在网格里插入文本:
<div style="margin-left:120px; margin-top:10px;">ProductName</div><br> <div style="margin-left:50px;">Total</div> <br> <div style="margin-left:30px;">ProductLine</div>
值得注意的是,网格的行高度一定要和表头的行高度一样,而且必须设置为固定数值的大小,不是##%:
预览,效果如下: