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

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

[VB.NET] แจกฟรีโค้ด ActiveReports.NET การพิมพ์ใบแจ้งค่าใช้จ่าย สำหรับหอพัก ห้องเช่า อพาร์ทเมนท์ แบบกระดาษครึ่ง A4

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

174

กระทู้

221

โพสต์

1680

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
1680


หลายวันก่อนก็แจกเป็นโปรแกรมไปเรียบร้อย (สามารถดาวน์โหลดได้ที่นี่) วันนี้มาแจกเป็นโค้ดเพื่อให้ได้นำไปศึกษาเรียนรู้กันครับผม โค้ด Visual Basic .Net ที่อ่านข้อมูลจาก Excel หรือการ Import ข้อมูลจากเวิร์คชีตของตาราง Excel เข้ามาสู่ตารางกริด จากนั้นก็นำผลไปพิมพ์เป็นใบแจ้งหนี้ หรือใบแจ้งค่าใช้จ่ายด้วย ActiveReports .Net (AR)  ...

สำหรับการพิมพ์รายงานแบบนี้ค่อนข้างจะแปลกประหลาดไปจากที่หลายๆคนอาจจะเคยเห็นๆมา เพราะว่าเป็นการนำเอาข้อมูลจากหลักมาพิมพ์ในแนวแถวแทน โดยพิจารณาจากภาพประกอบด้านบนซึ่งเป็น Excel เริ่มต้นจากหลักที่ 3 (Index = 2) หรือหลัก C เราเอาค่าในเซลล์ C1 มาพิมพ์ลง Detail ของ AR ในแถวแรก จากนั้นเลื่อนแถวถัดไปคือเซลล์ C2 (จำนวนเงิน) แต่กลับเอามาพิมพ์ต่อในแถวเดิม แต่เลื่อนหลักไป ... งงมั้ยครับ 5555+ ... คือต้องไปดูที่โค้ดในส่วนโปรแกรมย่อย Detail ของ AR แล้วต้องทำการ Debugger จะทำให้คุณเข้าใจได้ชัดเจนขึ้นครับ ...

หัวข้อที่เกี่ยวข้อง ...
การเรียกใช้งาน ActiveReports .NET แบบเบื้องต้น
[VB.NET] ก้าวแรกกับการพิมพ์รายงานด้วย ActiveReports .NET
[VB.NET] พื้นฐานการพิมพ์รายงานด้วย ActiveReports .NET ลงบนกระดาษขนาด A4

แอดมินได้อธิบายรายละเอียด ActiveReports (AR) ไล่เรียงกันมาตามหัวข้อด้านบนแล้ว ดังนั้นจึงจะไม่ขออธิบายเพิ่มเติมล่ะกันครับผม ... สำหรับบทความนี้เราจะไม่ใช้งาน Excel Object แต่เป็นการใช้ OLEDB เพื่อจัดการหรือติดต่อกับไฟล์ Excel file แทน

มาดูโค้ดในส่วนของการ Import ไฟล์ Excel ด้วยการติดต่อผ่าน ADO.NET ... นั่นคือเราจะมอง Excel เป็นเสมือนไฟล์ฐานข้อมูล
  1.     ' / --------------------------------------------------------------------
  2.     ' / เลือกไฟล์ Excel เข้ามา
  3.     Private Sub btnBrowse_Click(sender As System.Object, e As System.EventArgs) Handles btnBrowse.Click
  4.         ' ประกาศใช้งาน Open File Dialog ในแบบ Run Time
  5.         Dim dlgOpenFile As OpenFileDialog = New OpenFileDialog()

  6.         ' / ตั้งค่าการใช้งาน Open File Dialog
  7.         With dlgOpenFile
  8.             .InitialDirectory = MyPath(Application.StartupPath)
  9.             .Title = "เลือกไฟล์ MS Excel"
  10.             .Filter = "MS Excel Files (*.xlsx;*.xls)|*.xlsx;*xls"
  11.             .FilterIndex = 1
  12.             .RestoreDirectory = True
  13.         End With
  14.         ' / หากเลือกปุ่ม OK หลังจากการ Browse ...
  15.         If dlgOpenFile.ShowDialog() = DialogResult.OK Then
  16.             txtFileName.Text = dlgOpenFile.FileName
  17.             Dim strConn As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
  18.                 dlgOpenFile.FileName & "; Extended Properties=""Excel 12.0 Xml; HDR=YES"";"
  19.             Dim Conn As New OleDbConnection(strConn)
  20.             Conn.Open()
  21.             ' / มอง WorkSheet ให้เป็นตารางข้อมูล (Table)
  22.             Dim dtSheets As DataTable = Conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
  23.             Dim drSheet As DataRow

  24.             cmbSheetName.Items.Clear()
  25.             ' / นำรายชื่อ WorkSheet ทั้งหมด มาเก็บไว้ที่ ComboBox เพื่อรอให้ User เลือกนำไปใช้งาน
  26.             For Each drSheet In dtSheets.Rows
  27.                 cmbSheetName.Items.Add(drSheet("TABLE_NAME").ToString())
  28.             Next
  29.             Conn.Close()
  30.             '//
  31.             dgvData.Columns.Clear()
  32.         End If

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

โค้ดในการติดต่อกับ WorkSheet ... เรามองเวิร์คชีตเป็นเหมือนตารางข้อมูล (Table)
  1.     ' / --------------------------------------------------------------------
  2.     ' / เลือก WorkSheet เพื่อนำข้อมูลมาแสดงผลในตารางกริด
  3.     Private Sub cmbSheetName_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbSheetName.SelectedIndexChanged
  4.         Dim Conn As OleDbConnection
  5.         Dim Cmd As OleDbCommand
  6.         Dim DAP As OleDbDataAdapter
  7.         Dim DS As DataSet

  8.         Dim strConn As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
  9.             txtFileName.Text & "; Extended Properties=""Excel 12.0 Xml; HDR=YES"";"
  10.         Try
  11.             Conn = New OleDbConnection
  12.             Conn.ConnectionString = strConn
  13.             Cmd = New OleDbCommand
  14.             '// เสมือน WorkSheet เป็น Table ในฐานข้อมูล
  15.             Cmd.CommandText = "Select * FROM [" & cmbSheetName.Text & "]"
  16.             Cmd.Connection = Conn
  17.             DAP = New OleDbDataAdapter(Cmd)
  18.             DS = New DataSet
  19.             Conn.Open()
  20.             DAP.Fill(DS, "MySheet")
  21.             '// ผูกข้อมูล (Bound Data)
  22.             dgvData.DataSource = DS.Tables("MySheet")
  23.             Call InitGrid()
  24.         Catch ex As Exception
  25.             MessageBox.Show(ex.Message)
  26.         Finally
  27.             Conn = Nothing
  28.             Cmd = Nothing
  29.             DAP = Nothing
  30.             DS = Nothing
  31.         End Try
  32.     End Sub
คัดลอกไปที่คลิปบอร์ด

โค้ดในส่วนของการผูก ActiveReports Designer เข้ากับ ARViewer
  1.     ' / --------------------------------------------------------------------
  2.     Private Sub dgvData_DoubleClick(sender As Object, e As System.EventArgs) Handles dgvData.DoubleClick
  3.         If dgvData.Rows.Count <= 0 Then Exit Sub
  4.         ' Instance name ARDesigner มันจะชี้ไปที่ไฟล์ arRentRoomBill.vb
  5.         Dim rpt As New arRentRoomBill
  6.         ' โหลดรายงาน document (arRentRoomBill) เข้าสู่ ActiveReports Viewer
  7.         '// Zoom 95%
  8.         Me.Viewer1.ReportViewer.Zoom = 0.95
  9.         Me.Viewer1.Document = rpt.Document
  10.         ' Run Report
  11.         rpt.Run()
  12.     End Sub
คัดลอกไปที่คลิปบอร์ด

โค้ดในการตั้งค่าการพิมพ์ให้กับ ActiveReports Designer ...
  1.     ' / --------------------------------------------------------------------
  2.     ' / ก่อนเริ่มการพิมพ์มาตั้งค่าให้ Report ก่อน
  3.     Private Sub arRentRoomBill_ReportStart(sender As Object, e As System.EventArgs) Handles Me.ReportStart
  4.         '/ การตั้งค่าหน้ากระดาษ
  5.         With PageSettings
  6.             ' หน่วยวัดเป็นนิ้ว
  7.             .Margins.Left = CmToInch(1) ' แปลงค่า 1.0 ซม. เป็นนิ้ว
  8.             .Margins.Right = 0.1
  9.             .Margins.Top = 0.5
  10.             .Margins.Bottom = 0.2
  11.             ' ตั้งค่ากระดาษแนวตั้ง
  12.             .Orientation = PageOrientation.Portrait
  13.             ' กระดาษขนาด A4
  14.             '.PaperKind = Drawing.Printing.PaperKind.A4
  15.             ' กรณีที่กำหนดขนาดกระดาษเอง
  16.             .PaperKind = Drawing.Printing.PaperKind.Custom
  17.             .PaperWidth = CmToInch(21) ' 21 ซม.
  18.             .PaperHeight = CmToInch(14.8)
  19.         End With
  20.         '/ ปกติต้องเคลียร์ค่าต่างๆของ TextBox ก่อนการพิมพ์
  21.         txtItem.Text = ""
  22.         txtDesc.Text = ""
  23.         txtHeader.Text = ""
  24.         txtUnitPrice.Text = ""
  25.         txtQTY.Text = ""
  26.         txtAmount.Text = ""
  27.         txtGrandTotal.Text = ""
  28.         '// แสดงกิจการและที่อยู่ โดยการอ่านค่าจาก INI (Initialized File)
  29.         Dim strFileINI As String = MyPath(Application.StartupPath) & "Config.ini"
  30.         If My.Computer.FileSystem.FileExists(strFileINI) Then
  31.             txtOwner.Text = ReadIni(strFileINI, "Config", "Owner", "")
  32.             txtAddress.Text = ReadIni(strFileINI, "Config", "Address", "")
  33.             txtHeader.Text = ReadIni(strFileINI, "Config", "Header", "")
  34.             lblRemark1.Text = ReadIni(strFileINI, "Config", "Remark1", "")
  35.             lblRemark2.Text = ReadIni(strFileINI, "Config", "Remark2", "")
  36.             '// กรณีไม่เจอ ให้เริ่มต้นค่าใหม่
  37.         Else
  38.             txtOwner.Text = "ทองก้อน ฮาเร็ม อพาร์ทเมนท์"
  39.             txtAddress.Text = "123/456 ถ.กลางเมือง ต.เมืองเก่า อ.เมือง จ.ขอนแก่น โทร.043-XXX-XXX"
  40.             txtHeader.Text = "- ใบแจ้งค่าใช้จ่าย -"
  41.             lblRemark1.Text = "[1] กรุณาชำระเงินภายในวันที่ 32 ของทุกเดือน"
  42.             lblRemark2.Text = "[2] การเงินมีปัญหา ใส่ชุดนักศึกษามาหาป๋าทองก้อนได้ตลอด 24 ชั่วโมง"
  43.         End If
  44.         txtDate.Text = FormatDateTime(Now(), DateFormat.GeneralDate)
  45.         '// อ่านค่าชื่อ WorkSheet มาพิมพ์ประจำเดือน (ตัวอย่าง "สิงหาคม 2560")
  46.         Dim strMonth As String = frmMainBill.cmbSheetName.Text
  47.         '// ตัดคำที่ไม่ต้องการคือ $
  48.         strMonth = strMonth.Replace("'", "").Replace("[        DISCUZ_CODE_3        ]quot;, "")
  49.         txtDateReciept.Text = strMonth

  50.         '// รับค่า "แถว" ที่ถูกเลือกในตารางกริด
  51.         sRow = frmMainBill.dgvData.CurrentRow.Index
  52.         '// หลักแรกกับหลักที่ 2
  53.         txtCname.Text = frmMainBill.dgvData.Rows(sRow).Cells(0).Value
  54.         txtRoomNo.Text = frmMainBill.dgvData.Rows(sRow).Cells(1).Value
  55.     End Sub
คัดลอกไปที่คลิปบอร์ด

โค้ดในส่วนของการพิมพ์รายละเอียด ... ขอให้สังเกตว่า ข้อมูลการพิมพ์มันจัดเรียงต่อกันในแนวนอน แต่จริงๆเราจะต้องเอาทีละหลักมาพิมพ์
  1.     ' / --------------------------------------------------------------------
  2.     Private Sub Detail1_Format(sender As Object, e As System.EventArgs) Handles Detail1.Format
  3.         '// ItemNo หรือลำดับที่ โดยจะเริ่มจาก 1
  4.         txtItem.Text = ItemNo
  5.         With frmMainBill
  6.             '// อ่านค่าเริ่มจากหลัก 2 ดังนั้น ItemNo จึงต้อง +1 เพื่ออ่านค่าจาก Header มาแสดงผล
  7.             '// โดยเรียงตามลำดับ --> ค่าเช่าห้อง(หลักที่ 2), ค่าไฟฟ้า(3), ค่าน้ำ(4), ค่าอินเทอร์เน็ต(5), ค่าเคเบิ้ลทีวี(6) และค่าเก็บขยะ(7)
  8.             txtDesc.Text = .dgvData.Columns(ItemNo + 1).HeaderText
  9.             txtQTY.Text = "1"
  10.             '// อ่านค่าข้อมูลจากแถวที่เลือกมา (sRow) และข้อมูลอยู่ในหลัก 2 (และเลื่อนหลักถัดๆไป)
  11.             txtUnitPrice.Text = Format(Val(.dgvData.Rows(sRow).Cells(ItemNo + 1).Value), "#,##0.00")
  12.             txtAmount.Text = txtUnitPrice.Text
  13.         End With
  14.         ' รวมจำนวนเงินผ่านทางตัวแปร
  15.         GrandTotal = GrandTotal + CDbl(txtUnitPrice.Text)
  16.         txtGrandTotal.Text = "รวมเงิน: " & Format(GrandTotal, "#,##0.00") & " บาท."
  17.     End Sub
คัดลอกไปที่คลิปบอร์ด
ส่วนสำคัญ ... ต้องใจเย็นๆช้าๆในการไล่แกะและทำความเข้าใจกับโค้ดครับ เพราะเป็นการอ่านค่าจากแถวใดแถวหนึ่ง (sRow) ที่เลือกขึ้นมา แต่ข้อมูลที่จะพิมพ์จะไล่ไปทีละหลัก คืออ่านค่าข้อมูลในแนวนอนตั้งแต่หลักที่ 2 (ค่า Index) แต่เอาข้อมูลในหลักนั้นมาพิมพ์ทีละแถวเรียงลงไปแทน ...

โค้ดในส่วนของการตรวจสอบว่าหมดข้อมูล (จำนวนหลัก) ที่จะพิมพ์แล้วหรือยัง ...
  1.     ' ตัวแปรนี้ต้องประกาศเป็นแบบ Public (เฉพาะ arRoomReciept) เพื่อให้ส่วนของ Detail1_Format และ FetchData มองเห็นด้วย
  2.     Private ItemNo As Integer
  3.     Private GrandTotal As Double
  4.     '// เลือกจากแถวในตารางกริด
  5.     Private sRow As Integer

  6.     ' / --------------------------------------------------------------------
  7.     ' / จะเกิดการนับตามจำนวนหลักคือ 6 หลัก ข้อมูลการพิมพ์ก็จะหมด eArgs.EOF = True
  8.     Private Sub arRentRoomBill_FetchData(sender As Object, eArgs As DataDynamics.ActiveReports.ActiveReport.FetchEventArgs) Handles Me.FetchData
  9.         ItemNo = ItemNo + 1
  10.         '/ ตรวจสอบจำนวนการพิมพ์ทั้งหมด ซึ่งจะมีทั้งหมด 6 หลัก
  11.         '/ 2 หลักแรกคือ ชื่อผู้เช่า (0) และ หมายเลขห้อง (1) เราพิมพ์ที่ PageHeader ไปแล้ว ก็ให้ข้ามไป
  12.         '/ หลักที่ต้องนำมาพิมพ์ตามแถวเรียงตามลำดับ --> ค่าเช่าห้อง(หลักที่ 2), ค่าไฟฟ้า(3), ค่าน้ำ(4), ค่าอินเทอร์เน็ต(5), ค่าเคเบิ้ลทีวี(6) และค่าเก็บขยะ(7)
  13.         If ItemNo > 6 Then
  14.             '/ หากหมดแล้วก็จบการพิมพ์
  15.             eArgs.EOF = True
  16.             Exit Sub
  17.             '/ ยังไม่หมดข้อมูล
  18.         Else
  19.             eArgs.EOF = False
  20.         End If
  21.     End Sub
คัดลอกไปที่คลิปบอร์ด
กรณีที่จำนวนหลักในไฟล์ Excel เปลี่ยนแปลงไปไม่ตรงกับตัวอย่าง ... แอดมินวางยาเอาไว้แถวๆนี้แหละ หากเข้าใจในตัวโค้ดก็จะแก้ปัญหาได้ครับ อิอิอิอิ

สำหรับโค้ดเรื่องของ Initialize File หรือ INI แอดมินขอแยกมาอยู่อีกหัวข้อหนึ่งล่ะกันครับ การประยุกต์ใช้งานไฟล์ INI (Initialize File) มาทำการเก็บข้อมูลขนาดเล็ก   

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

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

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

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

0

กระทู้

33

โพสต์

163

เครดิต

Member

Rank: 2

เครดิต
163
โพสต์ 2017-11-17 17:22:09 | ดูโพสต์ทั้งหมด

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

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

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

GMT+7, 2019-4-20 19:56 , Processed in 0.239180 second(s), 5 queries , File On.

Powered by Discuz! X3.3 R20170401, Rev.54

© 2001-2017 Comsenz Inc.

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