วันพฤหัสบดีที่ 30 กรกฎาคม พ.ศ. 2558

ตามรอย JasperReports 3.6 Development Cookbook พาทำ Dynamic Titles

>> รันด้วย Ant สู่ Servlet และขณะนี้เราจะกลับมายังพื้นฐานอีกครั้งด้วยหนังสือพาทำงานแบบเป็นชิ้น นามว่า JasperReports 3.6 Development Cookbook ซึ่งครั้งนี้ขอยกสักตัวอย่างหนึ่งที่อยู่ตอนต้นของหนังสือมาลองทำตามครับ

>> ฐานข้อมูลเราจะใช้โปรแกรม PostgreSQL (อ่านว่า โพสต์เกรสคิวเอล) สามารถดาวน์โหลดได้ฟรีที่
http://www.postgresql.org/download/
ผมเลือกเป็นเวอร์ชัน Windows แบบตัวช่วยติดตั้งให้เลย และติดตั้งตามค่า default ทุกประการ ยกเว้นเครื่องมือสุดท้ายของมัน (ติดตั้งโปรแกรมหลักเสร็จ มันจะถามให้ติดตั้งอะไรสักอย่าง จำชื่อไม่ได้ ซึ่งผมตอบปฏิเสธไป)

>> ตัวชิ้นงานที่หนังสือใช้อ้างอิง สามารถโหลดได้ที่นี่
http://www.packtpub.com/code_download/5244
เป็น .zip ไฟล์ชื่อ 0769_Code.zip เนื้อหาด้านในประกอบด้วยงานแต่ละชิ้นในแต่ละบท สำหรับบทที่ 1 นี้มี Task1 ถึง Task7 พร้อมกับวิธีติดตั้ง PostgreSQL, สร้างฐานข้อมูลและเพิ่มข้อมูลลงไปในตาราง

>> เมื่อติดตั้ง PostgreSQL ผมก็เปิดโปรแกรมควมคุมในระดับผู้ควบคุมขึ้นมา (pgAdmin3.exe) โดยมันถูกเก็บไว้ที่นี่
C:\Program Files\PostgreSQL\9.4\bin\pgAdmin3.exe

>> ภายใต้หน้าต่าง Object browser มองหา Server Groups/Servers/PostgreSQL 9.4 (localhost:5432)/Databases (ระหว่างขั้นตอนนี้มันจะถามหา password ก็ใส่ไปให้ตรงกับที่ได้ตั้งไว้ตอนติดตั้งโปรแกรมนะครับ) สร้างฐานข้อมูลใหม่ก่อน ด้วยการคลิกขวาที่ไอคอนชื่อ Databases ข้างต้น ตั้งชื่อว่า jasperdb1 ตามตำรา


>> ต่อมา (วิ่ง) ก็สร้างตารางก่อน โดยการมองหาสิ่งที่เรียกว่า PSQL Console สำหรับเวอร์ชัน 9.4 (ปี 2558 หรือ 2015) มันถูกซ่อนไว้ใกล้กับไอคอนรูปจิ๊กซอว์สีออกน้ำตาลอ่อนกับเขียวด้านล่างเมนูบาร์ (ดูรูปประกอบ) เปิดมันขึ้นมาจะเป็นหน้าต่างสีดำครับ

***หมายเหตุ หากไม่สามารถคลิกเปิด PSQL Console ได้ แสดงว่าเรายังไม่ได้เลือกฐานข้อมูล (ที่เพิ่งสร้าง) ให้ไปคลิกซ้ายที่ฐานข้อมูล jasperdb1 หนึ่งที เพื่อจะสร้างตารางในนี้

>> ตารางและข้อมูลจะถูกสร้างและเพิ่มตามลำดับด้วยคำสั่งภายในไฟล์ชื่อ copySampleDataIntoPGS.txt ซึ่งเนื้อหาที่เราต้องการคัดลอกก็คือ

CREATE TABLE "CustomerInvoices" (
"InvoiceID" integer NOT NULL,
"CustomerName" varchar(80) NOT NULL,
"ProductName" varchar(80) NOT NULL,
"InvoicePeriod" varchar(20) NOT NULL,
"InvoiceValue" real NOT NULL,
CONSTRAINT CustomerInvoices_pkey PRIMARY KEY ("InvoiceID")
);

INSERT INTO "CustomerInvoices" VALUES (1001, ’Packt Publishing’, ’Packing Material’, ’Mar09’, 5020.25);
INSERT INTO "CustomerInvoices" VALUES (1002, ’Packt Publishing’, ’Offset Paper’, ’Apr09’, 3000.50);
INSERT INTO "CustomerInvoices" VALUES (1003, ’Packt Publishing’, ’Offset Paper’, ’Mar09’, 4150.05);
INSERT INTO "CustomerInvoices" VALUES (1005, ’Packt Publishing’, ’Packing Material’, ’Mar09’, 2050.00);
INSERT INTO "CustomerInvoices" VALUES (1004, ’Packt Publishing’, ’Packing Material’, ’Mar09’, 2050.00);
INSERT INTO "CustomerInvoices" VALUES (1006, ’Bob’, ’JapserReports Cookbook’, ’Mar09’, 50.00);

ได้แก่การสร้างตารางชื่อ CustomerInvoices พร้อมกับข้อมูล 6 รายการ เป็นของพี่ชายที่ชื่อ Packt Publishing ทั้งสิ้น ให้เราคัดลอกทั้งหมดนี้แล้วนำไปวางลงใน PSQL Console (ถ้าวางไม่เป็น หลังจากคัดลอกแล้วให้คลิกขวาที่กรอบหน้าต่างด้านบน จะปรากฏเมนูลอยออกมา ให้เลือก Edit ต่อด้วย Paste) มันจะทำงานสร้างตารางและเพิ่มข้อมูลให้เลยทันที

รูปด้านล่างนี้แสดงให้เห็นว่ามีตารางและข้อมูลเกิดขึ้น มองดูที่ Schemas/Tables


>> ทีนี้มาทดสอบดูว่าเราจะสามารถ query ข้อมูลที่ว่าผ่านทาง iReport ได้อย่างไร ครับ ก่อนอื่นเตรียม report view หรือหน้าตาของรายงานเสียก่อน
- ให้เปิด iReport ขึ้นมา
- สร้างไฟล์ชื่อ myreport.jrxml ไว้ ณ
D:\Workspace\Report\jasperreports\myreports\report4
- จากนั้นลาก Text Field มาวางภายในพื้นที่ของ Title

- มองหาหน้าต่าง Report inspector (หาไม่เจอให้คลิกเลือกเปิดที่เมนู Window) มองหากลุ่ม Parameters หากสงสัยว่ามันคืออะไรให้ข้ามไปก่อนนะ
- คลิกขวาที่กลุ่ม Parameters แล้วเลือก Add Parameter เราจะได้ parameter1 มา (อยู่ท้ายๆ)

- เปลี่ยนชื่อ parameter1 เป็น CustomerName ได้โดยคลิกที่ parameter1 ก่อนแล้วมองหาหน้าต่าง Properties ตรงช่อง Name ก็ใส่ชื่อ CustomerName ลงไปไงล่ะ

- ทีนี้กลับไปคลิกขวาที่ Text Field ตัวก่อนหน้านี้เพื่อเปลี่ยนเงื่อนไขของมัน เลือก Edit expression จะปรากฏหน้าต่าง Expression editor จงลบ $F{field} ทิ้งไป แล้วมองหากลุ่ม Parameters ด้านล่างซ้ายของหน้าต่างเดียวกันนี้ เลือกเสร็จไปดูช่องตรงกลาง ใช้เม้าส์เลื่อนหาพารามิเตอร์ที่เราเพิ่งเปลี่ยนชื่อไป นั่นก็คือ CustomerName ดับเบิลคลิกมัน จะได้ $P{CustomerName} มาแปะไว้ตรงช่อง expression ของ Expression editor เสร็จกิจกดปุ่ม Apply ด้านล่าง


>> ติดต่อฐานข้อมูลเพื่อใช้ทดสอบ query ผ่านทางปุ่ม Report Datasources (ดูรูปประกอบ) แล้วกดปุ่ม New เพื่อสร้าง connection ใหม่ไปยัง jasperdb1

- หน้าต่าง Datasource เลือก Database JDBC connection กด Next

- หน้าต่าง Database JDBC connection ระบุรายละเอียดลงไปดังนี้
-- Name อะไรก็ได้ ผมใส่เป็น PostgreSQL
-- JDBC Driver เลือก PostgreSQL (org.postgresql.Driver)
-- Username โดย default คือ postgres
-- Password ใส่ไป
-- กดปุ่ม Test สักหนเพื่อทดสอบว่าติดต่อฐานข้อมูลได้หรือไม่ ซึ่งต้องได้เท่านั้น
-- กดปุ่ม Save


>> กดปุ่มเขียน query ของรายงาน (ดูรูปประกอบ) แล้วเขียน query ลงไปดังนี้
SELECT * FROM "public"."CustomerInvoices" WHERE "public"."CustomerInvoices"."CustomerName" = $P{CustomerName}

มันหมายถึงดึงทุกฟิวล์จากตาราง CustomerInvoices เมื่อชื่อของลูกค้าตรงกับพารามิเตอร์ที่เราจะระบุส่งให้ในอนาคตอันใกล้นี้ เสร็จแล้วกดปุ่ม OK


>> กดปุ่ม Preview ของ iReport มันจะถามหาค่าของพารามิเตอร์ชื่อ CustomerName ก็ให้ใส่ไปว่า Packt Publishing (ต้องตรงตามนี้นะไม่งั้นไม่ออก)

>> เย้! รายงานมาแล้ว

*** หมายเหตุ ผมไม่เข้าใจว่าทำไมตำราให้ทำยากขนาดนี้ เพราะหัวข้อคือ Dynamic Titles หรือก็คือหัวเรื่องสามารถเปลี่ยนแปลงได้ในระหว่างที่รายงานนี้กำลังถูกประมวลผล (ซึ่งจัดอยู่ในขั้นตอน fill ข้อมูล) อันที่จริงเราแค่แปะ Text Field ไว้อันหนึ่ง สร้างพารามิเตอร์มาผูกแล้ว preview เลยก็ได้ ใส่อะไรให้พารามิเตอร์มันก็ออกอันนั้นแหละ

>> อ่านไปไกลแล้ว แต่ทดลองทำไม่มากเท่า หัวข้อไหนน่าสนใจจะมาทดลองทำและเล่าสู่กันใหม่เป็นกรณีศึกษาและส่งเสริมการอ่านทั้งส่งเสริมการซื้อ Cookbook อ่านกันอีกด้วย (ที่จริงผมได้รับสืบทอดมาอีกที) คืนนี้ดึกมากแล้ว สวัสดีครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น