วันจันทร์ที่ 27 มกราคม พ.ศ. 2557

2.2.15 การติดต่อฐานข้อมูลด้วย ActiveX Data Object

2.2.15 การติดต่อฐานข้อมูลด้วย ActiveX Data Object
การใช้งาน ADO (ActiveX Data Object) กับ MS Excel
ADO หรือ ActiveX Data Object เป็นเทคโนโลยีที่ช่วยให้แอพพลิเคชั่นต่างๆ สามารถเข้าถึงข้อมูลใดๆก็ได้ โดยอาศัยการเชื่อมต่อผ่าน OLE DB ซึ่งเป็นการอินเตอร์เฟสระดับล่าง (เราปล่อยให้ระบบมันไปคุยกันเอาเอง) ที่สามารถเข้าถึงแหล่งข้อมูลได้หลายประเภท ไม่ว่าจะเป็นไฟล์ฐานข้อมูล (DBMS), File System, Text หรือ Graphics รวมไปถึงแหล่งข้อมูลอื่นๆ คุณสมบัติที่ดีเลิศ ประเสริฐศรีของ ADO ก็คือใช้งานง่าย มีกระบวนการติดต่อของแอพพลิเคชั่นน้อย ใช้ทรัพยากรระบบไม่มากมาย หรือ ฟุ่มเฟือยนัก

หลายต่อหลายครั้งที่รับงานเขียนโปรแกรมขนาดเล็กๆเข้ามา ก็ต้องเจอกับการดึงข้อมูลเดิมออกมาใช้งาน โดยส่วนใหญ่ก็มักจะเป็น Access หรือไม่งั้นก็ Excel เป็นหลัก ซึ่งในบทความนี้ ขอกล่าวถึงโปรแกรมยอดนิยมอย่าง Excel ล่ะกัน เพราะผู้ใช้งาน (User) ส่วนใหญ่ ชอบเก็บข้อมูลต่างๆที่ต้องการเอาไว้เป็นประจำ
 ข้อมูลใน MS Excel ช่างเหมือนกับใน MS Access

ผลจากการทำงานของโปรแกรม
ดังนั้นในตัวอย่างงานชิ้นนี้ จะแสดงการเปิดไฟล์ Excel ขึ้นมา เพื่อดูข้อมูลต่างๆใน Work Sheet แต่ละตัว ที่มีอยู่ในไฟล์ MS Excel โดยเลือกนำ ADO มาใช้งาน

อ้างอิง References --> Microsoft ActiveX Data Objects 2.8 Library

เพิ่ม Component เข้ามาอีก 2 ตัว คือ Common Dialog และ Hierarchical Flex Grid Control
ในตัวอย่างนี้ บางส่วนผมก็ได้ทำการแทรกแนวทางของการทดสอบหาข้อผิดพลาด หรือ ที่เราเรียกว่า Trap Error
Option Explicit
Dim Conn As ADODB.Connection
' ฟังค์ชั่นที่ใช้ในการเปิดไฟล์ MS Excel
' และคืนค่ากลับ "จริง" หรือ "เท็จ" เพื่อแจ้งสถานะของการติดต่อไฟล์ด้วย
Private Function Connect() As Boolean
On Error GoTo ErrorHandler
    Set Conn = New ADODB.Connection
    With Conn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source=" & txtPathNameXLS.Text & ";Extended Properties=Excel 8.0;"
        .Open
    End With
      ' แสดงว่าสามารถเปิดไฟล์ MS Excel ได้ (หรือ Connect - เชื่อมต่อได้) ก็แจ้งกลับด้วยสถานะที่เป็นจริง
    Connect = True
ExitProc:
    Exit Function
ErrorHandler:
    ' แจ้งสถานะของความผิดพลาด (Trap Error)
    ' เทคนิคการเขียนโปรแกรมของผมครับ ตรง Title MsgBox --> "Error: ฟังค์ชั่น Connect" ก็คือ
    ' ให้มันแจ้งการเกิด Error ในโปรแกรมย่อย (Sub program หรือ Function) ว่ามาจากตัวไหนกันแน่
    ' เวลาที่มีโปรแกรมย่อยเหล่านี้อยู่
    MsgBox Err.Number & vbCrLf & Err.Description, vbOKOnly + vbCritical, "Error: ฟังค์ชั่น Connect"
      ' การติดต่อล้มเหลวผิดพลาด ต้องส่งค่ากลับเป็น False
    Connect = False
     ' การใช้ Resume ในกรณีที่เกิด Error ขึ้นมา ส่วน GoTo มันกระโดดไปแบบไม่มีเงื่อนไขเลย  
 Resume ExitProc
End Function
' ทำการอ่าน WorkSheet หรือเสมือนกับว่ามันคือตารางข้อมูล (Table) นั่นแหละ
Private Sub GetExcelTables()
    ' ประกาศตัวแปร RecordSet หรือ ตารางเสมือน
    Dim RS As ADODB.Recordset
    'Set RS = New ADODB.Recordset
    With Conn
        ' อ่านค่า Sheet ที่คุณเลือกเข้าสู่ RecordSet (มองเหมือนรูปแบบของตาราง - SchemaTables)
        Set RS = .OpenSchema(adSchemaTables)
    End With
    ' ' Loop ไปเรื่อยๆ จนกว่าจะหมดจำนวนของ WorkSheet
    Do While Not RS.EOF
        ' นำชื่อ WorkSheet (หรือ ชื่อตาราง) มาใส่ไว้ใน ComboBox
        cmbWorkSheet.AddItem (RS.Fields("TABLE_NAME").Value)
        RS.MoveNext
    Loop
    End Sub
' อ่านข้อมูลที่อยู่ในเซลล์ต่างๆเข้าสู่ Flexgrid
' เหมือนอ่านข้อมูลออกจากตาราง (Table) ใน MS Access ที่เราคุ้นเคย
Private Sub GetExcelData()
    Dim RS As ADODB.Recordset
    Set RS = New ADODB.Recordset
    With RS
        .ActiveConnection = Conn
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockReadOnly
        ' ไม่บรรยายแล้วกัน SQL Statement
        .Source = "SELECT * FROM [" & cmbWorkSheet.Text & "]"
        .Open
       
        ' กำหนด DataSource ให้กับ FlexGrid
        Set fgSheet.DataSource = RS
    End With
    RS.Close
    Set RS = Nothing
End Sub
' เริ่มต้นการเปิดไฟล์ Excel
Private Sub cmdOpenXLS_Click()
'On Error Resume Next
On Error GoTo ErrHandler
    With dlgOpenFile
        .DialogTitle = "เลือกไฟล์ Microsoft Excel"
        .InitDir = App.Path
        ' เลือกเฉพาะไฟล์ Excel
        .Filter = "All Microsoft Excel Files (*.xls)|*.xls"
        .ShowOpen
การกดปุ่ม Cancel ตอนเลือกไฟล์ซึ่งใช้ร่วมกับ On Error GoTo ErrHandler
  ' และต้องสั่งให้ dlgOpenFile.CancelError = True
  ' เพื่อให้เกิดการแจ้ง Error  โดย Err.Number = 32755 หมายความว่าเกิดการกดปุ่ม Cancel
        .CancelError = True
        If .FileName <> "" Then txtPathNameXLS.Text = .FileName
    End With
   
    ' ไม่มีชื่อไฟล์กลับมา ดังนั้นจะให้มันไปฟังค์ชั่น Connect ทำไมให้เกิด Error
    If txtPathNameXLS.Text = "" Then Exit Sub
   
    การเรียกใช้โปรแกรมย่อย (Sub หรือ Fucntion) เรียงต่อๆกันไปนี่
    ' บางทีก็หาจุดของการเกิด Error ลำบากเหมือนกัน
    If Connect Then
        cmbWorkSheet.Clear
        Call GetExcelTables
    End If
ExitProc:
    Exit Sub
ErrHandler:
    Select Case Err.Number
    Case 32755
        Err.Clear
        Exit Sub
    ' หรือคอย Trap Error ตัวอื่นๆ
    ' Case xxxx
        ' แจ้งความผิดพลาดเกี่ยวกับอะไร ...
     Case Else
        MsgBox Err.Number & vbCrLf & Err.Description
    End Select
    ' การใช้ Resume ในกรณีที่เกิด Error ขึ้นมา ส่วน GoTo มันกระโดดไปแบบไม่มีเงื่อนไขเลย
    Resume ExitProc
    End Sub
Private Sub cmbWorkSheet_Click()
    If cmbWorkSheet.ListIndex < 0 Then Exit Sub
    ' เรียกการแสดงผลเข้าสู่ FlexGrid
    Call GetExcelData
End Sub
Private Sub Form_Load()
    txtPathNameXLS.Text = ""
    cmbWorkSheet.Clear
    lblDescription.Caption = "โปรแกรมตัวอย่างการใช้งาน ADO และ MS Excel - www.g2gnet.com"
    Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
End Sub
Private Sub cmdExit_Click()
    End
End Sub

2.2.14 การเขียนVisual Basic6 ติดต่อ SQL Server

2.2.14 การเขียนVisual Basic6 ติดต่อ SQL Server
การเชื่อมต่อระบบฐานข้อมูล MS SQL Server
          โดยทั่ว ๆไปเมื่อเราทดสอบการเชื่อมต่อฐานข้อมูล MS SQL Server อยู่ที่เครื่องที่เราใช้งานเอง (Local Machine) ก็มักจะไม่ค่อยพบปัญหาเท่าใดนัก แต่พอข้ามเครื่อง (Network) ทีไรก็จะเจอปัญหาทุกที่ ซึ่งส่วนใหญ่ก็น่าจะเป็นเรื่องของ Security การใช้งานโปรแกรม MS Visual basic 6 ไม่จำเป็นต้องมีฟอร์มเลยก็ได้ โดยที่เราสามารถสั่งให้ Startup object ได้เลย ที่ Sub Main ซึ่งเจ้า Sub Main ที่ว่ามานี้ โดยปกติเราจะนำไปวางไว้ที่ Module (นามสกุล .BAS)

การออกแบบโปรแกรมให้มีโครงสร้าง จะช่วยลดปัญหาลงไปได้เยอะ'พร้อมๆกับทำให้โปรแกรมเมอร์อย่างมีเวลาไปเล่นเกมส์ได้อีก การทดสอบกับเครื่อง Local Machine
'โค้ดเหล่านี้ถูกจัดเก็บใน Module
Option Explicit
Global ConnDB As New ADODB.Connection
'Global RS As New ADODB.Recordset
'Global DS As New ADODB.Recordset
'Global RstData As New ADODB.Recordset   ' ใช้ในรายงาน
'Global Statement As String
'Global SQLStmt As String
'
Sub Main()
    ' ทดสอบการเชื่อมต่อฐานข้อมูล
    Call OpenDataBase
    ' เปิดแล้วก็ปิด ... เพราะต้องการแค่ทดสอบ
    Call CloseDataBase
End Sub
Public Sub OpenDataBase()
On Error GoTo Err_Handler
    ' Open a connection.
    Set ConnDB = New ADODB.Connection
    ' จัดรูปแบบให้สวยงาม อ่านง่ายๆ
    ' ใช้ฐานข้อมูลตัวอย่าง NorthWind เป็นตัวทดสอบ
    ConnDB.ConnectionString = _
        " Provider=SQLOLEDB.1;" & _
        " Integrated Security=SSPI;" & _
        " Server=(local);" & _
        " Initial Catalog=NorthWind;" & _
        " User ID=;" & _
        " Password=;"
    ConnDB.Open
    MsgBox "การเชื่อมต่อกับฐานข้อมูลเรียบร้อย.", vbOKOnly + vbInformation, "รายงานสถานะ"

ExitProc:
    Exit Sub
Err_Handler:
       MsgBox "Open Database Error : " & vbCrLf & Err.Number & " " & Err.Description
       Resume
End Sub
Public Sub CloseDataBase()
    ' ตรวจสอบว่ามีการเชื่อมโยง - Connect ข้อมูลหรือไม่
    If ConnDB.State = adStateOpen Then
        ConnDB.Close
        Set ConnDB = Nothing
    End If
End Sub

' การทดสอบกับระบบเครือข่ายโดยใช้ MS Windows XP เป็น Server
' ก็แค่เปลี่ยนชื่อ Server ที่เราต้องการจะติดต่อกับมัน ... เท่านั้นเอง
Public Sub OpenDataBase()
On Error GoTo Err_Handler
    Set ConnDB = New ADODB.Connection
    ConnDB.ConnectionString = _
        " Provider=SQLOLEDB.1;" & _
        " Integrated Security=SSPI;" & _
        " Server=Server-XP;" & _
        " Initial Catalog=NorthWind;" & _
        " User ID=;" & _
        " Password=;"

ConnDB.Open
    MsgBox "การเชื่อมต่อกับฐานข้อมูลเรียบร้อย.", vbOKOnly + vbInformation, "รายงานสถานะ"
ExitProc:
    Exit Sub
Err_Handler:
       MsgBox "Open Database Error : " & vbCrLf & Err.Number & " " & Err.Description
       Resume
End Sub

การใช้คุณสมบัติ adPromptAlways เพื่อสร้างทางเลือกของการเชื่อมต่อฐานข้อมูล
Public Sub OpenDataBase()
On Error GoTo Err_Handler
    Set ConnDB = New ADODB.Connection
    ConnDB.ConnectionString = _
        " Provider=SQLOLEDB.1;" & _
        " Integrated Security=SSPI;" & _
        " Server=Server-XP;" & _
        " Initial Catalog=NorthWind;" & _
        " User ID=;" & _
        " Password=;"
  ConnDB.Properties("Prompt") = adPromptAlways
    ConnDB.Open
    ' MsgBox "การเชื่อมต่อกับฐานข้อมูลเรียบร้อย.", vbOKOnly + vbInformation, "รายงานสถานะ"
ExitProc:
    Exit Sub
Err_Handler:
    Select Case Err.Number
        ' ดัก Trap Error ของการกดปุ่ม Cancel
        Case -2147217842
            ' จากนั้นสั่งให้ Resume หรือ ทำงานต่อไปได้เลย
            Resume
       
        Case Else
            MsgBox "Open Database Error : " & vbCrLf & Err.Number & " " & Err.Description
            Resume
    End Select
End Sub

2.2.13 การสร้างงานด้วย Data Rever

2.2.13 การสร้างงานด้วย Data Rever
Data Report
Visual Basic 6 เป็นเวอร์ชันแรกที่เพิ่ม report writer ภายใน IDE เมื่อเปรียบเทียบกับ Crystal report แล้ว DataReport designer ใช้ได้ง่ายกว่า แต่ส่วนประกอบหลายอย่างและไม่สามารถทำงานหนักได้ดีเท่ากับ Crystal report
การใช้ DataReport designer ต้องทำการเพิ่มเข้าไปใน IDE ด้วยการไปที่เมนู Project แล้วเลือกคำสั่ง Component เมื่อไดอะล๊อกบ๊อกซ์ Component เปิดขึ้นมา ให้คลิกแท็บ Designer แล้วเลือก check box ของ DataReport แล้วคลิกที่ ok เพื่อปิดไดอะล๊อกบ๊อกซ์ หรือสร้าง data project ใหม่ และให้ Visual Basic สร้าง instance ของ DataReport designer
DataReport designer ทำงานในโหมด bound อย่างเดียว ทำให้สามารถดึงข้อมูล และส่งไปยังเครื่องพิมพ์หรือแสดงรายการใน Preview window โดยอัตโนมัติ DataReport designer สามารถส่งออกรายงานเป็นไฟล์ข้อความ หรือไฟล์ HTML และสนับสนุนรูปแบบกำหนดเอง
DataReport designer มากับกลุ่มของตัว Control ที่ใช้ได้รูปถึง Lines, Shapes, Images และฟังก์ชันที่นำมาใช้การสร้างฟิลด์ผลรวมในรายงาน การส่งพิมพ์ไปเครื่องพิมพ์เป็นการส่งในโหมด Asynchronous ที่ทำให้ผู้ใช้สามารถพิมพ์งานขณะที่กำลังพิมพ์งาน

ไอคอน ชื่อ Class ชื่อ Class คำอธิบาย
  RptLabel RptLabel สร้างป้าย ข้อความ เหมือน Label
  RptTextBox RptTextBox ข้อความ หรือข้อมูลของฟิลด์ เหมือน Text box
  RptPicture RptPicture แสดงภาพ เหมือน Image
  RptLine RptLine เส้น
  RptShape RptShape รูปทรง เช่น สี่เหลี่ยม วงกลม
  RptFunction RptFunction ประยุกต์ฟังก์ชัน
การทำงานเมื่อออกแบบ
วิธีง่ายที่สุดในการสร้างรายงานด้วย DataReport คือ ทำงานร่วมกับ DataEnvironment designer ซึ่ง DataReport designer สนับสนุนการ drag-and-drop ของอ๊อบเจค command ใน DataEnvironment designer รวมถึงอ๊อบเจค Hierarchical command ข้อจำกัดคือรายงานสามารถมี Recordset ลูกได้เพียง 1 ระดับ ในแต่ละระดับ nesting ตัวอย่างที่จะกล่าวถึงเป็นการใช้อ๊อบเจค Hierarchical command ที่มาจาก table "Orders" และ "Order Details" ในฐานข้อมูล NWind.mdb
การรวมกับอ๊อบเจค Command
การสร้างรายงานที่มาจากอ๊อบเจค Hierarchical command มีวิธีการดังนี้
1. สร้าง Hierarchical command "Orders" มี Command ลูก คือ "Order Details" และตรวจสอบค่าได้ถึงสารสนเทศที่สนใจ เช่น โดยการรวมกับ Hierarchical Flexgrid บนฟอร์มและเรียกใช้คำสั่งประยุกต์
2. สร้าง instance ของ DataReport designer หรือใช้ provider ที่เป็น provider เริ่มต้น ใน Data project ของ Visual Basic Project
3. เรียกตารางคุณสมบัติ ของ DataReport แล้วกำหนดให้คุณสมบัติ DataSource ชี้ที่ DataEnvironment1 (หรือชื่อที่ตั้งไว้) และตั้งค่าคุณสมบัติ DataMember เป็น Orders
4. คลิกเมาส์ปุ่มขวาบนส่วนหัวรายงาน(Report header) ของ DataReport designer และเลือกคำสั่ง Retrieve Structure เพื่อสร้างส่วนกลุ่มหัวและส่วนกลุ่มล่าง ซึ่งมีชื่อ Orders_header และ Orders_footer สำหรับส่วนรายละเอียด มีชื่อ Order_Details_detail
ส่วนที่เป็นบล็อกของข้อมูล ที่จะทำสำหรับแต่ละเรคคอร์ดในอ๊อบเจค Command แม่ ส่วนเรคคอร์ดตรงกับอ๊อบเจค Command แม่ ส่วนที่สองเป็น Command ลูก และมาถึงส่วนรายละเอียดซึ่งตรงกับอ๊อบเจค Command ชั้นในที่สุด ส่วนทั้งหมดยกเว้นส่วนรายละเอียดจะแบ่งเป็นส่วนหัวและส่วนล่าง ซึ่งจะพิมพ์ก่อนและหลังสารสนเทศที่สัมพันธ์กับส่วนของอ๊อบเจคที่ระดับชั้นใน
DataReport designer มีส่วนรายงาน (ซึ่งพิมพ์สารสนเทศที่ตอนต้นและท้ายของรายงาน) และส่วนหน้า (ซึ่งพิมพ์สารสนเทศที่ตอนต้นและตอนท้ายของแต่ละหน้า) ถ้าไม่เห็นสองส่วนนี้ให้เมาส์มุ่มขวา บน DataReport designer และเลือกคำสั่งที่ต้องการ
5. drag ฟิลด์ ที่ต้องการจากอ๊อบเจค Command "Orders" ใน DataEnvironment มายังส่วน Orders_header ของ DataReport เมื่อปล่อยปุ่มของเมาส์ ชุดของตัว control คือ RptLabel และ RptTextbox จะปรากฏใน DataReport ซึ่งภายใน RptLabel จะสร้างข้อความด้วยชื่อของฟิลด์ และ Rpttexbox จะถูกแทนที่โดยข้อความจาก ฟิลด์ฐานข้อมูล แล้วจัดตำแหน่งฟิลด์ให้เหมาะสม
6. คลิกบนอ๊อบเจค Command "Order Details" และ drag ไปที่ DataReport จากนั้น Visual Basic จะสร้างชุดตัว control คือ RptLabel และ RptTextbox สำหรับแต่ละฟิลด์ ใน Recordset สามารถลบฟิลด์ OrderID และจัดตำแหน่งตัว control ในแถว
7. จัดส่วนสูงเพื่อไม่ให้มีที่ว่างมากเกินไป ซึ่งมีความสำคัญมาก สำหรับส่วนรายละเอียด เพราะส่วนนี้จะแสดงเรคคอร์ดแต่ละเรดคอร์ดซ้ำ และสามารถลดส่วนทั้งหมดที่ไม่มีฟิลด์เป็นค่าว่าง
8. ถ้าสารสนเทศใน DataReport เพียงพอ ให้นำไดอะล๊อกบ๊อกซ์ของ Project properties pages เลือก Datareport1 เป็น Startup object และเรียกใช้โปรแกรม
Note: การวางตัว control ในส่วน สามารถวางให้ตรงกับอ๊อบเจค command และส่วนที่อยู่ระดับต่ำกว่า เช่น สามารถวางฟิลด์ OrderID จากอ๊อบเจค Command "Orders" ในส่วน Orders และ Order_Details แต่ไม่สามารถวางฟิลด์ UnitPrice จากส่วนชั้นใน Order_Details มายังส่วน Orders
การตั้งค่าคุณสมบัติ
การรวมตัว control ลงบน DataReport เหมือนกับตัว control มาตรฐานที่วางบนฟอร์ม แต่มีไลบรารีต่างกัน และไม่สามารถนำ intrinsic control มาวางบน DataReport หรือตัว control จากไลบรารี DataReport ไปตามวางบนฟอร์ม รวมถึงไม่สามารถใช้คำสั่งในเมนู Format ต้องใช้การคลิกเมาส์ปุ่มขวาบนตัว control และใช้คำสั่งจากเมนู popup
สำหรับคุณสมบัติเฉพาะ คือ คุณสมบัติ Control ถ้าตั้งค่าเป็น True ตัว control ยอมให้ขยายตามแนวตั้งเมื่อข้อมูล มากกว่าความกว้าง ค่าเริ่มต้นของคุณสมบัตินี้ คือ False ซึ่งจะตัดข้อความที่ยาวกว่าความกว้าง

การแสดงฟิลด์คำนวณ
วิธีการแสดงฟิลด์คำนวณมี 2 วิธีคือ
1. ใช้คำสั่ง SELECT คำนวณค่าของฟิลด์ต่าง ๆ ในเรคคอร์ดเดียวกัน เช่น
SELECT OrderID, ProductID, UnitPrice, Quantity, Discount,
((UnitPrice * Quantity) * (1 - Discount)) As Total FROM [Order Details]
แล้วเพิ่มฟิลด์ Total ในส่วนรายละเอียดเพื่อแสดงราคารวมของแต่เรคคอร์ด จาก Order Details แล้วจัดรูปแบบและตำแหน่งของฟิลด์ให้เหมาะสม
นอกจากนี้สามารถใช้คำสั่ง SQL ระดับสูง คือ การเชื่อม table ด้วย JOIN Clause เป็นประโยคคำสั่ง SELECT เพื่อดึงข้อมูลจาก table อื่น
SELECT [Order Details].OrderID, [Order Details].ProductID, [Order Details].UnitPrice,
[Order Details].Quantity, [Order Details].Discount, (([Order Details].UnitPrice *
[Order Details].Quantity) * (1 - [Order Details].Discount)) As Total,
Products.ProductName FROM [Order Details] INNER JOIN Products
ON [Order Details].ProductID = Products.ProduvtID
2. ใช้ RptFunction ในการหาผลรวมของเรคคอร์ด เช่น หาผลรวมฟิลด์ Total ของอ๊อบเจค Command "Order Details" ให้วาง RptFunction ลงในส่วน Order_Footer แล้วกำหนดค่าคุณสมบัติในตัว control ใหม่ ตั้งค่าคุณสมบัติ DataMember เป็น Order_Details คุณสมบัติ DataField เป็น Total คุณสมบัติ FunctioType เป็น 0-rptFuncSum และคุณสมบัติ DataFormat เป็น Currency ค่าที่หาได้เป็นผลรวมของแต่ละ OrderID
ถ้าต้องการหาผลรวมของรายงานทั้งหมด ให้วาง RptFunction ที่ส่วนรายงาน เช่น การหาผลรวมของค่าขนส่งทั้งหมด ให้วาง RptFunction ที่ส่วนรายงาน แล้วตั้งคุณสมบัติ DataMember เป็น Orders คุณสมบัติ DataField เป็น Freight คุณสมบัติ FunctioType เป็น 0-rptFuncSum และคุณสมบัติ DataFormat เป็น Currency เมื่อเรียกใช้โปรแกรม จะได้ผลรวมของทุก OrderID ที่หน้าสุดท้ายของรายงาน
การจัดการส่วนล่างของหน้าและตัวแบ่งหน้า
หน้าส่วนหัวและหน้าส่วนล่าง ใช้แสดงสารสนเทศเกี่ยวกับหมายเลขหน้า ,จำนวนหน้ารวม, วันที่และเวลาที่พิมพ์ เป็นต้น การกำหนดรายละเอียดเหล่านี้ที่ให้คลิกเมาส์ปุ่มขวาในส่วนที่สนใจ เลือกคำสั่ง Insert Control จากนั้นเลือกสารสนเทศที่ต้องการแสดง
ตัว control ที่ใช้คือ RptLabel แล้วกำหนดตัวอักษรตามตาราง 15.1 ในคุณสมบัติ Caption เช่น หน้า %p ของ %P
ในทุกส่วนของอ๊อบเจคมีคุณสมบัติ 2 อย่างที่มีผลต่อการแบ่งหน้า คือ คุณสมบัติ ForePageBreak เพื่อหากำหนดขึ้นหน้าใหม่
คุณสมบัติ KeepTogether เป็นค่า Boolean ถ้ากำหนดเป็น True การพิมพ์รายงาน DataReport จะเพิ่มตัวแบ่งหน้าหรือขึ้นหน้าใหม่โดยอัตโนมัติ ถ้าข้อมูลในหน้าต่อไปยาวกว่า 1 หน้ากระดาษ
คุณสมบัติอื่นของรายงาน
DataReport designer มีคุณสมบัติหลายอย่างที่สามารถปรับปรุงได้ในตารางคุณสมบัติ เหมือนกับ Designer อื่น เช่น Caption, Font, WindowState เป็นต้น
คุณสมบัติเฉพาะของ DataReport designer คือคุณสมบัติ LeftMargin, RightMargin, TopMargin และ ButtomMargin สำหรับการหาขนาดของระยะจากขอบกระดาษในการพิมพ์รายงาน ในขณะที่คุณสมบัติ ReportWidth หาความกว้างของหน้ารายงาน ส่วน GridX และ GridY เป็นระยะห่างของตารางตัว control ในเวลาออกแบบ
การทำงานเมื่อเรียกใช้
การเตรียมรายงาน อาจมีการเพิ่มตัว control บางตัวบน DataReport designer เพื่อใช้คุณสมบัติ เมธอด และ event ในการควบคุมผ่านคำสั่งเมื่อเรียกใช้ เพื่อทำให้สามารถสร้างรายงานที่ซับซ้อนได้
การพิมพ์รายงาน
การพิมพ์รายงานปกติทำได้ง่ายโดยการส่งพิมพ์ที่ปุ่มเครื่องพิมพ์บนแถบเครื่องมือใน Preview Window ของ DataReport ในการแสดง DataReport window ทำได้ด้วยเมธอด Show
DataReport1.WindowState = VbMaximzed
DataReport1.Show vbModal
ควบคุมการพิมพ์ด้วยคำสั่ง ต้องใช้เมธอด PrintReport ของ DataReport designer ตามไวยากรณ์นี้
Cookie = PrintReport [Show Dialog], [Range], [Page From], [Page To]
Show Dialog เป็นค่า Boolean สำหรับการแสดง Print dialog box
Range เป็นการกำหนดช่วงของการพิมพ์ ด้วยค่า 0-rptRangeAllPages (พิมพ์ทุกหน้า) หรือ 1-rptRangeFromTo (กำหนดช่วงพิมพ์)
Page Form และ Page To ระบุหลักแรกและหน้าสุดท้าย ของการพิมพ์
Dim Cookie As Long
Cookie = DataReport1. PrintReport (False, rptRangeFromTo,1,10)
การใช้ประโยชน์การประมวลผลแบบ Asynchronous
การสร้างรายงาน แบ่งเป็น 3 ขั้นตอนย่อย คือ การ query, การสร้างไฟล์ชั่วคราว และการพิมพ์ (รวมถึง Preview และการส่งออก) โดยการ query และการพิมพ์ไฟล์ชั่วคราว เป็น synchronous ส่วนการพิมพ์เป็น asynchronous เมื่อ DataReport designer กำลังทำงานแบบ asynchronous จะเกิด ProcessingTimeout เป็นระยะประมาณทุกวินาทีสามารถจับ event เพื่อให้ผู้ใช้ควบคุมการพิมพ์ได้ เช่น การยกเลิกการพิมพ์
Private Sub DataReport_ProcessingTimeout(ByVal Seconds As Long, Cancel As Boolean, _
ByVal JobType As MSDataReportLib.AsyncTypeConstants, ByVal Cookie As Long)
   ' แสดงข้อความทุกๆ 20 วินาที
   Const TIMEOUT = 20
   ' ค่าของวินาทีเมื่อแสดงข้อความ
   Static LastMessageSecs As Long
   ' ตั้งค่า LastMessage ใหม่ ถ้า มีการสั่งพิมพ์ใหม่
   If Seconds < LastMessageSecs Then
      LastMessageSecs = 0
   ElseIf LastMessageSecs + TIMEOUT <= Seconds Then
      LastMessageSecs = Seconds
      ' ถามผู้ใช้ ถ้าต้องการทำงานยกเลิกการทำงาน
      If MsgBox("การทำงานนี้ได้เริ่มต้นมาแล้ว " & Seconds & " วินาที " & vbCr & "ต้องการยกเลิกหรือไม่?", vbYesNo + vbExclamation) = vbYes Then
         Cancel = True
      End If
   End If
End Sub
อากิวเมนต์ JopType เป็นประเภทการทำงานที่ค่าเป็น 0-rptAsynPreview, 1-rptAsyncPrint หรือ 2-rptAsyncExport ส่วน cookie ระบุการทำงานตามค่า Long ที่ส่งออกมาจาก เมธอด PrintReport หรือ ExportReport การแสดงความก้าวหน้าของการพิมพ์สามารถจับ Progress event ซึ่งเกิดขึ้นทุกครั้งที่พิมพ์หน้าใหม่
Private Sub DataReport_AsyncProgress(ByVal JobType As MSDataReportLib.AsyncTypeConstants, _
ByVal Cookie As Long, ByVal PageCompleted As Long, ByVal TotalPages As Long)
   ' แสดงสถานะพิเศษใน Label บนฟอร์มหลัก
   frmMain.lblStatus = "พิมพ์ " & PageCompleted & " ของ " & TotalPages
End Sub
การส่งออกรายงาน
ผู้ใช้สามารถส่งออกรายงานด้วยการคลิกปุ่ม Export บน Preview window ของ DataReport ในไดอะล๊อกบ๊อกซ์ Export ให้เลือกชื่อไฟล์ ประเภทไฟล์ (เป็น html, htmltext , Unicode และ Unicode text) และช่วงของหน้า ซึ่งหน้าของการ Export มักจะไม่ตรงกับหน้าของการ Preview และไม่สามารถส่งออกกราฟฟิก โดย RptImage และ RptShape
การส่งออกด้วยคำสั่ง ใช้เมธอด ExportReport ตามไวยากรณ์นี้
Cookie = ExportReport ([Format Or Indexkey], [File Name], [Overwrite], [Show Dialog],
[Range], [PageFrom], [PageTo])
Format หรือ Indexkey เป็นดัชนีตัวเลข หรือ string key ที่ระบุรูปแบบการส่งออก
Overwrite เป็นค่า Boolean ในการหาว่าถ้ามีไฟล์อยู่แล้วจะทำการเขียนทับ (ค่าเริ่มต้นเป็น True)
Show Dialog เป็นค่า Boolean เพื่อระบุการแสดงไดอะล๊อกบ๊อกซ์มาตรฐานของการส่งออก
อากิวเมนต์อื่นมีความหมายเหมือนเมธอด PrintReport
เมธอด ExpoitReport ส่งออกค่า Long กำหนดได้เฉพาะใน ProcessingTimeout, AsyncProgress หรือ Error Event
ตัวอย่างคำสั่งการส่งออกไฟล์ html
cookie = DataReport1.ExportReport rptKeyHtml, App.Path & "\Orders", True
การเปลี่ยนผังรายงานเมื่อเรียกใช้
ในกรณีที่สร้างรายงาน หลายรายงานที่คล้ายกัน เช่น รายงานพนักงานที่แสดงสารสนเทศทั้งหมดและรายงานที่ซ่อนข้อมูลบางส่วน การสร้างรายงานประเภทคำได้สะดวกเนื่องจาก DataReport เป็นอ๊อบเจคแบบ programmable
การอ้างถึง อ๊อบเจค Section หรือส่วน ใช้ Sections collection และอ้างถึงตัว control ภายในส่วน
' ซ่อนส่วนล่าง (footer) ตามคำสั่ง
DataReport1.Sections ("Orders_Footer").Visible = False
' เปลี่ยน caption ของ lblTitle
DataReport1.Sections ("Section1").Controls ("lblTitle") .Caption = "May 99"
การอ้างถึงส่วนสามารถใช้ดัชนีตัวเลข หรือชื่อ
ในเวลาเรียกใช้ การเพิ่มตัว control ในรายงานไม่สามารถทำได้ เนื่องจาก DataReport ไม่สนับสนุนเมธอด Add การทำงานลักษณะที่ให้เตรียมรายงานที่มีฟิลด์ทั้งหมด แล้วซ่อนฟิลด์ที่ไม่ต้องการในแต่ละเวอร์ชัน
' ตัวแปร member สำหรับคุณสมบัติ ShowDetails
Private m_ShowDetails As Boolean
Public Property Get ShowDetails() As Boolean
   ShowDetails = m_ShowDetails
End Property
Public Property Let ShowDetails(ByVal newValue As Boolean)
Dim newTop As Single
   m_ShowDetails = newValue
   ' สร้างหัวรายงาน
   If m_ShowDetails Then
      Sections("Section1").Controls("lblTitle").Caption = "รายละเอียดใบสั่งซื้อ"
   Else
      Sections("Section1").Controls("lblTitle").Caption = "สรุปใบสั่งซื้อ"
   End If
   ' คุณสมบัติมีผลต่อการมองเห็นของส่วนในที่สุด
   Sections("Order_Details_Detail").Visible = m_ShowDetails
   ' มีผลกระทบต่อการมองเห็นในส่วน Orders ถ้าต้องการลดความสูงของส่วน
   ' ที่ต้องสร้างทั้งหมดตัว control ที่ไม่จำเป็นมองไม่เห็น และย้ายขึ้น อื่นๆ กำหนดให้
   ' ค่าเล็กกว่าของความสูงของส่วนที่ไม่ต้องการทำงาน
   newTop = IIf(m_ShowDetails, 2500, 0)
   With Sections("Orders_Header")
      .Controls("lblProduct").Visible = m_ShowDetails
      .Controls("lblProduct").Top = newTop
      .Controls("lblUnitPrice").Visible = m_ShowDetails
      .Controls("lblUnitPrice").Top = newTop
      .Controls("lblQty").Visible = m_ShowDetails
      .Controls("lblQty").Top = newTop
      .Controls("lblDiscount").Visible = m_ShowDetails
      .Controls("lblDiscount").Top = newTop
      .Controls("lblTotal").Visible = m_ShowDetails
      .Controls("lblTotal").Top = newTop
      .Controls("shaDetailHeader").Visible = m_ShowDetails
      .Controls("shaDetailHeader").Top = newTop
      ' ตั้งค่าความสูงส่วนเป็น 0 เพื่อบีบให้มากที่สุดเท่าที่จะทำได้
      .Height = IIf(m_ShowDetails, 2200, 0)
   End With
End Property
การเพิ่มรูปแบบ dynamic และ ฟิลด์ lookup
เมื่อมีการรวม DataReport ด้วยกลไกการรวม ADO มาตรฐาน ทำให้ศักยภาพสูงขึ้น เช่น การจัดรูปแบบของฟิลด์ที่รวมข้อมูลแล้วสามารถควบคุมผ่าน Format event ของอ๊อบเจค StdDataFormat
Dim WithEvents DiscountFormat As StdDataFormat
Private Sub DataReport_Initialize()
   ' สร้างรูปแบบ DataFormat อื่น สำหรับฟิลด์ Discount
   Set DiscountFormat = New StdDataFormat
   Set Sections("Order_Details_Detail").Controls("txtDiscount").DataFormat = DiscountFormat
End Sub
Private Sub DiscountFormat_Format(ByVal DataValue As StdFormat.StdDataValue)
   If CDbl(DataValue.Value) = 0 Then
      DataValue.Value = Null
   End If
End Sub


2.2.12 การใช้งาน Data Environment

2.2.12 การใช้งาน Data Environment
DataEnvironment
DataEnvironment designer เป็นส่วนการทำงานใหม่ใน Visual Basic 6 ที่น่าสนใจมาก โดยระหว่างเวลาออกแบบจะนำเสนออ๊อบเจค ADO ซึ่งมีอีกวิธีที่จะสร้างในขณะเรียกใช้ ความสามารถที่น่าสนใจ คือ สามารถนำแบบการเขียนโปรแกรมไปยังการพัฒนาฐานข้อมูล ทำให้การเขียนโปรแกรมง่ายและสะดวก
การประยุกต์ DataEnvironment designer สามารถใช้กำหนดพฤติกรรมของ ADO Connection, Command และอ๊อบเจค Recordset การตั้งค่าคุณสมบัติและเมธอดในเวลาออกแบบให้กดปุ่ม F4 เพื่อเปิดตารางคุณสมบัติหรือใช้ property page ของอ๊อบเจค เช่นเดียวกับการทำงานกับฟอร์มและตัว control
ข้อได้เปรียบอีกประการของอ๊อบเจค DataEnvironment ในเวลาออกแบบ แทนที่การสร้างอ๊อบเจค ADO คือ instance ของ Data Environment เป็น entity ที่เพียงพอในตัวเองที่สามารถเก็บอ๊อบเจคอื่นและคำสั่งที่ใช้จัดการ สามารถเพิ่มคุณสมบัติและเมธอด แบบ public ใน Data Environment designer ทำให้สามารถปรับปรุงการนำมาใช้ใหม่ เหมือนกับ class module เฉพาะที่ใช้ทำงานกับฐานข้อมูล
การเพิ่ม Data Environment designer ให้กับ project ปัจจุบัน มีวิธีการดังนี้
วิธีที่ 1 - ที่เมนู Project เลือกคำสั่ง Add Data Environment (Project Add Data Environment)
ถ้าไม่พบคำสั่งนี้ให้เพิ่ม Reference ของ Microsoft Data Environment Instance 1.0 Library ที่เมนู Project เลือกคำสั่ง Reference
วิธีที่ 2 - ที่ Window ของ Data View คลิกปุ่ม Add Data Environment designer


วิธีที่ 3 - เมื่อสร้าง Project ใหม่ให้เลือก Data Project จากรายการของ New Project

อ๊อบเจค Connection
อ๊อบเจคหลักใน Data Environment designer คือ อ๊อบเจค Connection ซึ่งคล้ายกับอ๊อบเจคฟอร์มใน Form designer ในความหมายที่เป็นอ๊อบเจคระดับบน แต่ต่างกันที่ instance ของ Data Environment designer สามารถเก็บอ๊อบเจคแบบหลาย Connection
การสร้าง Connection สามารถทำได้ดังนี้
วิธีที่ 1 - เมื่อมีการสร้าง DataEnvironment จะมีค่าเริ่มต้นของอ๊อบเจค Connection ให้กำหนดคุณสมบัตินี้ของอ๊อบเจค
วิธีที่ 2 - กดปุ่ม F 4 เพื่อเปิดตารางคุณสมบัติมาตรฐาน
วิธีที่ 3 - คลิกเมาส์ปุ่มขวาบนอ๊อบเจค แล้วเลือกคำสั่ง Properties เพื่อเปิด Property Page

การกำหนด Connection มีวิธีการเดียวกับการตั้งค่าคุณสมบัติ Data Link ใน Window ของ Data View และการสร้างคุณสมบัติ ConnectionString ของ ADO data control
ตารางคุณสมบัติมาตรฐานมีคุณสมบัติจำนวนหนึ่งที่ไม่ปรากฏใน Property page ได้แก่ คุณสมบัติ Designer UserName และ DesignPassword ที่ให้ผู้ใช้ตั้งค่าชื่อผู้ใช้และรหัสผ่าน เมื่อต้องการสร้างอ๊อบเจค Data Environment ในส่วน RunUserName และ RunPassword เป็นชื่อผู้ใช้และรหัสผ่านเมื่อประมวลผล คุณสมบัติ DesignPrompBehavior และ RunPrompBehavior สามารถกำหนดได้เป็น 1-adPromptAlways (แสดงไดอะล๊อกบ๊อกซ์ login เสมอสำหรับการแก้ไขข้อมูลการ login), 2-adPromptComplete (แสดงไดอะล๊อกบ๊อกซ์ login เมื่อพารามิเตอร์บางตัวหายไป), 3-adPrompt CompleteRequired (คล้ายกับ 2-ad Prompt Complete แต่ยินยอมให้ผู้ใช้ป้อนพารามิเตอร์ที่ต้องการ), 4-adPrompt Never (ไม่แสดงไดอะล๊อกบ๊อกซ์ login และส่งออกค่าผิดพลาดไปที่โปรแกรมประยุกต์ ถ้าพารามิเตอร์หายไป) ตามปกติ จะตั้งค่าคุณสมบัติ DesignPromptBehavior เป็น adPromptComplete และ RunPromptBehavior เป็น adPrompt Never สำหรับคุณสมบัติ DesignSaveAuthentication และ RunSaveAuthentication เป็นการหาสารสนเทศ login ที่บันทึกใน VBP และไฟล์ EXE
อ๊อบเจค Command
อ๊อบเจค Command ใน Data Environment designer เป็นการเสนอการทำงานของฐานข้อมูลอ๊อบเจค Command เป็นลูกของอ๊อบเจค Connection เสมอเช่นเดียวกับตัว control เป็นลูกของฟอร์ม
การสร้างอ๊อบเจค Command
การสร้างอ๊อบเจค Command ทำได้ โดยการ drag อ๊อบเจคได้แก่ table, view หรือ stored procedure จาก Window ของ Data View ไปที่ Window ของ Data Environment จากนั้น Visual Basic จะสร้างอ๊อบเจค Command ตรงตาม table, view หรือ stored procedure และสร้าง Connection ที่เป็นแม่ ถ้าจำเป็นอ๊อบเจค Command สามารถเป็นลูกเฉพาะ Connection ที่อ้างถึงฐานข้อมูลของตัวเอง ยังสมมารถสร้างอ๊อบเจค Command จับคู่กับ stored procedure ในฐานข้อมูลโดยการคลิกปุ่ม Insert Stored Procedure บนแถบเครื่องมือ Data Environment
การอ๊อบเจค Command ภายใน DataEnvironment designer
1. เลือกอ๊อบเจค Connection แล้วคลิกที่ปุ่ม Insert Command บนแถบเครื่องมือของ DataEnvironment designer
2. จะมีไอคอนอ๊อบเจค Command ภายในอ๊อบเจค Connection ให้คลิกเมาส์ปุ่มขวา แล้วเลือก Properties จากเมนู popup
3. จะปรากฏไดอะล๊อกบ๊อกซ์ Property page ของอ๊อบเจค Command ที่เลือก เพื่อกำหนดข้อมูลของ อ๊อบเจค Command ได้แก่ ชื่อ Connection และแหล่งข้อมูล จาก ฐานข้อมูล หรือการใช้คำสั่ง SQL เมื่อกำหนดเสร็จแล้ว ให้คลิก Apply หรือ OK จะปรากฏอ๊อบเจค Command ตามรายละเอียดบน DataEnvironment designer
อ๊อบเจค Command มี 2 ชนิด คือ ชนิดหนึ่งส่งคืนเป็น Recordset อีกชนิดไม่ส่งคืนเป็น Recordset โดยชนิดแรก คือ คิวรี่ของ SQL, stored procedure, table หรือ view ที่ส่งค่าเป็น Recordset ชนิดที่สองคือคำสั่งของ SQL หรือ stored procedure ในการแทรก ลบ หรือปรับค่าในฐานข้อมูลแต่ไม่มีการส่งคืนค่าเป็นกลุ่มของเรคคอร์ด
คุณสมบัติทั้งหมดของอ๊อบเจค Command สามารถตั้งค่าได้ภายใน property page และไม่จำเป็นต้องเปิดตารางคุณสมบัติมาตรฐาน ที่แท็บ General ให้เลือกอ๊อบเจคฐานข้อมูล เช่น table, view stored procedure หรือ synonym ที่ตรงกับ Command หรือใช้คำสั่ง SQL
ถ้ามีคำสั่ง normal, nonparameterized และ nonhierarchical สามารถข้ามไปที่แท็บ Advanced สำหรับการเลือกประเภท cursor และที่ตั้ง, ประเภทการล๊อก, ขนาดของ cache, ค่า timeout ของคำสั่ง และจำนวนเรคคอร์ดมากที่สุด ที่คิวรี่สามารถส่งออกได้ ซึ่งค่านี้เป็นการป้องกันมาถึงจำนวนเรคคอร์ดมากเกิน ที่อาจจะนำมาสู่ปัญหาการติดต่อของเครือข่าย มีคุณลักษณะเดียวของหน้านี้ ที่ไม่สัมพันธ์กับคุณสมบัติ ADO คือ check box ของ Recordset Returning
คำสั่ง Parameterized
การใช้พารามิเตอร์ จะเพิ่มความยืดหยุ่นอย่างมากให้กับอ๊อบเจค Command การสร้างคำสั่ง Parameterized สามารถแบ่งออกเป็น 2 ประเภท คือ พารามิเตอร์แบบ SQL Query และ stored procedure
คำสั่งพารามิเตอร์แบบ SQL Query เป็นการใช้เครื่องหมายคำถามเป็นตำแหน่งของพารามิเตอร์ ในคำสั่ง SQL Query เช่น
SELECT * FROM Products;
หลังจากที่ป้อนคิวรี่ในแท็บ General ของไดอะล๊อกบ๊อกซ์ Properties เปลี่ยนไปที่แท็บ Parameter และตรวจ Data Environment ได้จัดการเพิ่มพารามิเตอร์ให้กับคิวรี่แล้ว ในแท็บนี้สามารถกำหนดชื่อให้แต่ละพารามิเตอร์, กำหนดประเภทข้อมูลและขนาดและอื่นๆ พารามิเตอร์ทั้งหมดในคิวรี่ประเภทนี้เป็นพารามิเตอร์นำเข้า
คำสั่งพารามิเตอร์แบบ stored procedure สร้างโดยการคลิกปุ่ม insert stored procedure และเลือก stored procedure ที่ต้องการใช้งาน ตามปกติ Data Environment สามารถดึงไวยากรณ์ stored procedure และจัดกลุ่ม Collection ให้กับคำสั่งพารามิเตอร์ได้ แต่ต้องระวังเกี่ยวกับคุณลักษณะ Direction ซึ่งบางครั้งอาจผิดพลาดได้เนื่องจาก Data Environment อาจจะไม่ทราบพารามิเตอร์ส่งออก แต่แก้ไขได้ที่คุณลักษณะ Direction
การรวมข้อมูลด้วย DataEnvironment Designer
DataEnvironment designer สามารถทำงานในฐานะแหล่งข้อมูล ADO ที่ปรากฏใน Combo box ของคุณสมบัติ DataSource ในตารางคุณสมบัติขณะที่ออกแบบ เมื่อมีการรวมตัว control กับ DataEnvironment designer และต้องตั้งค่าคุณสมบัติ DataMember ของตัว control ชนิด Data-aware ด้วยชื่อของอ๊อบเจค Command ที่เจาะจง มีเฉพาะอ๊อบเจค Command แบบส่งออก Recordset สามารถทำงานในฐานะแหล่งข้อมูล
ฟิลด์ และตาราง
การสร้างตัว control บนฟอร์มและรวมเข้ากับอ๊อบเจค DataEnvironment ทำได้โดยการ drag-and-drop

1. สร้าง Project ใหม่ จะปรากฏฟอร์มเปล่า
2. ที่เมนู View เลือกคำสั่ง Data View เมื่อปรากฏ Window ของ Data View ให้คลิกที่ปุ่ม Add Data Environment
3. เมื่อ Window ของ Data Environment เปิดขึ้นมาให้สร้างอ๊อบเจค Command ของ table ชื่อ Customers โดยการเลือก table นี้ใน Window ของ Data View แล้ว drag ไปวางไว้ใน Window ของ Data Environment ซึ่ง Visual Basic จะสร้างอ๊อบเจค Command ให้ชื่อ Customers แบบใช้ Data Source ให้พร้อมสร้างอ๊อบเจค Connection ให้ใหม่
4. เลือกอ๊อบเจค Command ใน Window ของ Data Environment มาวางบนฟอร์ม เมื่อวางลงจะปรากฏ Text Box ของแต่ละฟิลด์ในอ๊อบเจค Command บนฟอร์ม
5. ให้สร้างตัวเลื่อนเรคคอร์ด โดยวาด command button 2 ตัว control ให้ตั้งชื่อว่า cmdNext สำหรับการเลื่อนไปเรคคอร์ดต่อไป และ cmdPreview สำหรับเลื่อนย้อนไปหาเรคคอร์ดก่อนหน้าและกำหนดคำสั่ง
Private Sub cmdNext_Click()
   DataEnvironment1.rsProducts.MoveNext
End Sub
Private Sub cmdPrevious_Click()
   DataEnvironment1.rsProduct.MovePrevious
End Sub
การเลือกประเภทฟิลด์
เมื่อวางอ๊อบเจค Command บนฟอร์มแล้ว Data Environment designer จะสร้าง Text Box เป็นค่าเริ่มต้นตามประเภทข้อมูลของฟิลด์ การเปลี่ยนค่าเริ่มต้น ทำได้ดังนี้
- คลิกปุ่ม Options บนแถบเครื่องมือ Data Environment จะปรากฏไดอะล๊อกบ๊อกซ์ Options ที่สามารถเลือกซึ่งตัว control จะสร้างขึ้นเมื่อวางฟิลด์ตามประเภทที่กำหนดให้ ประเภทฟิลด์ของ ADO ได้รับการจัดกลุ่มเป็น category แต่สามารถเลือกให้แสดงประเภทข้อมูลทั้งหมดที่ show All Data Type สำหรับแต่ละประเภทฟิลด์ สามารถเลือกให้ตรงกับตัว control แบบ instrinsic และตัว control แบบ ActiveX Drag and Drop Field Caption สามารถเลือกเพื่อใช้สร้าง Label ให้แต่ละฟิลด์ โดย Data Environment designer
- สามารถเลือกจากประเภทฟิลด์พิเศษ 2 ประเภท Caption เป็นการระบุให้ตัว control เป็น Label ของตัว control อื่น Multiple เป็นตัว control ที่ใช้เมื่อ drag อ๊อบเจค Command ด้วยการใช้เมาส์ปุ่มซ้าย และสามารถระบุเป็นตัว control แบบตาราง
- สามารถเลือกตัว control สำหรับแต่ละฟิลด์ของอ๊อบเจค Command ที่เจาะจง ด้วยการคลิกเมาส์ปุ่มขวา ใน Data Environment designer คลิกคำสั่ง Properties Menu แล้วเลือกประเภท control และ Caption ที่ใช้เมื่อวางฟิลด์บนฟอร์ม
Hierarchical Command
DataEnvironment designer มีการอินเตอร์เฟซ ระหว่างการออกแบบที่มีประโยชน์ของ ADO คือ การสร้างโครงสร้างลำดับชั้น (hierarchy) ของ Recordset โดยโครงสร้างนี้มีกลุ่มของเรคคอร์ด ซึ่งอาจจะมี Recordset ที่เป็นลูก เช่น การสร้างรายชื่อลูกค้า จากฐานข้อมูล Nwind.mdb และลูกค้ามีการสั่งสินค้าหลายใบสั่งซื้อ สารสนเทศ เหล่านี้สามารถดึงมาด้วยคำสั่ง SQL แต่การแสดงด้วยโครงสร้างลำดับชั้นของ Recordset (hierarchical Recordset)
ความสัมพันธ์ของ Hierarchy
การสร้าง Hierarchical Recordset ภายใน Data Environment designer เป็นคู่ของวิธีการที่แตกต่างกัน สิ่งแรกต้องการแสดงคุณสมบัติความสัมพันธ์ของอ๊อบเจค Command ที่ตรงตาม table หลักในความสัมพันธ์ วิธีการทำ
1. เปิด Connection ของฐานข้อมูล Nwind.mdb ใน Window ของ Data View เลือก table ชื่อ Categories แล้ว drag ไปที่ Window ของ Data Environment แล้วตั้งชื่อว่า CategoryList
2. สร้าง Command ลูกโดยเลือก table ชื่อ Product แล้ว drag ไปที่ Window ของ Data Environment ภายในโครงสร้างของ CategoryList เมื่อวางลง Command ลูกจะอยู่ต่อจากรายการฟิลด์ของ List_Customers แล้วตั้งชื่อว่า ProductList
3. จากนั้นกำหนดความสัมพันธ์ของCommand ลูก ด้วยการเปิด Property page ของอ๊อบเจค List_Customers แล้วเปลี่ยนไปที่แท็บ Relation ให้คลิกเลือก Relation To a Parent Command Object เพื่อปรับค่าตัว control แล้วเลือก Parent Command ในกรณีนี้เลือก CategoryList
4. ในกรอบ Relation Definition เลือกฟิลด์ที่อ๊อบเจค Command ทั้งสองสัมพันธ์กัน ซึ่งฟิลด์ที่ primary key อยู่ใน Command แม่และฟิลด์ดีเป็น Foreign key อยู่ใน Command ลูกในตัวอย่างนี้คือฟิลด์ CategoryID คลิกปุ่ม Add
5. จะปรากฏชื่อฟิลด์ทั้งสองในรายการฟิลด์ แล้วคลิก OK
การปรับปรุงตัวอย่างโดยการสร้าง Command ชื่อ OrderByProduct และให้เป็นลูกของอ๊อบเจค ProductList
1. คลิกเมาส์ปุ่มขวาบน Command ชื่อ ProductList แล้วเลือก Add Child Command Object
2. เมื่ออ๊อบเจค Command 1 ได้รับการสร้างให้สร้างเปลี่ยนชื่อเป็น OrderByProduct
3. เปิด Property page ของ OrderByProduct แล้วเลือกเรคคอร์ดจาก table ชื่อ Order Detail
4. เปลี่ยนไปที่แท็บ Relation คลิกที่ check box ของ Relate to a Parent Command Object แล้วกำหนดความสัมพันธ์ของ Command ทั้งสองคือ ProductList และ OrderByProduct มีความสัมพันธ์ด้วยฟิลด์ ProductID
5. ไปที่แท็บ Grouping ให้เลือกฟิลด์ที่ใช้จัดกลุ่ม ให้เลือกฟิลด์ ProductID ต้องคลิกเลือก Group Command Object ที่ check box
6. ไปที่แท็บ Aggregate เลือกฟิลด์ที่ใช้หาผลรวม ให้เลือก Sum ฟิลด์ Quantity และ Count ฟิลด์ OrderID
7. คลิกปุ่ม Add เพื่อระบุฟิลด์ในรายการฟิลด์ แล้วคลิก OK
ทดสอบอ๊อบเจคที่สร้างขึ้น ให้เพิ่ม Microsoft Hierarchical Flex Grid control โดยการเพิ่ม component นี้

1. ไปที่เมนู Project คลิกที่ Component เมื่อไดอะล๊อกบ๊อกซ์ของ Component แสดงขึ้น ให้เลือก Microsoft Hierarchical Flex Grid control แล้วคลิก OK
2. สร้างฟอร์มใหม่
3. เลือก CategoryList แล้ว drag ด้วยการคลิกเมาส์ปุ่มขวา แล้วลงบนฟอร์ม
4. จะปรากฏฟอร์มแบบ Master/Detail โดย CategoryList จะเป็นฟอร์ม Master และ ProductList เป็นฟอร์ม Detail ของ HierarchicalFlexGrid แสดงผลรวมด้วย OrderByProduct_Grouping และรายละเอียดของแต่ละกลุ่มด้วย OrderByProduct ภายใน HierarchicalFlexGrid ของ ProductList
5. ทำการซ่อนบางคอลัมน์ด้วยคลิกเมาส์ปุ่มขวาบนตาราง เลือกคำสั่ง Retrieve Command คลิกเมาส์ปุ่มขวาเพื่อแสดงไดอะล๊อกบ๊อกซ์ Properties แล้วเปลี่ยนไปที่แท็บ Bands

6. ในแท็บ Bands ใช้กำหนดฟิลด์ที่ให้เห็นได้บนฟอร์มของ Recordset สามารถเปิดดูความสัมพันธ์ในแต่ละ Band เช่น Band0 (ProductList) Band1 (OrderByProduct_Grouping) Band2 (OrderByProduct) โดยให้คลิกที่ check box หน้าฟิลด์
7. เรียกใช้โปรแกรมประยุกต์ จะปรากฏตารางข้อความตามความสัมพันธ์ โดยผู้ใช้สามารถขยายหรือลดแถวโดยการคลิกเครื่องหมายบวก และลบใกล้ขอบด้านซ้ายของตาราง
Grouping Hierarchy
Data Environment designer สนับสนุน hierarchy 2 ประเภท คือ Grouping hierarchy และ Aggregate hierarchy
แนวคิดของ Grouping hierarchy เป็นแนวคิดที่ง่าย เริ่มต้นด้วยอ๊อบเจค Command และสร้าง Command แม่ที่จัดกลุ่มเรคคอร์ดของ Command เดิมด้วยฟิลด์ 1 ฟิลด์ หรือมากกว่า
ตัวอย่างเช่น การสร้างกลุ่มของ ProductID ด้วย วาง table ชื่อ Order Detail บน Window ของ Data Environment แล้วเปิด Property page ของ Grouping ให้เลือก Group Command Object เพื่อทำให้ตัว control เข้าถึงได้ ในหน้านี้ คลิกเลือกฟิลด์ ProductID จากรายการด้านซ้าย มายังด้านขวา แล้วปิดไดอะล๊อกบ๊อกซ์
ใน Data Environment designer จะมีอ๊อบเจค Command เพิ่มขึ้นใต้ Connection หลักชื่อ OrderByProduct_Grouping และไดเรคทอรี 1 ไดเรคทอรี ข้างใต้ ไดเรคทอรี หนึ่งเก็บฟิลด์ ProductID อีกไดเรคทอรีเก็บฟิลด์ของ Command เดิมไว้

Aggregate hierarchy
ฟิลด์ aggregate เป็นฟิลด์คำนวณที่คำนวณด้วย expression พื้นฐาน (sum, count, overage เป็นต้น) ให้กับฟิลด์ที่กำหนดทุกแถวของ Recordset การเพิ่มฟิลด์ aggregate ทำเมื่อมีการใช้ grouping hierarchy จากตัวอย่างใน Grouping hierarchy ให้นับจำนวนใบสั่งซื้อ ด้วยการ Count ฟิลด์ OrderID ภายใต้กลุ่มของแต่ละ ProductID และ เพิ่มฟิลด์ SumQty เพื่อหาผลรวมของฟิลด์ Quantity ภายใต้กลุ่มของแต่ละ ProductID

ฟิลด์ aggregate กำหนดในแท็บ Aggregate ของไดอะล๊อกบ๊อกซ์ คลิกปุ่ม Add เพื่อฟิลด์ aggregate ใหม่ ตั้งชื่อและเลือกฟังก์ชันที่มีให้ คือ COUNT, SUM, AVERAGE, MINIMUM, MAXIMUM, STANDARD DEVIATION หรือ ANY โดย Combo Box ของ Aggregate On จะหาฟิลด์ aggregate และประเมินให้เป็นอย่างใดอย่างหนึ่งจาก Grouping, Grand Total หรือชื่อของ Command ลูก ถ้าเลือก Grand Total จะสามารถป้อนชื่อของฟิลด์ได้



2.2.11 Data Form Wizard สร้างฟอร์ม สร้างกราฟ

          2.2.11 Data Form Wizard สร้างฟอร์ม สร้างกราฟ
Data Form Wizard
Wizard ของ Data Form เป็นฟอร์มที่เชื่อมต่อกับฐานข้อมูลที่มีให้ใน add-in ของ Visual Basic 6 ซึ่งสามารถใช้สร้างฟอร์มโดยอัตโนมัติด้วยกลุ่มของตัว control ที่รวมเข้ากับแหล่งข้อมูล และสร้างปุ่มคำสั่งสำหรับการทำงานปกติ เช่น การเพิ่มหรือลบเรคคอร์ด วิธีรวมกับแหล่งข้อมูล สามารถเลือกเป็น ADO Data control, ADO Recordset หรือ class modules

วิธีการสร้างฟอร์มด้วย Data Form Wizard
ที่เมนู Project เลือกคำสั่ง Add Form จะปรากฏไดอะล๊อกบ๊อกซ์ Add Form ให้เลือก VB Data Form Wizard แล้วคลิก Open เพื่อเข้าสู่การสร้างฟอร์มด้วย Data Form Wizard มีขั้นตอน คือ
1. Wizard ขั้นตอนที่ 1 Introduction เพื่อให้ถึง Profile มาใช้งาน คลิก Next เพื่อไปที่ขั้นตอนที่ 2
2. Wizard ขั้นตอนที่ 2 Database Type เลือกประเภทฐานข้อมูลจากรายการ คลิก Next เพื่อไปที่ขั้นตอนที่ 3
3. Wizard ขั้นตอนที่ 3 ชี้ตำแหน่งของฐานข้อมูล (ตามตัวอย่างเลือก Access) ถ้าเป็นการเลือก ODBC จะต้องกำหนดรายละเอียดข้อมูลการติดต่อผ่าน ODBC คลิก Next เพื่อไปที่ขั้นตอนที่ 4
4. Wizard ขั้นตอนที่ 4 ให้กำหนดประเภทของฟอร์ม และการรวมกับข้อมูล คลิก Next เพื่อไปที่ขั้นตอนที่ 5

5. Wizard ขั้นตอนที่ 5 การสร้างฟอร์ม ด้วยการเลือก table แล้วเลือกฟิลด์จากช่องด้านซ้าย และคลิกปุ่มการเลือกให้มาอยู่ในช่องด้านขวา ตามตัวอย่างเป็นในขั้นตอนที่ 4 เป็นการเลือก Master/Detail ขั้นตอนนี้จึงเป็นการเลือกแหล่งข้อมูลและฟิลด์สำหรับฟอร์มที่เป็น Master 5 แล้วคลิก Next เพื่อไปขั้นตอนต่อไป
6. Wizard ขั้นตอนนี้ เป็นการสร้างฟอร์มที่เป็น Detail ซึ่งให้ทำการกำหนดและเลือกตามข้อ 5 แต่ถ้าเป็นการเลือกฟอร์มประเภทอื่นๆ จะไม่มีขั้นตอนนี้ แล้วคลิก Next เพื่อไปขั้นตอนต่อไป
7. Wizard ขั้นตอนนี้ เป็นระบุฟิลด์ที่เชื่อมระหว่างฟอร์ม Master กับ Detail แล้วคลิก Next เพื่อไปขั้นตอนที่ 6
ขั้นตอนนี้เหมือนกับข้อ 7 คือ มีเฉพาะฟอร์มประเภท Master/Detail
8. Wizard ขั้นตอนที่ 6 กำหนดปุ่มคำสั่งบนฟอร์ม คลิก Next เพื่อไปขั้นตอนที่ 7
9. Wizard ขั้นตอนที่ 7 ฟอร์มได้รับการสร้างเสร็จเรียบร้อย ขั้นตอนนี้เป็นการเก็บเป็น profile แล้วคลิกปุ่ม Finish เพื่อออกจาก Wizard
10. เมื่อออกจาก Wizard แล้วจะพบฟอร์มที่สร้างเสร็จเรียบร้อยแล้ว
 Data View
Visual Basic 6 มีเครื่องมือ Visual Database ในชุด Professional ซึ่งเป็นชุดของเครื่องมือ สำหรับการทำงานกับฐานข้อมูลใน IDE ในขณะที่ Visual Basic 5 มีให้ในชุด Enterprise สำหรับ Database Designer window และ Query Designer Window มีให้เฉพาะ Visual Basic 6 ชุด Enterprise
Data View Window
การเข้าไปใช้เครื่องมือ Visual Database ต้องเข้าผ่าน window ของ Data View ซึ่งการเปิด window ใช้คำสั่งในเมนู View หรือคลิกบนปุ่มสีเหลืองบนแถบเครื่องมือมาตรฐาน Window ที่เป็นรวมสำหรับการติดต่อฐานข้อมูล และสามารถแสดง table, view, ไดอะแกรม และ stored procedure ในฐานข้อมูล (ในฐานข้อมูล Oracle สามารถมองเห็นไดเรคทอรีอีก 2 ไดเรคทอรี คือ Function และ Synonyms) ผู้ใช้สามารถขยายโหนดของ table หรือ view เพื่อดูฟิลด์ภายใน table หรือ view ของ Data View สามารถนำไปประยุกต์ได้ คือ
การเปิด Data View Windows ให้ไปที่เมนู View เลือก Data View Window จะปรากฏ window ของ Data View บนหน้าจอ การประยุกต์บน window ของ Data View สามารถสรุปได้ คือ

- สร้างการเชื่อมข้อมูล (Data Link) และเพิ่มเข้าไปยัง Window ของ Data View โดยการคลิกปุ่มขวาสุด บนแถบเครื่องมือของ Data View จากนั้นจะปรากฏไดอะล๊อกบ๊อกซ์ของ Data Link Properties สำหรับกำหนดการเชื่อมต่อกับฐานข้อมูล ผู้ใช้สามารถลบการเชื่อมข้อมูลที่มีอยู่ หรืออ๊อบเจคที่ปรากฏ อยู่ใน Window โดยการคลิกที่การเชื่อมข้อมูลหรืออ๊อบเจค แล้วกดปุ่ม Del บนแป้นพิมพ์ หรือคลิกเมาส์ด้านขวาแล้วเลือกคำสั่ง Remove บนเมนู popup การสร้าง connection ของการเชื่อมข้อมูลเป็นการเก็บใน Registry ของระบบและไม่สัมพันธ์กับ Project ของ Visual Basic
- การดูข้อมูลของ table หรือ view โดยเลือกชื่อ table หรือ view แล้วดับเบิลคลิกหรือเลือกคำสั่ง Open บนเมนู popup
- สร้าง table ของฐานข้อมูลใหม่ โดยการสร้างคลิกเมาส์ปุ่มขวาบนโฟลเดอร์ของ table แล้วเลือกคำสั่ง New table ในเมนูเดียวกับผู้ใช้สามารถเลือกสามารถแสดงหรือซ่อน system table หรือกรอง table แต่ความสามารถที่ไม่ได้สนับสนุนโดยฐานข้อมูลทุกประเภท เช่น provider ของ SQL Server สนับสนุนในขณะที่ provider ของ Jet ไม่สนับสนุน
- การเปลี่ยนผังของ table โดยการคลิกเมาส์ปุ่มขวาแล้วเลือกคำสั่ง Design ซึ่งความสามารถนี้ได้รับการสนับสนุนจากฐานข้อมูลบางประเภท
- การดู Attributes ให้การคลิกเมาส์มุ่มขวาบนอ๊อบเจค และเลือกคำสั่ง Properties ผู้ใช้สามารถใช้ประโยชน์ในการเปลี่ยนค่าสำหรับการติดต่อ ความเป็นเจ้าของในแต่ละ table และประเภทของคอลัมน์
- การสร้าง stored procedure ใหม่หรือแก้ไข ซึ่ง stored procedure เป็นอนุกรมของคำสั่งฐานข้อมูล ที่เก็บในฐานข้อมูลในการคอมไฟล์ และกำหนดค่าเหมาะสมให้ฟอร์ม stored procedure ยอมรับพารามิเตอร์ และส่งออกกลุ่มของเรคคอร์ด และ stored procedure สามารถแก้ไขใน SQL Editor และเครื่องมือในชุดเครื่องมือ Visual Database
- การเพิ่ม Trigger ใหม่ให้กับ table ที่มีอยู่ โดยการเลือกคำสั่ง New Trigger จากเมนู pop-up ซึ่ง Trigger เป็น Store Procedure พิเศษ ที่ประมวลผลอัตโนมัติ เมื่อเรคคอร์ดใน table มีการปรับปรุง เพิ่มหรือลบ
- สร้างไดอะแกรมของฐานข้อมูลใหม่หรือแก้ไข โดยการเลือกคำสั่งจากเมนู pop-up เมื่อคลิกเมาส์ปุ่มขวาที่ไดเรคทอรี Database Diagram หรือบนอ๊อบเจค Database Diagram ที่มีอยู่ ไดอะแกรมของฐานข้อมูลเป็นมุมมองของกราฟฟิก ของ table ทั้งหมดหรือบางส่วนในฐานข้อมูลที่แสดงความสัมพันธ์ (Relationships) ระหว่างอ๊อบเจค
การสร้าง Connection ใหม่
การทำงานฐานข้อมูลใน Window ของ Data View ต้องมีการสร้างการเชื่อมข้อมูลไปยังฐานข้อมูล การเชื่อมข้อมูลประกอบด้วยสารสนเทศหลายอย่าง เช่น ชื่อของ OLE DB provider ที่ใช้ในการติดต่อกับ engine ของฐานข้อมูล ซึ่งของฐานข้อมูลที่เจาะจงในการติดต่อ และการข้อมูลของการ login เช่น ชื่อผู้ใช้และรหัสผ่าน
1. การสร้างการเชื่อมข้อมูลใหม่ ทำได้โดยการคลิกปุ่มขวาสุด บนแถบเครื่องมือของ Data View หรือโดยการคลิกคำสั่ง Add a Data Link จากเมนู popup
จากนั้นจะปรากฏไดอะล๊อกบ๊อกซ์ของ Data Link Properties สำหรับกำหนดการเชื่อมต่อกับฐานข้อมูล
2. ที่แท็บ Provider ของไดอะล๊อกบ๊อกซ์ Data Link Properties ให้เลือก provider ที่ต้องการใช้ติดต่อกับฐานข้อมูล ค่าเริ่มต้น ของ ADO ใช้ Microsoft OLE DB provider for ODBC drivers (MSDASQL ซึ่งให้ผู้ใช้ติดต่อกับฐานข้อมูลแบบสัมพันธ์และ ISAM สำหรับแหล่งข้อมูลบางประเภทให้เลือก provider เฉพาะเพื่อสร้างข้อมูล เมื่อเลือก provider ตามที่แสดงให้เห็นในรายการ ตามตัวอย่างเลือก Microsoft Jet 3.5.1 OLE DB provider แล้วคลิกปุ่ม Next หรือแท็บ Connection
3. ที่แท็บ Connection โดยรายละเอียดของแท็บขึ้นกับ provider ที่เลือกกำหนดการเชื่อมต่อ ให้กำหนดฐานข้อมูล ในช่อง1. Select or enter a database name ในช่อง 2. การ login ขึ้นกับการประยุกต์ อาจจะทดสอบการเชื่อมต่อด้วยการคลิกปุ่ม Test Connection ถ้าการเชื่อมต่อถูกต้อง จะมีไดอะล๊อกบ๊อกซ์แจ้งว่า "Test connection succeeded" ถ้าติดต่อไม่ได้ จะมีข้อความแจ้งว่า "Test connection failed" พร้อมสาเหตุ แล้วคลิกปุ่ม OK
4. แท็บ Advance ใช้ในกรณีที่มีเงื่อนไขการเข้าถึงเพิ่มเติม เช่น การเข้าถึงฐานข้อมูล และป้องกันความผิดพลาด timeout โดยการตั้งค่าคุณสมบัติ timeout สูงขึ้น
5. All เป็นการสรุปคุณสมบัติทั้งหมดของการติดต่อ รวมถึงคุณลักษณะ และสามารถเข้าไปแก้ไขข้อมูลได้ โดยเลือกรายการข้อมูลและคลิกที่ปุ่ม Edit Value
ตามปกติข้อมูลพื้นฐานในการสร้างการเชื่อมกับข้อมูลอยู่ที่แท็บ Provider และ Connection ซึ่งเพียงในการทำงาน
ถ้าเป็นการเลือก provider อื่นๆ เช่น การเลือก ODBC เมื่อมาที่แท็บ Connection จะมีข้อมูลคือ การเลือก Data Source ในช่อง1. Specify source of data และระบุพาร์ทของฐานข้อมูล ในช่อง 3. Enter initial catalog to use ส่วนช่อง 2. Enter information to login ขึ้นกับการประยุกต์
ถ้าเป็นการเลือกเมื่อการมีการติดต่อกับฐานข้อมูล SQL Server ใช้ Microsoft OLE DB Provider for SQL Server 6.5 โดยผู้ใช้สามารถเลือกชื่อแม่ข่าย ป้อนข้อมูลการ login และเลือกชื่อฐานข้อมูล (ADO เรียกว่า initial catalog) ในกรณีที่ SQL Server ใช้ชื่อและรหัสผ่านในเวลา login เพื่อตรวจสอบสอนสิทธิ์ในการเข้าถึงแม่ข่าย คลิกปุ่ม Test Connection เพื่อตรวจสอบทุกอย่าง
ถ้าใช้ Microsoft OLE DB provider for ODBC drivers ข้อมูลในแท็บ Connection จะแตกต่างออกไป ในกรณีนี้สามารถเลือก DSN หรือ ข้อความการติดต่อ (สำหรับ DSN-Lass Connection) ถ้าเลือกใช้ Connection String ผู้ใช้สามารถสร้างการเริ่มต้นด้วย DSN ที่มีอยู่หรือสร้างใหม่ และสามารถป้อนค่าคุณสมบัติอื่นใน ไดอะล๊อกบ๊อกซ์ ซึ่งมีรายละเอียดตามไดร์ฟเวอร์ของ ODBC ถ้ามีการป้อนค่าของชื่อผู้ใช้รหัสอ่านและชื่อฐานข้อมูล ใน ไดอะล๊อกบ๊อกซ์ ผู้ใช้ไม่จำเป็นต้องป้อนค่าอีกใน Wizard ต่อไป
DataCombo และ DataList
Visual Basic 6 ได้เพิ่ม DataCombo และ DataList ซึ่งเป็น bound control (เป็นตัว control ที่ต้องรวมกับข้อมูล) ตัว control กลุ่มนี้แตกต่างจาก List box และ Combo box เพราะสามารถรวมกับ ADO Data control ที่ต่างกัน 2 ตัว control โดย Data control แรกหาค่าที่เลือกในตัว control (เช่นเดียวกับ List box และ Combo box) และ Data control ที่สองเป็นการเพิ่มข้อมูลเข้ามาเป็นรายการ
DataCombo และ DataList มี lookup ที่ใช้ในการแปลงคำสั่งให้เป็นฟอร์ม เช่น การเลือกข้อมูลจาก table "Products" ในฐานข้อมูล Nwind.mdb โดยให้ฟิลด์ CategoryID มีค่าตรงกับฟิลด์ CategoryID ของ table "Categories" เพื่อแสดงสารสนเทศของสินค้า ด้วยการใช้คำสั่ง INNER JOIN ในการดึงข้อมูลทั้งหมด
SELECT ProductName,CategoryName FROM Products INNER JOIN Categories
ON Products.CategoryID = Categories.CategoryID
คำสั่งข้างต้นสามารถใช้ได้กับการประมวลผลข้อมูลด้วยคำสั่ง แต่ไม่สามารถใช้ได้กับตัว control แบบ bound เช่น เมื่อมีการให้ผู้ใช้สามารถปรับปรุงค่าในฟิลด์ CategoryID ของสินค้าจะต้องมีการอินเตอร์เฟซให้มีการ โหลดข้อมูลจาก Table "Categories" ไปสู่ List box หรือ Combo box เพื่อทำให้ผู้ใช้ไม่สามารถป้อนชื่อ Category ที่ผิด ซึ่งจำเป็นต้องมีการเปิด Recordset อันดับสอง
Dim rsCat As New ADODB.Recordset
rsCat.Open "SELECT ProductName,CategoryName FROM Categories", cn
lstCategories.Clear
Do until rsCat.EOF
lstCategories.AddItem rsCat("CategoryName")
lstCategories.ItemData (lstCategories.NewIndex) = rsCat("CategoryID")
Loop
rsCat.Close
การแสดงค่าลักษณะดังกล่าวทำได้สะดวกใน DataCombo และ DataList ด้วยการตั้งค่า คุณสมบัติจำนวนหนึ่งในเวลาออกแบบ
DataCombo และ DataList อยู่ในไฟล์ MSDATLST.ocx ซึ่งต้องกระจายไปกับโปรแกรมประยุกต์ที่ใช้ตัว control นี้
Note: DataCombo และ DataList มีการทำงานคล้ายกับ DbCombo และ DbList (แนะนำใน Visual Basic 5) แต่ต่างกันที่ DataCombo และ DataList ทำงานกับ ADO Data control ส่วน DbCombo และ DbList ทำงานกับ Data control และ Remote Data control
การตั้งคุณสมบัติเมื่อออกแบบ
การประยุกต์เครื่องมือ lookup table กับ DataCombo และ DataList จำเป็นต้องวาง ADO Data control 2 ตัวลงบนฟอร์ม ตัวหนึ่งสำหรับชี้ไปที่ table หลัก (ตามตัวอย่างคือ Products ) และอีกตัวชี้ไปที่ lookup table (ตามตัวอย่างคือ Categories ) แล้วตั้งค่าคุณสมบัติ ดังนี้
- DataSource อ้างถึง ADO Data control หลัก ที่ชี้ไปยัง table หลัก
- DataField เป็นชื่อของฟิลด์ใน Table ที่อ้างถึงโดยคุณสมบัติ DataSource และเป็นข้อมูลที่รวมกับตัว control ฟิลด์ที่จะได้รับการปรับปรุงเพื่อค่าใหม่ ได้รับการเลือกในรายการ
- RowSource เป็นการอ้างถึง ADO Data control ตัวที่สอง ที่ชี้ไปยัง lookup table แสดงรายการของตัว control ที่จะได้รับการเติมข้อมูลจาก lookup table
- BoundColumn เป็นชื่อของฟิลด์ใน lookup table เพื่อผู้ใช้เลือกค่าในรายการฟิลด์ DataField ใน table หลักจะได้รับค่าจากคอลัมน์นี้ ถ้าไม่กำหนดค่าให้คุณสมบัตินี้ จะใช้ชื่อฟิลด์เดียวกับคุณสมบัติ ListField
1. ให้สร้างADO Data control (adodc1) ตั้งค่าชี้ไปที่ table "Products" ของฐานข้อมูล NWind.mdb ในแท็บ RecordSource ของ Property Pages
แล้วเพิ่ม Text box จำนวนหนึ่งเพื่อแสดงข้อมูลของฟิลด์ จาก table โดย Text box ทุกตัวให้กำหนด DataSouce เป็น Adodc1 ส่วน DataField ขึ้นกับการแสดงข้อมูลของฟิลด์ เช่น ชื่อสินค้า ให้กำหนดด้วยฟิลด์ "ProductName" ราคาต่อหน่วยกำหนดด้วยฟิลด์ "UnitPrice"

2. ADO Data control อีก 1 ตัว (Adodc2) และตั้งค่าให้ดึงข้อมูลจาก table "Categories" แล้วเพิ่ม DataList ตั้งชื่อว่า "dblCategory" และตั้งคุณสมบัติตามนี้ DataSource = adodc1, DataField = CategoryID, RowSource = adodc2, BoundColumn = CategoryID, ListField = CategoryName
3. ใน table "Products" มี Foreign key คือ SupplierID ซึ่ง Suppliers สามารถสร้างกลไกการ lookup คือ 1 ชุดโดยการเพิ่ม ADO Data control (Adodc3) ตั้งค่าชี้ไปที่ table "Suppliers" และ DataCombo ตั้งชื่อว่า "dblSupplier" และกำหนดคุณสมบัติดังต่อไปที่ DataSource = adodc1, DataField = SupplierID, RowSource = adodc3, BoundColumn = SupplierID, ListField = CompanyName

Note: DataCombo และ DataList มีคุณสมบัติอีก 2 อย่าง คือ DataMember และ RowNumber ซึ่งจะมีการกำหนดเมื่อใช้ อ๊อบเจค Command ของ DataEnvironment designer ในฐานะ data source หลักหรืออันดับที่สอง
การทำงานเมื่อเรียกใช้
การทำงาน DataCombo และ DataList ในเวลาเรียกใช้คล้ายกับ Combo box และ List box แต่มีความแตกต่างเล็กน้อย เช่น ไม่มีคุณสมบัติ ListIndex และ ListCount หรือ เมรอด AddItem สำหรับการเพิ่มข้อมูลในรายการ เมื่อเรียกใช้ การเพิ่มรายการทำได้ด้วยการใช้ ADO Data control หรือ แหล่งข้อมูลอื่น ๆ เช่น Recordset หรือ instance ของ DataEnvironment
DataCombo และ DataList มีคุณสมบัติพิเศษ ได้แก่ คุณสมบัติ MatchWithList ซึ่งเป็นคุณสมบัติอ่านอย่างเดียว ส่งออกค่า True ถ้าค่าที่ป้อนใน DataCombo ตรงกับข้อมูลในรายการ คุณสมบัตินี้เป็น True เสมอ ถ้าคุณสมบัติ Style ของ DataCombo และ DataList เป็น 2-dbcDropDownList คุณสมบัติ BoundText ส่งออกหรือตั้งค่าของชื่อฟิลด์ตามคุณสมบัติ BoundColumn ซึ่งเป็นค่าที่จะกำหนดให้กับคอลัมน์ DataField ใน table หลัก

' ในส่วนการประกาศของโมดูลฟอร์ม
Dim rsCategory As New ADODB.Recordset
Dim rsSupplier As New ADODB.Recordset
' ใน sub procedure
rsCategory.Open "Categories", adoProducts.Recordset.ActiveConnection, _
adOpenDynamic, adLockOptimistic
Set dblCategory.RowSource = rsCategory
rsSupplier.Open "Suppliers", adoProducts.Recordset.ActiveConnection, _
adOpenDynamic, adLockOptimistic
Set dbcSupplier.RowSource = rsSupplier
การแสดงสารสนเทศ lookup เบื้องต้น
คุณสมบัติ SelectedItem ส่งออก bookmark ไปที่ lookup table ที่ตรงกับข้อมูลที่ไฮไลต์ในรายการ ตามปกติการใช้คุณสมบัติเพื่อแสดงสารสนเทศเพิ่มเติมเกี่ยวกับข้อมูลที่เรียก
Private Sub dbcSupplier_Click(Area As Integer)
' ย้ายไปที่เรคคอร์ดที่ถูกต้องใน lookup table.
' หมายเหตุ: ฟิลด์ ContactName
' ต้องรวมอยู่ในรายการของฟิลด์ที่ส่งออกโดย adoProducts
   ShowSupplierInfo
End Sub
Click และ Dblcick event ของ DataCombo รับพารามิเตอร์ Area เพื่อระบุตำแหน่งของตัว control ที่ได้รับการเลือก ค่าของพารามิเตอร์ได้แก่ 0-dbcAreaButton, 1-dbcAreaEdit และ 2-dbcAreaList
กรณีที่ไม่เกิดขึ้น Click event ของ DataCombo เมื่อมีการแสดงเรคคอร์ดในฟอร์ม การแก้ไขต้องใช้การจับ MouseComplete event ของ ADO Data control อันดับแรก
Private Sub adoProducts_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, _
adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
' บังคับให้ปรับปรุง DataCombo
On Error Resume Next
   dbcSupplier.BoundText = adoProducts.Recordset("SupplierID")
   ShowSupplierInfo
End Sub
การบันทึก Connection
ADO Data control มีการใช้ทรัพยากร Connection น้อยกว่า Data control ซึ่งการติดต่อของ Data control ในกรณีที่เป็นหลาย Data control ไม่สามารถพื้นที่เดียวกับของทรานแซคชัน และแต่ละ Connection ต้องใช้ทรัพยากรของเครื่องแม่ข่าย ในขณะที่ ADO Data control ลดการใช้ทรัพยากรลง เช่น DataCombo และ DataList ไม่จำเป็นต้องมองเห็น Data control เพราะผู้ใช้ไม่เคยเลื่อนดู lookup table ดังนั้น สามารถให้ผลลัพธ์เดียวกันด้วยการใช้อ๊อบเจค ADO Recordset ตั้งค่าคุณสมบัติของ DataCombo และ DataList ให้รวม ADO Data control สำหรับ lookup table แต่ทำให้คุณสมบัติ RowSource ว่างโดยการกำหนดคุณสมบัตินี้ในเวลาเรียกใช้หลังจากการสร้าง
อ๊อบเจค Recordset ใช้ Connection ร่วมกับ ADO Data control หลัก
' ในส่วนการประกาศของโมดูลฟอร์ม
Dim rsCategory As New ADODB.Recordset
Dim rsSupplier As New ADODB.Recordset
Private Sub Form_Load()
   adoProducts.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51; Persist Security Info=False;Data Source=" & DB_PATH
   adoProducts.Refresh
   rsCategory.Open "Categories", adoProducts.Recordset.ActiveConnection, adOpenDynamic, adLockOptimistic
   Set dblCategory.RowSource = rsCategory
   rsSupplier.Open "Suppliers", adoProducts.Recordset.ActiveConnection, adOpenDynamic, adLockOptimistic
   Set dbcSupplier.RowSource = rsSupplier
   ShowSupplierInfo
   ' เริ่มต้นทรานแซคชัน
   adoProducts.Recordset.ActiveConnection.BeginTrans
   IsDirty = False

2.2.10 การใช้ Data Control

           2.2.10 การใช้ Data Control
         การเขียนโปรแกรมฐานข้อมูลด้วย Data Control
ความรู้ทั่วไปเกี่ยวกับ Relational Database
Relational Database คือกลุ่มของข้อมูลที่สัมพันธ์กัน (Relation) ซึ่งจัดเก็บอยู่ในรูปของตาราง (Table) แต่ละตารางจะประกอบไปด้วยกลุ่มของ Record โดยแต่ละ Record จะประกอบไปด้วยกลุ่มของ Field ดังนั้นจึงอาจกล่าวได้ว่าแต่ละตารางก็เปรียบเสมือนกับ Spread Sheet ที่มี Record แสดงอยู่ในรูปของแถว (Row) และ Field แสดงอยู่ในรูปของสดมภ์ (Column)
ประเภทของความสัมพันธ์ระหว่าง Table แบ่งออกเป็น 3 ประเภทคือ
ประเภทที่ 1 ความสัมพันธ์แบบ One-to-Many
หมายถึง ข้อมูล 1 Record ใน Table หนึ่งจะมีความสัมพันธ์กับข้อมูลในอีก Table หนึ่งมากกว่า 1 Record เช่น เจ้าของบัญชีเงินฝากธนาคาร 1 คน สามารถมีบัญชีเงินฝากได้มากกว่า 1 บัญชี
ประเภทที่ 2 ความสัมพันธ์แบบ One-to-One
หมายถึง ข้อมูลแต่ละ Record ใน Table หนึ่งจะมีความ สัมพันธ์กับข้อมูลในอีก Table หนึ่งเพียง Record เดียว เช่น กรณีมีการกำหนดให้ บัญชีเงินฝากธนาคารแต่ละบัญชีจะมีเจ้าของบัญชีได้เพียงคนเดียว
ประเภทที่ 3 ความสำพันธ์แบบ Many-to-Many
หมายถึง หลาย Record ใน Table หนึ่งจะมีความสัมพันธ์กับอีกหลาย Record ในอีก Table หนึ่ง เช่น เจ้าของบัญชีเงินฝาก 1 คน สามารถเป็นเจ้าของบัญชีเงินฝากได้มากกว่า 1 บัญชี และแต่ละบัญชีเงินฝากสามารถมีเจ้าของบัญชีได้มากกว่า 1 คน
ตารางหรือ Table
          Table เป็นพื้นที่ที่ใช้ในการเก็บข้อมูลจริงๆ ในฐานข้อมูล แต่ละตารางจะอยู่ในรูปของตารางขนาด 2 มิติ โดยที่แต่ละแถวหรือ Row ได้แก่ Record ส่วนสดมภ์หรือ Column จะได้แก่ Field หรือ Attribute ซึ่งจะต้องมีคุณสมบัติที่ประกอบไปด้วย ชื่อ ประเภทของข้อมูล และขนาด
Data Control
         Visual Basic จะอาศัย Control ชื่อ "Data" (มักจะเรียกว่า "Data Control") ในการทำงานร่วมกับ Database โดยที่ 1 Data Control จะใช้อ้างถึง 1 Table หรือมากกว่าใน
ฐานข้อมูล (กรณีที่อ้างถึงมากกว่า 1 Table จะหมายถึง การนำเอา Table ต่างๆ ที่สัมพันธ์กันมา Join กัน) ข้อมูลที่ถูกอ่านจาก Table มาเก็บไว้ใน Data Control จะเรียกว่า "Recordset" ดังนั้นจึงอาจกล่าวได้ว่า Recordset ได้แก่ กลุ่มของ Record ใน Table ซึ่งอาจมาจาก 1 หรือมากกว่า 1 Table ที่ถูกอ่านเข้ามาเก็บไว้ในตัว Data Control ตามเงื่อนไขที่กำหนด ในการอ้างถึง Recordset ใน Data Control ให้เขียนอยู่ในรูปแบบ ดังนี้


          Data Control นี้จะอยู่ในรูปแบบของ VCR-Style ซึ่งประกอบด้วยปุ่มลูกศร จำนวน 4 ปุ่ม ทั้ง 4 ปุ่มนี้จะใช้สำหรับเลื่อน Pointer ของ Record ดังนี้
-ปุ่มหมายเลข 1 ใช้สำหรับเลื่อน Pointer ไปยัง Record แรกใน Recordset
-ปุ่มหมายเลข 2 ใช้สำหรับเลื่อน Pointer ไปยัง Record ก่อนหน้า Record ปัจจุบันใน   Recordset  
-ปุ่มหมายเลข 3 ใช้สำหรับเลื่อน Pointer ไปยัง Record ถัดจาก Record ปัจจุบันใน   Recordset  
-ปุ่มหมายเลข 4 ใช้สำหรับเลื่อน Pointer ไปยัง Record สุดท้ายใน Recordset
Method ที่ใช้ในการจัดการข้อมูล
ในการเพิ่มข้อมูลเข้าไปยัง Table ต่างๆ ใน Database จะอาศัย Method "Addnew” เพื่อสร้าง Record ว่างต่อเพิ่มเข้าไปใน Recordset


Method ที่ใช้ในการบันทึกข้อมูลที่มีการแก้ไข ได้แก่ Method "Update" โดยจะบันทึกข้อมูลที่ปรากฏอยู่ใน Object ที่เป็น Bound Control กลับลงไปยัง Record ปัจจุบันใน Recordset รูปแบบของคำสั่งเป็นดังนี้


Method ที่ใช้สำหรับลบข้อมูล Record ปัจจุบันออกจาก Recordset ได้แก่ Method ’Delete“

ในการลบ Record ทุกครั้งหลังจากลบ ควรที่จะมีการขยับ Pointer เนื่องจาก Record ปัจจุบันได้ถูกลบไปเพื่อป้องกันการสับสนว่า Pointer ชี้ไปที่ Record ใด สำหรับ Method ที่ใช้ในการเลื่อน Pointer ได้แก่ Method"MoveFirst", "MoveNext", "MoveLast" และ "MovePrevious
          ทั้ง 4 Method นี้ จะมีรูปแบบของคำสั่งเช่นเดียวกัน สำหรับหน้าที่ของแต่ละ Method มีดังนี้
1. MoveFirst ใช้สั่งให้ Data Control เลื่อน Pointer ไปยัง Record แรกใน Recordset
2. MoveLast ใช้สั่งให้ Data Control เลื่อน Pointer ไปยัง Record สุดท้ายใน Recordset
3. MoveNext ใช้สั่งให้ Data Control เลื่อน Pointer ไปยัง Record ถัดไปใน Recordset
4. MovePrevious ใช้สั่งให้ Data Control เลื่อน Pointer ไปยัง Record ก่อนหน้า ใน Recordset


          Method ที่ใช้ในการค้นหาข้อมูลใน Recordset จะประกอบไปด้วย
1. EindFirst ใช้สำหรับค้นหา Record โดยทิศทางในการหาจะเริ่มจาก Record แรก   ไปยัง Record สุดท้ายใน Recordset จนกระทั่งพบ Record ซึ่งตรงกับเงื่อนไขในการค้นหา
2. FindLast ใช้สำหรับค้นหา Record โดยทิศทางในการหาจะเริ่มจาก Record สุดท้ายไปยัง Record แรกใน Recordset จนกระทั่งพบ Record ซึ่งตรงกับเงื่อนไขในการค้นหา
3. FindNext ใช้สำหรับค้นหา Record โดยทิศทางในการหาจะเริ่มจาก Record  ปัจจุบันไปยัง Record สุดท้ายใน Recordset จนกระทั่งพบ Record ซึ่งตรงกับเงื่อน ไขในการค้นหา
4. FindPrevious ใช้สำหรับค้นหา Record โดยทิศทางในการหาจะเริ่มจากRecord ปัจจุบันไปยัง Record แรกใน Recordset จนกระทั่งพบ Record ซึ่งตรงกับเงื่อนไขในการค้นหา
          DBCombo และ DBList
          DBCombo และ Control ที่มีลักษณะการทำงานคล้ายกับ ComboBox เช่น ComboBox
ส่วน DBList เป็น Control ที่มีลักษณะการทำงานคล้ายกับ ListBox แต่ต่างกันที่ทั้ง 2 Control นี้ จะสามารถเข้าถึงข้อมูลใน Recordset ได้โดยตรง แต่เนื่องจากทั้ง 2 Control นี้ ไม่ได้เป็น Bound Control มาตรฐาน ดังนั้น จึงต้องเพิ่มเข้ามาไว้ใน Toolbox ก่อน โดยมีขั้นตอนดังนี้
1. เลือกเมนู Project และ Components ตามลำดับ จะปรากฏจอภาพ Components ให้เลือก "Microsoft Data Bound List Control 6.0
2. คลิกที่ปุ่ม OK จะปรากฏ 2 Control ใหม่ ซึ่งได้แก่ DBList และ DBCombo ใน Toolbox
          การเข้าถึงข้อมูลใน Field โดยไม่ต้องใช้ Bound Control
การเข้าถึงข้อมูลใน Field นอกเหนือจากการใช้ Bound Control แล้ว เรายังสามารถเข้าถึงข้อมูลได้โดยการเขียนโปรแกรม เช่น การนำค่า Field มาเก็บไว้ในตัวแปร เป็นต้น ในการเข้าถึงข้อมูลใน Field จะต้องอาศัย Property "Value" ซึ่งรูปแบบในการอ้างถึงดังนี้

          Event "Reposition"
จะเกิดอะไรขึ้นเมื่อมีการเลื่อน Pointer ของข้อมูล ซึ่งอาจเกิดจากการคลิกที่ปุ่มทั้ง 4 ปุ่มของ Data Control หรือเกิดการใช้ Method ที่ก่อให้เกิดการเลื่อน Pointer ของข้อมูลขึ้น เช่น Method "MoveFirst", 'MoveLast", "EindFirst", "FindLast" เป็นต้น 
Data Control กับ SQL 
SQL จะประกอบไปด้วย 2 ส่วนคือ Data Definition Language (DDL) ซึ่งใช้สำหรับสร้างฐานข้อมูล และ Date Manipulation Language (DML) ซึ่งใช้สำหรับจัดการกับฐานข้อมูล แต่ในที่นี้ เราจะให้เกิดความสนใจเฉพาะในส่วนของ DML คำสั่งของ SQL ในส่วนของ DML มักจะอยู่ในรูป 
     การใช้งาน SQL
ในการใช้งาน SQL กับ Data Control จะใช้การกำหนดประโยคคำสั่งที่เขียนขึ้นด้วย SQL ลงใน Property "RecordSource" Data ของ Control แทนการกำหนดชื่อ Table ในลักษณะเดิม แล้วจึงใช้ Method "Refresh" เพื่อสั่งให้ Data Control ทำงานตามคำสั่งที่กำหนด 
การเชื่อมโยงของข้อมูลระหว่าง Table ที่สัมพันธ์กันภายในภาษา SQL จะอาศัยคำสั่ง INNER JOIN ซึ่งมีรูปแบบดังนี้ 


2.2.9 การสร้างฐานข้อมูลด้วย Visual Data Manager

2.2.9 การสร้างฐานข้อมูลด้วย Visual Data Manager
ฐานข้อมูลในโปรแกรม Visual Basic 6
Visual Basic จัดแบ่งกลุ่มตัว control ออกเป็น 3 กลุ่ม คือ
1. Intrinsic Control เป็นตัว control มาตรฐาน ของ Visual Basic เป็นตัว control ที่เก็บไว้ใน Tool box จึงเห็นได้เมื่ออยู่ใน IDE Window เช่น Text box, Label, Picture box, Combo box เป็นต้น
2. ActiveX Control เป็นตัว control เก็บอยู่ในไฟล์ .ocx ที่แยกออกมา เช่น DataGrid, DataCombo, DataList เป็นต้น รวมถึง ActiveX control ที่มาจากบริษัทอื่นๆ ตามปกติ ตัว control กลุ่มนี้จะมองไม่แสดงโดยอัตโนมัติ เมื่อเปิดโปรแกรม Visual Basic การนำมาใช้ต้องการเพิ่ม Component เข้ามา
3. Insertable Object เป็น เช่น Microsoft Excel เป็นต้น ซึ่งมานำเป็นประยุกต์ภายในโปรแกรมประยุกต์ Visual Basic
Intrinsic control เป็นตัว control มาตรฐาน ของ Visual Basic เป็นตัว ที่มองเห็นได้ใน Toolbox เมื่ออยู่ใน IDE Window ตัว control
Data Control
เป็นตัว control ที่สามารถรวมข้อมูลกับฐานข้อมูลได้ และเป็นส่วนที่ Visual Basic ให้ผู้ใช้สามารถติดต่อระหว่างตัว control บนฟอร์มกับฟิลด์ใน table ของฐานข้อมูล โดย Data จะทำงานกับ Database Jet  ซึ่ง Database Jet เป็นเหมือนกับอุปกรณ์ใช้ในการติดต่อฐานข้อมูล
การสร้าง ฐานข้อมูลด้วย Data Manager
นอกจาการสร้างฐานข้อมูลจาก โปรแกรมจัดการเกี่ยวกับฐานข้อมูลต่างๆ เช่น MS Office, SQL, Foxpro เป็นต้น เรายังสามารถสร้างฐานข้อมูลใช้โปรแกรม VB.6 ได้ โดยใช้ Data Manager ซึ่งมีขั้นตอนดังนี้
ไปที่ Menu Bar เลือกคำสั่ง Add-Ins --> Visual Data Manager…




รูปที่ 2 การเรียกใช้งาน Visual Data Manager


รูปที่ 3 Visual Data Manager

การใช้งานเราสามารถ สร้างฐานข้อมูล หรือ เปิดฐานข้อมูลที่มีอยู่แล้วมาแก้ไข โดยใช้รูปแบบคำสั่งต่อไปนี้
- เปิดฐานข้อมูลเก่ามาแก้ไข

รูปที่ 4 เปิดฐานข้อมูลเก่ามาใช้

รูปที่ 5 เรียกใช้ฐานข้อมูลที่สร้างไว้แล้ว
- สร้างฐาน


การใช้งาน Data Control
เลือก Object ของ Data Control ไว้ที่ Form ดังภาพข้างล่าง


ทำการระบุคุณสมบัติ ของ Data Control โดยเลือก DatabaseName เพื่อจะทำการเลือกฐานข้อมูลที่เราสร้างขึ้น โดยสร้างจาก MS Access, FoxPro, Dbase ฯลฯ ดังรูป แล้วกด Open


ทำการเลือก RecordSource ซึ่งจะทำการระบุชื่อของ ตาราง (Table) ที่มีในฐานที่เรา ต้องการนำมาแสดงผลหรือใช้งาน


การแสดงผลในฐานข้อมูล โดยใช้  Data Control
ในการแสดงผลจากฐานข้อมูลเราสามารถแสดงผลจากฐานข้อมูลโดยการนำเอา ActiveX มาช่วยในการแสดงผล ตัวอย่างเช่น