หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 5 3 5 9 3 3

7 ธันวาคม พ.ศ.2549
203 Users On-Line.
Visitors - Page views
 8 8 8 5 7 2 1
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

เรียนรู้ Visual Basic 6.0 กับ ฐานข้อมูล MS Access ภาค 6

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 9/11/2549 14:35:00
(อ่าน : 28198) 

มาตามสัญญาครับ ... พี่น้อง

การออกแบบงานให้มีลักษณะ Single Form หรือ แบบฟอร์มเดี่ยวๆอย่างตัวอย่างที่ผมนำเสนอทุกๆท่านมานี้ มันก็มีข้อดีอยู่เรื่องนึง ก็คือ ประหยัดฟอร์มครับผม แต่การโค้ดเราต้องระมัดระวังอย่างมาก เพราะโอกาสเกิดข้อผิดพลาดเล็กๆน้อยๆ (Bug) มันเป็นไปได้เสมอเลย ดังนั้นโดยปกติแล้วผมจะออกแบบโดยให้แสดงผลจากกริดขึ้นมาก่อนครับ จากนั้นค่อยมีปุ่มเพิ่ม แก้ไข (หรือ Double Click) เพื่อให้แสดงฟอร์มใหม่ขึ้นมา และเราก็จะคอยควบคุมให้ผู้ใช้งานเขา (หรือ เธอ) ทำงานตามที่เราได้วางไว้ตามขั้นตอนต่างๆ ท่านทั้งหลายก็ลองไปใส่ Idea ของท่านดูแล้วกันครับ



เอามายั่วให้เกิดความอยาก ... เรียนรู้น่ะ (ภาคพิศดารต่อไปจะให้ Download ไปศึกษาครับ)
ดูตัวอย่างของจริงดีกว่ามั้ย

สำหรับโค้ดตัวอย่างนี้ มันเป็นแค่อีกเสี้ยวหนึ่งที่จะนำทางให้คุณได้รู้จักกับ VB และ DataBase ในอีกมุมมองหนึ่งเท่านั้นเองครับ (ดูตัวอย่างการพัฒนาโปรแกรมที่ใช้งานจริง) และผมก็ไม่สามารถบรรยายทุกขั้นตอนที่ปรากฏบนหน้าเว็บได้ทั้งหมดหรอก คุณต้องนำโค้ดตัวเต็มมาลองทดสอบทีละขั้นตอน (กด F8) โดยเริ่มศึกษาจากภาค 2 เพื่อไล่การทำงานทีละโมดูล อย่าเพียงแต่แค่อาศัยการจดจำ ต้องทำความเข้าใจในหลักการ (Concept) และไล่เรียงคำสั่งที่นำมาใช้งาน แล้วลองหาข้อมูลจากแหล่งอื่นๆมาทำการเปรียบเทียบดูว่า หากลองทำอย่างนี้แล้วมันจะมีผลเช่นไร ... เมื่อคุณได้ลองศึกษาการทำงานเบื้องต้นนี้แล้ว ผมมีโจทย์ให้คุณลองปรับเปลี่ยน ...

  1. เพิ่มรายการคำนำหน้า (Title) เช่น นาย นาง นางสาว ในตารางฐานข้อมูล ส่วนใน VB ให้ใช้ ComboBox เหมือนรายการชื่อจังหวัด
  2. ให้แยกการแสดงผลออกจากกัน โดยแสดงเฉพาะรายการลูกค้าในตารางกริดบนฟอร์มหลัก รวมถึงการค้นหาด้วย
  3. กดดับเบิ้ลคลิ๊กเพื่อเลือกรายชื่อลูกค้า แล้วให้ไปแสดงรายการในอีกฟอร์มหนึ่ง (ฟอร์มรอง)
ขอให้โชคดีครับทุกท่าน ... 


Design-Time


 

ดาวน์โหลด Source Code ของโปรแกรม (VB 6.0/SP6) ไปลองทดสอบดูได้เลยครับพี่น้อง
			
' โค้ดทั้งหมดต้อง Download มาน่ะครับ นี่แค่อธิบายบางตัวอย่างเท่านั้นเอง			
Option Explicit

Private Sub cmdNew_Click()
    ' ต้องระบุให้เป็นการเพิ่มข้อมูลใหม่
    blnNewData = True
    Call SetupScreen
    Call DisplayProvince
    Call UnLockScreen
    Call RecordControl
    txtCustomerID.Text = "[New]"
End Sub

' การเรียกรายการจาก MS FlexGrid ขึ้นมาแสดงผล ก็คือการแก้ไขข้อมูลนั่นเองครับผม
Private Sub fgCustomer_DblClick()
' ดัก Error กรณีที่ไม่มีข้อมูลอยู่ในตารางเลยสักรายการ จะทำให้ FlexGrid มีแค่ 1 แถว (Header)
If Val(fgCustomer.Text) <= 0 Or IsNull(fgCustomer.Text) Then Exit Sub
    ' ต้องระบุให้เป็นการแก้ไขข้อมูล
    blnNewData = False
    Call SetupScreen
    Call UnLockScreen
    Call DisplayProvince
    Call RecordToScreen(Val(fgCustomer.Text))
    Call RecordControl
End Sub

' เหตุการณ์กด Enter ใน MS FlexGrid
Private Sub fgCustomer_KeyPress(KeyAscii As Integer)
    If KeyAscii = vbKeyReturn Then Call fgCustomer_DblClick
End Sub

Private Sub Form_Load()
    OpenDataBase
    '
    Call SetupScreen
    Call LockScreen
    Call DisplayProvince
    Call SetupFgCustomer
    Call DisplayFgCustomer
End Sub

Private Sub cmdRefresh_Click()
    txtSearch.Text = ""
    Call SetupFgCustomer
    Call DisplayFgCustomer
End Sub

Private Sub cmdSave_Click()
' ตรวจสอบข้อมูลหลักที่เราบังคับให้ User ป้อนก่อนครับ
If Trim(txtFirstname.Text) = "" Or Len(txtFirstname.Text) = 0 Then
    MsgBox "กรุณาป้อนรายชื่อลูกค้าให้เรียบร้อยก่อนด้วย.", vbOKOnly + vbExclamation, "รายงานสถานะ"
    txtFirstname.SetFocus
    Exit Sub
ElseIf Trim(txtLastname.Text) = "" Or Len(txtLastname.Text) = 0 Then
    MsgBox "กรุณาป้อนนามสกุลลูกค้าให้เรียบร้อยก่อนด้วย.", vbOKOnly + vbExclamation, "รายงานสถานะ"
    txtLastname.SetFocus
    Exit Sub
End If
' ไม่มีข้อผิดพลาดให้ทำการบันทึกข้อมูลได้
Call SaveData
End Sub


' โปรแกรมย่อยเพื่อทำการบันทึกข้อมูล โดยแบ่งเป็น 2 ส่วน ในโปรแกรมย่อยตัวเดียวกัน
' หาก blnNewData = True หมายความว่าเป็นการเพิ่มข้อมูลใหม่
' เราต้องทำการหาค่า CustomerID ใหม่ เนื่องจากฐานข้อมูลที่ออกแบบไว้นั้น ผมไม่ต้องการให้มันเป็น Autonumber มีเหตุผลน่ะครับ ... ' หาก blnNewData = False หมายความว่าเป็นการแก้ไขข้อมูล
Sub SaveData() Dim CountRec As Long Set RS = New ADODB.Recordset     ' กรุณาทำความเข้าใจเรื่อง Events/Driven น่ะครับ คือผมจะสั่งให้ทำงานอะไรก็แล้วแต่ จะขึ้นกับเงื่อนไขของเหตุการณ์นั้นๆไป     ' นี่แหละคือ Concept หลักของ MS Visual Basic     ' เป็นการเพิ่มข้อมูลเข้าไปใหม่ If blnNewData = True Then Statement = "SELECT * FROM tblCustomer ORDER BY CustomerID " RS.CursorLocation = adUseClient RS.Open Statement, ConnMyDB, adOpenForwardOnly, adLockReadOnly, adCmdText         ' มันมีหลายวิธีในการหาค่าสุดท้ายของข้อมูลน่ะครับ โปรดศึกษาเพิ่มเติมด้วย         ' RS.BOF และ RS.EOF เป็นจริงทั้งคู่ นั่นก็คือไม่มีข้อมูลอยู่เลย If RS.BOF Or RS.EOF Then CountRec = 1 ' เตรียมค่าให้ CustomerID เท่ากับ 1 เป็นค่าเริ่มต้น Else RS.MoveLast ' ให้เลื่อนตำแหน่งไปท้ายสุด CountRec = RS("CustomerID") + 1 ' เพิ่มค่า CustomerID อีก 1 End If RS.Close Set RS = New ADODB.Recordset Statement = "SELECT tblCustomer.*, tblProvince.ProvinceName " & _ " FROM tblCustomer INNER JOIN tblProvince ON tblCustomer.ProvinceID = tblProvince.ProvinceID " & _ " ORDER BY [CustomerID] " RS.Open Statement, ConnMyDB, adOpenKeyset, adLockOptimistic, adCmdText         ' เพิ่มข้อมูล RS.AddNew RS("CustomerID") = CountRec     ' เป็นการแก้ไขข้อมูล     Else Statement = "SELECT tblCustomer.*, tblProvince.ProvinceName " & _ " FROM tblCustomer INNER JOIN tblProvince ON tblCustomer.ProvinceID = tblProvince.ProvinceID " & _ " WHERE [CustomerID] = " & Val(fgCustomer.Text) RS.Open Statement, ConnMyDB, adOpenKeyset, adLockOptimistic, adCmdText End If ' การ Update ด้วยวิธีการนี้ จะลด Bug ลงได้เยอะ ' และสำหรับผู้เริ่มต้นก็จะสามารถมองภาพของฐานข้อมูลได้ดีกว่าการใช้งาน Insert, Update ตามภาษา SQL ' ไม่ว่าข้อมูลนั้นจะเป็นการเพิ่ม หรือ แก้ไข ก็ตามทีแต่เราก็ใช้งานในส่วนนี้ร่วมกัน RS("Firstname") = "" & Trim(txtFirstname.Text) RS("Lastname") = "" & Trim(txtLastname.Text) RS("Address") = "" & Trim(txtAddress.Text) RS("Amphur") = "" & Trim(txtAmphur.Text) RS("ProvinceID") = cmbProvince.ListIndex RS("PostCode") = "" & Trim(txtPostCode.Text) RS.Update MsgBox "บันทึกข้อมูลเรียบร้อยแล้ว.", vbOKOnly + vbInformation, "รายงานสถานะ" RS.Close Set RS = Nothing ' ตั้งค่าต่างๆใหม่อีกรอบ Call SetupScreen Call LockScreen Call SetupFgCustomer Call DisplayFgCustomer Call CancelControl End Sub Private Sub cmdSearch_Click() If txtSearch.Text = "" Or Len(Trim(txtSearch.Text)) = 0 Then txtSearch.SetFocus Exit Sub End If Dim CountRec As Long, item As Long Set RS = New ADODB.Recordset Statement = "SELECT * FROM tblCustomer WHERE " & _ " [FirstName] " & " Like '%" & Trim(txtSearch.Text) & "%'" & " OR " & _ " [LastName] " & " Like '%" & Trim(txtSearch.Text) & "%'" & _ " ORDER BY CustomerID " RS.CursorLocation = adUseClient RS.Open Statement, ConnMyDB, adOpenForwardOnly, adLockReadOnly, adCmdText CountRec = RS.RecordCount If CountRec <= 0 Then MsgBox "ไม่พบข้อมูลที่คุณต้องการค้นหา.", vbOKOnly + vbExclamation, "รายงานสถานะ" RS.Close Set RS = Nothing Exit Sub End If fgCustomer.Rows = CountRec + 1 RS.MoveFirst item = 1 Do Until RS.EOF With fgCustomer .TextMatrix(item, 0) = RS("CustomerID") .TextMatrix(item, 1) = item .TextMatrix(item, 2) = Right$("0000000" & RS("CustomerID"), 7) .TextMatrix(item, 3) = "" & RS("Firstname") .TextMatrix(item, 4) = "" & RS("Lastname") End With item = item + 1 RS.MoveNext Loop RS.Close Set RS = Nothing End Sub Sub RecordToScreen(ID As Long) Set RS = New Recordset Statement = "SELECT tblCustomer.*, tblProvince.ProvinceName " & _ " FROM tblCustomer INNER JOIN tblProvince ON tblCustomer.ProvinceID = tblProvince.ProvinceID " & _ " WHERE [CustomerID] = " & ID RS.Open Statement, ConnMyDB, adOpenForwardOnly, , adCmdText txtCustomerID.Text = Right$("0000000" & RS("CustomerID"), 7) txtFirstname.Text = "" & RS("Firstname") txtLastname.Text = "" & RS("Lastname") txtAddress.Text = "" & RS("Address") txtAmphur.Text = "" & RS("Amphur") cmbProvince.Text = RS("ProvinceName") txtAmphur.Text = "" & RS("Amphur") txtPostCode.Text = "" & RS("PostCode") ' RS.Close Set RS = Nothing End Sub ' Load รายชื่อจังหวัดเข้าสู่ ComboBox Sub DisplayProvince() Dim Add$ Set DS = New ADODB.Recordset Statement = "SELECT * FROM tblProvince ORDER BY ProvinceID" Set DS = ConnMyDB.Execute(Statement, , adCmdText) cmbProvince.Clear Do Until DS.EOF Add$ = "" & Trim(DS("ProvinceName")) cmbProvince.AddItem Add$ DS.MoveNext Loop DS.Close Set DS = Nothing End Sub Sub SetupFgCustomer() With fgCustomer .Clear .FixedRows = 1 .FixedCols = 0 .SelectionMode = flexSelectionByRow .Cols = 5 .Rows = 1 .TextMatrix(0, 0) = "CustomerID" .TextMatrix(0, 1) = "ลำดับที่" .TextMatrix(0, 2) = "รหัสลูกค้า" .TextMatrix(0, 3) = "ชื่อ" .TextMatrix(0, 4) = "นามสกุล" .ColAlignment(2) = vbLeftJustify .ColWidth(0) = 0 .ColWidth(1) = 600 .ColWidth(2) = 1400 .ColWidth(3) = 2200 .ColWidth(4) = 2200 End With End Sub Sub DisplayFgCustomer() Dim CountRec As Long, item As Long Set RS = New ADODB.Recordset Statement = "SELECT * FROM tblCustomer ORDER BY CustomerID" RS.CursorLocation = adUseClient RS.Open Statement, ConnMyDB, adOpenForwardOnly, adLockReadOnly, adCmdText CountRec = RS.RecordCount If CountRec <= 0 Then MsgBox "ยังไม่มีข้อมูลอยู่ในระบบ.", vbOKOnly + vbExclamation, "รายงานสถานะ" RS.Close Set RS = Nothing Exit Sub End If fgCustomer.Rows = CountRec + 1 RS.MoveFirst item = 1 Do Until RS.EOF With fgCustomer .TextMatrix(item, 0) = RS("CustomerID") .TextMatrix(item, 1) = item .TextMatrix(item, 2) = Right$("0000000" & RS("CustomerID"), 7) .TextMatrix(item, 3) = "" & RS("Firstname") .TextMatrix(item, 4) = "" & RS("Lastname") End With item = item + 1 RS.MoveNext Loop RS.Close Set RS = Nothing End Sub Private Sub cmdDelete_Click() ' ดัก Error กรณีที่ไม่มีข้อมูลอยู่ในตารางเลยสักรายการ จะทำให้ FlexGrid มีแค่ 1 แถว (Header) If Val(fgCustomer.Text) <= 0 Or IsNull(fgCustomer.Text) Then Exit Sub Statement = "DELETE * FROM tblCustomer WHERE [CustomerID] = " & Val(fgCustomer.Text) If MsgBox("คุณแน่ใจว่าต้องการลบข้อมูลรหัสลูกค้า " & Right("0000000" & fgCustomer.Text, 7) & " นี้?",
vbOKCancel + vbQuestion + vbDefaultButton2, "ยืนยันการลบข้อมูล") = vbCancel Then Exit Sub End If Set RS = ConnMyDB.Execute(Statement) MsgBox "ลบข้อมูลรหัสลูกค้า " & Right("0000000" & " ออกจากระบบเรียบร้อยแล้ว.", vbOKOnly + vbInformation, "รายงานสถานะ" ' ระมัดระวังในการเรียกใช้งานโปรแกรมย่อยให้เรียงตามลำดับการทำงานด้วยน่ะครับ Call SetupScreen Call SetupFgCustomer Call DisplayFgCustomer Call CancelControl End Sub Private Sub cmdExit_Click() CloseDataBase End End Sub Private Sub Form_Unload(Cancel As Integer) CloseDataBase End End Sub Sub SetupScreen() txtCustomerID.Text = "" txtFirstname.Text = "" txtLastname.Text = "" txtAddress.Text = "" txtAmphur.Text = "" cmbProvince.Clear txtPostCode.Text = "" txtSearch.Text = "" End Sub ' เนื่องจากเราใช้งานในฟอร์มๆเดียว ดังนั้นจึงต้องอาศัยเทคนิคของการ ปิด/เปิด
และย้ายตำแหน่งของ Object เข้าช่วย ก็ลองศึกษาดูเอาน่ะครับ ด้วยการสั่ง Run ทีละ Step (F8)
Sub LockScreen() txtCustomerID.Locked = True txtFirstname.Locked = True txtLastname.Locked = True txtAddress.Locked = True txtAmphur.Locked = True cmbProvince.Locked = True txtPostCode.Locked = True End Sub Sub UnLockScreen() txtCustomerID.Locked = True txtFirstname.Locked = False txtLastname.Locked = False txtAddress.Locked = False txtAmphur.Locked = False cmbProvince.Locked = False txtPostCode.Locked = False End Sub Sub RecordControl() cmdNew.Visible = False cmdSave.Visible = True cmdDelete.Enabled = False cmdExit.Visible = False cmdCancel.Visible = True cmdSave.Move 60, 150, cmdSave.Width, cmdSave.Height cmdCancel.Move 60, 2010, cmdCancel.Width, cmdCancel.Height txtSearch.Locked = True cmdSearch.Enabled = False cmdRefresh.Enabled = False fgCustomer.Enabled = False End Sub Sub CancelControl() cmdNew.Visible = True cmdSave.Visible = False cmdDelete.Enabled = True cmdExit.Visible = True cmdCancel.Visible = False txtSearch.Locked = False cmdSearch.Enabled = True cmdRefresh.Enabled = True fgCustomer.Enabled = True End Sub Private Sub cmdCancel_Click() Call SetupScreen Call LockScreen Call CancelControl End Sub

จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560