Biểu thức trong JasperReport

Trong JasperReport có rất nhiều các thiết lập được định nghĩa dạng biểu thức, ví dụ như điều kiện để ẩn hiện một thành phần, các tính toán đặc biệt, các xử lý chuỗi ký tự… Các biểu thức này có thể được viết bằng 3 ngôn ngữ lập trình khác nhau:

  • JavaScript
  • Groovy
  • Java

Mặc định ngôn ngữ của các biểu thức là Java nhưng bạn có thể lựa chọn hai ngôn ngữ đầu tiên, bạn có thể sử dụng mà không cần biết quá nhiều kiến thức về lập trình. Để thiết lập ngôn ngữ cho biểu thức, chọn nút gốc trong cửa sổ Outline và chọn đến thuộc tính Language trong cửa sổ Properties:

Lựa chọn ngôn ngữ cho biểu thức trong JasperReport

Một biểu thức (Expression) trong JasperReport giống như các biểu thức khi sử dụng trong một ô Excel, một ô có thể có giá trị đơn giản là một số, một ký tự hoặc một biểu thức phức tạp.

1. Dạng dữ liệu biểu thức

Dạng dữ liệu biểu thức được xác định theo ngữ cảnh khi biểu thức được sử dụng, ví dụ nếu biểu thức được sử dụng cho một điều kiện thì biểu thức đó có dạng Boolean (có giá trị true hoặc false), nếu biểu thức sử dụng để hiển thị trong một text field, nó có thể ở dạng String hoặc số như Integer, Double.
Java có rất nhiều các kiểu dữ liệu như java.lang.Boolean, java.lang.Byte, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Float, java.lang.Double, java.lang.String, java.util.Date, java.lang.Object.

2. Toán tử và cách thức tham chiếu đến các đối tượng

Các toán tử trong 3 ngôn ngữ JasperReport hỗ trợ (Java, Javascript, Groovy) là giống nhau về cú pháp.

  • +: Toán tử cộng hoặc nối hai chuỗi ký tự, ví dụ A + B
  • -, *, /: Toán tử trừ, nhân, chia
  • %: toán tử trả về phần dư phép chia, ví dụ A % B
  • ||, &&: Toán tử logic OR và AND, ví dụ A || B, A && B
  • ==, !=, ! Toán tử logic so sánh bằng, khác và phủ định.

Chú ý khi sử dụng toán tử ==, trong Java nó là toán tử so sánh giá trị gốc, khi so sánh các đối tượng bạn cần sử dụng phương thức equals(). Ví dụ, bạn không thể so sánh “test” == “test” mà phải sử dụng “test”.equals(“test”). Tương tự với toán tử !=.

Trong biểu thức chúng ta có thể tham chiếu đến các đối tượng cùng với các toán tử ở trên. Có rất nhiều các đối tượng trong JasperReport mà chúng ta đã biết đến trong các bài trước đây:

  • $F{tên_trường}: Tham chiếu đến các trường kết quả truy vấn trong báo cáo.
  • $V{tên_biến_số}: Tham chiếu đến các biến số.
  • $P{tên_tham_số}: Tham chiếu đến các tham số của báo cáo.
  • $P!{tên_tham_số}: Cú pháp đặc biệt được sử dụng để các câu truy vấn SQL để hiển thị thành một phần của câu truy vấn.
  • $R{resource_key}: Tham chiếu đến các chuỗi cá nhân hóa báo cáo.
  • $X{functionName, tên_cột, tham_số_1, [tham_số_n]}: Cú pháp đặc biệt giải quyết các cú pháp phức tạp của câu truy vấn như IS NULL, ISNOT NULL, các truy vấn có điều kiện thời gian…

Tóm lại, các đối tượng trong JasperReport như trường, biến số, tham số khi khai báo đều có thể sử dụng trong biểu thức. Ví dụ như đoạn “Hà Nội, ngày … tháng … năm 2019” xuất hiện trong các chứng từ, hợp đồng sẽ được xử lý kiểu như sau:

"Hà Nội, ngày " + $F{orderDate}.substring(0, 4) + " tháng " + $F{orderDate}.substring(0, 4) + " năm " + $F{orderDate}.substring(0, 4) + "."

Ở đây $F{orderDate} là trường orderDate trong kết quả truy vấn có dạng 20190212 thì biểu thức trên sẽ có kết quả là: “Hà Nội, ngày 12 tháng 02 năm 2019”.

Các đối tượng trong JasperReport cũng là đối tượng trong ngôn ngữ lập trình do đó nó có các phương thức, cú pháp để gọi các phương thức này:

Object.method(argument1, argument2, <etc.>)

Dưới đây là một vài ví dụ về gọi phương thức của đối tượng:

"JasperReport".length() //trả về kết quả là 12
"JasperReport".substring(0,6) //trả về kết quả là Jasper
"JasperReport".startsWith("J") //trả về kết quả là true
"JasperReport".substring(5,6).startsWith("J") //trả về kết quả là false

3. Cấu trúc rẽ nhánh if-then trong biểu thức

Trong biểu thức, để sử dụng cấu trúc if-then chúng ta sử dụng toán tử ?, cú pháp như sau:

(<điều_kiện>) ? <giá_trị_nếu_đk_đúng> : <giá_trị_nếu_đk_sai>

ví dụ:

($F{product_import_date}.substring(0,4).equals("2019")) ? "Sản phẩm mới nhập" : "Sản phẩm cũ"

Chú ý là các cấu trúc if-then này có thể lồng vào nhau, ví dụ:

($F{product_import_date}.substring(0,4).equals("2019")) ? "Sản phẩm 2019" : ($F{product_import_date}.substring(0,4).equals("2018")) ? "Sản phẩm 2018" : "Sản phẩm cũ"

Mặc dù biểu thức đã rất phức tạp nhưng có thể chưa đủ để đáp ứng được các yêu cầu, ví dụ bạn muốn in ra một số dạng số La Mã hay trả về ngày cuối cùng của một tháng… khi đó bạn cần sử dụng đến các phương thức từ các lớp Java bên ngoài, các phương thức này được khai báo dạng static. Ví dụ:

MyFormatter.toRomanNumber( $F{MyInteger}.intValue())

toRomanNumber là một static method của lớp MyFormatter, nó nhận vào một tham số dạng int và trả về một số dạng La Mã.

4. Trình soạn thảo biểu thức

Trong các phần trước chúng ta thấy được Biểu thức (Expression) trong JasperReport có thể làm được rất nhiều thứ phức tạp bằng cách sử dụng các phương thức của các lớp Java ở ngoài hoặc các phương thức helper xây dựng sẵn… Nhưng thật khó để nhớ hết tất cả mọi thứ khi viết code cho một biểu thức. Bạn không cần phải lo lắng, JasperSoft Studio có sẵn một công cụ là Expression Editor.

Trình soạn thảo biểu thức Expression Editor trong JasperSoft Studio

Như chúng ta đã biết ở đầu bài viết, có rất nhiều các thuộc tính của một thành phần báo cáo có dạng biểu thức, khi đó tên các thuộc tính này sẽ có từ khóa expression và giá trị của thuộc tính sẽ là một đoạn text mà nhập liệu vào có dạng textarea. Xung quanh giao diện thiết lập thuộc tính sẽ có nút Edit hoặc nếu là thuộc tính Expression thì chúng ta có thể click đúp vào thành phần báo cáo đó để hiển thị cửa sổ Expression Editor như trên

Trình soạn thảo biểu thức chia thành 4 vùng chính:

  • Vùng soạn thảo biểu thức, ở đây chúng ta soạn thảo nội dung biểu thức sẽ sử dụng trong Jasper Report. Các biểu thức khi soạn thảo sẽ được highlight giúp cho việc đọc code dễ dàng hơn. JasperSoft Studio sử dụng Xtext framework để xây dựng tính năng này cho Expression Editor.
  • Vùng thứ 2 là vùng dẫn hướng đến các đối tượng hoặc nhóm các chức năng. Trong JasperReport có các đối tượng như trường, biến số, tham số. Các nhóm chức năng như các phương thức được xây dựng sẵn, các biểu thức được người dùng định nghĩa để sử dụng lại…
  • Vùng thứ 3 là danh sách các phương thức mà đối tượng hoặc nhóm chức năng đó có.
  • Vùng thứ 4 là thông tin chi tiết như giới thiệu về chức năng, định dạng dữ liệu, các tham số của phương thức…

Add Comment