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

หรือติดต่อเข้ามาทาง 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 3 3 7 8 6 4

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

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

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

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

ตอนนี้จะเข้าสู่การออกแบบและโค้ดโปรแกรมใน Visual Basic 6.0 แล้วครับ


จากภาค 2 ที่ผ่านนั้น เราได้รู้วิธีการเชื่อมต่อตารางข้อมูล 2 ตาราง เข้าหากันเป็นที่เรียบร้อยแล้วครับ สำหรับในภาคนี้จะแนะนำให้ท่านทั้งหลาย ได้รู้จักกับการออกแบบ และ พัฒนาโปรแกรมด้วย MS Visual Basic 6.0 ในรูปแบบของ Run-Time (ต้องสั่งให้โปรแกรมทำงานก่อน เราจึงจะเห็นผลลัพธ์ของการทำงาน) ที่อาจจะแตกต่างจากหนังสือทั่วๆไป ที่ชอบแนะนำ้ท่านทั้งหลาย ให้ไปเรียนรู้ หรือ พัฒนาโปรแกรมในรูปแบบของ Data Control เป็นหลักครับพี่น้อง
แต่มิใช่ว่า Data Control หรือ Design Time หรือ วิธีการผูกติดคอนโทรล (Bound Control) จะไม่ดีน่ะครับ ข้อดีมันก็มีดังนี้ คือ
    ข้อดี
  • ทำงานได้เร็วกว่าวิธีการแบบ Run-Time
  • เหมาะสำหรับโปรแกรมขนาดเล็กๆที่ไม่สลับซับซ้อนมากนัก
  • เหมาะสำหรับคนที่เขียนโปรแกรมขึ้นมาเอง แล้วนำไปใช้งานเอง ... หุหุหุ

แต่บทความนี้ (และงานต่างๆของผมด้วย) จะต้องออกแบบ และ เขียนโค้ดกันในแบบของ Run-Time และ จะไม่ผูกคอนโทรลใดๆ เอาไว้กับฟิลด์ของตารางข้อมูลเลย ครับผม อ้าว ... ตอนนี้ก็เปิดโปรแกรม Visual Basic 6.0 กันขึ้นมาครับพี่น้อง เมื่อพร้อมแล้ว อันดับแรกก็ต้องเรียกใช้งาน References - อ้างอิง ซึ่งเรามีความจำเป็น ต้องอ้างอิงการใช้งานฐานข้อมูลผ่านทาง MDAC ดังภาพด้านล่างนี้


ต่อไปก็เลือก Microsoft ActiveX Data Objects 2.8 Library หรือ เอา Version ที่มันสูงสุดนั่นแหละครับ ...


สำหรับ MS Windows XP มันจะติด ActiveX (Version 2.8) ตัวนี้มาให้อยู่แล้ว
ส่วน Windows รุ่นที่ต่ำกว่านี้คงต้อง Download MDAC มาติดตั้งเอง


ที่ท่านเห็นจากภาพว่ามีทั้ง Version 2.5, 2.6 หรือ 2.7 คือแบบว่า ... ผมติดตั้ง MDAC เข้าไปเพิ่มเองน่ะครับ ก็เพราะงานโปรแกรมของผมที่พัฒนาขึ้นมานั้น มีทั้งงานเก่าๆ และยังต้องนำไปใช้งานกะ Windows หลายรุ่นครับ ไม่ว่าจะเป็น 95, 98 หรือ Win ME ประเดี๋ยวท่านจะงงว่าทำไมในเครื่องของท่านมันไม่มี ... อิอิอิ

สำหรับในส่วนของ Components นั้นผมจะใช้ วัตถุ หรือ Object หรือ Control แบบพื้นฐาน น่ะครับ และ ไม่จำเป็นต้องเรียกใช้งาน Microsoft ADO Data Control (OLEDB) เข้ามาเลยครับ ... บอกแล้วว่าวิธีนี้เป็นการออกแบบของ Run-Time ซึ่งมันจะแปลกแตกต่างไปจากที่ท่านได้เห็นๆกันมาซ่ะออกบ่อยๆนั่นล่ะครับ ... พี่น้อง

 

ขั้นตอนต่อไป ... ก็คือการวางวัตถุ (Object) หรือ Control เข้าสู่บนฟอร์มล่ะครับ

    ซึ่งจะประกอบไปด้วย
  • Label จำนวน 7 ตัว (กำหนดให้ใช้ค่า Index ได้ครับ เช่น lblCustomer(0)=รหัสลูกค้า หรือ lblCustomer(1)=ชื่อลูกค้า เป็นต้น)
  • TextBox จำนวน 6 ตัว แต่ไม่ต้องกำหนดให้ใช้ Index น่ะครับ เพราะคุณจะจดจำชื่อได้ยาก ยิ่งหากมี TextBox หลายสิบตัว
  • ComboBox จำนวน 1 ตัว เพื่อใช้กับรายชื่อจังหวัด (Province)
  • CommandButton จำนวน 1 ตัว (ก่อน) เพื่อใช้ปิดโปรแกรม
  • ส่วน MS Flex Grid Control เพื่อใช้ในการ List รายชื่อลูกค้าออกมานั้น เราจะนำมากล่าวถึงในภาคต่อไป ... สำหรับภาคนี้ขอข้ามไปก่อนน่ะครับผม


    Properties หรือ คุณสมบัติที่สำคัญสำหรับ TextBox แต่ละตัว มีดังนี้คือ (Design Time)
      รหัสลูกค้า
    1. Name: txtCustomerID
    2. Text: txtCustomerID
    3. Locked: True

      ชื่อ
    1. Name: txtFirstname
    2. Text: txtFirstname
    3. MaxLength: 40 (ให้อ้างอิงความยาวจากตารางข้อมูล)

      นามสกุล
    1. Name: txtLastname
    2. Text: txtLastname
    3. MaxLength: 40 (ให้อ้างอิงความยาวจากตารางข้อมูล)

      ที่อยู่
    1. Name: txtAddress
    2. Text: txtAddress
    3. MaxLength: 150 (ให้อ้างอิงความยาวจากตารางข้อมูล)

      อำเภอ
    1. Name: txtAmphur
    2. Text: txtAmphur
    3. MaxLength: 50 (ให้อ้างอิงความยาวจากตารางข้อมูล)

      รหัสไปรษณีย์
    1. Name: txtPostCode
    2. Text: txtPostCode
    3. MaxLength: 5 (ให้อ้างอิงความยาวจากตารางข้อมูล)
ลองสังเกตด้วยน่ะครับว่า คุณสมบัติของ Text .... ที่ต้องใส่ลงไปด้วยนั้น ก็เพื่อช่วยให้เราได้รู้ว่าไอ้เจ้าคอนโทรลตัวนี้เนี้ยะ มันมีชื่อว่าอะไรบ้าง เพราะยิ่งมี TextBox มากเท่าไร และอีกอย่าง หากเราต้องย้อนกลับมาแก้ไขงานอีกรอบ หลังจากเวลาผ่านไปสักเดือนนึงดูซิ จะไม่งงแย่เหรอครับ ... พี่น้อง อันนี้ก็คงต้องฝึกให้เป็นนิสัยด้วยแล้วกัน ไม่ใช่ไปทำตามหนังสือที่เขาบอกมากนัก เช่น ประเภททำแบบ Index ดังนี้คือ Name(0), Name(1), ... ไปจนถึง Name(30) แล้วจะไปรู้ได้ไงว่า Name(17) นี่มันคือ ????? เฮ้อ ... แค่คิดก็มันแล้วครับพี่น้อง
    Properties หรือ คุณสมบัติที่สำคัญสำหรับ ComboBox มีดังนี้คือ
      แสดงรายชื่อจังหวัด
    1. Name: cmbProvince
    2. Text: cmbProvince เหตุผลเหมือนกับ TextBox
    3. Style: 2 - Drop Down List
      อันนี้จะเป็นการบังคับให้ ComboBox แสดงผลในโหมดอ่านได้อย่างเดียว (Read only) ไม่ต้องการให้ผู้ใช้คีย์อะไรเข้าไปได้ แต่ในโปรแกรมที่ผมใช้งานจริงๆนั้น จะไม่ได้ออกแบบเช่นนี้หรอกครับ แล้วเราค่อยมาว่ากันต่อไปในภาคต่อๆไปครับผม ... แต่สำหรับผู้ที่เข้ามาเรียนกับผมนั้น ผมก็จะบอกเป็นแนวทางเพื่อให้เขาไปสร้างเป็น ฟังค์ชั่น ในการตรวจสอบเพิ่มเติมเอาเองน่ะครับ

 

ก่อนที่ท่านจะโค้ดคำสั่งต่างๆเข้าไปนั้นในฟอร์มนั้น ผมขอแทรกขั้นตอนสำคัญอีกประการหนึ่ง นั่นคือ การประกาศตัวแปร ที่ต้องใช้งานบ่อยๆ รวมไปถึงโปรแกรมย่อยแบบ Public เอาไว้ใน Module ด้วยการกดเมาส์ขวาในช่อง Project และ Add --> Module เพิ่มเติมเข้ามาก่อนน่ะครับ ดังภาพที่อยู่ด้านล่างนี้



เมื่อ Save ไฟล์เราจะได้เป็นนามสกุล BAS ครับ
Option Explicit

Global ConnMyDB As New ADODB.Connection ' สร้าง Connection เพื่อเชื่อมต่อเข้ากับไฟล์ฐานข้อมูล MS Access
Global RS As New ADODB.Recordset ' สร้างการเชื่อมต่อเข้ากับตาราง (ตััวหลัก)
Global DS As New ADODB.Recordset ' สร้างการเชื่อมต่อเข้ากับตาราง (ตััวรอง)
Global Statement As String ' สำหรับการประกาศ SQL Statement
'
Global blnNewData As Boolean ' สำหรับให้รู้ว่าฟอร์มนั้นสร้างข้อมูลขึ้นใหม่ หรือ เป็นการแก้ไข
'
Public Sub OpenDataBase() ' โปรแกรมย่อยใช้เปิดไฟล์ฐานข้อมูล
On Error GoTo Err_Handler
Dim DB_File As String
    DB_File = App.Path
 ' ตรวจสอบตำแหน่งของไฟล์ข้อมูล
    If Right$(DB_File, 1) <> "\" Then DB_File = DB_File & "\"
    DB_File = DB_File & "MyDB.MDB"
 ' สร้าง Connection
    Set ConnMyDB = New ADODB.Connection
    ConnMyDB.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & DB_File & ";" & _
        "Persist Security Info=False"

    ConnMyDB.Open ' เปิดไฟล์ข้อมูลเรียบร้อย
    Exit Sub
Err_Handler:
    MsgBox "Error : " & Err.Number & " " & Err.Description ' คอยดักข้อผิดพลาด - Trap Error
    End
End Sub

Public Sub CloseDataBase() ' โปรแกรมย่อยใช้ปิดไฟล์ฐานข้อมูล
    If ConnMyDB.State = adStateOpen Then 
        ConnMyDB.Close
        Set ConnMyDB = Nothing
    End If
End Sub
ดังนั้นเมื่อ Save ไฟล์ (นามสกุล BAS) เรียบร้อยแล้ว และไม่ว่าคุณจะสร้างงานโปรเจคขึ้นมาใหม่ ก็สามารถดึงไฟล์ตัวนี้ไปใช้งานได้เสมอ โดยไม่จำเป็นต้องมานั่งเสียเวลาคัดลอกโค้ดไปเลยครับ ... นี่คือเหตุผล

เริ่มต้นการโค้ดโปรแกรมลงสู่ฟอร์มแสดงผล


เอาล่ะครับ ... ก็ย้อนกลับมาพิจารณาจากฟอร์มเดิมที่เราได้สร้างขึ้นเอาไว้แล้ว Concept หลักของแนวทางแบบ Run-Time นั้น ผมจะมี โปรแกรมย่อย ตัวหลักๆอยู่ดังต่อไปนี้คือ
  1. SetupScreen เพื่อ Clear หน้าจอ กล่าวง่ายๆ คือ ล้างพวก TextBox ให้มันเป็นช่องว่างเปล่านั่นแหละครับ เพื่อพร้อมจะรับข้อมูลเข้ามา ไม่ว่าจะเป็นการเพิ่ม หรือ การแก้ไขข้อมูลก็ตาม
  2. RecordToScreen เพื่อนำข้อมูลเดิมมาแสดงผล และอาจมีการแก้ไขข้อมูลต่อไป
  3. แสดงข้อมูลจากตารางย่อย (Detail) เข้าใน ComboBox ในตัวอย่างนี้ก็คือ DisplayProvince เพื่อแสดงรายชื่อจังหวัด
Sub SetupScreen() ' Clear หน้าจอ
    txtCustomerID.Text = "" ' รหัสลูกค้า
    txtFirstname.Text = "" ' ชื่อลูกค้า
    txtLastname.Text = "" ' นามสกุล
    txtAddress.Text = "" ' ที่อยู่
    txtAmphur.Text = "" ' อำเภอ
    cmbProvince.Clear ' จังหวัด
    txtPostCode.Text = "" ' รหัสไปรษณีย์
End Sub

Sub RecordToScreen() ' นำข้อมูลมาแสดงผล
Set RS = New Recordset
    ' SQL Statement ตัวนี้นี่แหละครับ ที่เราตัดมาจาก MS Access
    Statement = "SELECT tblCustomer.*, tblProvince.ProvinceName " & _
        " FROM tblCustomer INNER JOIN tblProvince ON tblCustomer.ProvinceID = tblProvince.ProvinceID " & _
        " WHERE [CustomerID] = 2 " ' สมมุติว่าต้องการให้แสดงผลข้อมูลของ CustomerID มีค่า = 2

    RS.Open Statement, ConnMyDB, adOpenForwardOnly, , adCmdText ' ในการแสดงผลนั้นให้ทำการอ่าน (Read Only) ไปข้างหน้าอย่างเดียว (Forward) เพื่อช่วยเร่งการแสดงผลเท่านั้นเอง
    txtCustomerID.Text = "" & RS("CustomerID")
    txtFirstname.Text = "" & Trim(RS("Firstname"))
    txtLastname.Text = "" & Trim(RS("Lastname"))
    txtAddress.Text = "" & Trim(RS("Address"))
    txtAmphur.Text = "" & Trim(RS("Amphur"))
    cmbProvince.Text = RS("ProvinceName") ' เราจะเอาชื่อจังหวัดมาแสดงผลครับ
    txtAmphur.Text = "" & Trim(RS("Amphur"))
    txtPostCode.Text = "" & Trim(RS("PostCode"))
 ' ปิดการเชื่อมต่อตารางไว้ก่อนน่ะ
RS.Close
Set RS = Nothing
End Sub

Sub DisplayProvince() ' นำข้อมูลรายชื่อจังหวัดเข้ามาใน ComboBox
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")) ' ที่ทำเช่นนี้ก็เพราะป้องกันข้อผิดพลาดจากตารางข้อมูล tblProvince ในฟิลด์ ProvinceName หากมันมีค่าเป็น Null
        cmbProvince.AddItem Add$ ' เป็น Method ของการนำข้อมูลเข้าไปใน ComboBox โดยอินเด็กซ์ตัวแรกจะมีค่าเป็น 0 (ให้ย้อนกลับไปดูตารางข้อมูลของ tblProvince)
        DS.MoveNext ' ทำไปเรื่อยๆจนกว่าจะหมด
    Loop
 ' ปิดการเชื่อมต่อตารางไว้ก่อนน่ะ
    DS.Close
    Set DS = Nothing
End Sub

' ทีนี้ก็มาทดสอบการทำงาน เพื่อดูซิว่าผลมันจะออกมาเป็นอย่างไรครับพี่น้อง
Private Sub Form_Load() ' ทดสอบในฟอร์มหลักนี่แหละครับ
OpenDataBase ' สร้างการเชื่อมต่อไฟล์ข้อมูลที่เรากำหนดเอาไว้ใน Module
Call SetupScreen ' Clear การแสดงผลให้แสดงข้อความว่างเปล่า
Call DisplayProvince ' โหลดรายชื่อจังหวัดเข้าไปใน ComboBox
Call RecordToScreen ' ให้แสดงผลข้อมูลออกมา
End Sub

SetupScreen


DisplayProvince


RecordToScreen


ภาพจากการเชื่อมโยงตารางข้อมูล


หรือ ลองให้ CustomerID มีค่าเท่ากับ 8

ลองดูน่ะครับหากว่าเรามี ComboBox อยู่ในฟอร์มสัก 10 ตัว นั่นแสดงว่า เราต้องมีโปรแกรมย่อย ที่คล้ายกับ DisplayProvince อยู่อีกนับสิบตัวตามไปด้วย โค้ดมันคงจะพิลึกน่าดูน่าชมจัง ... เราจะแก้ไขด้วยการใช้เป็น "ฟังค์ชั่น" แทนครับ และ คุณต้องกำหนดในตารางข้อมูลให้มันมีโครงสร้างที่คล้ายกันๆด้วย เพื่อความง่าย และ สะดวก เอ้า ... แหม ก็ลองนำไปคิดเป็นการบ้านดูมั่งซิครับ ... พี่น้อง

หมายเหตุ: ในโปรแกรมย่อย DisplayProvince นี้มันเกิดการเรียงข้อมูลชื่อจังหวัดจากน้อยไปหามากมาเรียบร้อยแล้ว แล้วในกรณีที่ข้อมูลมันไม่จัดเรียงตามตัวอักษรล่ะ เราจะมีวิธีการในการแก้ปัญหานี้ได้อย่างไร ??????

ตอบ: อย่าพึ่งไปคิดมากเลยครับ เพราะบทความนี้เพียงเพื่อแค่ต้องการให้คุณๆได้เห็นแนวทางในการนำข้อมูลออกมาแสดงผลด้วยวิธีการ Run-Time เท่านั้นเองครับผม มันยังไม่ได้ใกล้เคียงกับงานจริงๆที่สามารถนำออกมาขายได้เลยครับ ... พี่น้อง ... ก็ลองติดตามกันต่อไปเรื่อยๆแล้วกัน
จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560