第五章 BIRT文本类报表

第九章 BIRT嵌套报表以及参数的传递 9.1 表内的嵌套 我们新建报表MasterDetailOneReport_A.rptdesign,空白模板,示例数据库,sql选择查询数据集。 新建数据集Orders: select * from orders 新建数据集SingleOrderDetail select * from orderdetails where ordernumber = ? 数据集参数默认值为101 阅读详情

5.1 基本的文本报表

我们构建一个报表ProductLinesAfter.rptdesign,使用示例数据库,空白模板,sql选择查询作为数据源,新建数据集Data Set:

select *

from CLASSICMODELS.PRODUCTLINES

查询数据源资源管理器,注意到表PRODUCTLINES中有一个字段HTMLDESCRIPTION是CLOB字段的:

存储内容为html格式的字符文档,其中prodcutline为Vintage Cars的htmldescription如下:

  1. <html>  
  2. <h4><font face="Verdana">Vintage Cars</font></h4><p>  
  3. <font face="Times New Roman">Our Vintage Car models realistically portray automobiles produced from the early</font>   
  4. <b><font face="Arial" size="2">1900s</font></b> <font face="Times New Roman">through the</font> <b>  
  5. <font face="Arial" size="2">1940s</font></b>.<font face="Times New Roman"> Materials used include   
  6. <i><b>Bakelite<sup>®</sup>, diecast, plastic and wood</b></i>. Most of the replicas are in the </font>  
  7. <b><font face="Arial" size="2">1:18</font></b> and <b>  
  8. <font face="Arial" size="2">1:24</font></b> <font face="Times New Roman">scale sizes, which provide the optimum in detail and accuracy. Prices range from</font>   
  9. <i><b><font face="Arial" color="#009933" size="2">$30.00</font></b></i> up to <i><b>  
  10. <font color="#009933" face="Arial" size="2">$180.00</font></b></i>   
  11. <font face="Times New Roman">for some <i><b>special limited edition replicas</b></i>. All models include a  
  12. <i><b>certificate of authenticity</b></i> from their manufacturers and <i><b>come fully assembled</b></i> and ready for display in the home or office.</font></p>  
  13.   
  14. <font face="Times New Roman">  
  15.   
  16. <u><b>Additional Information</b></u>  
  17. </font>  
  18. <ul>  
  19.     <li><font face="Times New Roman">No Toxic Materials</font></li>  
  20.     <li><font face="Times New Roman">Monogram Service Available</font></li>  
  21.     <li><font face="Times New Roman">Suitable for Children Above 10 Years of Age</font></li>  
  22.     <li><font color="#FF0000" face="Times New Roman"><i><b>90 Day Money Back Guarantee</b></i></font></li>  
  23. </ul>  
  24. </html>  


 

布局报表:

插入一个1行3列的网格,其中第一列插入一个图片,为url嵌入的名为Classic-Models-Minimal-S.jpg,第二列插入一个标签,名为Product Lines,第三列插入一个名为Classic Models Inc的标签和一个无格式的动态文本701 Gateway Blvd,

South San Francisco, CA 94080

如下所示:

然后网格下方插入一个1行4列的表,合并页眉,插入标签Product Lines

详细数据行,第一列拖入dataSetRow["PRODUCTLINE"],第二列插入文本,选择HTML格式的动态文本,输入<H5><VALUE-OF>row["TEXTDESCRIPTION"]</VALUE-OF></H5>

第三列插入动态文本,输入row["HTMLDESCRIPTION"]

第四列插入图像,

作适当的布局和美化,效果如下:

在web查看器中查看报表,运行效果如下:

这说明了我们可以在文本和动态文本中通过插入html格式的字符串来实现一些特效。

例如我们可以在中间插入一列文本,文本是html格式的,内容如下:

  1. <html>  
  2. <script language='JavaScript' type='text/JavaScript'>  
  3. function printproduct(str){alert(str);}  
  4. </script>  
  5. <body>  
  6. <center>  
  7. <form>  
  8. <input type='button' value='单击可以获取行信息'  onclick="alert('<VALUE-OF>row["PRODUCTLINE"]</VALUE-OF>:<VALUE-OF>row["TEXTDESCRIPTION"]</VALUE-OF>')">  
  9. </form>  
  10. <a href='' title='<VALUE-OF>row["TEXTDESCRIPTION"]</VALUE-OF>' onclick="printproduct('<VALUE-OF>row["TEXTDESCRIPTION"]</VALUE-OF>')" ><b><i><u><VALUE-OF>row["PRODUCTLINE"]</VALUE-OF></u></i></b></a>  
  11. </center>  
  12. </body>  
  13. </html>  


 

布局和预览分别如下:

把鼠标放在超链接上会有帮助文本出现,当然单击按钮和超链接一样可以获得产品线文本描述。

上面的一段html说明了,在文本中可以输入html,可以自定义javascript脚本,在需要行信息的时候,只需要加上[<VALUE-OF>列绑定</VALUE-OF>]即可,html在运行调用之前会把[<VALUE-OF>列绑定</VALUE-OF>]替换成一个不带引号的字符串常量。

这意味着我们可以在birt中编写网页,只要在需要数据集的地方插入数据集即可,这样我们可以编写丰富的文本类报表,比如会计凭证,信笺封面,信笺正文,甚至添加ajax特性。

5.2 交互式文本报表

下文详细说明标签,文本,动态文本,数据的差别。

标签只能插入文字,无法包含任何格式信息;

动态文本能把clob中的字符显示出来,如果clob字段包含HTML标签,则显示浏览器解释后的HMTL效果;

数据能把clob中的字符显示出来,如果clob字段中包含html标签,则连同标签一起显示出来,不区分是否为html文本;

而文本,对于clob中包含html标签,则既能显示成浏览器解释后的效果,也能显示成带html标签的纯文本。从显示的效果来看,插入动态文本类似于插入文本-HTML格式动态文本,在编辑区输入:<VALUE-OF  format="HTML">row["HTMLDESCRIPTION"]</VALUE-OF>

而插入数据则相当于插入文本-HTML格式动态文本,编辑成如下内容:<VALUE-OF >row["HTMLDESCRIPTION"]</VALUE-OF>

只是用文本的方式删除了html中的换行。

然而,动态文本和数据仍然是不可缺少的元素,它们有各自的优势。

动态文本的优势在于,我们可以在编辑动态文本时加入javascript逻辑,如下所示,我们插入动态文本:

if (row.__rownum%2==0){

displayString = row["HTMLDESCRIPTION"]

}

else{

displayString = "这是一个行数为奇数的行,老夫不想显示"

}

则显示效果如下:

数据的优势在于,我们在插入数据的时候必须进行列绑定,这意味着我们可以在其他地方(文本,动态文本,数据)需要处理数据的时候用到这个列绑定。例如我们可以新插入一列,插入[数据]用的不是数据集,而是可用列绑定,把这个处理后的可用列帮东命名为fifthbinding:

我们再插入第六列,插入动态文本,用的可用列绑定:row["fifthbinding"].substr(0,2)+row["HTMLDESCRIPTION"]

查看效果:

下面详细描述文本的格式。

类型有三个,HTML格式,无格式,自动

HTML格式代表编辑区域的文本是包含HTML标签的,需要解释后显示;无格式代表文本是纯文本,就算有HTML标签也连同标签直接显示,自动表示会检测识别。通常选HTML即可。

内容编辑区的工具栏有五类标签可用,格式化,布局,内容,列表,动态文本。

熟悉HTML标签的人应该很好理解格式化,布局,内容,列表这四类标签的含义。实际上这四类标签仅作帮助,编辑区可以使用任何HTML标签,例如下面的文本,

<CENTER><B><span style="font-size: larger">

Shipped Orders Report

</B></span><BR>

<FONT size="small">For the month of March</FONT></CENTER>

在BIRT中显示如下:

重点讲解<value-of>标签,只要是想调用javascript脚本或者列绑定的地方,都可以插入<value-of>标签,例如我们可以插入下面这句:

Report generated on <VALUE-OF>new Date()</VALUE-OF>

输出:Report generated on 2013-1-2 下午4:53

还能插入下面这句:

Dear <VALUE-OF>row["Sex"] == "M" ? "Mr." : "Ms."</VALUE-OF>

<VALUE-OF>row["Name"]</VALUE-OF>,

输出:

Dear Mr. Scott Johnson,

Dear Ms. Ella Parker,

也可以这样写:

Dear <VALUE-OF>if(row["Sex"] == "M"){

Title = "Mr."

}

else{

Title = "Ms."

}</VALUE-OF>

<VALUE-OF>row["Name"]</VALUE-OF>

我们可以在文本中多次使用<VALUE-OF>标签:

Dear <VALUE-OF>row["contact_firstname"]</VALUE-OF>,

<p>

Thank you for your recent order. Order <VALUE-OF>

row["orderID"]</VALUE-OF> will be shipped by <VALUE-OF>

row["shipByDate"]</VALUE-OF>.

输出:

Dear Bob,

Thank you for your recent order. Order 1115 will be shipped

by Apr 17, 2009 12:00AM.

<VALUE-OF>标签还可以指定格式化的样式

<VALUE-OF format="MM-dd-yy">new Date()</VALUE-OF><br>

<VALUE-OF format="$#,###.00">row["orderTotal"]</VALUE-OF><br>

<VALUE-OF format="(@@@) @@@-@@@@">row["phone"]</VALUE-OF>

输出:

04-17-05

$321,000.00

(415) 123-5555

具体的样式格式,参看下一章数据的格式化。

<VALUE-OF format="HTML">表示该可用列绑定里面的html标签需要先解释再显示,用法如下。

<VALUE-OF format="HTML">row["HTMLDESCRIPTION"]</VALUE-OF>

我们现在做一个稍微复杂的例子。

构建报表customer.rptdesign,空白模板,示例数据库,sql选择查询数据源,数据集customer:

select CLASSICMODELS.CUSTOMERS.CUSTOMERNUMBER,CLASSICMODELS.CUSTOMERS.CUSTOMERNAME,CLASSICMODELS.CUSTOMERS.CONTACTLASTNAME,CLASSICMODELS.CUSTOMERS.CONTACTFIRSTNAME,CLASSICMODELS.CUSTOMERS.PHONE,CLASSICMODELS.CUSTOMERS.ADDRESSLINE1,CLASSICMODELS.CUSTOMERS.CREDITLIMIT,CLASSICMODELS.CUSTOMERS.COUNTRY,CLASSICMODELS.CUSTOMERS.STATE,CLASSICMODELS.CUSTOMERS.CITY

,CLASSICMODELS.CUSTOMERS.POSTALCODE from CLASSICMODELS.CUSTOMERS

where CLASSICMODELS.CUSTOMERS.CUSTOMERNUMBER=?

新建报表静态文本框参数customernumber,默认值114

绑定数据集参数和报表参数customernumber。

插入1行5列的表,布局如下:

构建报表oders.rptdesign,空白模板,示例数据库,sql选择查询数据源,数据集orders:

select CLASSICMODELS.ORDERS.ORDERNUMBER,CLASSICMODELS.ORDERS.ORDERDATE,CLASSICMODELS.ORDERS.REQUIREDDATE,CLASSICMODELS.ORDERS.SHIPPEDDATE,CLASSICMODELS.ORDERS.STATUS,CLASSICMODELS.ORDERS.COMMENTS,CLASSICMODELS.ORDERS.CUSTOMERNUMBER

from CLASSICMODELS.ORDERS

插入1行6列的表,布局如下:

构建报表oderdetails.rptdesign,空白模板,示例数据库,sql选择查询数据源,数据集orderdetails:

select CLASSICMODELS.ORDERDETAILS.ORDERNUMBER,CLASSICMODELS.ORDERDETAILS.PRODUCTCODE,CLASSICMODELS.ORDERDETAILS.QUANTITYORDERED,CLASSICMODELS.ORDERDETAILS.PRICEEACH,CLASSICMODELS.ORDERDETAILS.ORDERLINENUMBER

from CLASSICMODELS.ORDERDETAILS

where CLASSICMODELS.ORDERDETAILS.ORDERNUMBER=?

新建报表静态文本框参数ordernumber,默认值10100

绑定数据集参数和报表参数ordernumber。

插入1行5列的表,布局如下:

构建报表product.rptdesign,空白模板,示例数据库,sql选择查询数据源,数据集product:

select CLASSICMODELS.PRODUCTS.PRODUCTCODE,CLASSICMODELS.PRODUCTS.PRODUCTNAME,CLASSICMODELS.PRODUCTS.PRODUCTLINE,CLASSICMODELS.PRODUCTS.PRODUCTSCALE,CLASSICMODELS.PRODUCTS.PRODUCTDESCRIPTION,CLASSICMODELS.PRODUCTS.BUYPRICE

from CLASSICMODELS.PRODUCTS

where CLASSICMODELS.PRODUCTS.PRODUCTCODE=?

新建报表静态文本框参数productcode,默认值S10_1678

绑定数据集参数和报表参数productcode。

插入1行6列的表,布局如下:

构建报表productline.rptdesign,空白模板,示例数据库,sql选择查询数据源,数据集product:

select * 

from CLASSICMODELS.PRODUCTLINES

where CLASSICMODELS.PRODUCTLINES.PRODUCTLINE=?

新建报表参数productline,默认值Vintage Cars

绑定数据集参数到报表参数productline。

插入1行5列的表,如前文所述做布局如下:

我们现在想做一个网页,通过订单,可以了解客户详细信息,也可以了解订单明细,产品明细,产品线明细,而不用转跳到别的网页,也不用完全的刷新页面。单击一个客户号即可刷新一个客户详细信息。单击一个订单号即可刷新一个订单明细,单击一个产品号即可刷新一个产品详细信息;单击一个产品线号即可刷新一个产品线的明细。我们在1个jsp上嵌入5个frame来实现。

我们新建jsp文件allorders.jsp,内容如下:

  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2. pageEncoding="ISO-8859-1"%>  
  3. <%@ taglib uri="/birt.tld" prefix="birt" %>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  8.     <meta http-equiv="Content-Language" content="en-us">  
  9.     <title>BIRT JSP Tag Lib Mashup</title>  
  10.     <style>  
  11.         .pageHeader {  
  12.             position: absolute;  
  13.             width: 1020px;  
  14.             text-align: center;  
  15.             color: #224499;  
  16.             font-size: xx-large;  
  17.             font-weight: bold;  
  18.         }  
  19.           
  20.         .mashupContainer {  
  21.             position: absolute;  
  22.             font-family: Verdana, Tahoma, Arial;  
  23.             font-size: 11px;  
  24.             border: 1px solid #87AFDA;  
  25.             margin: 3px;  
  26.         }  
  27.           
  28.         .mashupTitle {  
  29.             position: absolute;  
  30.             background: #D4E6FC;  
  31.             font-size: 14px;  
  32.             font-weight: bold;  
  33.             color: #224499;  
  34.             padding: 3px;  
  35.             border-bottom: 1px solid #87AFDA;  
  36.         }  
  37.           
  38.         .mashupContent {  
  39.             position: absolute;  
  40.             padding: 3px;  
  41.         }  
  42.     </style>  
  43. </head>  
  44. <body>  
  45.     <div class="mashupContainer" id="orders" style="top: 50px; left: 20px; width: 655px; height: 400px;">  
  46.         <div class="mashupTitle" style="width: 99.1%; height: 20px;">orders</div>  
  47.         <div class="mashupContent" id="ordersDiv" style="top: 24px; left: 0px; width: 99%; height: 380px;">  
  48.             <birt:viewer id="birtViewer1"  
  49.                 reportDesign="orders.rptdesign"  
  50.                 baseURL="<%= request.getContextPath( )%>"  
  51.                 pattern="run"  
  52.                 height="367"  
  53.                 width="645"  
  54.                 format="html"  
  55.                 frameborder="false"  
  56.                 isHostPage="false"  
  57.                 isReportlet="true"  
  58.                 showParameterPage="false"  
  59.             >  
  60.             </birt:viewer>  
  61.         </div>  
  62.     </div>  
  63.   
  64.     <div class="mashupContainer" id="orderdetails" style="top: 50px; left: 700px; width: 650px; height: 400px;">  
  65.         <div class="mashupTitle" style="width: 99.1%; height: 20px;">orderdetails</div>  
  66.         <div class="mashupContent" id="orderdetailsDiv" style="top: 24px; left: 0px; width: 99%; height: 380px;">  
  67.             <birt:viewer id="birtViewer2"  
  68.                 reportDesign="orderdetails.rptdesign"  
  69.                 baseURL="<%= request.getContextPath( )%>"  
  70.                 pattern="run"  
  71.                 height="367"  
  72.                 width="650"  
  73.                 format="html"  
  74.                 frameborder="false"  
  75.                 isHostPage="false"  
  76.                 isReportlet="true"  
  77.                 showParameterPage="false"  
  78.             >  
  79.             </birt:viewer>  
  80.         </div>  
  81.     </div>  
  82.   
  83.     <div class="mashupContainer" id="customer" style="top: 460px; left: 20px; height: 100px; width: 655px;">  
  84.         <div class="mashupTitle" style="width: 99.4%; height: 90px;">customer</div>  
  85.         <div class="mashupContent" id="customerDiv" style="top: 25px; width: 99%; height: 80px; align: middle; text-align: center;">  
  86.             <!-- This example uses the same report design, but this can a different rptdesign file than used above -->  
  87.             <birt:viewer id="birtViewer3"  
  88.                 reportDesign="customer.rptdesign"  
  89.                 baseURL="<%= request.getContextPath( )%>"  
  90.                 pattern="run"  
  91.                 height="70"  
  92.                 width="645"  
  93.                 format="html"  
  94.                 frameborder="false"  
  95.                 isHostPage="false"  
  96.                 isReportlet="true"  
  97.                 showParameterPage="false"  
  98.             >  
  99.             </birt:viewer>  
  100.         </div>  
  101.     </div>  
  102.       
  103.     <div class="mashupContainer" id="product" style="top: 460px; left: 700px; width: 655px; height: 100px;">  
  104.         <div class="mashupTitle" style="width: 99.1%; height: 90px;">product</div>  
  105.         <div class="mashupContent" id="productDiv" style="top: 24px; left: 0px; width: 99%; height: 80px;">  
  106.             <birt:viewer id="birtViewer4"  
  107.                 reportDesign="product.rptdesign"  
  108.                 baseURL="<%= request.getContextPath( )%>"  
  109.                 pattern="run"  
  110.                 height="70"  
  111.                 width="645"  
  112.                 format="html"  
  113.                 frameborder="false"  
  114.                 isHostPage="false"  
  115.                 isReportlet="true"  
  116.                 showParameterPage="false"  
  117.             >  
  118.             </birt:viewer>  
  119.         </div>          
  120.     </div>  
  121.       
  122.         <div class="mashupContainer" id="productline" style="top: 570px; left: 20px; height: 650px; width: 1200px;">  
  123.         <div class="mashupTitle" style="width: 99.4%; height: 20px;">productline</div>  
  124.         <div class="mashupContent" id="productlineDiv" style="top: 25px; width: 99%; height: 40px; align: middle; text-align: center;">  
  125.             <!-- This example uses the same report design, but this can a different rptdesign file than used above -->  
  126.             <birt:viewer id="birtViewer5"  
  127.                 reportDesign="productline.rptdesign"  
  128.                 baseURL="<%= request.getContextPath( )%>"  
  129.                 pattern="run"  
  130.                 height="600"  
  131.                 width="1200"  
  132.                 format="html"  
  133.                 frameborder="false"  
  134.                 isHostPage="false"  
  135.                 isReportlet="true"  
  136.                 showParameterPage="false"  
  137.             >  
  138.             </birt:viewer>  
  139.         </div>  
  140.     </div>  
  141. </body>  
  142. </html>  

我们访问http://localhost:8080/WebViewerExample/allorders.jsp

则能看到如下的效果:

但是此时这五个frame还不能联动,要对报表进行相应的修改。

对于orders.rptdesign,修改订单号页眉下的详细数据项,删除绑定的数据项,插入文本,内容如下:

  1. <html>  
  2. <script language='JavaScript' type='text/JavaScript'>  
  3. function printproduct(paravalue){var origUrl = parent.frames['birtViewer2'].location.toString();var pos = origUrl.indexOf('&__overwrite=true');if (pos > 0) { parent.frames['birtViewer2'].location = origUrl.substr(0, pos) + '&__overwrite=true&ordernumber='+paravalue ;} else {parent.frames['birtViewer2'].location = origUrl+ '&__overwrite=true&ordernumber='+ paravalue;};}  
  4. </script>  
  5. <body>  
  6. <center>  
  7. <a href='' title='<VALUE-OF>row["ORDERNUMBER"]</VALUE-OF>' onclick="printproduct('<VALUE-OF>row["ORDERNUMBER"]</VALUE-OF>')" ><b><i><u><VALUE-OF>row["ORDERNUMBER"]</VALUE-OF></u></i></b></a>  
  8. </center>  
  9. </body>  
  10. </html>  

说明:插入了一个超链接,单击触发事件,javascript脚本的含义是修改id为birtViewers2的报表地址,拼接上参数ordernumber为当前报表行row["ORDERNUMBER"],这样就实现了动态刷新嵌入有orderdetails.rptdesign的frame,让报表只显示单击后的订单号的订单明细。

同样的道理,我们修改客户号页眉下的详细数据项,删除绑定的数据项,插入文本如下:

  1. <html>  
  2. <script language='JavaScript' type='text/JavaScript'>  
  3. function printproduct1(paravalue){var origUrl = parent.frames['birtViewer3'].location.toString();var pos = origUrl.indexOf('&__overwrite=true');if (pos > 0) { parent.frames['birtViewer3'].location = origUrl.substr(0, pos)    + '&__overwrite=true&customernumber='+paravalue ;} else {parent.frames['birtViewer3'].location = origUrl+ '&__overwrite=true&customernumber='+ paravalue;};}  
  4. </script>  
  5. <body>  
  6. <center>  
  7. <a href='' title='<VALUE-OF>row["CUSTOMERNUMBER"]</VALUE-OF>' onclick="printproduct1('<VALUE-OF>row["CUSTOMERNUMBER"]</VALUE-OF>')" ><b><i><u><VALUE-OF>row["CUSTOMERNUMBER"]</VALUE-OF></u></i></b></a>  
  8. </center>  
  9. </body>  
  10. </html>  

说明:插入了一个超链接,单击触发事件,javascript脚本的含义是修改id为birtViewers3的报表地址,拼接上参数customernumber为当前报表行row["CUSTOMERNUMBER"],这样就实现了动态刷新嵌入有customer.rptdesign的frame,让报表只显示单击后的客户号的客户明细。

依次类推,我们修改orderdetails.rptdesign,修改产品号下面的数据项,删除数据绑定,插入文本如下:

  1. <html>  
  2. <script language='JavaScript' type='text/JavaScript'>  
  3. function printproduct(paravalue){var origUrl = parent.frames['birtViewer4'].location.toString();var pos = origUrl.indexOf('&__overwrite=true');if (pos > 0) { parent.frames['birtViewer4'].location = origUrl.substr(0, pos) + '&__overwrite=true&productcode='+paravalue ;} else {parent.frames['birtViewer4'].location = origUrl+ '&__overwrite=true&productcode='+ paravalue;};}  
  4. </script>  
  5. <body>  
  6. <center>  
  7. <a href='' title='<VALUE-OF>row["PRODUCTCODE"]</VALUE-OF>' onclick="printproduct('<VALUE-OF>row["PRODUCTCODE"]</VALUE-OF>')" ><b><i><u><VALUE-OF>row["PRODUCTCODE"]</VALUE-OF></u></i></b></a>  
  8. </center>  
  9. </body>  
  10. </html>  

说明:插入了一个超链接,单击触发事件,javascript脚本的含义是修改id为birtViewers4的报表地址,拼接上参数productcode为当前报表行row["PRODUCTCODE"],这样就实现了动态刷新嵌入有product.rptdesign的frame,让报表只显示单击后的产品号的产品明细。

最后修改product.rptdesign,删除产品流水线页眉下的数据项,插入文本,内容如下:

  1. <html>  
  2. <script language='JavaScript' type='text/JavaScript'>  
  3. function printproduct(paravalue){var origUrl = parent.frames['birtViewer5'].location.toString();var pos = origUrl.indexOf('&__overwrite=true');if (pos > 0) { parent.frames['birtViewer5'].location = origUrl.substr(0, pos) + '&__overwrite=true&productline='+paravalue ;} else {parent.frames['birtViewer5'].location = origUrl+ '&__overwrite=true&productline='+ paravalue;};}  
  4. </script>  
  5. <body>  
  6. <center>  
  7. <a href='' title='<VALUE-OF>row["PRODUCTLINE"]</VALUE-OF>' onclick="printproduct('<VALUE-OF>row["PRODUCTLINE"]</VALUE-OF>')" ><b><i><u><VALUE-OF>row["PRODUCTLINE"]</VALUE-OF></u></i></b></a>  
  8. </center>  
  9. </body>  
  10. </html>  

说明:插入了一个超链接,单击触发事件,javascript脚本的含义是修改id为birtViewers5的报表地址,拼接上参数productline为当前报表行row["PRODUCTLINE"],这样就实现了动态刷新嵌入有productline.rptdesign的frame,让报表只显示单击后的产品流水线的明细。

就这样,我们最终实现了一个四级联动的异步刷新的报表。

初始页面如下图:

我们分别单击订单号:10114,客户号:128,页面如下:

再单击产品号:S24_2840,页面如下:

最后单击产品流水号:Classic Cars,页面如下:

整个过程没有刷新过整个页面,而是有条件的异步刷新。

5.3 文本运用导航栏数据

我们还能利用导航栏的jsp,在页面上生成页码。

页面效果:

组件脚本变量似乎于javascript不能用,要获取组件设置的属性还需要绕些弯弯,下面以制作表格分页信息为例说明。制作表格及样式的部分在些就省略不提了,大家都懂的。

本文的分页信息放到Master Page里,以便在每一页都可以看得到:

图中标示的部分是一个Text组件,选择HTML类型,输入如下内容:

[javascript] view plain copy
  1. <div id="pageInfo" />   
  2. <script type="text/javascript">   
  3. // 脚本先于pageNumber和totalPage执行,所以需要延时。   
  4. setTimeout(function(){   
  5. // pageNumber和totalPage是report-viewer/NavigationbarFragment.jsp里的元素,分别显示当前页和总页数。   
  6. var pageNumber = parseInt(document.getElementById("pageNumber").innerText);   
  7. var totalPage = parseInt(document.getElementById("totalPage").innerText);   
  8. // pageSize来自于位于table头部的text(html类型)的脚本(非js脚本)。   
  9. // 通过table的onPrepare脚本获取其设置的pageBreakInterval(分页间隔,即分页大小)值,然后通过table里的text元素将其读出并传到js脚本里(保存为js公共域的变量即可),需保证其在本text标签前完成渲染。   
  10. var firstIndex = pageSize * (pageNumber - 1) + 1;   
  11. var lastIndex = pageSize * pageNumber;   
  12. lastIndexlastIndex = lastIndex > total ? total : lastIndex;   
  13.   
  14. var str = "power by fbpang 共 " + total + " 条记录,当前显示 " + firstIndex + " ~ " + lastIndex + " 条记录 第 "   
  15. + pageNumber + " 页,共 " + totalPage + " 页";   
  16.   
  17. document.getElementById("pageInfo").innerText = str;   
  18. }, 100);   
  19. </script>   


脚本里主要解决的就是获取当前分面(pageNumber)、分页总数(totalPage)和分页大小(pageSize)。

获取当前分面和分页总数可查看NavigationbarFragment.jsp文件,在WebRoot/report-viewer/birt/pages/control目录下(birt3.7.2,其他版本的自己找),这个文件是报表驱动(report engine)里的文件,用于控制分页的导航页,即下图部分:

打开NavigationbarFragment.js文件,找到如下代码:

  1. <TD WIDTH="100%" NOWRAP>   
  2. <B>   
  3. <%   
  4. if ( attributeBean.getBookmark( ) != null )   
  5. {   
  6. %>   
  7. <%=   
  8. BirtResources.getMessage( "birt.viewer.navbar.prompt.one" )   
  9. %>    
  10. <SPAN ID='pageNumber'></SPAN>    
  11. <%= BirtResources.getMessage( "birt.viewer.navbar.prompt.two" )%>    
  12. <SPAN ID='totalPage'></SPAN>   
  13. <%   
  14. }   
  15. else   
  16. {   
  17. %>   
  18. <%= BirtResources.getMessage( "birt.viewer.navbar.prompt.one" )%>    
  19. <SPAN ID='pageNumber'><%= ""+attributeBean.getReportPage( ) %></SPAN>    
  20. <%= BirtResources.getMessage( "birt.viewer.navbar.prompt.two" )%>    
  21. <SPAN ID='totalPage'></SPAN>   
  22. <%   
  23. }   
  24. %>   
  25. </B>   
  26. </TD>   


这就是下图所标示部分的代码:

其中pageNumber是当前页码,totalPage是分页总数,在js脚本里通过如下代码获取:

var pageNumber = parseInt(document.getElementById("pageNumber").innerText); 

var totalPage = parseInt(document.getElementById("totalPage").innerText); 

获取分页大小有些绕弯,在table的onPrepare脚本里获取分页间隔(pageBreakInterval,也就是分页大小)的值:

reportContext.setGlobalVariable("pageBreakInterval",this.getUserProperty("pageBreakInterval"));

分页间隔(pageBreakInterval)是在table的Page Break属性里设置的,如下图:

再在table的列头里添加一个Text组件,组件不写任何值,其任务就是做组件Script脚本和html页面js脚本的信使:

在其onPrepare脚本里写下如下代码,其目的是通组件Script脚本将获取的table属性保存到js脚本变量以备使用,因为table的onPrepare先于其里面的组件的onPrepare执行,所以可以这样获取值:

  1. this.contentType = "html";   
  2. this.content = "<script type=\"text/javascript\">var pageSize = "   
  3. + reportContext.getGlobalVariable("pageBreakInterval") + "</script>";   

然后就可以在Master Page里的Text使用了,使用setTimeout延迟100ms是因为Master Page里的Text会先于NavigationbarFragment.jsp里的分页导航渲染,为保证读取到当前分页和分页总数,必须延迟这段代码的执行。

 

BIRT使用1:简介、概念、元素、报表设计器组成 前一篇博客对birt进行了一个初探,相信通过上篇博客大家对birt有个初步认识,接下来我们随着下面这张思维导图的展示,进入birt的使用学习。              这一篇博客是第一部分,主要介绍一下birt的简介、概念、元素、报表设计器组成及部分等。       1.BIRT简介商业智能和报表工具BIRT是一个Eclipse-based开放源代码报表系统。它主要是用在基于Java与J2EE的 阅读详情

相关推荐

BIRT报表目录

打算近期出版一本全面介绍BIRT使用的书籍,能够帮助大家全面了解BIRT的方方面面,用丰富的案例和源码,例子,诠释这个报表设计工具,展现工具,开源框架,扩展框架的种种优点特性。 初稿内容如下,书写正在进行中~ 欢迎大家光临我的主页:http://blog.youkuaiyun.com/birtbird~ BIRT的世界-BIRT技术漫谈 目录 第一章 BIRT简介 3 1.1 BIR

BIRT的世界-BIRT技术漫谈 1万+

Birt API 实现动态参数列报表

效果简述:       根据你传入的参数,动态展现展示列。 例如传入参数:columnNames: "EMPLOYEENUMBER,FIRSTNAME,LASTNAME,EMAIL,OFFICECODE",则显示这五列。 见图 figure1     试验环境:        1:birt-report-designer-all-2_3_1 集成e

z1012890225的专栏 2207

精通BIRT:Eclipse商务智能报表工具开发实践指南

书籍正有清华大学出版社编辑出版发行中,敬请期待,目录如下:  第一章 BIRT简介 5 1.1 BIRT初识 5 1.2 BIRT安装 8 1.2.1 BIRT设计器的安装 8 1.2.2 BIRT运行时环境的安装 9 第二章 BIRT设计器概述及本地化支持 12 2.1 BIRT设计器概述 12 2.1.1 基本概念 12 2.1.2 基本视图 13 2.2 BIRT本地化之

BIRT的世界-BIRT技术漫谈 1万+

Birt 报表参数的使用

序言 参数是 birt 提供的一种很重要的机制,在 birt 中,参数具有变量的作用,它为 birt 报表的生成提供了一种灵活强大的机制。本文基于 Birt 2.1.2 讲述 Birt 报表中一些重要的用法以及 birt 源码级的参数使用机理,为报表开发者以及报表应用程序开发者提供一个参考。 本文的示例是基于 Birt RCP designer 2.1.2 开发的,在阅读本文前,最好有 e

石羊博客专栏 9692

5 深入理解SAP采购订单报表及其关键字段,表EKKO & EKPO & PRCD_ELEMENTS & EKET & EKES & EKBE & 采购订单BAPI

在SAP系统中,采购订单是一种非常重要的文档,用于向供应商正式下达购买产品或服务的指令。每个采购订单都包含关于所订购物料或服务的详细信息,比如数量、价格和交货日期。

1万+

TC397 EB配置ADC软件触发:从零实现周期采样与中断处理

本文详细介绍了如何在Infineon AURIX TC397芯片上使用EB Tresos工具配置ADC软件触发,实现周期采样与中断处理。通过硬件连接、EB模块配置、代码初始化及数据处理的全流程解析,帮助开发者快速掌握ADC软件触发技术,提升嵌入式系统开发效率。

root9的博客 231

第五章 BIRT文本类报表 .

5.1 基本的文本报表 我们构建一个报表ProductLinesAfter.rptdesign,使用示例数据库,空白模板,sql选择查询作为数据源,新建数据集Data Set: select * from CLASSICMODELS.PRODUCTLINES 查询数据源资源管理器,注意到表PRODUCTLINES中有一个字段HTMLDESCRIPTION是CLOB字段的:

z1012890225的专栏 2088

Stable-Baselines3性能优化:多环境训练对比指南(DummyVecEnv vs SubprocVecEnv)

本文深入对比了Stable-Baselines3中DummyVecEnv与SubprocVecEnv两种向量化环境的性能差异与应用场景。DummyVecEnv适用于轻量级、步进快的环境,调试友好且开销低;而SubprocVecEnv则通过真正的多进程并行,能显著加速计算密集型环境的训练。文章通过基准测试与决策树,指导开发者根据环境计算成本、CPU核心数等关键因素做出最优选择,以实现训练效率最大化。

weixin_29063979的博客 147

精通BIRT:Eclipse商务智能报表工具开发实践指南 (1-16章的目录明细)

书籍正有清华大学出版社编辑出版发行中,敬请期待,目录如下:  第一章 BIRT简介 5 1.1 BIRT初识 5 1.2 BIRT安装 8 1.2.1 BIRT设计器的安装 8 1.2.2 BIRT运行时环境的安装 9 第二章 BIRT设计器概述及本地化支持 12 2.1 BIRT设计器概述 12 2.1.1 基本概念 12 2.1.2 基本视图 13 2.2 BIRT本地化之

The code world of freedom 1037

Agent 操作系统:未来的 Harness 平台

在大模型技术爆发的当下,自主智能体(Agent)已经成为AI原生应用的核心载体,但当前Agent开发面临着碎片化严重、运维难度高、规模化落地难三大核心痛点,就像1970年代没有通用操作系统的裸机编程时代,开发者需要重复造轮子解决底层基础设施问题。本文将深度解析Agent操作系统(Agent OS)作为AI原生时代的底层基础设施的核心定位,以及下一代Harness平台如何将Agent OS与成熟的DevOps、CI/CD、可观测性、成本管理能力深度融合,成为AI原生应用全生命周期管理的统一平台。

软件工程实践的博客 278

北京大学MuMo多模态肿瘤分类模型复现与迁移学习

本项目复现了北京大学MuMo多模态肿瘤分类模型,并针对特定医学影像数据集进行迁移学习。MuMo模型通过整合CT、MRI、PET等多模态医学影像数据,显著提升了肿瘤分类准确性。项目内容包括环境配置(Python 3.8+、PyTorch 1.9+)、数据预处理(DICOM/NIfTI格式处理、强度归一化)、多模态数据集类实现,以及训练验证测试集划分。关键特点是采用MONAI医学影像处理库,实现三维医学影像的标准化预处理流程,并支持多种模态数据的并行加载与联合训练,为后续模型复现和迁移学习奠定基础。

max500600的博客 1241

BIRT-商业智能报表工具开发案例指南

打算近期出版一本全面介绍BIRT使用的书籍,能够帮助大家全面了解BIRT的方方面面,用丰富的案例和源码,例子,诠释这个报表设计工具,展现工具,开源框架,扩展框架的种种优点特性。 初稿内容如下,书写正在进行中~ 欢迎大家光临我的主页:http://blog.youkuaiyun.com/b...

chihengfu9559的博客 102

可编程逻辑控制器(PLC)系列:Mitsubishi MELSEC-Q_(8).MELSEC-Q系列PLC故障诊断与维护

MELSEC-Q系列PLC的故障诊断与维护是一个系统性的过程,需要工程师具备扎实的理论基础和丰富的实践经验。通过了解故障类型、使用诊断工具、遵循诊断步骤,可以有效地定位和解决故障问题。同时,定期的检查与保养、备份与恢复、优化程序和配置,以及提供良好的运行环境,可以减少故障的发生,提高系统的可靠性。希望本文能够帮助工程师在故障诊断与维护过程中更加得心应手,确保MELSEC-Q系列PLC的稳定运行。

2401_87715305的博客 1247

Birt报表开发实践

  项目需要用报表,看了几个报表工具,似乎Myeclipse自带 Birt比较方便,自带导出分页,支持多种图形,简单报表基本只需要写sql,。。开始实践学习;    一、相关资料:  1、  MyEclipse8.6——BIRT报表开发学习,这篇文章看完了基本可以了解下Birt是个什么东西。  2、 http://blog.youkuaiyun.com/birtbird~(看了目录我继续写下去的欲...

brosnan2800 142

30天入门 SAP BTP 开发系列之二:了解 SAP BTP Region 的概念,包含账号申请的详细步骤

SAP BTP 的 Region,实际是一组按地理位置划分的、由 SAP 或合作 Hyperscaler 承载的基础设施栈。这些基础设施栈至少包含多可用区网络、对象存储、计算节点及自动化运维等服务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1466

OpenClaw 在 Docker 容器中的部署实战——零配置启动

本文介绍了OpenClaw在Docker容器中的快速部署方法,对比了本地部署与容器化部署的优势。通过官方镜像和Docker Compose两种方式,5分钟即可完成部署,并详细讲解了配置管理方案(挂载配置文件和环境变量)。文章还提供了飞书集成配置方法,以及生产环境下的日志管理、资源限制、健康检查等优化建议。最后包含常见问题排查指南,帮助开发者快速实现OpenClaw的容器化部署。

刘一说的IT专栏 905

BIRT-商务智能报表工具开发案例指南

BIRT 报表 脚本 开发 数据库 http://www.iteye.com/topic/1128694 打算近期出版一本全面介绍BIRT使用的书籍,能够帮助大家全面了解BIRT的方方面面,用丰富的案例和源码,例子,诠释这个报表设计工具,展现工具,开源框架,扩展框架的种种优点特性。 初稿内容如下,书写正在进行中~欢迎大家光临我的主页:http://blog.youkuaiyun.com/birt...

weixin_30795127的博客 139

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Birt集成与扩展

目录:前言序言PartI:安装和部署BIRT第一章 安装BIRT的前提条件,软件环境介绍第二章 安装BIRT报表设计器排查安装问题第三章 安装其它BIRT包Chart、Demo Database、Report、Samp...

cisiruan3500的博客 163

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

优秀的开源报表工具BIRT(百灵)介绍

BIRT(百灵报表) 是为 Web 应用程序开发的基于 Eclipse 的开源报表系统(其实BIRT里的Chart可以作为一个单独的引擎使用,不限于j2ee),特别之处在于它是以 Java 和 J2EE 为基础。BIRT 有两个主要组件:基于 Eclipse 的报表设计器,以及部署到应用服务器上的运行时组件。BIRT的主要特点有:1. 自带报表设计器, 所见所得的设计风格.2. 报表格

caolijunmingyan的专栏 5535

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

第十章 BIRT图表(续) .

10.4 图表的动态设置与异步刷新 首先我们实现一个jsp输入框与birt的异步刷新。 新建一个报表,取名TopNPercent.rptdesign,空白模板,sql查询结果集。 新建数据源MyDataSource,采用BIRT设计器自带的例子数据库: 驱动程序类:org.eclipse.birt.report.data.oda.sampledb.Driver (Class

z1012890225的专栏 1293

BIRT报表使用

BIRT是一个开源软件项目,它提供BIRT技术平台来创建数据可视化和报表,这些可视化和报表可以嵌入到丰富的客户端和Web应用程序中,尤其是那些基于Java和Java EE的应用程序。 内含下载地址

乱域葬魂 4167

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

12.1 报表的工作模式以及相应的部署和配置 虽然为了示例的需要,在前文的第二章讲过BIRT的配置,以及在文本类报表,网格报表,图表中用过birt jsp tag,也做过一些说明。但报表的工作模式,不仅仅包含这两种。实际上,BIRT有五种工作模式, 第一种是用jsp或者javascript访问url,这个url遵循特定的格式,例如url/frameset?__report=&__paranam

BIRT的世界-BIRT技术漫谈 1万+
上一篇: 第四章 BIRT数据集和参数的建立
下一篇: 第六章 BIRT普通网格报表
freedom1993
博客等级 码龄12年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值