บทที่10

การเขียนโปรแกรมจัดการฐานข้อมูลด้วยแมโคร


ความรูเบื้องตนเกี่ยวกับ VBA Access VBA (Visual Basic for Applications) เปนโปรแกรมที่ชวยขยายขีดการทํางาน ของโปรแกรม MS Access ใหมีขีดความสามารถในการทํางานเพิ่มมากยิ่งขึ้น VBA เปนโปรแกรม เชิงวัตถุจึงควรเขาใจหลักการเบื้องตน ของวัตถุเสียกอน


เรื่องของตัวแปร

ตัวแปรของ VBA แบงออกเปนหลายประเภท ตัวแปรที่ ควรรูจัก มีดังนี้




   เรื่องของ Object Object หรือวัตถุจะมีคุณลักษณะ property ซึ่งจะบอกใหทราบถึงลักษณะของวัตถุนั้น ๆ ใน MS Access ฟอรมถือเปนวัตถุๆ หนึ่ง รายงาน ก็เป็นวัตถุ ๆ หนึ่ง นอกจากนี้ Controls ตาง ๆ ที่อยูบนฟอรม ก็เปนวัตถุ ๆ หนึ่งเชนกัน และจะมี property หรือคุณสมบัติที่แตกตางกันออกไป เชน สีของ background ของ Control นั้น ๆ คา หรือ value ที่มีอยูใน control นั้น เป็นต้น แตละ object จะมีmethod หรือ สิ่งที่วัตถุนั้น ๆ ทําไดเชน ฟอรมสามารถจัดเรียงข้อมูล ใหมไดโดยมีmethod ชื่อrequery ซึ่งสามารถสังเกตไดดังนี้ Forms!frmCustomer.requery นอกจากน ี้ แตละ object ยังมีevent หรือ เหตุการณของวัตถุนั้น ๆ เชน เมื่อมีการเปด ฟอรม หรือปดฟอรม หรือเมื่อมีการคลิกเมาสที่ฟอรม หรือที่ control เปนตน ในแตละ event จะมีproperty ควบคูกันไป event property นี้สามารถดูไดจาก Event category ใน Property Sheet ของแตละ Object ดังภาพขางลางนี้


Objects และ Collections 

   ใน Access วัตถุหรือ Object สวนใหญจะรวมกันอยู่เป็นหมู่ๆ เราเรียกแตละหมูวาเปน collection เชน ฐานขอมูลจะประกอบไปดวย collection ของ ฟอรม ซึ่งจะมีอยูหลายฟอรม โดยที่ แตละฟอรม ก็คือ Object หรือเปนวัตถุ ๆ หนึ่ง ซึ่ง ก็จะประกอบไปดวย collection ของ controls ตาง ๆ ที่อยูบนฟอรมนั้น ๆ เชน ปุมสงขอมูล (Command Button) ชองสําหรับกรอกขอมูล (Text Box) กรอบขอความ (Label) และ Combo Box เปนตน ตัวอยาง Form Collection ของฐานขอมูล

การอ้างถึง Objects 

  การจัดการขอมูลตาง ๆ โดยใช VBA จะต้องมีการอางถึง objects ตาง ๆ ใหถูกตองจึงจะ สามารถทําการเปลี่ยนแปลงแกไขไดการอางอิง เราใชเครื่องหมาย! และเครื่องหมายจุด . โดยมี หลักดังนี้ 1. ใชเครื่องหมายตกใจ ! คั่น ระหวาง collection กับ object ดังนี้ collection_name!object_name 
2. ใชเครื่องหมายจุด . คั่น ระหวาง Object และ Collection ดังนี้ object_name.collection_name 

การอ้างถึง Form หรือ Report 

  สมมุติในโปรแกรมฐานขอมูลของเรา มีฟอรม ชื่อfrmCustomer และ มีแบบรายงาน หรือ report ชื่อrptCustomer Report เราจะอางถึงดังนี้ การอางถึงฟอรม frmCustomer จะเริ่มจาก Application Object ดังนี้ Application.Forms!frmCustomer การอางถึงรายงาน อางดังนี้ Application.Reports![rptCustomer Report] 

การสร้าง Procedure 

  Procedure คือกลุมคําสั่งที่อยูรวมกันเพื่อทํางานอยางใดอยางหนึ่งตั้งแตการทํางานอยาง งายเชนการเปด หรือปดฟอรม ไปจนกระทงซับซอนมาก ๆ เชน การจัดการขอมูล หรือจัดเก็บขอมูลลงฐานขอมูลเปนตน Procedure สามารถรับขอมูลจากภายนอกเพื่อนํามาจดการอย่างใด อยางหนึ่งได 
ประเภทของ Procedures ที่ควรทราบ 
1. Sub Procedures เปนการทํางานของกลุมคําสั่งโดยที่ไมมีการสงคาคืนออกมา สวน ใหญใชSub Procudures เพื่อรับกับเหตุการณหรือ events ของ ฟอรม หรือรายงาน หรือของ control ตาง ๆ รูปแบบของ Sub procedures มีดังน ี้ 
Private Sub ชื่อ ([คาที่สงเขาไปใน Sub])

            คําสั่ง
            คําสั่ง 
            ... 
            End Sub 

   Sub Procedure ที่ใชกับ event ของ ฟอรม หรือรายงาน หรือของ Control ตาง ๆ เรา เรียกวาเปน event procedure โดยจะมีคําวา Form หรือ Report หรือช ื่ อของ control และตอดวย event นั้น ๆ เชน

Private Sub Form_Load()      หรือ 
Private Sub cmdOK_Click() 

2. Function Procedures เปน Procedure ที่คืนคาอยางใดอยางหนึ่งออกมาจาก Procedure เราใช Function สําหรับการกระทําที่ทําซ้ำๆ กัน แตมีการเปลี่ยนแปลงขอมูลเราสามารถสราง Function ขึ้นใชเอง Function มักจะมีการรบคั าจากภายนอกเพื่อนําไปประมวลผลบางอยางและ สงคาคืนกลับออกไป รูปแบบของ Function มีดังนี้
           Private Function_name ([คาที่สงเขาไปใน Sub]) ประเภทขอมูลที่สงออกมา 

                       คําสั่ง 
                       คําสั่ง 
                       ... 
                       Function_name = expression 
End Function 

ตัวอยาง Private Function addit(firstNum AS integer, secondNum AS integer) AS Integer 

ใหสรางฟอรม ชื่อform1 และนํา Control มาวางไวดังภาพ



ใหสราง Sub และ Function เพื่อรับคาและเมื่อกรอกตัวเลขในชองตัวเลขตัวแรกและ ตัวเลขตัวที่ 2 จากนั้นเมื่อกดปุม Command2 แลวใหนําคามาแสดงดังรูป


วิธีทํา 

สราง Sub และfunction ตามขางลางนี้

Private Sub Command2_Click() 
Dim thisR As Long 
Dim fNum As Long 
Dim sNum As Long 
fNum = Me.Text0 
sNum = Me.Text3 

putText "ทานพิมพ " 'เวลาเรียก sub ที่สรางเองอยาใสเครื่องหมายวงเล็บครอม parameter 
' ถาเปนตัวเลขก็ใสเฉยๆเชน addme 3, 5 
'มิฉะนั้น จะนึกวาเปน function ซึ่งตองมีการรับคา เพราะจะสงคาคืนมา 
' จึงถามหาเครื่องหมายเทากับ 

thisR = addThem(fNum, sNum) 
Me.Text7 = thisR 
End Sub 

Function addThem(first As Long, second As Long) As Long 
Dim result As Long 
result = first + second 
addThem = result 
End Function 

Sub putText(thisText As String) 
Dim f, s As Long 
f = Me.Text0 
s = Me.Text3 
Me.Text5 = thisText & f & "และ " & s 
End Sub


เรื่อง Control Structure 

  Control Structure เปนโครงสรางในการควบคุมการทํางานของโปรแกรม เชน มีการ กําหนดเงื่อนไขการควบคุมการทํางานซ้ำเปนตน การควบคุมเหลานี้ในโปรแกรม VBA ใช โครงสรางเชนเดียวกับ Visual Basic โครงสรางที่นาสนใจ มีดังนี้ 
1. การกําหนดเงื่อนไข 
          1.1 การใชif … then … else เปนการกําหนดเงื่อนไขการทํางาน ถาเงื่อนไขเปนจริง ใหทําอะไรถาไมเปนจริงใหทํา อะไร สวนของ else จะมีหรือไมมีก็ไดถาเราไมสนใจวาถาไมเปนไปตามเงื่อนไขที่กําหนดจะใหทําอะไร ไมจําเปนตองมีelse โครงสรางการใชมีดังนี้

          รูปแบบที่ 1 (บรรทัดเดียว) 
          If (เง ื่อนไข) then คําสั่ง [else คําสั่ง ]
         (เครื่องหมาย[ และ] แสดงวาส ิ่ งท ี่ อยูขางใน จะมหรี ือไมมีก็ไดเครื่องหมายนไม่ได้เป็นสวนหนึ่งงของโปรแกรม) 

         รูปแบบที่ 2 (หลายบรรทัด) 
         If (เง ื่อนไข) Then 
                   คําสั่ง 
                   คําสั่ง 
                   ...... 
         [Else 
                   คําสั่ง 
                   คําสั่ง
                   .........]
         End If 

         รูปแบบที่ 3 เปนการก  ําหนดเง ื่อนไขซอนกนหลายเง ั ื่อนไข 
         If (เงื่อนไข) Then 
                   คําสั่ง 
                   คําสั่ง 
         ...... [ElseIf (เง ื่อนไข) Then 
                   คําสั่ง 
                   ....... ] 
         [Else 
                   คําสั่ง
                   คําสั่ง 
                   .........] 
         End If

   การตรวจสอบเงื่อนไขในลกษณะนี้ จะตรวจสอบทีละเงื่อนไขตามลำดับ ถาเงื่อนไขไหน เปนจริง ก็จะทําคําสั่ง และจะออกจากการตรวจสอบ ถาไมมีเงื่อนไขใดเปนจริงเลย ก็จะทําตาม คําสั่ง ในสวนของ Else ดังนั้น จึงควรพิจารณาดูกอนวา เงื่อนไขใดมีแนวโนมที่จะเปนจริงมากที่สุด ก็ใหตรวจสอบกอน จะทําใหโปรแกรมมประสิทธิภาพดีขึ้น

ตัวอย่าง (_if_exercise.mdb)

ใหสรางฟอรมใหมดังภาพข้างล่าง เมื่อผูใชเลือก radio button แลวคลิกปุมสงขอมูลให บอกวา เขาคลิกเลือกอะไร



หนาจอเมื่อคลิกปุมสงขอมูลแลว



วิธีการทํา 

ที่ปุม on click ของปุม สงขอมูลใหเขียน code ดังนี้


Dim numOfChildren As Byte 
numOfChildren = Me.frmNumOfChildren.Value 

If numOfChildren = 1 Then 
    MsgBox ("คุณมีบุตร 1คน") 
ElseIf numOfChildren = 2 Then 
    MsgBox ("คุณมีบุตร 2 คน") 
ElseIf numOfChildren = 3 Then 
    MsgBox ("คุณมีบุตร 3 คน") 
Else 
    MsgBox ("คุณมีบุตร มากกวา 3 คน")
End If
End Sub

เรื่องของ DAO (Data Access Object) 


   ฐานขอมูลของ Access คือ Jet Database Engine: (Jet ยอมาจาก Joint Engine Technology) ซึ่งเปนหัวใจสาคัญที่เก็บรักษาขอมูลตาง ๆ ตัว Access เปนเพียงการสรางหนาจอเพื่อ รับขอมูลเทานั้น เราใช้ VBA เพื่อจัดการกับวัตถุของ Access เชน แบบฟอรม และรายงาน เปนตน สําหรับ ตัวเชื่อมระหว่าง Jet Database Engine และ Access ก็คือ DAO หรือ Data Access Object ซึ่งมีสภาพเปน วัตถุๆ หนึ่ง ประกอบขึ้นด้วยวัตถุยอย ๆ อีกหลายวัตถุ 
   ปจจุบัน Microsoft ไดจัดทํา ADO (ActiveX Data Objects) แตในการอบรมครั้งนี้จะ เลือกใช DAO เนื่องจาก DAO ไดถูกออกแบบมาใชกับ Access และ Jet Database ซึ่งมีการ เชื่อมตอกันอยางเหนียวแน่น และมีประสิทธิภาพ อีกทั้งยังรวดเร็วกวาการตอเชื่อมผาน ADO อยางไรก็ตาม ถาในอนาคต จะมีการเลือกใชฐานขอมูลจากภายนอก ที่ไมใช Jet Database แลวละก็ ADO จะกลายเปนตัวเลือกแทนที่ DAO ทันที 
   MS Access 2003 จะมีDAO 3.6 มาพรอมดวยแลว DAO 3.6 ออกแบบมาใหใชกับ Jet 4.0 Database engine อยางไรก็ตาม กอนที่จะมีการเรียกใชงานไดเราตองเพิ่ม DAO 3.6 Object Library เสียก่อนโดยการเปิดหน้าจอ Code แลวไปที่ Tools > References แลวเลือก Microsoft DAO 3.6 Library จึงจะสามารถใชงานได Database Access Object Model 
   DAO Model มีแผนผังดังนี้




Workspaces 


Workspaces collection ประกอบไปดวย Workspace objects ใน Workspace object แต ละตัวเป็นขอบเขตการทำงานของผูใชแตละคน การกําหนดสิทธิและความปลอดภัยของแตละคน มี อยูใน Workspace ของแตละคน 


Databases 

Databases Collections ประกอบด้วยฐานขอมูลตาง ๆ หลายฐานข้อมูล ใน Workspaces ของผูใชนั้น ๆ ฐานขอมูลอาจจะเปน Jet Databases หรือฐานข้อมูลภายนอกก็ได Database Object แตละตัว ก็คือฐานข้อมูลแตละฐาน ถาตองการอางถึง database ที่ใชในปจจุบันขณะนั้น เรา สามารถใชฟงชั่น CurrentDB() แทนได้


TableDefs 

TableDefs collect ประกอบไปดวยตารางตาง ๆ ในฐานขอมูลนั้น ๆ ทั้งที่กําลังเปดใชงาน อยูและทั้งท ี่ไมไดเปด TableDefs จะบรรจุรายละเอียดข้อมูลของตารางแตละตาราง 

QueryDefs 

QueryDefs collect ประกอบไปดวย queries .ในฐานขอมูลนั้น ๆ Code ขางลางจะพิมพ รายชื่อ queries และคําสั่ง SQL ของ Query นั้น ๆ

Fields 

Field collection มีอยูใน TableDef, QueryDef และ Recordset objectsการหา รายละเอียดของ Field สามารถทําไดโดยการอางอิงจาก TableDef, QueryDef และ Recordset objects

Recordsets 

Recordset Object เปนกลุมของ Records ที่มาจากตารางตาง ๆ Recordset collection จะประกอบไปดวย Recordset Objects ที่กําลังเปดอยูในฐานขอมูลปจจุบัน

ไม่มีความคิดเห็น:

แสดงความคิดเห็น