LazReport & Fortes Report สองสิงห์เครื่องมือจัดทำ Report สำหรับ Lazarus

  • หายหน้าหายตาไปนานทีเดียว จนคนสงสัยว่าจะเลิกเขียน 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 ดังรูปด้านล่าง
Lazreport บน palette ของ Lazarus

การใช้งานอย่างย่อ

  • วิธีใช้งานคร่าวๆดูที่  website ของ Lazarus ตามลิงค์นี้ ตัวอย่างการใช้งานมีอยู่ 3-4 ตัวอย่างสามารถเปิดได้ด้วย Lazarus อยู่ที่โฟลเดอร์ย่อย samples
  • ถ้าเป็นของผมก็ประมาณรูปด้านล่้าง
การใส่ component ของ Lazreport ลงบนฟอร์ม
  •  ผมใช้ 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
การออกแบบ Report
  • และอีกตัวที่ไม่พูดไม่ได้คือ 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 ได้ดังรูปด้านล่าง
ผลลัพธ์ที่ได้จาก Lazreport

ข้อดีและข้อด้อย

  • ข้อดีคือเร็ว มี 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 ดังรูปด้านล่าง
Fortes Report บน palette ของ Lazarus
  • จะเห็นเครื่องมือหลายอย่างค่อนข้างจะลายตา ค่อนข้างจะครบครัน มี barcode ให้ใช้ด้วย และตัวที่ช่วย export ตัว report เป็น HTML, pdf, CSV หรือแม้กระทั่ง Excel

การใช้งานอย่างย่อ

  • สมมติว่ามีตัวแปรต่อ Database เรียบร้อยแล้วหรือใช้เครื่องมือจำพวก ZeosLib ก็สะดวกดีเหมือนกัน ขั้นตอนแรกสร้างฟอร์มเพื่อจะลากวาง component ลงบนฟอร์ม จะต่างกับ LazReport ตรงไม่มี Visual Designer แต่ก็ไม่ยากอะไรนัก จับลากวาง set property อะไรประมาณนี้
  • อันดับแรกลากวาง TRLReport มาวางบนฟอร์มก่อน พอวางปุ๊บ ก็กลายเป็นกระดาษมีหน่วยเซ็นติเมตร ให้เราได้ออกแบบ report ได้ง่ายทั้งแนวราบและแนวดิ่ง
การออกแบบ report ด้วย Fortes Report
  • เมื่อวาง TRLReport ผมตั้งชื่อว่า rptManDetail ตัวนี้เป็นตัวหลัก ตัวอื่นจะต้องลากมาวางบนตัวนี้เท่านั้น อันดับต่อไปคือลาก Band มาวาง Band ที่วางไปแล้วสามารถตั้งได้ว่าเป็นแบบไหนทีหลังได้แก่ Title, ColumnHeader, ColumnFooter, Header, Footer ,Summary, Detail

การใส่ฟิลด์

  • พอวาง Band เสร็จ ก็ลาก TRLLabel ไปวางบน Band การใส่ฟิลด์ของ Dataset จะใส่ผ่านช่องนี้ ดูรูปด้านล่างประกอบ
การ set property ใส่ชื่อฟิลด์

การกำหนด 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 ให้กันอย่างไรดูรูปด้านล่างประกอบ
การส่งผ่านพารามิเตอร์อของการ Query

ผลลัพธ์

  • มาดูผลลัพธ์ของรายงานที่ได้
ผลลัพธ์ที่ได้จาก Fortes Report

การ Export รายงานเป็น Excel

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

ข้อดีและข้อด้อย

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

Leave a Reply

Your email address will not be published. Required fields are marked *