ΚΕΝΤΡΟ ΠΛΗ.ΝΕ.Τ. Ν. ΦΛΩΡΙΝΑΣ
Προγραμματισμός σε Access
ΥΠΟΜΟΝΑΔΕΣ (Modules)
Τι είναι οι Υπομονάδες της Access και ποια η χρησιμότητά τους;
Οι υπομονάδες (modules) της Access είναι στην ουσία η γλώσσα προγραμματισμού που έχει η Access. Επειδή οι μακροεντολές της Access είναι περιορισμένες σε κάποιες συγκεκριμένες εντολές, υπάρχουν και οι υπομονάδες που έχουν απεριόριστες δυνατότητες.
Με τις υπομονάδες μπορούμε να δημιουργήσουμε όσες μεταβλητές και σταθερές θέλουμε και να ελέγξουμε και να τροποποιήσουμε όποια πεδία των πινάκων της Access θέλουμε. Μπορούμε, ακόμη, πολύ εύκολα, να δημιουργήσουμε συνθήκες, εντολές ροής, εντολές επανάληψης (βρόχους), συναρτήσεις (functions) και υπορουτίνες (subroutines).
Η Visual Basic for Applications (VBA), η γλώσσα προγραμματισμού της Access, δεν διαφέρει και δεν υστερεί σε τίποτα από τις άλλες γλώσσες προγραμματισμού. Κάθε πρόγραμμα (κώδικας) της VBA αποθηκεύεται σε υπομονάδες (modules). Υπάρχουν δύο τρόποι δημιουργίας υπομονάδων : σαν αντικείμενο υπομονάδας ή σαν μέρος ενός αντικειμένου φόρμας ή αναφοράς.
Τι είναι το Αντικείμενο Υπομονάδας;
Είναι ένας κώδικας προγράμματος που περιέχει διαδικασίες που θα μπορούν να χρησιμοποιηθούν από ένα ή περισσότερα ερωτήματα, φόρμες ή αναφορές. Μια διαδικασία που έχει οριστεί σ’ ένα αντικείμενο υπομονάδας, μπορεί να κληθεί από οποιοδήποτε σημείο της εφαρμογής μας.
Μπορούμε να δούμε τα αντικείμενα υπομονάδων μιας βάσης δεδομένων πατώντας στην καρτέλα Modules (Υπομονάδες).
Τι είναι οι Υπομονάδες Φορμών και Αναφορών;
Είναι υπομονάδες που ανήκουν αποκλειστικά σε κάποια φόρμα ή αναφορά. Μπορούμε να διορθώσουμε την υπομονάδα μιας φόρμας ή αναφοράς ανοίγοντας τη φόρμα ή την αναφορά σε Άποψη Σχεδιασμού και πατώντας στο κουμπί Code (Eώδικας) της γραμμής εργαλείων ή επιλέγοντας την εντολή Code από το μενού View.
Περιγράψτε το Παράθυρο Υπομονάδας
Το παράθυρο υπομονάδας δημιουργείται όταν ανοίξουμε μια υπομονάδα σε Άποψη Σχεδιασμού. Η Access μάς τοποθετεί αυτόματα στο τμήμα Declarations (Δηλώσεις), όπου μπορούμε να ορίσουμε εκείνες τις μεταβλητές που θα τις μοιράζονται όλες οι διαδικασίες της υπομονάδας.
Στη γραμμή τίτλου του παραθύρου βλέπουμε το όνομα της υπομονάδας και ακριβώς από κάτω υπάρχουν δύο πλαίσια πτυσσόμενου καταλόγου :
Πλαίσιο Καταλόγου Αντικειμένων (Object)
Όταν δουλεύουμε μ’ ένα αντικείμενο υπομονάδας, εδώ εμφανίζεται μόνο η επιλογή General. Όταν δουλεύουμε με μια υπομονάδα φόρμας ή αναφοράς, επιλέγουμε τη φόρμα ή την αναφορά από τον κατάλογο και τότε στο πλαίσιο καταλόγου διαδικασιών (Proc) εμφανίζονται οι διαθέσιμες διαδικασίες συμβάντων για το αντικείμενο που έχουμε επιλέξει.
Πλαίσιο Καταλόγου Διαδικασιών (Proc)
Όταν δουλεύουμε μ’ ένα αντικείμενο υπομονάδας, εδώ εμφανίζονται με αλφαβητική σειρά όλες οι διαδικασίες που έχει η υπομονάδα. Όταν δουλεύουμε με μια υπομονάδα φόρμας ή αναφοράς, εδώ εμφανίζονται οι διαθέσιμες διαδικασίες συμβάντων που ανήκουν στη φόρμα ή την αναφορά.
Πώς δημιουργώ μια νέα Διαδικασία σε μια Υπομονάδα;
Μέσα στο παράθυρο υπομονάδας, γράφουμε την εντολή Function (Συνάρτηση) ή Sub (Υπορουτίνα) και μετά πατάμε στο κουμπί Εισαγωγής Διαδικασίας (Insert Procedure) της γραμμής εργαλείων ή επιλέγουμε την εντολή Procedure από το μενού Insert. Η Access θα ξεκινήσει τότε αυτόματα μια νέα διαδικασία και θα βάλει στο τέλος την εντολή End Function ή End Sub αντίστοιχα.
Τύποι Δεδομένων της VBA
Οι τύποι δεδομένων της VBA είναι παρόμοιοι με τους τύπους δεδομένων των πεδίων μιας βάσης δεδομένων.
Οι τύποι δεδομένων είναι : Byte, Integer (%), Long (&), Single (!), Double (#), Currency (@), String ($), Boolean, Date Object, Variant και User-defined. Τα σύμβολα μέσα στην παρένθεση είναι ο χαρακτήρας που τοποθετείται μετά το όνομα της μεταβλητής για να προσδιορίσει τον τύπο της.
Εμβέλεια Μεταβλητών και Σταθερών
Μια μεταβλητή ή μια σταθερά μπορεί να είναι “ορατή” σε μία μόνο διαδικασία (τοπική εμβέλεια), σ’ όλες τις διαδικασίες μιας υπομονάδας ή σ’ όλες τις διαδικασίες της βάσης δεδομένων μας (καθολική εμβέλεια).
Για να δηλώσουμε μια καθολική μεταβλητή, χρησιμοποιούμε την εντολή Public στο τμήμα Declarations ενός αντικειμένου υπομονάδας. Για να δηλώσουμε μια καθολική σταθερά, χρησιμοποιούμε τη λέξη Public μαζί με μια εντολή Const στο τμήμα Declarations.
Για να δηλώσουμε μια μεταβλητή ή σταθερά που θα μπορεί να χρησιμοποιηθεί απ’ όλες τις διαδικασίες μιας υπομονάδας, την ορίζουμε στο τμήμα Declarations της υπομονάδας.
Για να δηλώσουμε μια μεταβλητή ή σταθερά που θα μπορεί να χρησιμοποιηθεί μόνο σε μια συγκεκριμένη διαδικασία, την ορίζουμε σαν μέρος της διαδικασίας.
Σε μια βάση δεδομένων, μπορούμε να δώσουμε ίδια ονόματα σε μεταβλητές που ανήκουν σε διαφορετικές υπομονάδες καθώς και σε μεταβλητές που έχουν καθολική ή τοπική εμβέλεια. Στην πρώτη περίπτωση, για να ξεχωρίσουμε τις μεταβλητές, γράφουμε πριν απ’ το όνομά τους, το όνομα της υπομονάδας που ανήκουν. Π.χ., οι μεταβλητές module1.intx και module2.intx έχουν ίδιο όνομα (intx) αλλά ανήκουν σε διαφορετικές υπομονάδες.
Στη δεύτερη περίπτωση, ισχύει ό,τι και σ’ άλλες γλώσσες προγραμματισμού, δηλ. μέσα σε μια διαδικασία υπερισχύουν οι τοπικές μεταβλητές και έξω από τη διαδικασία υπερισχύουν οι καθολικές μεταβλητές.
Εντολές της VBA
Εντολές για Ορισμό Σταθερών και Μεταβλητών
Const
Με την εντολή αυτή ορίζουμε σταθερές.
Π.χ.
Public Const PI = 3.14159
Dim
Δηλώνουμε μια μεταβλητή ή έναν πίνακα μεταβλητών στο τμήμα Declarations μιας υπομονάδας που θα μπορεί να χρησιμοποιηθεί σ’ όλες τις διαδικασίες της υπομονάδας. Μπορούμε, ακόμη, να χρησιμοποιήσουμε την εντολή Dim μέσα σε μια διαδικασία για να δηλώσουμε μια τοπική μεταβλητή στη διαδικασία αυτή.
Π.χ.
Dim intMyInteger As Integer
Dim dbMyDatabase As Database
Dim strMyString (51 To 100) As String * 20
Public
Με την εντολή αυτή δηλώνουμε καθολικές μεταβλητές στο τμήμα Declarations μιας υπομονάδας.
Π.χ.
Public lngMyNumber As Long
Υπάρχει και η εντολή Private, με την οποία δηλώνουμε μια μεταβλητή ή σταθερή που θα είναι διαθέσιμη μόνο μέσα στην υπομονάδα όπου γίνεται η δήλωση. Η δήλωση Private είναι default.
ReDim
Δηλώνουμε δυναμικά έναν πίνακα μέσα σε μια διαδικασία ή αλλάζουμε τις διαστάσεις ενός δηλωμένου πίνακα μέσα σε μια διαδικασία κατά το χρόνο εκτέλεσης.
Π.χ.
ReDim strProductNames(20) As String * 25
Static
Δηλώνουμε μια μεταβλητή που θα χρησιμοποιηθεί μόνο μέσα σε μια διαδικασία και στην οποία η Access δεν θα επαναφέρει την αρχική της τιμής για όσο διάστημα θα είναι ανοιχτή η υπομονάδα που περιέχει τη διαδικασία αυτή.
Π.χ.
Static intMyInteger As Integer
Static strMyString (51 To 100) As String * 20
Type
Την χρησιμοποιούμε σ’ ένα τμήμα Declarations για να δημιουργήσουμε μια δομή δεδομένων ορισμένη από το χρήστη που θα περιέχει μία ή περισσότερες μεταβλητές. Μπορούμε επίσης να χρησιμοποιήσουμε την εντολή Type για να δηλώσουμε μια δομή εγγραφής.
Αφού δηλώσουμε μια δομή δεδομένων ορισμένη από το χρήστη, θα μπορούμε να χρησιμοποιήσουμε το όνομα τύπου σε οποιαδήποτε επόμενη εντολή Dim, Public ή Static για να δημιουργήσουμε μια μεταβλητή αυτού του τύπου.
Μπορούμε να αναφερόμαστε στις μεταβλητές μιας τέτοιας δομής δεδομένων, εισάγοντας το όνομα της μεταβλητής, μια τελεία και το όνομα της μεταβλητής που είναι μέσα στη δομή.
Π.χ.
Type MyRecord
lngID As Long
strLast As String
strFirst As String
strMid As String
End Type
...
Dim usrContacts As MyRecord
usrContacts.strLast = ‘Jones’
Οι Πίνακες στην Access
Πίνακες μπορούμε να δηλώσουμε με τις εντολές Dim, ReDim και Static. Σ’ έναν πίνακα μπορούμε να έχουμε μέχρι και 60 διαστάσεις. Αν δεν ορίσουμε το κάτω όριο σε μια διάσταση ενός πίνακα, η προεπιλογή είναι το 0. Μπορούμε να αλλάξουμε την προεπιλεγμένη τιμή του κάτω ορίου με την εντολή Option Base στο τμήμα Declarations της υπομονάδας :
Option Base 1
Το κάτω όριο μιας διάστασης ενός πίνακα θα πρέπει να είναι μεγαλύτερο από τον αριθμό -32.768 και το πάνω όριο θα πρέπει να είναι μικρότερο από τον αριθμό 32.767.
Η Εντολή Set
Με την εντολή αυτή μπορούμε να αντιστοιχίσουμε μεταβλητές αντικειμένου σε ονόματα βάσεων δεδομένων, πινάκων και πεδίων για να κάνουμε ευκολότερα τη δουλειά μας. Δείτε τα παρακάτω παραδείγματα :
Dim dbMyDB As Database
Set dbMyDB = CurrentDb()
Η μεταβλητή dbMyDB αναφέρεται στην τρέχουσα βάση δεδομένων.
Dim tblMyTable As TableDef
Set tblMyTable = dbMyDB.TableDefs![tblClubs]
Η μεταβλητή tblMyTable αναφέρεται στον πίνακα tblClubs της τρέχουσας βάσης δεδομένων.
Dim fldMyField As Field
Set fldMyField = tblMyTable![Notes]
Η μεταβλητή fldMyField αναφέρεται στο πεδίο Notes του πίνακα tblClubs της τρέχουσας βάσης δεδομένων.
Επεξεργασία των Εγγραφών μιας Βάσης Δεδομένων
Η Access χρησιμοποιεί πολλές εντολές με πολλές επιλογές για να επεξεργαστεί τις εγγραφές ενός πίνακα μιας βάσης δεδομένων. Εδώ θα δούμε με απλά παραδείγματα το πώς μπορούμε να επεξεργαστούμε τις εγγραφές ενός πίνακα.
Dim dbEntSched As Database
Dim rcdClubs As RecordSet
Set dbEntSched = CurrentDb()
Set rcdClubs = dbEntSched.OpenRecordSet(‘tblClubs’, dbOpenTable)
Μπορούμε να χρησιμοποιήσουμε μια από τις μεθόδους Move για να μετακινηθούμε σε μια συγκεκριμένη εγγραφή. Π.χ. recordset.MoveFirst για να μετακινηθούμε στην πρώτη εγγραφή. Άλλες επιλογές είναι οι MoveLast, MoveNext και MovePrevious.
Για να μετακινηθούμε σε μια άλλη εγγραφή, πρέπει να χρησιμοποιήσουμε τη μέθοδο Find με κάποια κριτήρια. Για παράδειγμα, για να βρούμε το πρώτο στοιχείο ενός συνόλου εγγραφών του οποίου η τιμή AmountOwed είναι μικρότερη από 100$, δίνουμε :
Dim dbEntSched As Database
Dim rcdAPContracts As RecordSet
Set dbEntSched = CurrentDb()
rcdAPContracts.FindFirst ‘AmountOwed > 100’
Για να διαγράψουμε μια εγγραφή, πρώτα μετακινούμαστε στην εγγραφή αυτή και μετά χρησιμοποιούμε τη μέθοδο Delete. Για παράδειγμα, για να διαγράψουμε το πρώτο στοιχείο ενός συνόλου εγγραφών του οποίου η τιμή AmountOwed είναι ίση με 0, δίνουμε :
rcdAPContracts.FindFirst ‘AmountOwed = 0’
If Not rcdAPContracts.NoMatch Then
rcdAPContracts.Delete
End If
Για να ενημερώσουμε κάποιες εγγραφές, πρώτα πηγαίνουμε στην πρώτη εγγραφή που θέλουμε να ενημερώσουμε και μετά χρησιμοποιούμε τη μέθοδο Edit. Τέλος, θα πρέπει να χρησιμοποιήσουμε και τη μέθοδο Update για να ισχύσουν οι αλλαγές. Για παράδειγμα, για να αυξήσουμε κατά 10% την καταχώριση AmountOwed της πρώτης εγγραφής με τιμή μεγαλύτερη από 100, δίνουμε :
rcdAPContracts.FindFirst ‘AmountOwed > 100’
If Not rcdAPContracts.NoMatch Then
rcdAPContracts.Edit
rcdAPContracts![AmountOwed] = rcdAPContracts![AmountOwed] * 1.1
rcdAPContracts.Update
End If
Για να εισάγουμε μια νέα εγγραφή σ’ ένα σύνολο εγγραφών, πρέπει να χρησιμοποιήσουμε τη μέθοδο AddNew. Δίνουμε όλες τις τιμές που θέλουμε στα πεδία και τέλος χρησιμοποιούμε και τη μέθοδο Update για να γίνει η αποθήκευση.
rcdClubs.AddNew
rcdClubs![ClubName] = ‘Winthrop Brewing Co.’
rcdClubs![StreetAddress] = ‘155 Riverside ave.’
rcdClubs![City] = ‘Winthrop’
rcdClubs![State] = ‘WA’
rcdClubs![ZipCode] = ‘98862’
rcdClubs![PhoneNumber] = ‘(509) 996-3183’
rcdClubs.Update
Συναρτήσεις και Υπορουτίνες
Στη VBA υπάρχουν, όπως και στις άλλες γλώσσες προγραμματισμού, δύο είδη διαδικασιών : οι Συναρτήσεις (Functions) και οι Υπορουτίνες (Subroutines). Και οι τύποι διαδικασιών μπορούν να δεχθούν παραμέτρους. Οι συναρτήσεις μπορούν να επιστρέψουν μια τιμή δεδομένων, ενώ οι υπορουτίνες όχι.
Function
Μπορούμε να χρησιμοποιήσουμε μια εντολή Function για να δηλώσουμε μια νέα συνάρτηση, τις παραμέτρους που θα δέχεται, τον τύπο μεταβλητής που θα επιστρέφει και τον κώδικα που θα εκτελεί τη διαδικασία συνάρτησης.
Θα πρέπει να δηλώσουμε τον τύπο δεδομένων όλων των ορισμάτων που μπορεί να δεχθεί η συνάρτηση στη λίστα παραμέτρων της. Αν χρησιμοποιήσουμε τη δεσμευμένη λέξη ByVal για να δηλώσουμε ένα όρισμα, τότε αυτή θα είναι κλήση με τιμή. Δηλαδή, οποιαδήποτε αλλαγή κάνουμε σ’ ένα όρισμα ByVal μέσα στη συνάρτηση, δεν θα αλλάξει την αρχική μεταβλητή.
Αν χρησιμοποιήσουμε τη δεσμευμένη λέξη ByRef για να δηλώσουμε ένα όρισμα, τότε αυτή θα είναι κλήση με αναφορά. Δηλαδή, οποιαδήποτε αλλαγή κάνουμε σ’ ένα όρισμα ByRef μέσα στη συνάρτηση, θα αλλάξει και την αρχική μεταβλητή.
Μπορούμε να χρησιμοποιήσουμε την εντολή Exit Function σε οποιοδήποτε σημείο της συνάρτησης, για να βγούμε από τη συνάρτηση ομαλά και να επιστρέψουμε στη διαδικασία κλήσης.
Για παράδειγμα, για να δημιουργήσουμε μια συνάρτηση με όνομα MyFunction που θα δέχεται ένα ακέραιο και ένα αλφαριθμητικό όρισμα και θα επιστρέφει μια τιμή διπλής ακρίβειας, γράφουμε :
Function MyFunction (intArg1 As Integer, strArg2 As String) As Double
<εντολές συνάρτησης>
End Function
Sub
Μπορούμε να χρησιμοποιήσουμε μια εντολή Sub για να δηλώσουμε μια νέα υπορουτίνα, τις παραμέτρους που θα δέχεται και τον κώδικά της.
Μπορούμε να χρησιμοποιήσουμε την εντολή Exit Sub σε οποιοδήποτε σημείο της υπορουτίνας, για να βγούμε από την υπορουτίνα ομαλά και να επιστρέψουμε στη διαδικασία κλήσης.
Για παράδειγμα, για να δημιουργήσουμε μια υπορουτίνα με όνομα MySub που θα δέχεται δύο αλφαριθμητικά ορίσματα, αλλά θα μπορεί να τροποποιήσει μόνο το δεύτερο, γράφουμε :
Sub MySub (ByVal strArg1 As String, ByRef strArg2 As String)
<εντολές υπορουτίνας>
End Sub
Έλεγχος της Ροής των Εντολών
Call
Μεταφέρει τον έλεγχο σε μια υπορουτίνα.
Π.χ.
Call MySub (intMyInteger, curPrice * intQty)
Do ... Loop
Εκτελεί ένα σύνολο εντολών πολλές φορές μέχρις ότου γίνει ψευδής ή αληθής μια συνθήκη. Δέχεται και τις δύο εκφράσεις While και Until, τις οποίες μπορούμε να βάλουμε στην αρχή ή στο τέλος του βρόχου.
Π.χ.
Do Until rcdClubs.EOF
<εντολές διαδικασίας>
rcdClubs.MoveNext
Loop
For ... Next
Εκτελεί ένα σύνολο εντολών συγκεκριμένες φορές.
Π.χ.
For intI = 0 To 4
Debug.Print dbEntSched.QueryDefs(intI).Name
Next intI
For Each ... Next
Εκτελεί ένα σύνολο εντολών για κάθε στοιχείο μιας συλλογής ή μήτρας.
Π.χ.
For Each qdf In dbEntSched.QueryDefs
Debug.Print qdf.Name
Next qdf
GoTo
Πηγαίνει, χωρίς περιορισμό, σε κάποια άλλη εντολή.
Π.χ.
GoTo SkipOver
If ... Then ... Else
Εκτελεί κάποιες εντολές ανάλογα με την τιμή που επιστρέφει μια συνθήκη.
Π.χ.
Dim strMyString As String, strFirst As String, intVal As Integer
strFirst = Ucase$(Mid$(strMyString, 1, 1))
If strFirst >= ‘A’ And strFirst <= ‘F’ Then
intVal = 1
ElseIf strFirst >= ‘G’ And strFirst <= ‘N’ Then
intVal = 2
ElseIf strFirst >= ‘O’ And strFirst <= ‘Z’ Then
intVal = 3
Else
intVal = 0
End If
Select Case
Εκτελεί εντολές υπό συνθήκη, με βάση το αποτέλεσμα της σύγκρισης της τιμής μιας παράστασης μ’ έναν κατάλογο ή ένα εύρος τιμών.
Π.χ.
Dim strMyString As String, intVal As Integer
Select Case Ucase$(Mid$(strMyString, 1, 1))
Case ‘A’ To ‘F’
intVal = 1
Case ‘G’ To ‘N’
intVal = 2
Case ‘O’ To ‘Z’
intVal = 3
Case Else
intVal = 0
End Select
Stop
Αναστέλλει προσωρινά την εκτέλεση μιας διαδικασίας.
While ... Wend
Εκτελεί συνέχεια ένα σύνολο εντολών για όσο διάστημα είναι αληθής μια συνθήκη.
Π.χ.
While Not rcdClubs.EOF
<εντολές διαδικασίας>
rcdClubs.MoveNext
Wend
With
Είναι παρόμοια με την εντολή With της Pascal.
Π.χ.
Dim rst As Recordset, db As Database
Set db = CurentDb()
Set rst = db.OpenRecordset(‘MyTable’, dbOpenDynaset, dbAppendOnly)
With rst
.Addnew
![FieldOne] = ‘1’
![FieldTwo] = ‘John’
![FieldThree] = ‘Viescas’
.Update
.Close
End With
Εκτέλεση Ενεργειών Μακροεντολών
Στη VBA μπορούμε να εκτελέσουμε τις περισσότερες από τις ενέργειες μακροεντολών. Για όσες, όμως, ενέργειες μακροεντολών δεν μπορούν να εκτελεστούν μέσα σε μια διαδικασία της VBA, υπάρχουν ισοδύναμες εντολές της VBA. Για να εκτελέσουμε μια ενέργεια μακροεντολής μέσα από τη VBA, χρησιμοποιούμε το αντικείμενο DoCmd.
DoCmd
Π.χ. για να ανοίξουμε τη φόρμα Customer στην Άποψη Φόρμας για να εισαγάγουμε δεδομένα, γράφουμε :
DoCmd.OpenForm ‘Customer’, acNormal, , ,acAdd
Για να κλείσουμε τη φόρμα Supplier, γράφουμε :
DoCmd.Close acForm, ‘Supplier’