Thursday, May 3, 2012

ทำรายงาน crystal report โดยใช้ Class

หัวข้อนี้ได้แรงบันดาลใจจากกระทู้นี้ http://www.greatfriends.biz/?130875
ขอแบ่งปันประสบการณ์ด้าน crystal report ไว้เป็นอีกหนึ่งทางเลือกครับ

เหมาะกับใคร?  :  เหมาะกับคนที่ชอบดึงข้อมูลจาก Database มาแล้วโยนเข้า crystal report เพื่อออกรายงาน

วัตถุประสงค์ : นำเสนอวิธีการทำ crystal report อีกแนวทางหนึ่งสำหรับคนที่ชอบ ดึงข้อมูลมาแล้วโยนเข้า crystal report
เครื่องมือที่ใช้

เริ่มกันเลย
หลักการทำรายงานด้วย crystal report มี 2 ข้อ
1. การเตรียมโครงข้อมูลและจัดรูปแบบรายงาน
2. การโยนข้อมูลใส่ crystal report
 
1. การเตรียมโครงข้อมูลและจัดรูปแบบรายงาน
หลักการสำคัญข้อนี้คือ จัดทำโครงข้อมูลใน crystal report ขอยกตัวอย่างการออกรายงานข้อมูลพนักงาน ประกอบด้วย
   -  Id เป็น int
   - Name เป็น string
   - Position เป็น string
   - Department เป็น string
   - Salary เป็น decimal

    โดยปกติเห็นหลายๆ คนจะทำเป็น DataSet แต่ผมชอบทำเป็น Class แล้วจับใส่ crystal report ผมจะเขียน Class Employee ขึ้นมาดังภาพต่อไปนี้


เสร็จแล้วต้อง Build Project ก่อนนะครับ ไม่งั้น crystal report จะมองไม่เห็นคลาส Employee


ต่อไปนำโครงเข้ามาใน crystal report และจัดรูปแบบกัน โดยสร้างรายงาน crystal report ก่อนตามภาพ
ตั้งชื่อเป็น rptEmployee.rpt ครับ หลังจากกด Add จะได้ก็เลือกประเภทรายงาน ตามภาพต่อไป
เลือกแบบ Standard แล้วกด OK 
crystal report จะให้เลือกโครงข้อมูลให้คลิ๊กที่ Project Data -> .NET Objects หา Class Employee ที่ทำไว้ดังภาพ
สังเกตุว่า Class Employee จะ ขึ้นต้นด้วย Name Space ในโปรเจคนี้ผมตั้งชื่อ Name Space เป็น SampleCrystalReport
คลาสข้อมูลจึงเป็น SampleCrystalReport.Employee คลิ๊กที่คลาส SampleCrystalReport.Employee แล้วกดปุ่ม > ด้านขวา
เพื่อเลือกคลาส จากนั้นกดปุ่ม Next > ด้านล่าง   ต่อไปก็ทำตามภาพจนกระทั่งกดปุ่ม Finish ครับ
ตอนนี้เราได้ก็ได้โครงสร้างและรูปแบบรายงานแล้ว ดังภาพด้านล่าง

ต่อมาทำฟอร์มแสดงข้อมูล ผมขอใช้ Windows Form นะครับ ง่ายดี
สร้าง Windows Form ฟอร์มมา 1 ตัวครับ แล้วเอา crystal report Viewer มาวางไว้ ดังภาพ

2. การนำข้อมูลใส่ให้ crystal report
   ตอนนำข้อมูลโยนใส่ crystal report จะนำมาจากไหนก็ได้ มีข้อแม้ว่าต้องเตรียมข้อมูลให้อยู่ในรูปแบบ Collection  หรือ DataTable
โดยถ้าเป็นรูปแบบ Collection เช่น
List<คลาสข้อมูล> Property ต้องเป็น Public และชื่อ Property ต้องตรงกับชื่อฟิล์ดใน crystal report
หรือถ้าเป็น DataTable ก็ต้องมีชื่อฟิล์ดตรงกับชื่อฟิล์ดใน crystal report ด้วยเช่นกัน
อาจใช้วิธีปรับแต่ง SQL Statement แบบนี้ก็ได้เช่น
Select EmpID AS Id, TName + FName + " " + LName AS Name, .....  พอจะนึกออกใช่มั้ยครับ

มาลุยต่อผมจะยกตัวอย่าง Code แบบใช้ Collection ในที่นี้ขอใช้ List<Employee> โดยเขียน Code ที่ Event Form_Load ดังนี้

เสร็จแล้ว Run Program จะได้ผลลัพธ์ตามนี้

หวังว่าจะเป็นประโยชน์นะครับ
ขอบถามต่ออีกหน่อยครับ ถ้า ใช้เป็น DataTable แล้ว ชื่อ DataTable นั้นต้องตรงตามชื่อ class ด้วยหรือเปล่าครับ
ตอบ  ชื่อ DataTable ไม่สำคัญครับ สำคัญที่ ชื่อฟิล์ด จากตัวอย่างผมขึ้นโครง crystal report ด้วย Class ที่มี Property ตามนี้
   -  Id เป็น int
   - Name เป็น string
   - Position เป็น string
   - Department เป็น string
   - Salary เป็น decimal
ตอนโยนข้อมูลจาก DataTable ขอแค่ให้ชื่อฟิล์ดตรงตาม Property คือ Id,Name,Position,... ก็พอครับ
สรุปคือ โครงของ crystal report จะมาจากไหนก็ได้   สำคัญก็คือตัวข้อมูลที่จะโยนเข้าต้องปรับแต่งให้ชื่อฟิล์ดตรงกับ crystal report 
ด้วยวิธีนี้บ่อยครั้งผมก็ลักไก่ คือมี Report รูปแบบเดียวกัน แต่ข้อมูลที่จะส่งเข้าชื่อฟิล์ดไม่ตรงกัน ผมก็แก้ชื่อฟิล์ดของ DataTable ตอน Run Time ก่อนโยนข้อมูล
เข้า crystal report ผมก็ลดเวลาในการทำ Report ไปเยอะเลย แต่ต้องใช้ดุจพินิจนะครับ บางทีลักไก่แบบนี้อาจส่งผลต่อการ MA ในอนาคต อันนี้ขึ้นอยู่กับความเหมาะสมด้วย

แต่ถ้าถามอีกหน่อยว่า จะ retrun List ไปยัง ฟังก์ชั่นอื่นๆทำไงคร้าบบบบบบบ เอ้!!  ยังไง ???
ผมไม่ค่อยเคลีย์คำถามเท่าไร ช่วยขยายความเพิ่มหน่อยครับ
การเพิ่ม Property (Field) จาก Class ให้ Update ใน crystal report
สมมุติ Report ที่สร้างจาก Class Employee มี Property (Field) เพิ่มขึ้น
ในที่นี้สมมุติเป็น NetIncome คือ รายได้สุทธิหลังหักภาษี 10% เพิ่มในคลาสดังนี้

เสร็จแล้วอย่าลืม Build โปรเจคด้วย 

จากนั้นไป Update Property (Field) ใน crystal report ไปที่ Field Explorer คลิ๊กเมาส์ปุ่มขวาที่ Class SampleCrystalReport_Employee
ที่ Popup Menu เลือก Set Datasource Location... 


นำฟิล์ด NetIncome ไปวางใน Report
ทดลองรันโปรแกรมดู จะได้ข้อมูล NetIncome เพิ่มเข้าเรียบร้อย


pnengวันที่ส่ง: 14 พ.ค. 54 22:42 GMT+7
วันที่ปรับล่าสุด: 14 พ.ค. 54 22:42 GMT+7
REPLY #6 (131062)
คุณ pneng เคยเจอปัญหา crystal report for vs2010 ไหมครับ เวลาลงโปรแกรมมันจะลงไม่สำเร็จไม่รู้เป็นเพราะอะไร
มันจะ ERROR ช่วงตอนที่ regis  .dll ต่างๆๆอะครับ

ถามว่ามันใช่ได้ไหม มันก็ใช้ได้นะครับ แต่เวลารัน report บ้างครั้ง จะปรากฎ Error can not ' load file keycode.dll ไม่ทราบว่า คุณ pneng เคยเจอไหมครับ

No comments:

Post a Comment