[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) ได้ที่ลิ้งค์ด้านล่างนี้ ขอบคุณครับ ขอให้แข็งแรงแข็งแรง ครับผม. ขอบคุณครับ:)
หน้า:
[1]