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

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

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

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

Visual Basic 6.0 กับ Northwind DataBase (ภาคพิเศษ) มาพร้อม Source Code เพื่อการศึกษาแบบกึ่งอาชีพ

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 7/12/2549 20:30:00
(อ่าน : 35190) 

ก่อนอื่นต้องขอขอบคุณทุกๆท่านที่ได้เข้ามาแวะเยี่ยมชมเว็บไซต์ของนักจับฉ่ายคอมพิวเตอร์ คือทำมันสารพัดอย่างในคนๆเดียวนี่แหละ ทั้งที่ส่งเมล์เข้ามาสอบถามข้อมูลต่างๆ โดยเฉพาะเรื่องของ VB กับ Access ซึ่งมีค่อนข้างจะเยอะเอาการ เพราะส่วนใหญ่ที่คุณๆทั้งหลายจะได้เรียนรู้ในเรื่อง VB+DataBase นี้ ก็คือ การสาละวนกันอยู่ที่ Data Control หรือ การผูกติดฐานข้อมูลเข้ากับ Control นั่นเอง (Bound Control) ด้วยวิธีการนี้มันง่ายก็จริง แต่มันเหมาะสำหรับโปรแกรมขนาดเล็กๆ ที่ไม่ซับซ้อน รวมไปถึง เหมาะสำหรับให้คนเขียนโปรแกรมนั่นแหละใช้งานเอง หลายคนที่ได้เรียนรู้กันในสไตล์แบบนี้ ซึ่งพอมาถึงสักจุดๆหนึ่ง มันก็จะถึงทางตัน Error เพียบ ไม่ว่าจะเป็น Run-Time หรือ Logical Error การขยายขีดความสามารถ หรือ ความต้องการเป็นไปได้ยาก หรือ แทบจะไม่ได้เลย ... อ้าวฝอยมาซ่ะเยอะ ลองมาดูงานอีกชิ้นหนึ่งที่คุณ [email protected] ส่งเมล์พร้อมรูปมาถามผม ลองดูภาพก่อนครับ

ภาพที่ส่งมาให้ดู
ภาพที่ส่งมาให้ดู

ดูปั๊บก็รู้แล้วว่าใช้ Data Control อันที่จริงจะแก้ไขก็ไม่ยากหรอกครับ ... เอาเป็นว่าผมไม่สนับสนุนให้บรรดาผู้เริ่มต้นคิดจะเป็นโปรแกรมมั่ว เอ๊ย โปรแกรมเมอร์ มาฝึก มาหัด กันไปแบบผิดทิศ ผิดทาง อย่างนี้จะดีกว่า แต่ทว่าเว็บมาสเตอร์ใจดี๊ใจดี ขอออกแบบให้ใหม่ในลักษณะ Run Time ไปเลย ซึ่งมันเป็น Flow control แบบง่ายๆ โค้ดที่ผมให้มานี้มันยังไม่สมบูรณ์ 100 % (รับรองว่าไม่มีกั๊กหรอก เดี๋ยวมีเฉลยให้) แต่มันคือแนวทาง และ ทางเลือกอีกทางหนึ่งให้คุณๆได้ศึกษาเรียนรู้ และ อย่าลืมลองไปอ่านๆดูในภาคต่างๆที่ผมทำไว้ให้ศึกษากัน ... รีบหน่อยแล้วกัน เผื่ออาจมีสำนักพิมพ์เขามาขอซื้อลิขสิทธิ์ของผมไปก่อนน่ะ เดี๋ยวก็ได้เสียตังค์อ่านล่ะ 55555 .....

ผลลัพธ์ที่จะได้จากภาคนี้
ผลลัพธ์ที่จะได้จากภาคนี้
พิจารณาให้ดีจากการใช้งานของ ComboBox น่ะครับ ... แล้วคุณจะรู้ว่าคุณทะลุทางตันอีกอย่างได้แล้ว

DataBase เป็น Northwind.mdb แต่ผมเปลี่ยนชื่อไฟล์เป็น Product.mdb จะมีเฉพาะตารางข้อมูลเท่านั้นครับ และ ข้อมูลตัวอย่างบางตัวต้องแก้ เพราะมันเป็นตัวขยึกขยือ เมื่อรันโปรแกรมแล้วมันอาจ Error เด้อพี่น้อง ... และแน่นอนครับผมเลือกใช้ Control มาตรฐานทั่วๆไป ร่วมกับ MS FlexGrid แค่นี้เอง ...
MSN: [email protected]
Skype: Thongkorn
CamFrog: Thongkorn (โปรแกรมประเทืองปัญญาจริงๆ อิอิ)

ดาวน์โหลด Source Code สำหรับ VB6-SP6
Option Explicit

Private Sub cmdSave_Click()
    ' ก่อนทำการบันทึกข้อมูลต้องตรวจสอบค่าใน txtProductID ว่ามีหรือไม่ 
' หากไม่มีแสดงว่าไม่มีการเรียกข้อมูลขึ้นมาแสดง ก็ให้ออกจาก Sub Program ได้
    If Trim(txtProductID.Text) = "" Or Len(Trim(txtProductID.Text)) = 0 Then Exit Sub Call SaveData ' Call SetupScreen Call SetupFgProduct Call DisplayFgProduct End Sub ' โปรแกรมย่อยที่ทำการบันทึกข้อมูล Sub SaveData() On Error Resume Next Dim CountRec As Long Set RS = New ADODB.Recordset If blnNewData = True Then ' คิดเองเป็นการบ้านว่าจะทำอย่างไรให้เกิดการบันทึกข้อมูลได้ ในกรณีของการเพิ่มข้อมูล         ' นึกไม่ออก ก็กลับไปทบทวนบทความ VB กับ DataBase ทั้ง 6 ตอนน่ะพี่น้อง Else ' เรียกตาราง Products มาตัวเดียวพอ เพราะจะบันทึกฟิลด์ต่างๆในตารางเดียวครับผม         Statement = "SELECT * FROM Products WHERE [ProductID] = " & Val(txtProductID.Text) RS.Open Statement, ConnMyDB, adOpenKeyset, adLockOptimistic, adCmdText End If ' RS("ProductName") = "" & Trim(txtProductName.Text) RS("QuantityPerUnit") = "" & Trim(txtQuantityPerUnit.Text)     ' ต้องหาค่า SupplierID และ CategoryID มาเก็บค่าลงในระบบ
    ' ดังนั้นต้องเรียกใช้ฟังค์ชั่นเพื่ออ่านค่าจาก ComboBox มาแล้วแปลงให้เป็นค่า ID หรือ Foreign Key
    RS("SupplierID") = CheckElement(cmbSupplier.Text, "SupplierID", "CompanyName", "Suppliers") RS("CategoryID") = CheckElement(cmbCategory.Text, "CategoryID", "CategoryName", "Categories") RS.Update MsgBox "บันทึกข้อมูลเรียบร้อย.", vbOKOnly + vbInformation, "รายงานสถานะ" ' RS.Close Set RS = Nothing End Sub ' ฟังค์ชั่นที่ใช้ในการหาค่า ID ของตัวอักษรที่อยู่ใน ComboBox ' โดยการส่งค่ามา คือ ค่าที่อยู่ใน ComboBox, ชื่อฟิลด์ ID, ชื่อฟิลด์ Name และ ชื่อตาราง
' (ปกติผมจะไม่ส่งมาเยอะอย่างนี้ โดยผมจะตั้งชื่อฟิลด์ให้มันมีความสัมพันธ์กัน) ' การส่งค่ากลับก็คือการส่ง ID ไปเพื่อบันทึกข้อมูลลงในตาราง Products นั่นเอง
Function CheckElement(CValue As String, FieldID As String, FieldName As String, TableName As String) As Integer Set DS = New ADODB.Recordset Statement = "SELECT * FROM " & TableName & " WHERE [" & FieldName & "] = " & "'" & CValue & "'" DS.Open Statement, ConnMyDB, adOpenForwardOnly, adLockReadOnly, adCmdText         ' หาข้อมูลไม่เจอ If DS.BOF And DS.EOF Then ' CheckElement = 0         ' นี่แหละที่ผมบอกว่าไม่เคยกำหนดฟิลด์ใดๆที่เป็น Primary Key ให้เป็น Autonumber เลย         ' หากเรากำหนดค่าเป็น Number (ไม่ใช่ Autonumber) ค่า 0 นี้มีไว้สำหรับใส่ค่าที่ไม่ระบุ หรือ หาไม่เจอ
        ' (กำหนดไว้ในตารางย่อย - Detail เช่น Categories หรือ Suppliers)
        ' หากเป็น Autonumber เรากำหนดค่าเองไม่ได้ครับผม ...         ' มิเช่นนั้นจะเกิด Error เพราะมันหาความสัมพันธ์กันไม่เจอนั่นเองครับ ... ท่านผู้ชม
Else             ' คืนค่า Foreign Key หรือ คีย์รองกลับไป CheckElement = DS(FieldID) End If DS.Close: Set DS = Nothing End Function Private Sub fgProduct_DblClick() ' เพื่อความแน่ใจว่าไม่มีการส่งค่าว่างมา กรณีที่ไม่มีรายการสินค้าเลย If Val(fgProduct.Text) <= 0 Or IsNull(fgProduct.Text) Then Exit Sub Call SetupScreen Call DisplaySupplier Call DisplayCategory ' แสดงให้รู้ว่า้เป็นการแก้ไข หากทำการเพิ่มข้อมูล blnNewData จะเป็น True     blnNewData = False Set RS = New Recordset Statement = "SELECT Products.*, Categories.CategoryName, Suppliers.CompanyName " & _ " FROM Suppliers INNER JOIN (Categories INNER JOIN Products ON " & _                             " Categories.CategoryID = Products.CategoryID) ON " & _ " Suppliers.SupplierID = Products.SupplierID " & _ " WHERE [ProductID] = " & Val(fgProduct.Text) RS.Open Statement, ConnMyDB, adOpenForwardOnly, , adCmdText txtProductID.Text = Right$("00000000" & RS("ProductID"), 8) txtProductName.Text = "" & RS("ProductName") cmbSupplier.Text = RS("CompanyName") txtQuantityPerUnit.Text = "" & RS("QuantityPerUnit") cmbCategory.Text = RS("CategoryName") ' ' ปิดตาราง RS.Close Set RS = Nothing End Sub Private Sub fgProduct_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then KeyAscii = 0 Call fgProduct_DblClick End If End Sub Private Sub fgSupplier_DblClick() ' เพื่อความแน่ใจว่าไม่มีการส่งค่าว่างมา กรณีที่ไม่มีรายการบริษัทฯที่ขายสินค้าเลย If Val(fgSupplier.Text) <= 0 Or IsNull(fgSupplier.Text) Then Exit Sub     ' ให้แสดงผลรายการสินค้าในตารางกริด Call DisplayFgProduct End Sub Private Sub fgSupplier_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then KeyAscii = 0 Call fgSupplier_DblClick End If End Sub Private Sub Form_Load() Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2 OpenDataBase ' Call SetupScreen Call SetupFgSupplier Call DisplayFgSupplier Call SetupFgProduct End Sub Sub SetupScreen() txtProductID.Text = "" txtProductName.Text = "" cmbSupplier.Clear txtQuantityPerUnit.Text = "" cmbCategory.Clear End Sub ' Load รายการ Supplier เข้าสู่ ComboBox Sub DisplaySupplier() Dim Add$ Set DS = New ADODB.Recordset     ' ให้จัดเรียงตามตัวอักษรไปเลย เพราะเรามีวิธีคำนวณหาค่า SupplierID อยู่แล้ว Statement = "SELECT * FROM Suppliers ORDER BY CompanyName" Set DS = ConnMyDB.Execute(Statement, , adCmdText) cmbSupplier.Clear Do Until DS.EOF Add$ = "" & Trim(DS("CompanyName")) cmbSupplier.AddItem Add$ DS.MoveNext Loop DS.Close Set DS = Nothing End Sub ' Load รายการ Category เข้าสู่ ComboBox Sub DisplayCategory() Dim Add$ Set DS = New ADODB.Recordset     ' ให้จัดเรียงตามตัวอักษรไปเลย เพราะเรามีวิธีคำนวณหาค่า CategoryID อยู่แล้ว Statement = "SELECT * FROM Categories ORDER BY CategoryName" Set DS = ConnMyDB.Execute(Statement, , adCmdText) cmbCategory.Clear Do Until DS.EOF Add$ = "" & Trim(DS("CategoryName")) cmbCategory.AddItem Add$ DS.MoveNext Loop DS.Close Set DS = Nothing End Sub Sub SetupFgSupplier() With fgSupplier .Clear .FixedRows = 1 .FixedCols = 0 .SelectionMode = flexSelectionByRow .Cols = 3 .Rows = 1 .TextMatrix(0, 0) = "SupplierID" .TextMatrix(0, 1) = "ลำดับที่" .TextMatrix(0, 2) = "ชื่อบริษัทฯ" .ColWidth(0) = 0 .ColWidth(1) = 600 .ColWidth(2) = 2160 End With End Sub Sub DisplayFgSupplier() Dim CountRec As Long, item As Long Set RS = New ADODB.Recordset Statement = "SELECT Suppliers.SupplierID, Suppliers.CompanyName FROM Suppliers " & _ " ORDER BY CompanyName" 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 fgSupplier.Rows = CountRec + 1 RS.MoveFirst item = 1 Do Until RS.EOF With fgSupplier .TextMatrix(item, 0) = RS("SupplierID") .TextMatrix(item, 1) = item .TextMatrix(item, 2) = RS("CompanyName") End With item = item + 1 RS.MoveNext Loop RS.Close Set RS = Nothing End Sub Sub SetupFgProduct() With fgProduct .Clear .FixedRows = 1 .FixedCols = 0 .SelectionMode = flexSelectionByRow .Cols = 6 .Rows = 1 .TextMatrix(0, 0) = "ProductID" .TextMatrix(0, 1) = "ลำดับที่" .TextMatrix(0, 2) = "รหัสสินค้า" .TextMatrix(0, 3) = "ชื่อสินค้า" .TextMatrix(0, 4) = "กลุ่ม/ประเภท" .TextMatrix(0, 5) = "จำนวนต่อหน่วย" .ColWidth(0) = 0 .ColWidth(1) = 600 .ColWidth(2) = 1200 .ColWidth(3) = 2300 .ColWidth(4) = 1650 .ColWidth(5) = 1600 End With End Sub Sub DisplayFgProduct() Dim CountRec As Long, item As Long Set RS = New ADODB.Recordset
ผลลัพธ์จากการใช้แบบสอบถาม
สร้างแบบสอบถาม (Query) จาก MS Access แล้วเราตัดเอาคำสั่ง SQL Statement มาใช้งานเลยครับ ... พี่น้อง
Statement = "SELECT Products.ProductID, Suppliers.SupplierID, Products.ProductName, " & _                         " Categories.CategoryName, Products.QuantityPerUnit " & _ " FROM Categories INNER JOIN (Suppliers INNER JOIN Products ON Suppliers.SupplierID = Products.SupplierID) ON " & _ " Categories.CategoryID = Products.CategoryID " & _ " WHERE Suppliers.SupplierID = " & Val(fgSupplier.Text) & _ " ORDER BY ProductID" RS.CursorLocation = adUseClient RS.Open Statement, ConnMyDB, adOpenForwardOnly, adLockReadOnly, adCmdText CountRec = RS.RecordCount If CountRec <= 0 Then RS.Close Set RS = Nothing Exit Sub End If ' fgProduct.Rows = CountRec + 1 RS.MoveFirst item = 1 Do Until RS.EOF With fgProduct .TextMatrix(item, 0) = RS("ProductID") .TextMatrix(item, 1) = item .TextMatrix(item, 2) = Right$("0000000" & Trim(RS("ProductID")), 8) .TextMatrix(item, 3) = "" & Trim(RS("ProductName")) .TextMatrix(item, 4) = "" & Trim(RS("CategoryName")) .TextMatrix(item, 5) = "" & Trim(RS("QuantityPerUnit")) End With item = item + 1 RS.MoveNext Loop RS.Close Set RS = Nothing End Sub Private Sub cmdExit_Click() CloseDataBase End End Sub Private Sub Form_Unload(Cancel As Integer) CloseDataBase End End Sub

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