- หายหน้าหายตาไปนานทีเดียว จนคนสงสัยว่าจะเลิกเขียน blog ไปแล้วยัง ก็ยังเขียนอยู่แต่เรื่องอาจจะไม่ถี่เหมือนที่ผ่านมาครับ สำหรับแฟนๆ Lazarus ที่ต้องเกี่ยวข้องกับ Database ถ้าเป็นตัวทำ report ที่ฟรีก็ต้องนึกถึงสองตัวนี้ ผมมีโอกาสใช้ทั้งคู่ บางโปรแกรมก็ใช้ทั้งสองอย่าง ตามลักษณะข้อดี ข้อด้อยที่ไม่เหมือนกัน ก็มาเปรียบเทียบดูกันว่าสอง component นี้จะเป็นอย่างไร
LazReport
- ตัวนี้พัฒนามาจาก FreeReport สำหรับ Delphi ตัว LazReport เป็นกลุ่ม component ที่สำหรับจัดทำ Report มีเครื่องมือ Visual ที่ช่วยในการออกแบบได้ง่าย มี Preview ที่สามารถดูผลลัพธ์ได้ตลอด
การติดตั้ง
- เครื่องมือตัวนี้มากับ Lazarus อยู่ในโฟลเดอร์ components วิธี compile และ build ก็ง่ายๆ เครื่องมือตัวนี้เรียกใช้ package “printer4lazarus” อันดับแรกเปิดเมนูของ Lazarus คือ Package > Open package file (.lpk) แล้ว browse ไปที่โฟลเดอร์ที่ติดตั้ง Lazarus เข้าไปที่โฟลเดอร์ components แล้วเข้าไปที่โฟลเดอร์ printers จะเจอ printer4lazarus.lpk จากนั้นทำการ install
- หลังจากติดตั้ง printer4lazarus เข้าไปแล้ว ก็มาติดตั้ง LazReport ที่เมนูเปิด Package > Open package file (.lpk) เข้าไปที่โฟลเดอร์ components -> lazreport -> source คลิกเลือก lazreport.lpk คลิกเลือก install ก็เป็นอันเรียบร้อย หลังจากติดตั้งแล้วจะเห็นหน้าตาของ LazReport ดังรูปด้านล่าง

การใช้งานอย่างย่อ
- วิธีใช้งานคร่าวๆดูที่ website ของ Lazarus ตามลิงค์นี้ ตัวอย่างการใช้งานมีอยู่ 3-4 ตัวอย่างสามารถเปิดได้ด้วย Lazarus อยู่ที่โฟลเดอร์ย่อย samples
- ถ้าเป็นของผมก็ประมาณรูปด้านล่้าง
- ผมใช้ Database Firebird มีสองตัวแปรคือ FDBConnect : TIBConnection และอีกตัวสำหรับ Transaction คือ FTrans : TSQLTransaction สอง class คือ TIBConnection กับ TSQLTransaction จะมากับ Lazarus อยู่แล้ว
- ดูบนฟอร์มข้างบน ผม drop TfrDBDataset ตั้งชื่อเป็น frDBMast ตัวต่อมา drop TSQLQuery ตั้งชื่อ SQLMast สุดท้ายลืมไม่ได้คือ TfrReport ตั้งชื่อ frReport1
- ผมใส่ frBarcodeObject1 (TfrBarcodeObject) ลงไปด้วยเพราะมีการใช้ Barcode
ความสัมพันธ์
- เนื่องจากผมใช้ตัวแปรคือ FDBConnect และ FTrans ไม่ได้ drop เป็น component จึงต้องมีการโค๊ดด้วยมือเริ่มจาก
SQLMast.Database := FDBConnect;
SQLMast.Transaction := FTrans;
frDBMast.Dataset := SQLMast;
- ดูจากโคีด frReport1(TfrReport) จะมองเห็นเฉพาะ frDBMast(TfrDBDataSet) ส่วน frDBMast จะมองหาเฉพาะ Dataset ซึ่งก็คือ SQLMast ซึ่งตัว SQLMast สามารถเชื่อมโยงไปหา Database ได้
เปิด Report Designer
- จากรูปด้านบนเมื่อ double click ที่ frReport1 จะกระโดดเข้าสู่โหมดการออกแบบทันที อันดับแรกเลือก Band ก่อนเมื่อลากวาง Band ลงบนกระดาษ Report จะถูกถามว่าเป็น band อะไร เช่นถ้าเป็น Report Title จะเป็นหัวของรายงานปรากฎอยู่ใน Report เพียงหน้าเดียวหน้าแรก ถ้าเป็น Column header อยู่ทุกหน้าตราบเท่าที่ตารางที่แสดงผลยังไม่หมด
- อีกตัวที่สำคัญคือ Master data จะเป้นข้อมูลของ Dataset อย่างของผมได้จากการ Query ผ่าน SQLMast

- และอีกตัวที่ไม่พูดไม่ได้คือ Memo Strings ชื่อ class เต็มๆคือ TfrMemostrings เราจะใส่ชื่อฟิลด์ของ Dataset ผ่านช่องนี้ เมื่อลากวาง Band ลงไปแล้วเราจะลากวาง Memo Strings ตัวนี้ลงบน band อีกที การใส่ชื่อฟิลด์จะอยู่ในเครื่องหมาย bracket [] ดังรูปด้านล่าง

- Save ตัว Report จะมีนามสกุลเป็น lrf ซึ่งไฟล์ตัวนี้เวลาทำโปรแกรม Setup ต้องนำไปด้วยถึงจะใช้งานได้ เวลาเรียก Report ก็ใช้โค๊ดดังนี้
SQLMast.Active := true;
frReport1.ShowReport;
- ผมลืมไปนิดเวลาเรียกไฟล์ Report ที่เราสร้างไว้แล้วอาจจะเป็นตอนสร้างฟอร์ม (FormCreate) ดังนี้
frReport1.LoadFromFile(‘barcodereport.lrf’);
ผลลัพธ์ (Report)
- สำหรับ Report ที่มีรูปมากๆ LazReport ทำได้ดีมาก ตัวอย่างจาก Report Designer ด้านบนผม generate ได้ดังรูปด้านล่าง

ข้อดีและข้อด้อย
- ข้อดีคือเร็ว มี Report Designer ที่เป็น Visual สามารถใช้งานได้ง่าย แรกๆผมอ่านวิธีการใช้งานไม่กี่บรรทัดก็ใช้งานได้แล้ว ข้อดีอีกอย่างคือ Memo Strings นั้นเป็น Memo เต็มตัวเมื่อแสดงข้อมูลในฟิลด์ที่ยาวๆสามารถปัดบรรทัดได้ (word wrap)
- ข้อด้อย อืม…..ในกรณีของผมดูเหมือน LazReport จะมี bug คือถ้าสร้าง Report แบบ Master – Detail จะเกิด Error ที่ component ของ LazReport บางครั้งโปรแกรมของผมรันผ่าน บางครั้งไม่ผ่านจนรำคาญต้องไปลองดูตัว Fortes Report ที่จะว่ากันต่อไป ข้อด้อยอีกอย่างคือไฟล์แสดง Definition ของ report ที่ผมกล่าวไปแล้วคือ .lrf ไม่สามารถแปลงเป็น resource ได้เวลาจะนำไฟล์โปรแกรมไปใช้ที่ไหนก็ต้องพ่วงไปด้วย ถ้าสามารถแปลงเป็น resource ได้เวลา build แค่มารวมกับไฟล์ execute ของโปรแกรมคงไม่กี่พันไบต์
Fortes Report
- component ตัวนี้ดั้งเดิมเป็นของบริษัทฯ Fortes Informatica สัญชาติบราซิล ดูใน wesite แล้วรุ่นสุดท้ายประมาณปี 2004 แล้วไม่มีการพัฒนาต่อ Fortes Report ออกแบบมาใช้กับ Delphi32 ผมเข้าใจว่าของดั้งเดิมน่าจะมีลิขสิทธิ์ แต่ไม่ทราบอีท่าไหนมีโปรแกรมเมอร์ชาวบราซิลอีกชุดหนึ่งนำโค๊ดมาเปิด น่าจะได้รับการอนุญาตจากเจ้าของเดิมเป็นที่เรียบร้อยแล้ว
- ผมเข้าใจว่า Fortes Report น่าจะขายไม่ได้คือตายๆไปพร้อมกับ Borland Delphi แต่ก็น่าดีใจว่ามีคนนำมาพัฒนาต่อแล้วเปิดเป็น LGPL ซึ่งก็คือฟรีและเปิดโค๊ด ผมชอบใจ Fortes Report ในรุ่นของ Lazarus มากคือเท่ห์ ถึงไม่ได้เร็วแบบ LazReport แต่แทบไม่มี bug มากวนใจเลยครับ
การติดตั้ง
- ผมลองดาวน์โหลดโค๊ดจากที่ต่างๆแล้วเช่น sourceforge ไม่สามารถ compile และติดตั้งผ่านใน Lazarus เลย ที่จะแนะนำคือให้ใช้ subversion (svn) เท่านั้น
- ถ้าเป็น linux ใช้คำสั่งนี้ได้เลย
svn co https://fortes4lazarus.svn.sourceforge.net/svnroot/fortes4lazarus fortes4lazarus
- ถ้าเป็นบนวินโดส์ ถ้าติดตั้ง TortoiseSVN ไว้แล้ว สร้างโฟลเดอร์เพื่อเก็บโค๊ดของ Fortes Report สมมติว่าผมสร้างโฟลเดอร์ชื่อ fortes4lazarus เรียบร้อยใช้ Explorer คลิกขวาแล้วเลือกเมนูของ TortoiseSVN คือ SVN Checkout… ใส่ https://fortes4lazarus.svn.sourceforge.net/svnroot/fortes4lazarus/trunk ตรงช่อง URL of repository
- ต่อไปก็เป็นกระบวนการดาวน์โหลดเพื่อดึง sourcecode ของ fortes report มาไว้บนเครื่องคอมพิวเตอร์ของเรา
การติดตั้ง
- เมื่อได้ sourcecode มาแล้วทำการติดตั้ง package ก็คล้ายๆกันของ LazReport ที่ผมกล่าวไปแล้ว จะเห็นชุดของ component ของ fortes report ดังรูปด้านล่าง

- จะเห็นเครื่องมือหลายอย่างค่อนข้างจะลายตา ค่อนข้างจะครบครัน มี barcode ให้ใช้ด้วย และตัวที่ช่วย export ตัว report เป็น HTML, pdf, CSV หรือแม้กระทั่ง Excel
การใช้งานอย่างย่อ
- สมมติว่ามีตัวแปรต่อ Database เรียบร้อยแล้วหรือใช้เครื่องมือจำพวก ZeosLib ก็สะดวกดีเหมือนกัน ขั้นตอนแรกสร้างฟอร์มเพื่อจะลากวาง component ลงบนฟอร์ม จะต่างกับ LazReport ตรงไม่มี Visual Designer แต่ก็ไม่ยากอะไรนัก จับลากวาง set property อะไรประมาณนี้
- อันดับแรกลากวาง TRLReport มาวางบนฟอร์มก่อน พอวางปุ๊บ ก็กลายเป็นกระดาษมีหน่วยเซ็นติเมตร ให้เราได้ออกแบบ report ได้ง่ายทั้งแนวราบและแนวดิ่ง

- เมื่อวาง TRLReport ผมตั้งชื่อว่า rptManDetail ตัวนี้เป็นตัวหลัก ตัวอื่นจะต้องลากมาวางบนตัวนี้เท่านั้น อันดับต่อไปคือลาก Band มาวาง Band ที่วางไปแล้วสามารถตั้งได้ว่าเป็นแบบไหนทีหลังได้แก่ Title, ColumnHeader, ColumnFooter, Header, Footer ,Summary, Detail
การใส่ฟิลด์
- พอวาง Band เสร็จ ก็ลาก TRLLabel ไปวางบน Band การใส่ฟิลด์ของ Dataset จะใส่ผ่านช่องนี้ ดูรูปด้านล่างประกอบ

การกำหนด Master – Detail
- ผมขอขยายความ report แบบ Master – Detail อีกนิดหนึ่่งว่าคือรายงานที่ประกอบไปด้วยตัวหลัก เช่นถ้าเป็นระบบ Timesheet ลูกจ้าง(Employee) แต่ละคน เป็น Master ตัว Detail ได้แก่ชั่วโมงทำงานของแต่ละคนในแต่ละวันเรียงลงมาเป็น period อาจจะเป็นสัปดาห์หรือหนึ่งเดือนก็แล้วแต่จะกำหนด
- ถ้าดูฟอร์มของผมจะเห็น Master-Detail มาดูกันนิดว่าจะ assign ใน Lazarus อย่างไร ตัว Fortes Report จะมองหา Datasource แทนที่จะเป็น Dataset อย่างใน LazReport
ความสัมพันธ์ Mater-Detail
- ผม drop TDatasource ลงบนฟอร์มสองตัวตั้งชื่อว่า Master กับ Detail และก็ drop TSQLQuery ตามลงไปสองตัว ตั้งชื่อว่า SQLMast และ SQLDetail ตามลำดับ มาดูความสัมพันธ์
Master.Dataset := SQLMast;
SQLMast.Database := FDBConnect;
SQLMast.Transaction := FTrans;
Detail.Dataset := SQLDetail;
SQLDetail.Database := FDBConnect;
SQLDetail.Transaction := FTrans;
SQLDetail.Datasource := Master //**** บรรทัดนี้สำคัญมากสำหรับ Master – Detail
- และที่สำคัญคือการ Query ใน SQLMast และ SQLDetail จะส่ง parameter ให้กันอย่างไรดูรูปด้านล่างประกอบ

ผลลัพธ์
- มาดูผลลัพธ์ของรายงานที่ได้

การ Export รายงานเป็น Excel
- ก็ขอเพิ่มเติมผมเห็นว่าเป็นฟีเจอร์ที่ค่อนข้างดีสำหรับ Fortes Report ทำการ drop “TRLXLSFilter” ลงไปบนฟอร์มที่มี Fortes Report อยู่ดังรูปตั้ง property ตัว Display Name = Export To Excel

- พอจะพิมพ์รายงานจะมี icon รูป diskette คลิกเพื่อทำการ export เลือก filter เป็น “Export To Excel” ตามที่เราตั้งไว้ แล้วใส่ชื่อไฟล์

ข้อดีและข้อด้อย
- ข้อดีคือใช้ง่ายไม่มีปัญหา สามารถ Export ข้อมูลจากรายงานได้หลากหลายฟอร์แม็ตมากกว่า LazReport ข้อเสียดูจะใช้งานยากกว่า LazReport นิดเดียว เมื่อใช้งานบ่อยๆก็จะเป็นเรื่องง่ายๆ