thongkorn โพสต์ 2017-11-13 13:58:34

[VB.NET] แจกฟรีโค้ดต้นฉบับ โปรแกรมต้นแบบร้านทองก้อนเบอเกอร์แดนซ์

http://www.g2gnet.com/webboard/images/vbnet/Burger.png
มีคำถามขอคำปรึกษาหลากหลายมากมายจากน้องๆนักศึกษา ที่กำลังคิดหา โปรเจคจบที่เกี่ยวข้องกับระบบฐานข้อมูลทำ ส่วนใหญ่ก็วนๆเวียนๆแต่เรื่องซ้ำๆกันไปมา เช่น ขายสินค้าเงินสด เงินเชื่อ สหกรณ์ ร้านขายกาแฟ เบเกอรี่ ฯลฯ วันนี้ก็เลยแนะนำโปรเจคที่คล้ายๆกัน แต่เป็นการขายเบอเกอร์แทนล่ะกันครับ ...

http://www.g2gnet.com/webboard/images/vbnet/BurgerPayment.png
สำหรับน้องๆมือใหม่คืออย่างนี้น่ะครับ ไม่ว่าเราคิดที่จะจับงานชิ้นไหนขึ้นมาทำก็ตาม อย่างแรกเมื่อเราตีกรอบ (Scope) ในงานนั้นๆแล้ว ต่อไปเราก็ควรจะต้องแบ่งแยกย่อยงานต่างๆออกเป็นส่วนๆ แล้วลองเขียนโค้ดขึ้นมาทดสอบก่อน (ก็พวกหลักการทางทฤษฎีที่ร่ำเรียนมานั่นแหละครับ) ...

ตัวอย่างงานนี้ แอดมินยังไม่มีความจำเป็นใดๆที่จะต้องไปแตะฐานข้อมูล แต่จำลองระบบการขายหน้าร้านขึ้นมาก่อน ด้วยการสร้างอินเทอร์เฟซที่ต้องติดต่อกับผู้ใช้งานในแบบคงที่ หรือ Static โดยพยายามเอาให้ใกล้เคียงกับงานจริงๆมากที่สุด และสังเกตด้วยว่า เราจะเอาข้อมูลตัวรายการสินค้าอะไรบ้างมาใส่ในตารางกริด จากตัวอย่างคือ Primary Key, Description และ UnitPrice พวกนี้แหละก็คือส่วนของการออกแบบตารางข้อมูล พอเราทำไปทำมา ก็จะมองเห็นบางอย่างเกิดขึ้น อ้าว!!! เกิดมีการสั่งสินค้ารายการเดียวกันแต่มากกว่า 1 ชิ้นล่ะ เอ้อ!!! นั่นแหละคือเราต้องเพิ่มฟิลด์ (Field) ขึ้นมาใหม่อีกตัวคือ จำนวน (Quantity) คือมันจะไล่ไปทีละสเต็ปเอง ... พอลองทดสอบเฉพาะส่วนนี้เสร็จเรียบร้อยแล้ว ก็คิดต่ออีกซิครับ เราจะโหลดภาพ โหลดปุ่มให้มาอยู่บนฟอร์ม ตามจำนวนรายการที่ต้องการได้อย่างไร ซึ่งนั่นก็คือการสร้าง Control เช่นปุ่มต่างๆในแบบ Dynamic ... นี่คือส่วนหนึ่งของการออกแบบ และแยกย่อยหั่นงานออกมา โดยที่ยังไม่ต้องไปว่าเรื่องของฐานข้อมูลเลย ...

โค้ดในส่วนของฟอร์มหลัก (frmMainOrder.vb)
Public Class frmMainOrder

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

    Private Sub frmMainOrder_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
      Me.Dispose()
      Application.Exit()
    End Sub

    Private Sub frmMainOrder_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
      Select Case e.KeyCode
            Case Keys.F8
                btnPayment_Click(sender, e)
            Case Keys.F10
                Me.Close()
      End Select
    End Sub

    ' / ---------------------------------------------------------------
    Private Sub frmMainOrder_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      txtPrice.Text = "0.00"
      txtAmount.Text = "0.00"
      Call InitGrid()
    End Sub

    ' / ---------------------------------------------------------------
    '// Initialize DataGridView @Run Time
    Private Sub InitGrid()
      '// ตั้งค่าจำนวนหลัก (Columns)
      With dgvData
            .Columns.Add("PK", "PK")
            .Columns.Add("Description", "รายการที่สั่ง")
            .Columns.Add("Unit Price", "ราคา")
            '//
            .Columns(0).Visible = False
            With .Columns(2)
                .ValueType = GetType(Decimal)
                .DefaultCellStyle.Format = "N2"
                .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            End With
      End With
      '//
      With dgvData
            .RowHeadersVisible = False
            .AllowUserToAddRows = False
            .AllowUserToDeleteRows = False
            .AllowUserToResizeRows = False
            .MultiSelect = False
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            .ReadOnly = True
            .Font = New Font("Tahoma", 11)
            .RowTemplate.Height = 40
            .RowTemplate.MinimumHeight = 32
            ' Autosize Column
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
            .AutoResizeColumns()
            '// Even-Odd Color
            .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
            ' Adjust Header Styles
            With .ColumnHeadersDefaultCellStyle
                .BackColor = Color.Navy
                .ForeColor = Color.Black
                .Font = New Font("Tahoma", 12, FontStyle.Bold)
                .WrapMode = DataGridViewTriState.False
            End With
      End With
    End Sub

    ' / ---------------------------------------------------------------
    Private Sub btnRemove_Click(sender As System.Object, e As System.EventArgs) Handles btnRemove.Click
      If dgvData.RowCount <= 0 Then Exit Sub
      dgvData.Focus()
      txtPrice.Text = "0.00"
      '// หาจำนวนเงินรวมใหม่
      Dim Amount As Double
      For i = 0 To dgvData.RowCount - 1
            Amount = Amount + CDbl(dgvData.Rows(i).Cells(2).Value)
      Next
      '// รวมจำนวนเงินทั้งหมด ลบออกจากแถวที่เลือก ด้วยราคาที่อยู่ในหลักที่ 3 (Index = 2)
      txtAmount.Text = Format(Amount - CDbl(dgvData.Item(2, dgvData.CurrentRow.Index).Value), "#,##0.00")
      '// แล้วค่อยลบแถวออกไป
      dgvData.Rows.Remove(dgvData.CurrentRow)
      dgvData.Refresh()
    End Sub

    ' / ---------------------------------------------------------------
    ' / เพิ่มรายการแถวใหม่ (UnBound Data)
    Private Sub AddRow(ByVal PK As Integer, ByVal Description As String, ByVal UnitPrice As Double)
      '// มองไปข้างหน้า ... กรณีที่ใช้ฐานข้อมูล เราจะต้องนำค่า PK มาใช้อ้างอิง ซึ่งข้อมูลแถวนี้จะมาจากการทำ Query
      Dim row As String() = New String() {PK, Description, Format(CDbl(UnitPrice), "#,##0.00")}
      dgvData.Rows.Add(row)
      '// โจทย์ให้นำไปคิดต่อคือ ...
      '// ต้องเช็คก่อนว่าค่า PK มันมีอยู่ในแถวแล้วหรือไม่ หากมีให้ "เพิ่มจำนวนขึ้น 1" ... จะทำอย่างไร?

      '// แสดงผลราคาสินค้าล่าสุด
      txtPrice.Text = UnitPrice
      '// หาจำนวนเงินรวมใหม่
      Dim Amount As Double
      For i = 0 To dgvData.RowCount - 1
            Amount = Amount + CDbl(dgvData.Rows(i).Cells(2).Value)
      Next
      txtAmount.Text = Format(Amount, "#,##0.00")
      '// โฟกัสไปที่ DataGridView แล้วย้ายไปแถวล่าสุด
      dgvData.Focus()
      SendKeys.Send("^{END}")
    End Sub

    Private Sub btnClear_Click(sender As System.Object, e As System.EventArgs) Handles btnClear.Click
      dgvData.Rows.Clear()
      txtPrice.Text = "0.00"
      txtAmount.Text = "0.00"
    End Sub

    Private Sub btnBurger1_Click(sender As System.Object, e As System.EventArgs) Handles btnBurger1.Click
      '// หากนำไปใช้งานจริง ข้อมูลของตัวสินค้าจะถูกเรียกมาจากตารางข้อมูล
      Call AddRow(1, btnBurger1.Text, "45.00")
    End Sub

    Private Sub btnBurger2_Click(sender As System.Object, e As System.EventArgs) Handles btnBurger2.Click
      Call AddRow(2, btnBurger2.Text, "85.00")
    End Sub

    Private Sub btnBurger3_Click(sender As System.Object, e As System.EventArgs) Handles btnBurger3.Click
      Call AddRow(3, btnBurger3.Text, "110.00")
    End Sub

    Private Sub btnBurger4_Click(sender As System.Object, e As System.EventArgs) Handles btnBurger4.Click
      Call AddRow(4, btnBurger4.Text, "90.00")
    End Sub

    Private Sub btnBurger5_Click(sender As System.Object, e As System.EventArgs) Handles btnBurger5.Click
      Call AddRow(5, btnBurger5.Text, "120.00")
    End Sub

    Private Sub btnBurger6_Click(sender As System.Object, e As System.EventArgs) Handles btnBurger6.Click
      Call AddRow(6, btnBurger6.Text, "80.00")
    End Sub

    Private Sub btnBurger7_Click(sender As System.Object, e As System.EventArgs) Handles btnBurger7.Click
      Call AddRow(7, btnBurger7.Text, "100.00")
    End Sub

    Private Sub btnSmall1_Click(sender As System.Object, e As System.EventArgs) Handles btnSmall1.Click
      '// Parameters - PK, Description, UnitPrice
      Call AddRow(101, btnSmall1.Text, "20.00")
    End Sub

    Private Sub btnSmall2_Click(sender As Object, e As System.EventArgs) Handles btnSmall2.Click
      Call AddRow(102, btnSmall2.Text, "20.00")
    End Sub

    Private Sub btnSmall3_Click(sender As Object, e As System.EventArgs) Handles btnSmall3.Click
      Call AddRow(103, btnSmall3.Text, "20.00")
    End Sub

    Private Sub btnMedium1_Click(sender As Object, e As System.EventArgs) Handles btnMedium1.Click
      Call AddRow(104, btnMedium1.Text, "40.00")
    End Sub

    Private Sub btnMedium2_Click(sender As Object, e As System.EventArgs) Handles btnMedium2.Click
      Call AddRow(105, btnMedium2.Text, "40.00")
    End Sub

    Private Sub btnMedium3_Click(sender As Object, e As System.EventArgs) Handles btnMedium3.Click
      Call AddRow(106, btnMedium3.Text, "40.00")
    End Sub

    Private Sub btnLarge1_Click(sender As Object, e As System.EventArgs) Handles btnLarge1.Click
      Call AddRow(107, btnLarge1.Text, "60.00")
    End Sub

    Private Sub btnLarge2_Click(sender As Object, e As System.EventArgs) Handles btnLarge2.Click
      Call AddRow(108, btnLarge2.Text, "60.00")
    End Sub

    Private Sub btnLarge3_Click(sender As Object, e As System.EventArgs) Handles btnLarge3.Click
      Call AddRow(109, btnLarge3.Text, "60.00")
    End Sub

    Private Sub txtAmount_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtAmount.KeyPress
      '// ล็อคการกดคีย์
      e.Handled = True
    End Sub

    Private Sub txtPrice_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtPrice.KeyPress
      e.Handled = True
    End Sub

    Private Sub btnPayment_Click(sender As System.Object, e As System.EventArgs) Handles btnPayment.Click
      If dgvData.RowCount <= 0 Then Exit Sub
      frmPayment.ShowDialog()
    End Sub

End Class
โค้ดในส่วนของการชำระเงินสด (frmPayment.vb)
Public Class frmPayment

    Private Sub frmPayment_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
      Select Case e.KeyCode
            Case Keys.F8
                btnCash_Click(sender, e)
            Case Keys.F10
                Me.Close()
      End Select
    End Sub

    Private Sub frmPayment_Load(sender As Object, e As System.EventArgs) Handles Me.Load
      txtAmount.Text = Format(CDbl(frmMainOrder.txtAmount.Text), "#,##0.00")
      txtCash.Text = "0"
      txtChange.Text = "0.00"
      txtCash.Focus()
    End Sub

    ' / ---------------------------------------------------------------
    ' / ฟังค์ชั่นในการป้อนเฉพาะค่าตัวเลขได้เท่านั้น (ควรนำไปเก็บไว้ใน Module)
    Function CheckDigitOnly(ByVal index As Integer) As Boolean
      Select Case index
            Case 48 To 57 ' เลข 0 - 9
                CheckDigitOnly = False
            Case 8, 13 ' Backspace = 8, Enter = 13
                CheckDigitOnly = False
            Case Else
                CheckDigitOnly = True
      End Select
    End Function

    ' / ---------------------------------------------------------------
    Private Sub btnCash_Click(sender As System.Object, e As System.EventArgs) Handles btnCash.Click
      If txtCash.Text = "" Or Len(txtCash.Text) = 0 Or Val(txtCash.Text) = 0 Then
            txtCash.Text = 0
            txtChange.Text = "0.00"
            txtCash.Focus()
            Exit Sub
      End If
      If CDbl(txtCash.Text) - CDbl(txtAmount.Text) < 0 Then
            MessageBox.Show("จำนวนเงินยังไม่ครบ กรุณาแก้ไขข้อมูลใหม่ด้วย.", "รายงานสถานะ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txtCash.Focus()
      Else
            MessageBox.Show("ทำรายการเสร็จสิ้น.", "รายงานสถานะ", MessageBoxButtons.OK, MessageBoxIcon.Information)
            '// สั่งเคลียร์รายการข้ามฟอร์มมาเลย
            With frmMainOrder
                .txtPrice.Text = "0.00"
                .txtAmount.Text = "0.00"
                .dgvData.Rows.Clear()
            End With
            Me.Close()
      End If
    End Sub

    Private Sub txtCash_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtCash.KeyPress
      '// รับค่าเฉพาะตัวเลขเท่านั้น
      e.Handled = CheckDigitOnly(Asc(e.KeyChar))
      txtCash.Text = CDbl(txtCash.Text)
    End Sub

    Private Sub txtCash_TextChanged(sender As System.Object, e As System.EventArgs) Handles txtCash.TextChanged
      Call CalSum()
    End Sub

    Private Sub btnClear_Click(sender As System.Object, e As System.EventArgs) Handles btnClear.Click
      txtCash.Text = "0"
      txtChange.Text = "0.00"
    End Sub

    ' / ---------------------------------------------------------------
    Private Sub CalSum()
      '/ Trap Error
      If Trim(txtCash.Text) = "" Or Len(Trim(txtCash.Text)) = 0 Then
            txtCash.Text = 0
            txtChange.Text = "0.00"
            Exit Sub
      End If
      '//
      Dim dChange As Double = CDbl(txtCash.Text) - CDbl(txtAmount.Text)
      txtChange.Text = dChange
      If CDbl(dChange) < 0 Then
            txtChange.ForeColor = Color.Red
      Else
            txtChange.ForeColor = Color.Blue
      End If
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      txtCash.Text = CDbl(txtCash.Text + Button1.Text)
      Call CalSum()
    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
      txtCash.Text = CDbl(txtCash.Text + Button2.Text)
      Call CalSum()
    End Sub

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
      txtCash.Text = CDbl(txtCash.Text + Button3.Text)
      Call CalSum()
    End Sub

    Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
      txtCash.Text = CDbl(txtCash.Text + Button4.Text)
      Call CalSum()
    End Sub

    Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
      txtCash.Text = CDbl(txtCash.Text + Button5.Text)
      Call CalSum()
    End Sub

    Private Sub Button6_Click(sender As System.Object, e As System.EventArgs) Handles Button6.Click
      txtCash.Text = CDbl(txtCash.Text + Button6.Text)
      Call CalSum()
    End Sub

    Private Sub Button7_Click(sender As System.Object, e As System.EventArgs) Handles Button7.Click
      txtCash.Text = CDbl(txtCash.Text + Button7.Text)
      Call CalSum()
    End Sub

    Private Sub Button8_Click(sender As System.Object, e As System.EventArgs) Handles Button8.Click
      txtCash.Text = CDbl(txtCash.Text + Button8.Text)
      Call CalSum()
    End Sub

    Private Sub Button9_Click(sender As System.Object, e As System.EventArgs) Handles Button9.Click
      txtCash.Text = CDbl(txtCash.Text + Button9.Text)
      Call CalSum()
    End Sub

    Private Sub Button10_Click(sender As System.Object, e As System.EventArgs) Handles Button10.Click
      txtCash.Text = CDbl(txtCash.Text + Button10.Text)
      Call CalSum()
    End Sub

    Private Sub Button11_Click(sender As System.Object, e As System.EventArgs) Handles Button11.Click
      txtCash.Text = CDbl(txtCash.Text + Button11.Text)
      Call CalSum()
    End Sub

    Private Sub txtAmount_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtAmount.KeyPress
      e.Handled = True
    End Sub

    Private Sub txtChange_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtChange.KeyPress
      e.Handled = True
    End Sub

    Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
      Me.Close()
    End Sub
End Classดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่ลิ้งค์ด้านล่างนี้

MrDen โพสต์ 2017-12-15 14:45:23

ขอบคุณครับ ขอให้แข็งแรงแข็งแรง ครับผม.

hot2 โพสต์ 2018-9-24 16:32:13

ขอบคุณครับ:)
หน้า: [1]
ดูในรูปแบบกติ: [VB.NET] แจกฟรีโค้ดต้นฉบับ โปรแกรมต้นแบบร้านทองก้อนเบอเกอร์แดนซ์