7.5 subprocedures toepassen in formulieren en rapporten

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:
  • een opdrachtknop om het formulier te sluiten (naam: cmdStop)
  • een opdrachtknop om een nieuw record toe te voegen (naam: cmdToevoegen)
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:
  • selecteer de knop "cmdStop"
  • neem in het snelmenu van deze knop de keuze "Gebeurtenis opbouwen"
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.

Oplossing

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
Bijschrift: Record wijzigen

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?

Oplossing

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:

Oplossing

Controle op het rekeningnummer

In ditzelfde formulier controleren we de invoer van het rekeningnummer.

Oplossing