|
มีคำถามขอคำปรึกษาหลากหลายมากมายจากน้องๆนักศึกษา ที่กำลังคิดหา โปรเจคจบที่เกี่ยวข้องกับระบบฐานข้อมูลทำ ส่วนใหญ่ก็วนๆเวียนๆแต่เรื่องซ้ำๆกันไปมา เช่น ขายสินค้าเงินสด เงินเชื่อ สหกรณ์ ร้านขายกาแฟ เบเกอรี่ ฯลฯ วันนี้ก็เลยแนะนำโปรเจคที่คล้ายๆกัน แต่เป็นการขายเบอเกอร์แทนล่ะกันครับ ...
สำหรับน้องๆมือใหม่คืออย่างนี้น่ะครับ ไม่ว่าเราคิดที่จะจับงานชิ้นไหนขึ้นมาทำก็ตาม อย่างแรกเมื่อเราตีกรอบ (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) ได้ที่ลิ้งค์ด้านล่างนี้ |
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|