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

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

[VB6/VB.NET] แจกโค้ดการรับค่าน้ำหนัก เพื่อทำการคำนวณหาอัตราค่าบริการขนส่ง

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

311

กระทู้

502

โพสต์

6050

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
6050



วันนี้แจกโค้ดทั้ง VB6 และ VB.NET ในการรับค่าน้ำหนักพัสดุ เพื่อทำการคำนวณหาราคาค่าบริการขนส่ง ซึ่งมีกระบวนการวิธีที่คิดเหมือนกัน แตกต่างกันเพียงแค่คำสั่งที่ใช้งานเท่านั้น โดยแอดมินสมมุติราคาค่าบริการดังนี้ ...


ตัวอย่างจะยังไม่มีการจัดเรียงตามค่าน้ำหนักสูงสุด (MaxWeight)


สมมุติเราชั่งน้ำหนักได้ 500 กรัม
เมื่อทำการจัดเรียงข้อมูลใหม่ และการทำ Query ด้วยเงื่อนไขมากกว่า หรือ เท่ากับ มันจะแสดงผลออกมาทั้งหมด ดังนั้นหากเราต้องการคำตอบที่ถูกต้องเพียง 1 เดียว ต้องใช้ TOP 1 เพื่อเลือกรายการแรกสุดมาเป็นคำตอบ โดยไม่จำเป็นต้องเปรียบเทียบค่าในแต่ละ Record เลย ... ง่ายมั้ยครับ


มาดูโค้ดหลักของ VB6 ...
  1. Option Explicit

  2. Private Sub Form_Load()
  3.     txtWeight.Text = ""
  4.     txtWeight.MaxLength = 5
  5.     txtFee.Text = ""
  6.     '// Connect MS Access DataBase
  7.     Call OpenDataBase
  8. End Sub

  9. Private Sub Form_Unload(Cancel As Integer)
  10.     Call CloseDataBase
  11.     End
  12. End Sub

  13. Private Sub txtFee_KeyPress(KeyAscii As Integer)
  14.     '// ป้องกันการกดคีย์ใดๆลงไป
  15.     KeyAscii = 0
  16. End Sub

  17. Private Sub txtWeight_KeyPress(KeyAscii As Integer)
  18.     '// ไม่มีการป้อนค่าใดๆ หรือป้อนค่า 0
  19.     If Trim(txtWeight.Text) = "" Or Val(txtWeight.Text) = 0 Then Exit Sub
  20.     '// กดคีย์ Enter
  21.     If KeyAscii = 13 Then
  22.         Dim FeeService As Double
  23.         KeyAscii = 0
  24.         FeeService = CalFee(CDbl(txtWeight.Text))
  25.         '// ค่าที่รีเทิร์นกลับมาต้องมากกว่า 0 จึงจะแสดงผล
  26.             If FeeService > 0 Then
  27.                 txtFee.Text = FeeService
  28.             Else
  29.                 txtWeight.Text = ""
  30.                 txtFee.Text = ""
  31.                 lblFeeName.Caption = ""
  32.                 MsgBox "คุณป้อนพิกัดน้ำหนักมากกว่าระบบกำหนดเอาไว้.", vbOKOnly + vbExclamation, "รายงานสถานะ"
  33.             End If
  34.     '// เช็คคีย์ที่กดต้องเป็น 0 - 9
  35.     Else
  36.         KeyAscii = CheckDigitOnly(KeyAscii)
  37.     End If
  38. End Sub

  39. ' / --------------------------------------------------------------------------
  40. ' / ฟังค์ชั่นในการคำนวณอัตราราคาตามจำนวนน้ำหนัก
  41. Function CalFee(ByVal Weight As Double) As Double
  42. ' / --------------------------------------------------------------------------
  43.     CalFee = 0
  44.     '// ประกาศ Instance Name ใหม่ และเพื่อให้แน่ใจว่าตัด RecordSet ทิ้งไปแล้ว
  45.     Set RS = New Recordset
  46.     '// เลือกเอาค่าแรกที่ได้มา (TOP 1) และต้องให้จัดเรียงตามน้ำหนักสูงสุด (MaxWeight)
  47.     Statement = _
  48.         " SELECT  TOP 1 tblFee.FeePK, tblFee.FeeName, tblFee.FeeCharge, tblFee.MaxWeight " & _
  49.         " FROM tblFee " & _
  50.         " WHERE [MaxWeight] >= " & Val(txtWeight.Text) & _
  51.         " ORDER BY tblFee.FeeCharge "
  52.     RS.CursorLocation = adUseClient
  53.     RS.Open Statement, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText
  54.     If RS.RecordCount > 0 Then
  55.         '// Return Value
  56.         CalFee = CDbl(RS("FeeCharge"))
  57.         lblFeeName.Caption = RS("FeeName")
  58.     End If
  59.     RS.Close:   Set RS = Nothing
  60. End Function
คัดลอกไปที่คลิปบอร์ด

โค้ดในส่วนของโมดูลการเชื่อมต่อฐานข้อมูล VB6 + Access 2003 ...
  1. Option Explicit

  2. Global ConnDB As New ADODB.Connection
  3. Global RS As New ADODB.Recordset
  4. Global DS As New ADODB.Recordset
  5. Global Statement As String
  6. Global SQLStmt As String
  7. '
  8. ' กำหนดว่าเป็นการเพิ่ม หรือ แก้ไขข้อมูล
  9. Global blnNewData As Boolean
  10. ' ให้เกิดการ Update ในฟอร์มที่มีการเปลี่ยนแปลง
  11. Global FormUpdate As Boolean
  12. '
  13. ' สำหรับทำการค้นหา
  14. Global gPK As Long
  15. ' การส่งชื่อตารางข้อมูลไป
  16. Global gTable As String

  17. Public Sub OpenDataBase()
  18. On Error GoTo Err_Handler
  19. Dim DB_File As String
  20.     DB_File = App.Path
  21.     If Right$(DB_File, 1) <> "" Then DB_File = DB_File & ""
  22.     DB_File = DB_File & "WeightData.MDB"
  23.     ' Open a connection.
  24.     Set ConnDB = New ADODB.Connection
  25.     ConnDB.ConnectionString = _
  26.         "Provider=Microsoft.Jet.OLEDB.4.0;" & _
  27.         "Data Source=" & DB_File & ";" & _
  28.         "Persist Security Info=False"
  29.     ConnDB.Open
  30.     Exit Sub
  31. Err_Handler:
  32.     MsgBox "Error : " & Err.Number & " " & Err.Description
  33.     End
  34. End Sub

  35. Public Sub CloseDataBase()
  36.     ' ตรวจสอบว่ามีการเชื่อมโยง - Connect ข้อมูลหรือไม่
  37.     If ConnDB.State = adStateOpen Then
  38.         ConnDB.Close
  39.         Set ConnDB = Nothing
  40.     End If
  41. End Sub

  42. Function CheckDigitOnly(Index As Integer) As Integer
  43.     Select Case Index
  44.         Case 48 To 57 ' 0 - 9
  45.         Case 8            ' Back Space
  46.         Case 13         ' Enter
  47.         Case Else
  48.             Index = 0
  49.     End Select
  50.     CheckDigitOnly = Index
  51. End Function

  52. '/  แก้ปัญหาฟังค์ชั่น SendKeys ใน Windows 8+ 64 บิต
  53. Public Sub Sendkeys(Text As String, Optional Wait As Boolean = False)
  54.     Dim WshShell As Object
  55.     Set WshShell = CreateObject("Wscript.shell")
  56.     WshShell.Sendkeys Text, Wait
  57.     Set WshShell = Nothing
  58. End Sub
คัดลอกไปที่คลิปบอร์ด

โค้ดในส่วนฟอร์มหลัก VB.NET (2010)
  1. Imports System.Data.OleDb

  2. Public Class frmFeeWeight

  3.     Private Sub frmCostWeight_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  4.         '// Connect MS Access DataBase
  5.         Conn = ConnectDataBase()
  6.         lblFeeName.Text = ""
  7.     End Sub

  8.     Private Sub txtWeight_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtWeight.KeyPress
  9.         '// ไม่มีการป้อนค่าใดๆ หรือป้อนค่า 0
  10.         If Trim(txtWeight.Text) = "" Or Val(txtWeight.Text) = 0 Then Exit Sub
  11.         '// กดคีย์ Enter
  12.         If e.KeyChar = Chr(13) Then
  13.             e.Handled = True
  14.             '// CDbl = Convert to Double
  15.             Dim FeeService As Double = CalFee(CDbl(txtWeight.Text))
  16.             '// ค่าที่รีเทิร์นกลับมาต้องมากกว่า 0 จึงจะแสดงผล
  17.             If FeeService > 0 Then
  18.                 txtFee.Text = FeeService
  19.             Else
  20.                 txtWeight.Clear()
  21.                 txtFee.Clear()
  22.                 lblFeeName.Text = ""
  23.                 MessageBox.Show("คุณป้อนพิกัดน้ำหนักมากกว่าระบบกำหนดเอาไว้.", "รายงานสถานะ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
  24.             End If
  25.         Else
  26.             '// ตรวจสอบการกดคีย์ จะรับค่า 0 - 9 หรือ ASCII Code = 48 - 57
  27.             e.Handled = CheckDigitOnly(Asc(e.KeyChar))
  28.         End If
  29.     End Sub

  30.     '// ฟังค์ชั่นใช้ในการค้นหาอัตราค่าบริการ ตามสัดส่วนน้ำหนัก
  31.     Private Function CalFee(ByVal Fee As Double) As Double
  32.         CalFee = 0
  33.         '// เลือกเอาค่าแรกที่ได้มา (TOP 1) และต้องให้จัดเรียงตามน้ำหนักสูงสุด (MaxWeight)
  34.         strSQL = _
  35.             " SELECT TOP 1 tblFee.FeePK, tblFee.FeeName, tblFee.FeeCharge, tblFee.MaxWeight " & _
  36.             " FROM tblFee " & _
  37.             " WHERE (" & _
  38.             " [MaxWeight] >= " & CDbl(txtWeight.Text) & _
  39.             " ) ORDER BY MaxWeight "
  40.         Try
  41.             If Conn.State = ConnectionState.Closed Then Conn.Open()
  42.             Cmd = New OleDbCommand(strSQL, Conn)
  43.             DR = Cmd.ExecuteReader
  44.             While DR.Read()
  45.                 If DR.HasRows Then
  46.                     CalFee = Format(CDbl(DR.Item("FeeCharge").ToString), "#,##0.00")
  47.                     lblFeeName.Text = DR.Item("FeeName").ToString
  48.                 End If
  49.             End While
  50.             DR.Close()
  51.             Cmd.Dispose()
  52.         Catch ex As Exception
  53.             MessageBox.Show(ex.Message)
  54.         End Try
  55.     End Function

  56.     Private Sub frmCostWeight_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  57.         If Conn.State = ConnectionState.Open Then Conn.Close()
  58.         Me.Dispose()
  59.         Application.Exit()
  60.     End Sub

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

โค้ดในการเชื่อมต่อฐานข้อมูล VB.NET + Access 2007+
  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.     Public Function ConnectDataBase() As System.Data.OleDb.OleDbConnection
  15.         strPathData = MyPath(Application.StartupPath) & "Data"
  16.         '"Provider = Microsoft.Jet.OLEDB.4.0;"
  17.         Dim strConn As String = _
  18.             "Provider = Microsoft.ACE.OLEDB.12.0;"
  19.         strConn += _
  20.             "Data Source = " & strPathData & "WeightData.accdb"

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

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


ฟังค์ชั่นในการรับค่าเฉพาะตัวเลขเท่านั้น VB.NET (2010)
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / ฟังค์ชั่นในการป้อนเฉพาะค่าตัวเลขได้เท่านั้น
  3.     ' / การใช้งานจากเหตุการณ์ KeyPress ของ TextBox
  4.     ' / e.Handled = CheckDigitOnly(Asc(e.KeyChar))
  5.     Function CheckDigitOnly(ByVal index As Integer) As Boolean
  6.         Select Case index
  7.             Case 48 To 57 ' เลข 0 - 9
  8.                 CheckDigitOnly = False
  9.             Case 8, 13 ' Backspace = 8, Enter = 13
  10.                 CheckDigitOnly = False
  11.             Case Else
  12.                 CheckDigitOnly = True
  13.         End Select
  14.     End Function
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดโค้ดต้นฉบับ VB6 (FeeWeight.zip) และโค้ดต้นฉบับ VB.NET (2010) ชื่อไฟล์ FeeWeightNet.zip

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

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

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

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

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

GMT+7, 2024-4-25 09:03 , Processed in 0.130776 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

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