Báo cáo các biến

Biến báo cáo là các đối tượng đặc biệt được xây dựng trên đầu biểu thức báo cáo.

Các biến báo cáo đơn giản hóa các tác vụ sau:

  • Biểu thức báo cáo, được sử dụng nhiều trong toàn bộ mẫu báo cáo. Các biểu thức này chỉ có thể được khai báo một lần bằng cách sử dụng các biến báo cáo.

  • Các biến báo cáo có thể thực hiện các phép tính khác nhau dựa trên các giá trị biểu thức tương ứng như đếm, tổng, trung bình, thấp nhất, cao nhất, phương sai, v.v.

Nếu các biến được xác định trong thiết kế báo cáo, thì chúng có thể được tham chiếu bởi các biến mới trong biểu thức. Do đó, thứ tự các biến được khai báo trong thiết kế báo cáo là quan trọng.

Sự định nghĩa biến

Một khai báo biến như sau:

<variable name = "CityNumber" class = "java.lang.Integer" incrementType = "Group"
   incrementGroup = "CityGroup" calculation = "Count">
   <variableExpression>
      <![CDATA[Boolean.TRUE]]>
   </variableExpression>
</variable>

Như đã thấy ở trên, phần tử <variable> chứa một số thuộc tính. Các thuộc tính này được tóm tắt dưới đây:

Thuộc tính Tên

Tương tự như các tham sốtrường , thuộc tính name của phần tử </variable> là bắt buộc. Nó cho phép tham chiếu đến biến theo tên khai báo của nó trong các biểu thức báo cáo.

Thuộc tính lớp

Các lớp thuộc tính cũng là bắt buộc mà xác định tên lớp cho các giá trị khác nhau. Giá trị mặc định của nó là java.lang.String . Điều này có thể được thay đổi thành bất kỳ lớp nào có sẵn trong classpath, cả tại thời điểm biên dịch báo cáo và thời gian điền báo cáo. Công cụ xử lý việc truyền kiểu trong các biểu thức báo cáo mà mã thông báo $ V {} được sử dụng, do đó, không cần truyền kiểu thủ công.

Phép tính

Thuộc tính này xác định - phép tính nào sẽ thực hiện trên biến khi điền vào báo cáo. Các phần phụ sau đây mô tả tất cả các giá trị có thể có cho thuộc tính tính toán của phần tử <variable>.

  • Trung bình - Giá trị biến là giá trị trung bình của mọi giá trị khác rỗng của biểu thức biến. Chỉ hợp lệ cho các biến số.

  • Đếm - Giá trị biến là số lượng các trường hợp không rỗng của biểu thức biến.

  • Đầu tiên - Giá trị biến là giá trị của phiên bản đầu tiên của biểu thức biến. Các giá trị tiếp theo bị bỏ qua.

  • Cao nhất - Giá trị biến là giá trị cao nhất của biểu thức biến.

  • Thấp nhất - Giá trị biến là giá trị thấp nhất cho biểu thức biến trong báo cáo.

  • Không có gì - Không có phép tính nào được thực hiện trên biến.

  • Độ lệch chuẩn - Giá trị biến là độ lệch chuẩn của tất cả các giá trị không rỗng khớp với biểu thức báo cáo. Chỉ hợp lệ cho các biến số.

  • Sum - Giá trị biến là tổng của tất cả các giá trị không rỗng được trả về bởi biểu thức báo cáo.

  • Hệ thống - Giá trị biến là một phép tính tùy chỉnh (tự tính giá trị cho biến đó, sử dụng chức năng scriptlets của JasperReports).

  • Phương sai - Giá trị biến là phương sai của tất cả các giá trị không rỗng được trả về bằng cách đánh giá biểu thức của biến báo cáo.

Lớp nhà máy tăng trưởng

Thuộc tính này xác định lớp được sử dụng để tính toán giá trị của biến khi điền vào bản ghi hiện tại trên báo cáo. Giá trị mặc định sẽ là bất kỳ lớp nào đang triển khainet.sf.jasperreports.engine.fill.JRIncrementerFactory. Lớp nhà máy sẽ được công cụ sử dụng để khởi tạo các đối tượng tăng dần trong thời gian chạy tùy thuộc vào thuộc tính tính toán được đặt cho biến.

IncrementType

Điều này xác định thời điểm tính toán lại giá trị của biến. Thuộc tính này sử dụng các giá trị, như bên dưới:

  • Cột - Giá trị biến được tính toán lại ở cuối mỗi cột.

  • Nhóm - Giá trị biến được tính toán lại khi nhóm được chỉ định bởi incrementGroup thay đổi.

  • Không có - Giá trị biến được tính toán lại với mọi bản ghi.

  • Trang - Giá trị biến được tính toán lại ở cuối mỗi trang.

  • Báo cáo - Giá trị biến được tính toán lại một lần vào cuối báo cáo.

Nhóm tăng dần

Điều này xác định tên của nhóm mà tại đó giá trị biến được tính toán lại, khi incrementTypeNhóm . Điều này lấy tên của bất kỳ nhóm nào được khai báo trong mẫu báo cáo JRXML.

ResetType

Điều này xác định thời điểm giá trị của một biến được đặt lại. Thuộc tính này sử dụng các giá trị, như bên dưới:

  • Cột - Giá trị biến được đặt lại ở đầu mỗi cột.

  • Nhóm - Giá trị biến được đặt lại khi nhóm được chỉ định bởi incrementGroup thay đổi.

  • Không có - Giá trị biến không bao giờ được đặt lại.

  • Trang - Giá trị biến được đặt lại ở đầu mỗi trang.

  • Báo cáo - Giá trị biến chỉ được đặt lại một lần ở đầu báo cáo.

ResetGroup

Điều này xác định tên của nhóm mà tại đó giá trị biến được đặt lại, khi resetTypeNhóm . Các giá trị cho thuộc tính này sẽ là tên của bất kỳ nhóm nào được khai báo trong mẫu báo cáo JRXML.

Các biến báo cáo tích hợp

Có một số biến hệ thống tích hợp sẵn, sẵn sàng sử dụng trong các biểu thức, như sau:

S.NO Tên và mô tả biến
1

PAGE_NUMBER

Giá trị của biến này là số trang hiện tại của nó. Nó có thể được sử dụng để hiển thị cả số trang hiện tại và tổng số trang sử dụng một tính năng đặc biệt của các nguyên tố lĩnh vực JasperReports văn bản, evaluationTime thuộc tính.

2

COLUMN_NUMBER

Biến này chứa số cột hiện tại.

3

REPORT_COUNT

Biến báo cáo này chứa tổng số bản ghi được xử lý.

4

PAGE_COUNT

Biến này chứa số lượng bản ghi đã được xử lý khi tạo trang hiện tại.

5

COLUMN_COUNT

Biến này chứa số lượng bản ghi đã được xử lý khi tạo cột hiện tại.

6

GroupName_COUNT

Tên của biến này có nguồn gốc từ tên của nhóm mà nó tương ứng với, kèm theo dãy _COUNT. Biến này chứa số lượng bản ghi trong nhóm hiện tại.

Thí dụ

Hãy thêm một biến (countNumber) vào mẫu báo cáo hiện có của chúng tôi ( Thiết kế Báo cáo Chương ). Chúng tôi sẽ đếm trước số lượng cho mỗi bản ghi. Mẫu báo cáo đã sửa đổi (jasper_report_template.jrxml) như sau. Lưu nó vào thư mục C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
   "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
   http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
   name = "jasper_report_template" pageWidth = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
	
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <queryString>
      <![CDATA[]]>
   </queryString>

   <field name = "country" class = "java.lang.String">
      <fieldDescription>
         <![CDATA[country]]>
      </fieldDescription>
   </field>

   <field name = "name" class = "java.lang.String">
      <fieldDescription>
         <![CDATA[name]]>
      </fieldDescription>
   </field>
   
   <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
      <variableExpression>
         <![CDATA[Boolean.TRUE]]>
      </variableExpression>
   </variable>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
			
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
         
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </title>

   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" width = "535"	height = "15"
               backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
         </staticText>
         
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>

   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
               backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
				
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
         </staticText>
         
         <textField>
            <reportElement x = "414" y = "0" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA["  " + String.valueOf($V{countNumber}) +"."+$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>

</jasperReport>

Các mã java để điền báo cáo vẫn không thay đổi. Nội dung của tệpC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java như dưới đây -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName =
      "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Nội dung của tệp POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java như dưới đây -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Nội dung của tệp C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java như dưới đây -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Tạo báo cáo

Chúng tôi sẽ biên dịch và thực thi tệp trên bằng quy trình xây dựng ANT thông thường của chúng tôi. Nội dung của tệp build.xml (được lưu trong thư mục C: \ tools \ jasperreports-5.0.1 \ test) như dưới đây.

Tệp nhập - baseBuild.xml được chọn từ chương Thiết lập môi trường và phải được đặt trong cùng thư mục với build.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
   
   <import file = "baseBuild.xml" />
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview
      the report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </target>
   
   <target name = "compilereportdesing" description = "Compiles the JXML file and
      produces the .jasper file.">
      
      <taskdef name = "jrc"
         classname = "net.sf.jasperreports.ant.JRAntCompileTask">
         <classpath refid = "classpath" />
      </taskdef>
      
      <jrc destdir = ".">
         <src>
            <fileset dir = ".">
               <include name = "*.jrxml" />
            </fileset>
         </src>
         <classpath refid = "classpath" />
      </jrc>
   
   </target>
	
</project>

Tiếp theo, hãy mở cửa sổ dòng lệnh và đi đến thư mục nơi build.xml được đặt. Cuối cùng, thực hiện lệnhant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport là mục tiêu mặc định) là -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28: warning:
   'includeantruntime' was not set, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 7 source files to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig
   for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 seconds

Kết quả của việc biên dịch ở trên, một cửa sổ JasperViewer mở ra như trong màn hình bên dưới:

Ở đây, chúng ta thấy rằng số đếm được đặt trước cho mỗi bản ghi.