ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 3606|ตอบกลับ: 1

[VB.NET] การพิมพ์รายงานด้วย ActiveReports .NET แบบวิธีการ UnBound Data

[คัดลอกลิงก์]

311

กระทู้

502

โพสต์

6050

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6050




วิธีการ Bound Data และการ UnBound Data ได้กล่าวซ้ำๆไปหลายรอบแล้ว แอดมินเลยขอข้ามในส่วนนี้ไปนะครับ ตามปกติเราๆท่านๆก็มักจะใช้วิธี Bound โดยการเลือก Data Source เข้ามา จากนั้นก็นำ TextBox มาผูกเข้าไว้กับฟิลด์ข้อมูล ในขณะทำการออกแบบ หรือ Design Time ซึ่งวิธีการนี้มันง่าย รวดเร็วดี แต่มีข้อจำกัดอยู่หลายประการ ทำให้ขาดความยืดหยุ่นไป เช่น หากเราต้องการเปลี่ยน Data Source จาก MS Access ไปเป็น MySQL Server หรือหาก Data Source เกิดมีปัญหา ไฟล์พังหรือหายไป เอ้อเหรอ (Error) อย่างแน่นอน ทำให้เราต้องเริ่มกระบวนการใหม่ทั้งหมด  แต่บทความนี้คือการไม่ผูกแหล่งจ่ายข้อมูล (Data Source) เอาไว้กับหน้ารายงานของ ActiveReports อ้าววว !!! แล้วมันผูกฟิลด์ข้อมูลเข้ากับ TextBox ได้อย่างไร ... แอดมินจะไล่เรียงการทำงานไปในแต่ละขั้นตอนให้ดูครับ

เริ่มจาก ReportStart ใน ActiveReports เพื่อทำการเชื่อมต่อฐานข้อมูล ... ปกติแล้วกระบวนการนี้เราจะเริ่มต้นมาตั้งแต่การเปิดฟอร์มหลัก แต่แอดมินนำมาแปะไว้เพื่อเป็นตัวอย่าง สำหรับท่านที่เผลอเข้ามาที่เว็บบอร์ดแห่งนี้ ต้องทำความเข้าใจในจุดประสงค์ของไฟล์ modDataBase.vb ซึ่งเป็นโมดูลเพื่อประกาศตัวแปรแบบ Public ด้วย เพราะว่าตัวแปรเหล่านี้เราจะต้องใช้งานมันบ่อยครั้งมากครับผม
  1.     '// Start Here.
  2.     Private Sub NewActiveReport1_ReportStart(sender As Object, e As System.EventArgs) Handles Me.ReportStart
  3.         '/ การตั้งค่าหน้ากระดาษ
  4.         With PageSettings
  5.             '/ หน่วยวัดเป็นนิ้ว แต่ใช้การแปลงหน่วยด้วย CmToInch เข้าช่วย หากเราถนัดหน่วยวัด ซม.
  6.             .Margins.Left = CmToInch(1) '// แปลงค่า 1.0 ซม. เป็นนิ้ว
  7.             .Margins.Right = 0.1
  8.             .Margins.Top = 1.0
  9.             .Margins.Bottom = 0.2
  10.             ' ตั้งค่ากระดาษแนวตั้ง
  11.             .Orientation = PageOrientation.Portrait
  12.             ' กระดาษขนาด A4
  13.             .PaperKind = Drawing.Printing.PaperKind.A4
  14.         End With

  15.         '// เคลียร์ค่าก่อนการพิมพ์
  16.         txtFullName.Text = ""
  17.         txtNickName.Text = ""
  18.         txtPositionName.Text = ""
  19.         txtDepartmentName.Text = ""

  20.         '// เริ่มต้นการเชื่อมต่อฐานข้อมูล
  21.         Try
  22.             '// Connect to DataBase. ปกติเราเชื่อมต่อฐานข้อมูลจากฟอร์มหลักมาเลยก็ได้
  23.             Conn = ConnectDataBase()
  24.             '// ทำการ Query ฟิลด์ข้อมูลที่ต้องการมาแสดงผล
  25.             strSQL = _
  26.                 " SELECT tblContact.ContactPK, tblContact.Fullname, tblContact.Nickname, tblPosition.PositionName, tblDepartment.DepartmentName " & _
  27.                 " FROM tblDepartment INNER JOIN (tblPosition INNER JOIN tblContact ON tblPosition.PositionPK = tblContact.PositionFK) ON tblDepartment.DepartmentPK = tblContact.DepartmentFK " & _
  28.                 " ORDER BY ContactPK, FullName ASC "
  29.             '// Open connection and create DataReader.     
  30.             Cmd = New OleDbCommand(strSQL, Conn)
  31.             If Conn.State = ConnectionState.Closed Then Conn.Open()
  32.             DR = Cmd.ExecuteReader()

  33.         Catch ex As Exception
  34.             MessageBox.Show(ex.Message)
  35.         End Try

  36.     End Sub
คัดลอกไปที่คลิปบอร์ด


สร้าง Field Collection ใน DataInitialize ... ก็เพราะเราไม่ได้ผูก Data Source จึงจำเป็นต้องสร้างฟิลด์ข้อมูลต่างๆขึ้นมาใหม่ ในตัวอย่างนี้จะใช้งานง่ายๆเพียง 4 ฟิลด์
  1.     '// Add fields to the report's fields collection.
  2.     Private Sub NewActiveReport1_DataInitialize(sender As Object, e As System.EventArgs) Handles Me.DataInitialize
  3.         Fields.Add("FullName")
  4.         Fields.Add("NickName")
  5.         Fields.Add("PositionName")
  6.         Fields.Add("DepartmentName")
  7.     End Sub
คัดลอกไปที่คลิปบอร์ด


การนำข้อมูลไปผูกเข้ากับฟิลด์ ใน FetchData ... การ Fetch ก็คือการเรียกข้อมูลเขามาใหม่ในแต่ละรายการ (Record) ที่เราทำการ Query เข้ามา หากข้อมูลนั้นยังไม่หมดรายการ หากค่า EOF (End Of File) = False (เท็จ) นั่นคือมันยังไม่หมดข้อมูล ก็จะนำค่าที่ Fetch เข้ามาไปพิมพ์ที่ Detail1_Format แต่หาก EOF = True (จริง) แสดงว่าไม่มีรายการข้อมูลที่จะพิมพ์ ก็จะไปที่ ReportEnd แทน เพื่อสิ้นสุดงานพิมพ์
  1.     '// Retrieve information to populate the report fields.
  2.     Private Sub NewActiveReport1_FetchData(sender As Object, eArgs As DataDynamics.ActiveReports.ActiveReport.FetchEventArgs) Handles Me.FetchData
  3.         Try
  4.             DR.Read()
  5.             '// นำข้อมูลมาผูกเข้ากับฟิลด์ที่เรากำหนดบน ActiveReports
  6.             Me.Fields("FullName").Value = DR("FullName")
  7.             Me.Fields("NickName").Value = DR("NickName")
  8.             Me.Fields("PositionName").Value = DR("PositionName")
  9.             Me.Fields("DepartmentName").Value = DR("DepartmentName")
  10.             '// ยังไม่หมดข้อมูล End Of File = เท็จ ... กระโดดไปพิมพ์ที่ Detail1_Format อีกครั้ง
  11.             eArgs.EOF = False

  12.         Catch ex As Exception
  13.             '// แสดงว่าหมดข้อมูลแล้ว นั่นคือสิ้นสุดการพิมพ์
  14.             eArgs.EOF = True
  15.         End Try
  16.     End Sub
คัดลอกไปที่คลิปบอร์ด


การพิมพ์รายละเอียดใน Detail1_Format ... จากเหตุการณ์ FetchData หาก EOF = False มันจะเกิดการพิมพ์รายละเอียดของรายงานที่นี่
  1.     '// หากเหตุการณ์ FetchData ทำให้ EOF = False แสดงว่ายังไม่หมดข้อมูล จะเกิดการพิมพ์ไปเรื่อยๆ
  2.     Private Sub Detail1_Format(sender As System.Object, e As System.EventArgs) Handles Detail1.Format
  3.         '// นำค่าจากฟิลด์ที่เรากำหนดมาแสดงผลใน TextBox ของ ActiveReports
  4.         txtFullName.Text = Me.Fields("FullName").Value
  5.         txtNickName.Text = Me.Fields("NickName").Value
  6.         txtPositionName.Text = Me.Fields("PositionName").Value
  7.         txtDepartmentName.Text = Me.Fields("DepartmentName").Value
  8.     End Sub
คัดลอกไปที่คลิปบอร์ด


โมดูลหากิน modDataBase.vb แอดมินทำการจัดเก็บตัวแปรที่สำคัญๆ และต้องใช้งานบ่อยๆเอาไว้ที่นี่ที่เดียว ดังนั้นจึงต้องประกาศตัวแปร และฟังค์ชั่นเป็นแบบ Public ทั้งหมด หมายความว่าทุกๆฟอร์ม จะสามารถมองเห็นได้ทั้งหมด
  1. Imports System.Data.OleDb
  2. Imports Microsoft.VisualBasic

  3. Module modDataBase
  4.     '// Declare variable one time but use many times.
  5.     Public Conn As OleDbConnection
  6.     Public Cmd As OleDbCommand
  7.     Public DS As DataSet
  8.     Public DR As OleDbDataReader
  9.     Public DA As OleDbDataAdapter
  10.     Public strSQL As String '// Major SQL
  11.     Public strStmt As String    '// Minor SQL

  12.     '// Data Path
  13.     Public strPathData As String = MyPath(Application.StartupPath)
  14.     '// Images Path
  15.     'Public strPathImages As String = MyPath(Application.StartupPath)

  16.     Public Function ConnectDataBase() As System.Data.OleDb.OleDbConnection
  17.         strPathData = MyPath(Application.StartupPath) & "Data"
  18.         'strPathImages = MyPath(Application.StartupPath) & "Images"
  19.         Dim strConn As String = _
  20.             "Provider = Microsoft.ACE.OLEDB.12.0;" & _
  21.             "Data Source = " & strPathData & "Contact.accdb"

  22.         Conn = New OleDb.OleDbConnection(strConn)
  23.         ' Create Connection
  24.         Conn.ConnectionString = strConn
  25.         ' Return
  26.         Return Conn
  27.     End Function

  28.     ' / --------------------------------------------------------------------------------
  29.     ' / Get my project path
  30.     ' / AppPath = C:\My Project\bin\debug
  31.     ' / Replace "\bin\debug" with ""
  32.     ' / Return : C:\My Project\
  33.     Function MyPath(AppPath As String) As String
  34.         '/ MessageBox.Show(AppPath);
  35.         AppPath = AppPath.ToLower()
  36.         '/ Return Value
  37.         MyPath = AppPath.Replace("\bin\debug", "").Replace("\bin\release", "").Replace("\bin\x86\debug", "")
  38.         '// If not found folder then put the \ (BackSlash) at the end.
  39.         If Right(MyPath, 1) <> "" Then MyPath = MyPath & ""
  40.     End Function
  41. End Module
คัดลอกไปที่คลิปบอร์ด


ฟอร์มหลักที่ใช้ในการ Preview รายงานของ ActiveReports ...
  1. Public Class frmUnBoundData

  2.     Private Sub btnPreview_Click(sender As System.Object, e As System.EventArgs) Handles btnPreview.Click
  3.         '// ประกาศตัวแปร rpt จากหน้ารายงาน ActiveReports
  4.         Dim rpt As New NewActiveReport1
  5.         '// สั่งรัน
  6.         rpt.Run()
  7.         Me.Viewer1.ReportViewer.Zoom = 1    '(100%)
  8.         '// แสดงผลรายงานเอกสาร
  9.         Me.Viewer1.Document = rpt.Document
  10.     End Sub

  11.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  12.         Me.Close()
  13.     End Sub

  14.     Private Sub frmUnBoundData_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  15.         Me.Dispose()
  16.         Application.Exit()
  17.     End Sub

  18. End Class
คัดลอกไปที่คลิปบอร์ด


Conclusion: จะเห็นได้ว่าการพิมพ์รายงานด้วย ActiveReports .NET นั้นไม่ได้ยากเย็นแสนเข็ญอะไรเลย มันจึงเป็นอีกหนึ่งทางเลือกของการทำรายงาน ... สวัสดี

ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...


ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

1

กระทู้

13

โพสต์

91

เครดิต

Member

Rank: 2

เครดิต
91
โพสต์ 2022-10-18 21:25:57 | ดูโพสต์ทั้งหมด

ขอบคุณครับอาจารย์ ที่มอบสิ่งดีดีให้
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-4-25 04:21 , Processed in 0.322117 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้