7.5.1 Het begrip subprocedure
Elk formulier (rapport) wordt gekenmerkt door een aantal eigenschappen en een aantal gebeurtenissen. Dat geldt eveneens voor elk object dat in het formulier (rapport) is opgenomen. Aan elke gebeurtenis kunnen we één of een verzameling van opdrachten koppelen die in een bepaalde volgorde en met een bepaalde frequentie worden uitgevoerd. Een dergelijke verzameling wordt daarom een gebeurtenisprocedure of een subprocedure genoemd. Een dergelijke subprocedure maakt deel uit van het betrokken formulier (rapport) en kan enkel via dit formulier (rapport) aangesproken worden.
SYNTAX:
| PRIVATE SUB subprocedurenaam() ... ... ... END SUB |
Dit is een voorbeeld van het modulevenster
waarin een gebeurtenisprocedure wordt opgebouwd:

Bemerk:
Het is duidelijk dat in dit voorbeeld de subprocedure opgeroepen wordt bij het sluiten van het formulier.
In de naam van de subprocedure worden automatisch de naam van
het object en de gebeurtenis bij dit object, waaraan de
subprocedure gekoppeld wordt, opgenomen. Dit gebeurt automatisch
door de programmagenerator. Wijzig dus niets aan deze naam!
Commentaarregels worden voorafgegaan door het afkappingsteken '.
Elk formulier en elk rapport in de databank beschikt over een ingebouwde formuliermodule of rapportmodule die sjablonen voor gebeurtenisprocedures bevat. Je kan programmacode toevoegen die wordt uitgevoerd als reactie op gebeurtenissen die plaatsvinden in het formulier, het rapport of de besturingselementen in het formulier of rapport. In het bovenstaande voorbeeld zal de gebeurtenisprocedure voor het object "form" automatisch worden uitgevoerd van zodra de gebeurtenis "close" zich voordoet.
Veel wizards (bijvoorbeeld de wizard Opdrachtknop) die objecten maken, kunnen ook gebeurtenisprocedures voor het object maken. Je kan deze gebeurtenisprocedures bekijken om te zien hoe procedures functioneren.
Als je een knop maakt zonder hulp van de wizard Opdrachtknop, doet de knop niets wanneer je erop klikt. Wat heeft de wizard dan precies gedaan om de knop datgene te laten doen wat je wil?
Als deze wizard een knop maakt, voegt hij een gebeurtenisprocedure toe aan de gebeurtenis "Click". Telkens op de knop wordt geklikt, voert Access de bijhorende Visual Basiccode uit.
7.5.2 De gebeurtenisprocedure van de wizard Opdrachtknop
Start het formulier "frmUitgeverijen" in de databank.
![]() |
In dit formulier voegen we onderaan 2 opdrachtknoppen
toe:
|
![]() |
Aangezien beide knoppen behoren tot het formulier "frmUitgeverijen" heeft de wizard de overeenkomstige procedure opgeslagen in de klassemodule van dit formulier. |
|
Je kan deze module bekijken door het formulier te
openen in ontwerpmode:
|
![]() |
Waneer de gebruiker de knop "cmdStop"
aanklikt wordt deze procedure uitgevoerd. De gebeurtenisprocedure begint met Private Sub ... en eindigt met End Sub. Met DoCmd.Close wordt het formulier gesloten. De overige regels handelen een procedure af voor het geval er iets mis gaat. De wizard neemt deze regels op zodat de applicatie niet gaat 'hangen' als er een fout optreedt. |
![]() |
Waneer de gebruiker de knop "cmdToevoegen"
aanklikt wordt deze procedure uitgevoerd. Met DoCmd.GoToRecord,,acNewRec wordt een blanco record toegevoegd. De overige regels handelen eveneens een procedure af voor het geval er iets mis gaat. |
Toepassing
Maak een opdrachtknop voor het opslaan van het huidige record.
7.5.3 De wizard Opdrachtknop aanvullen
De wizard Opdrachtknop is duidelijk een uitstekend hulpmiddel waarmee we onze toepassingen kunnen aanpassen en gebruiksvriendelijker maken. We kunnen dit echter nog verder perfectioneren door zelf de code van de bijhorende gebeurtenisprocedure aan te vullen.
Toepassing
Klik je, in de vorige toepassing, op de knop cmdToevoegen dan verschijnt er wel een nieuw, blanco record op het scherm maar blijft de focus op de knop en kan je niet meteen nieuwe gegevens invoeren. Daarom is het handig de gebeurtenisprocedure aan te vullen met de opdracht de focus te plaatsen op het object van het eerst in te voeren gegeven, de naam van de uitgeverij.
![]() |
Onder het DoCmd-statement voeg je de passende instructie toe. De naam van het object dat de focus dient te krijgen is "Uitgeverij_benaming". Dit vind je terug in het eigenschappenvenster van dit object. De objectnaam wordt gevolgd door een punt en de passende methode: SetFocus. |
7.5.4 Een opdrachtknop maken zonder hulp van een wizard
In de vorige toepassing willen we de aandacht van de gebruiker verscherpen bij het wijzigen van bestaande gegevens. Hij kan alleen wijzigingen aanbrengen indien hij daar uitdrukkelijk om vraagt.
![]() |
Vooreerst stellen we de formuliereigenschappen "Bewerken toestaan" en "Verwijderingen toestaan" in op Nee. |
![]() |
Vervolgens maken we een opdrachtknop om het wijzigen
van een record toe te staan. De wizard Opdrachtknop biedt
deze mogelijkheid niet. We schakelen deze wizard op de
werkset dus beter uit en plaatsen een opdrachtknop naast
de toevoegknop. Naam: cmdWijzigen Open het snelmenu van deze knop en kies voor Gebeurtenisprocedure opbouwen en vervolgens voor Opbouwfunctie voor programmacode. |
![]() |
Je krijgt meteen het modulevenster van het formulier
en een gebeurtenisprocedure bij de gebeurtenis Click van
de betrokken opdrachtknop. De eigenschap, Bewerken toestaan, plaatsen we op Ja met de instructie: Me.AllowEdits=True Me staat voor het actieve formulier. |
7.5.5 Gebeurtenisprocedures schrijven voor formuliergebeurtenissen
Tot nu toe hebben we steeds de gebeurtenis Click gebruikt bij het object Opdrachtknop. Andere objecten en andere gebeurtenissen zijn uiteraard ook mogelijk.
Toepassing
Als een gebruiker de knop "Record wijzigen" aanklikt, zorgt de bijhorende gebeurtenisprocedure dat deze wijziging mogelijk wordt. Als de gebruiker nadien naar een ander record gaat, of het actieve record opslaat, moet de formuliereigenschap "Bewerken toestaan" terug op Nee gebracht worden, zodat dit nieuwe record niet zomaar kan gewijzigd worden.
Aan welk object, welke gebeurtenis kan je deze actie koppelen?
7.5.6 Interactie: bericht en daaropvolgend antwoord vanwege de gebruiker
In een subprocedure is het best mogelijk dat het programma een beslissing van de gebruiker nodig heeft (een ja/nee antwoord) om de juiste opdrachten te kunnen uitvoeren. Het is ook mogelijk dat de gebruiker zich vergist en zijn keuze of beslissing wenst te annuleren (een ja/nee/annuleren antwoord). In dit geval is er een tussenkomst van de gebruiker vereist.
SYNTAX:
| MSGBOX(bericht[, knoppen][, titel]) |
| bericht: tekst die in het berichtvenster dient te verschijnen. Neem tussen elke regel een regelterugloop (Chr(13)). |
| knoppen: een getal dat de som van verschillende waarden vormt. Deze waarden vertegenwoordigen het aantal en type weer te geven knoppen, de pictogramopmaak die wordt gebruikt en de standaardknop. Laat je dit getal weg, dan is de standaardwaarde voor knoppen 0. |
| titel: tekst die op de titelbalk van het berichtvenster wordt weergegeven. |
Het argument knoppen kent de volgende instellingen:
| Constante | Waarde | Weergave |
| vbOKOnly | 0 | Uitsluitend de knop OK. |
| vbOKCancel | 1 | De knoppen OK en Annuleren. |
| vbAbortRetryIgnore | 2 | De knoppen Afbreken, Nogmaals en Negeren. |
| vbYesNoCancel | 3 | De knoppen Ja, Nee en Annuleren. |
| vbYesNo | 4 | De knoppen Ja en Nee. |
| vbRetryCancel | 5 | De knoppen Nogmaals en Annuleren. |
| vbCritical | 16 | Het pictogram Noodsignaal. |
| vbQuestion | 32 | Het pictogram Waarschuwingsvraag. |
| vbExclamation | 48 | Het pictogram Waarschuwingsbericht. |
| vbInformation | 64 | Het pictogram Informatief bericht. |
| vbDefaultButton1 | 0 | Eerste knop is standaardinstelling. |
| vbDefaultButton2 | 256 | Tweede knop is standaardinstelling. |
| vbDefaultButton3 | 512 | Derde knop is standaardinstelling. |
De eerste groep waarden (0 - 5) beschrijft het aantal knoppen
en het type knop dat in het dialoogvenster wordt weergegeven. De
tweede groep (16, 32, 48, 64) beschrijft de pictogramopmaak en de
derde groep (0, 256, 512) stelt de standaardknop in. Gebruik, als
je getallen optelt, slechts één getal uit elke groep om een
eindwaarde voor het argument knoppen te maken.
Deze constanten worden opgegeven door Visual Basic. Hierdoor kan
je de namen van de constanten in plaats van waarden op
willekeurige posities in de programma-instructies gebruiken.
Toepassing 1: schermmededeling
De gebruiker kan zich afvragen of de wijzigingen die hij in een record heeft aangebracht, daadwerkelijk worden opgeslagen. Aan de formuliergebeurtenis "Na bijwerken" voegen we daarom een statement toe dat een boodschap weergeeft met de bevestiging dat het record is opgeslagen.
Lay-out:

Code:

Toepassing 2: interactie
Bij het toevoegen van een nieuw record heeft de gebruiker adresgegevens zoals straat en nr ingevoerd maar het postnummer ontbreekt. In het programma kunnen we veronderstellen dat de gebruiker hier een verstrooidheidsfout heeft gemaakt. Om ons programma gebruiksvriendelijk te maken vragen we de gebruiker, alvorens dit record op te slaan, of hij dit record nog wenst aan te vullen of toch zo wenst te bewaren. Afhanfelijk van het antwoord van de gebruiker moet de passende actie worden uitgevoerd.
Uitwerking: toepassing 2 bij 7.5.7 Invoergegevens valideren.
7.5.7 Invoergegevens valideren
Het is belangrijk zoveel mogelijk invoerfouten op te vangen door passende foutmeldingen en acties.
Toepassing 1: vereist gegeven
In de tabel van de uitgeverijen staat het veld Uitgeverij-benaming ingesteld als een vereist gegeven. Wil de gebruiker, via het formulier frmUitgeverijen, een nieuw record toevoegen dan moeten we hem verplichten de naam van de uitgeverij in te voeren.
Controle
Voor het opslaan (de gebruiker klikt op de opdrachtknop Record
opslaan) wordt de inhoud van het tekstvakobject
"Uitgeverij_benaming" gecontroleerd. Is dit leeg, dan
verschijnt een passende foutmelding en wordt de schermcursor
terug op dit tekstvakobject in het formulier geplaatst. De
bewaaractie wordt meteen geannuleerd.
Lay-out

Code

Bemerk dat, als de gebruiker een record heeft toegevoegd en op de Stopknop klikt, weliswaar de foutmelding verschijnt, maar het sluiten van het formulier niet wordt geannuleerd. Vandaar volgende gewijzigde gebeurtenisprocedure:

In elk geval wordt nu, bij het toevoegen van een nieuw record,
naar de naam van de uitgeverij gevraagd.
Toepassing 2: interactie
Bij het toevoegen van een nieuw record heeft de gebruiker adresgegevens zoals straat en nr ingevoerd maar het postnummer ontbreekt. In het programma kunnen we veronderstellen dat de gebruiker hier een verstrooidheidsfout heeft gemaakt. Om ons programma gebruiksvriendelijk te maken vragen we de gebruiker, alvorens dit record op te slaan, of hij dit record nog wenst aan te vullen of toch zo wenst te bewaren. Afhanfelijk van het antwoord van de gebruiker moet de passende actie worden uitgevoerd.
Lay-out

Code

Bemerk de interactie
7.5.8 Toepassingen
Een uitgeverij zoeken
Het formulier frmUitgeverijen maken we gebruiksvriendelijker door het toevoegen van een keuzelijst met invoervak om de gegevens van een bepaalde uitgeverij onmiddellijk op het scherm te verkrijgen.
Lay-out:

Gevraagd:
Controle op het rekeningnummer
In ditzelfde formulier controleren we de invoer van het rekeningnummer.