Professional Documents
Culture Documents
Databaseontwikkeling Access 2003
Databaseontwikkeling Access 2003
Figuur 8.11
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
268
De eerste actie sluit het groene formulier en de tweede actie het
rode formulier. Aangezien er geen tabellen aan de formulieren zijn
gekoppeld, is het derde argument van de actie Sluiten overbodig.
Hiermee zijn alle macros gemaakt. Sla de macrogroep op onder
de naam frmRoodformulier. Hiermee geven we aan dat deze groep
alle macros van het rode formulier bevat. De volledige naam van
een macro binnen een macrogroep wordt overigens voorafgegaan
door de naam van de macro-groep. De naam van de macrogroep
en de macros in de groep worden gescheiden door een punt. Zo
luidt de volledige macronaam van de macro Initieer bijvoorbeeld:
frmRoodformulier.Initieer.
Macros koppelen aan gebeurtenissen
De macros zijn klaar, nu gaan we ze koppelen aan de opdracht-
knoppen en de gebeurtenis openen van het rode formulier. Als
eerste gaan we de macros van de opdrachtknoppen koppelen.
Selecteer in het databasevenster het overzicht Formulieren.
Kies het formulier Roodformulier en klik op de knop Ontwerpen.
Het rode formulier wordt in ontwerpweergave getoond.
Selecteer de opdrachtknop Kom terug en plaats vervolgens het
eigenschappenvenster op het scherm (via de knop Eigenschappen
in de werkbalk).
Selecteer in het tabblad Gebeurtenis, uit het eigenschappenvenster,
de gebeurtenis Bij klikken, zie guur 8.12.
Selecteer in de keuzelijst frmRoodformulier.Kom terug. De macro
wordt nu gestart als op de opdrachtknop wordt geklikt.
Figuur 8.12
Copyright 2007 Academic Service
8 Macros
269
Selecteer vervolgens de opdrachtknop Verdwijn en selecteer op
identieke wijze in het tabblad Gebeurtenis de gebeurtenis Bij klik-
ken.
Kies de macro frmRoodformulier.Verdwijn.
Koppel op dezelfde wijze de macro frmRoodformulier.Einde aan
de opdrachtknop Einde.
Er moet nog een macro gekoppeld worden aan de gebeurtenis ope-
nen van het rode formulier. Selecteer de eigenschappen van het
rode formulier (via de Formulierkiezer, links van de liniaal of uit
de keuzelijst van het eigenschappenvenster).
Kies in het tabblad Gebeurtenis de gebeurtenis Bij openen en kies
in de keuzelijst de macro frmRoodformulier.Initieer.
Als het rode formulier wordt geopend, wordt de macro frmRood-
formulier .Initieer gestart. Deze opent onder andere het groene
formulier, zodat beide formulieren op het scherm worden getoond.
Opmerkingen
In paragraaf 6.6 hebben we opdrachtknoppen met de Wizard
gemaakt. Deze voeren n actie uit, bijvoorbeeld het afdrukken
van een rapport of het openen van een formulier. Die actie wordt
niet uitgevoerd door een macro, maar door een zogeheten gebeur-
tenisprocedure: een programma in VBA-code (Visual Basic for
Applications). Door het klikken op een opdrachtknop die door de
wizard is gemaakt, wordt een stukje VBA-code uitgevoerd. Als
meerdere acties noodzakelijk zijn, en meestal is dat zo, moeten we
van macros gebruikmaken. Die voeren dan de acties voor ons uit.
Het beveiligingsniveau in Access 2003 is aanzienlijk aangescherpt.
Een groot aantal macroacties mag niet meer uitgevoerd worden.
Bijvoorbeeld het onzichtbaar maken van een formulier of acties
die bestanden kunnen verwijderen. U kunt die opdrachten wel
uit laten voeren op een lager beveiligingsniveau. Het beveiligings-
niveau kunt u wijzigen via de menubalk Extra, Macro, Beveiliging.
Alle macros zijn gekoppeld; nu kunnen we ze testen.
Open het rode formulier. Het groene formulier wordt tevens auto-
matisch geopend.
Controleer de werking van de opdrachtknoppen.
Als een macro niet naar wens functioneert, controleer dan de
macro die niet goed werkt.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
270
Eventueel kunnen we de stap-functie van de macros inschakelen.
Hiermee worden de acties stap voor stap doorlopen. Deze functie
is in paragraaf 8.1 toegelicht. Ook als de macro wel goed functio-
neert, kunnen we deze
mogelijkheid benutten, want hiermee kunnen we goed waarnemen
wat het effect is van iedere actie.
In het volgende hoofdstuk gaan we een toepassingsprogramma
maken dat volledig door macros wordt gestuurd. Hiermee kunnen
we professioneel ogende applicaties maken.
Opgave
8.2 a. Maak de formulieren en macros zoals beschreven in deze para-
graaf.
b. Wijzig de macro zo dat er nog twee extra meldingen worden
getoond, voordat de boodschap niet meer te verwijderen is.
Copyright 2007 Academic Service
9 Het bouwen van een
toepassing
In de vorige hoofdstukken hebben we geleerd hoe we tabellen ont-
werpen en bouwen, hoe we querys, formulieren en rapporten ont-
wikkelen en hoe we macros maken. In dit hoofdstuk zullen we een
toepassing (programma/applicatie) maken die gebruikmaakt van
alle opgedane kennis. We maken een professionele lay-out en
laten alle ingewikkelde gebeurtenissen door opdrachtknoppen en
macros uitvoeren. Hierdoor ontstaat een toepassing die zonder
kennis van Access gebruikt kan worden.
De toepassing die we gaan toelichten, heeft betrekking op onze
database Reisbureau. We gaan voor het reisbureau t Zonnetje een
toepassing ontwikkelen, die in stappen zal worden uitgelegd. De
database t Zonnetje staat op de cd-rom. Hiermee kunnen we
theorie en toepassing direct controleren. Naast database t Zonnetje
staat op de cd-rom de database Basis zonnetje, waarin alleen de
gebruikte tabellen uit database t Zonnetje zijn opgenomen. In die
database kunnen we tijdens het lezen de instructies uitvoeren die
tot database t Zonnetje hebben geleid.
Voor het ontwikkelen van een toepassing moeten we altijd een
aantal stappen doorlopen.
1. De informatiebehoefte moet volledig bekend zijn. We moeten pre-
cies weten wat de toepassing moet gaan doen; dit uiteraard in goed
overleg met de opdrachtgever.
2. De overzichten, rapporten en formulieren die gewenst zijn, moeten
genormaliseerd worden. Hierdoor ontstaat een logisch datamodel.
3. Aan de hand van het logische datamodel worden de tabellen en
relaties gedenieerd.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
272
4. De menustructuur moet ontworpen worden. Hiermee bedoelen
we: hoe ziet het openingsscherm eruit (hoofdmenu) en de vervolg-
schermen (submenus). Deze kunnen we in Access maken met
schakelborden. Deze worden in paragraaf 9.5 toegelicht.
5. Vervolgens moeten de benodigde querys, formulieren, rapporten
en macros ontworpen worden. Doe dit per formulier of rapport;
als een versie naar behoren werkt, kan aan het volgende formulier
of rapport begonnen worden.
6. Maak de ontworpen menustructuur uit de vierde stap met behulp
van schakelborden.
Deze stappen worden in de volgende paragrafen besproken, waar-
bij de eerste twee punten in ons voorbeeld als bekend worden ver-
ondersteld. We gaan van ons bestaande datamodel uit.
9.1 Tabellen en relaties
We maken gebruik van de tabellen die in de vorige hoofdstukken
zijn gebruikt:
Tabel Klant: hierin liggen de klantgegevens opgeslagen.
Klantnummer is de sleutel. Als een nieuwe klant wordt toegevoegd,
krijgt die het klantnummer dat n hoger is dan het laatste klant-
nummer dat is toegevoegd. De klanten zijn zo doorlopend
genummerd met behulp van het gegevenstype Autonummering.
Standaard begint het type Autonummering bij de waarde 1 en
wordt bij ieder volgend record opgehoogd. Het is mogelijk om de
eerstvolgende waarde te veranderen. Dit staat beschreven in bijlage
A, onder Veldlengte.
Tabel Boeking: hierin worden de boekingen van reizen opgeslagen,
zie guur 9.1.
Het veld Boekingnummer is de sleutel. Ook hiervoor geldt dat de
nummers worden doorgenummerd. Een nieuwe boeking krijgt een
nummer dat n hoger is dan het hoogste boekingnummer tot dan
toe. Het veld Klantnummer is een vreemde sleutel. Hierop hebben
we standaard een keuzelijst met invoervak gemaakt; zie in guur
9.1 de eigenschap Rijbron van het veld Klantnummer. In paragraaf
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
273
6.3 is uitgelegd hoe dat in zijn werk gaat. Hetzelfde geldt voor het
veld Rfeisnummer, dit is ook een vreemde sleutel. Hierop is even-
eens een keuzelijst met invoervak gemaakt.
Verder zijn in paragraaf 6.1 de velden Annuleringsverzekering en
Betaalwijze toegevoegd. Ten slotte zijn op de vreemde sleutels, dus
Klantnummer en Reisnummer, indexen (met duplicaten!) geplaatst.
Het zoekproces wordt hierdoor aanzienlijk versneld. In het alge-
meen geldt: zet indexen op sleutelvelden (automatisch in Access)
en vreemde-sleutelvelden.
Tabel Reis: alle mogelijke reizen worden hierin opgeslagen. Het
veld Reisnummer is de sleutel. Op het veld Bestemmingcode,
vreemde sleutel, is een index geplaatst (duplicaten toegestaan!) en
een keuzelijst met invoervak.
Tabel Bestemming: alle mogelijke bestemmingen worden in deze
tabel opgeslagen. Het veld Bestemmingcode is de sleutel. De sleutel
is van het type tekst en kan daardoor niet doorgenummerd worden.
Immers, bestemmingcodes zijn willekeurig.
Tabel Constant: deze tabel wordt hier voor het eerst gentrodu-
ceerd; in voorgaande hoofdstukken is die tabel niet eerder
gebruikt. Waar komt die vandaan? Een constantentabel is bij de
Figuur 9.1
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
274
meeste databases aanwezig. Hierin worden namelijk de constanten
opgeslagen. Bij het normaliseren worden de constanten verwijderd,
zoals de bedrijfsgegevens op een overzicht, de omrekeningsfactor
van de euro naar de dollar, het BTW-percentage laag, het BTW-
percentage hoog en het percentage van de annuleringsverzekering.
We houden dan de tabellen over die onderling gerelateerd zijn. Die
constanten moeten echter wel ergens opgeslagen liggen, we hebben
ze immers nodig. We hebben bijvoorbeeld het BTW-percentage
verwijderd tijdens het normaliseren. Maar tijdens het afdrukken
van de facturen moet wel het BTW-percentage gebruikt worden
om het BTW-bedrag uit te rekenen. Het is natuurlijk niet handig
om dat percentage in een rekenveld van een formulier- of rapport-
ontwerp op te nemen. Verandert het BTW-percentage, dan zullen
we alle formulieren en rapporten moeten nalopen om te contro-
leren of die het BTW-percentage bevatten. Vervolgens moet het
gewijzigd worden.
We noemen het in de informatiekunde wel constanten, maar het
zijn geen wiskundige constanten. Ze zijn dus alleen maar gedu-
rende een beperkte periode constant. Na een bepaalde periode
moeten ze makkelijk aan te passen zijn. Die constanten gaan we
opslaan in de tabel Constant. Die tabel heeft maar n record en is
aan geen enkele andere tabel gerelateerd! In dit ene record staan de
gegevens van de constanten, bijvoorbeeld 19% voor het BTW-per-
centage. Aangezien de tabel Constant maar n record heeft, is het
niet noodzakelijk om een sleutelveld te deniren. We kunnen nu
de waarden eenvoudig aanpassen. We hoeven dan immers alleen
maar het betreffende record op het scherm te plaatsen en de nieuwe
waarden in te toetsen.
Welke velden hebben we opgeslagen in de tabel Constant? Het veld
AnnuleerPerc, hierin staat het percentage waarmee gerekend wordt
als we een annuleringsverzekering hebben afgesloten. Verder het
veld KinderKortingPerc, hierin staat het kortingspercentage dat
aan kinderen wordt gegeven. Voor alle reizen geldt dit tarief. In
hoofdstuk 7 hebben we in opdracht 7.3 een omzetlijst gemaakt
waarin gerekend werd met een kortingspercentage van 20% voor
de kinderen. Als dit percentage wijzigt, moet de bijbehorende
query aangepast worden. Voor een gebruiker van de applicatie,
die geen kennis heeft van Access, is dat lastig. Door het gebruik
van de tabel Constant is geen kennis van Access meer nodig. De
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
275
gebruiker van de toepassing kan dan zelf eenvoudig het percentage
veranderen. In alle berekeningen wordt vanaf dat moment met dit
gewijzigde percentage gerekend. Voor het wijzigen van de constan-
ten wordt een formulier ontworpen.
Aangezien we de tabel Constant nog niet eerder hebben gebruikt,
tonen we de structuur. Merk op dat in de tabel geen sleutelveld is
gedenieerd.
De percentages moeten als fractie ingevoerd worden. Kies voor het
annuleringspercentage de waarde 0,04 en voor het percentage van
de kinderkorting de waarde 0,20. Door bij de notatie op te geven
dat het percentages zijn, zorgen we ervoor dat de getallen als per-
centages worden getoond. In onze berekeningen met de percenta-
ges is het dan niet noodzakelijk steeds door 100 te delen. De veld-
lengte is Enkele precisie. Met dat type kunnen decimale getallen
ingevoerd worden, zie eventueel de extra informatie in bijlage A.
Terzijde
Tabel Switchboard Items: deze tabel wordt automatisch aan-
gemaakt nadat we de schakelborden hebben gemaakt. Access
houdt hierin bij welke schakelborden bij deze toepassing in
gebruik zijn. Deze tabel wordt door Access gebruikt en is voor
ons niet van belang.
9.2 Menustructuur
Zodra we de database t Zonnetje starten, wordt direct een hoofd-
menu getoond, waaruit we een keuze kunnen maken. Na het
kiezen van sommige opties krijgen we vervolgens een submenu.
Voordat we de toepassing gaan maken, moeten we die gewenste
menustructuren gaan ontwerpen. Hoe moeten het hoofdmenu en
de submenus eruit zien? Technisch worden die menus in Access
Veldnaam Gegevenstype Veldlengte Notatie Vereist
AnnuleerPerc Numeriek Enkele precisie Percentage Ja
KinderKortingPerc Numeriek Enkele precisie Percentage Ja
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
276
gemaakt met schakelborden; dit wordt in paragraaf 9.5 toegelicht.
Die schakelborden (menus) maken we dus als laatste, wanneer alle
formulieren en rapporten af zijn. Verwar deze menus niet met de
menubalk van Access. Deze menus zijn aparte formulieren die we
door de toepassing navigeren. Om verwarring over de naamgeving
te voorkomen worden ze binnen Access schakelborden genoemd.
Hoofdmenu
Boekingen
Overzichten
Onderhoud
Het hoofdmenu is zeer kort: het bevat drie items. Na de keuze
Boekingen kunnen reizen worden geboekt en gemuteerd. Na de
keuze Overzichten krijgen we, via een submenu, de keuze uit ver-
schillende overzichten. En na de keuze Onderhoud komen we in
een submenu waarin de basisgegevens gemuteerd kunnen worden.
Voor twee keuzemogelijkheden, Overzichten en Onderhoud heb-
ben we submenus gemaakt.
Submenu Overzichten
Klantenlijst
Vertreklijst
Omzetlijst
Dit submenu is gemaakt met een schakelbord. De Klantenlijst
drukt een alfabetisch klantenoverzicht af op de printer.
Op de Vertreklijst komen de gegevens te staan van klanten die op
reis gaan. De gebruiker kan een datumbereik opgeven. Vervolgens
worden van alle klanten die binnen dat datumbereik op reis gaan
de relevante gegevens naar de printer gestuurd.
De Omzetlijst toont per te boeken reis de omzet, alsmede de bij-
drage, als percentage, van die reis aan de totale omzet.
Submenu Onderhoud
Klanten
Reizen
Bestemmingen
Constant
Ook dit submenu is gemaakt met een schakelbord. Na het klikken
op een van de items wordt een formulier zichtbaar waarop we
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
277
mutaties in de basisgegevens kunnen doorvoeren. Het is niet nood-
zakelijk de formulieren en rapporten in de volgorde van de menus
te maken. Ieder formulier of rapport kan onafhankelijk van de
andere gemaakt worden vooropgesteld dat als twee of meer for-
mulieren met elkaar samenwerken, deze ook gelijktijdig gemaakt
worden. Als laatste kunnen we dan de gemaakte formulieren en
rapporten aan de menus toekennen.
Alvorens verder te lezen is het aan te raden om de bijbehorende
database t Zonnetje te verkennen om een indruk van de toepassing
te krijgen. Tijdens de uitleg zal worden gevraagd om het een en
ander uit te proberen en te wijzigen.
Let op!
Als we de database t Zonnetje starten, verschijnt niet het data-
basevenster. Er wordt direct een menu getoond waaruit een keuze
gemaakt kan worden. Als we de formulieren, rapporten of macros
willen bestuderen (of kopiren), moeten we de toepassing starten
met de Shift-toets ingedrukt!
Om dit hoofdstuk te volgen moeten we de formulieren, rapporten,
enzovoort kunnen bestuderen, dus moeten we met de Shift-toets
ingedrukt starten.
9.3 De formulieren
Zorg bij het ontwerpen van de formulieren voor een toepassing
voor een consequente lay-out, zodat op ieder formulier dezelfde
knoppen voorkomen (indien nodig), in dezelfde volgorde, op
dezelfde plaats. Hierdoor kunnen de gebruikers van de toepassing
de opdrachtknoppen en overige besturingselementen in de ver-
schillende formulieren blindelings vinden.
We gaan eerst het formulier maken waarmee klantgegevens
gemuteerd kunnen worden. Dit formulier zal gekoppeld worden
aan het submenu Onderhoud bij het item Klanten. Het venster
Klant mutaties, guur 9.2, wordt na de keuze getoond. We hebben
als eerste voor dit formulier gekozen omdat het duidelijk is en veel
verwantschap vertoont met de overige formulieren uit het menu-
item Onderhoud. Immers, wat is technisch het verschil tussen een
reis muteren of een klant muteren?
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
278
Open het formulier Klant en onderzoek de functionaliteit. Hoe is
zon formulier ontworpen? Er volgt hier een beschrijving van het
ontwerp. Om een goed inzicht in het ontwerp te krijgen kunnen
we het beste gebruikmaken van de database Basis Zonnetje. Hierin
zijn alleen de tabellen van reisbureau t Zonnetje opgenomen. In
die database kunnen we tijdens het lezen de instructies uitvoeren
die tot het denitieve ontwerp hebben geleid. Probeer zelf alles uit.
9.3.1 Formulier Klant
Selecteer in het databasevenster het overzicht Formulieren en klik
op de knop Nieuw.
Kies voor AutoFormulier: in kolomvorm en plaats in de keuzelijst
de tabel Klant. Hierna wordt in formulieropmaak de eerste klant
getoond. Dit is ons uitgangspunt om het formulier handmatig aan
te passen aan onze wensen.
Sla dit formulier op onder de naam Klant.
Als eerste gaan we een aantal eigenschappen van het formulier
aanpassen.
Toon daartoe het formulier in de ontwerpweergave.
Zet vervolgens het eigenschappenvenster van het formulier op het
scherm, zie guur 9.3.
Figuur 9.2
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
279
Wijzig hierin de eigenschappen zoals in guur 9.4 wordt getoond.
Toelichting eigenschappen
Bijschrift: dit wordt weergegeven in de bovenste regel van het for-
muliervenster.
Schuifbalken: in ons formulier hebben we geen schuifbalken
nodig.
Recordkiezers: een recordkiezer is het pijltje dat aan de linkerkant
van het record getoond wordt. Handig indien rijen worden weer-
gegeven, maar bij een enkelvoudig formulier overbodig.
Navigatieknoppen: de standaard navigatieknoppen verwijderen we
uit ons formulier. We zetten zelf nieuwe grote navigatieknoppen
op ons formulier. Die zien er professioneler uit dan die kleine stan-
daardknopjes.
Figuur 9.3
Eigenschap Instelling
Bijschrift Klant mutaties
Schuifbalken Geen
Recordkiezers Nee
Navigatieknoppen Nee
Recordbegrenzingslijnen Nee
Min.- en max.-knop Geen
Figuur 9.4
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
280
Recordbegrenzingslijnen: dit zijn de lijnen die bij een doorlopend
formulier tussen de verschillende records scheidingslijnen trekken.
Er wordt in ons formulier maar n klant (record) tegelijk getoond,
dus zijn deze lijnen overbodig.
Min.- en max.-knop: hiermee geven we aan of de knoppen
Minimaliseren en Maximaliseren in de bovenste regel van het for-
mulier worden getoond. Aangezien we niet willen dat het formulier
verkleind of vergroot wordt, hebben we deze knoppen uitgescha-
keld.
Tip: klik om meer over de eigenschappen te weten te komen met
de muis in een eigenschap en druk op functietoets F1. Er verschijnt
een scherm met informatie over die eigenschap.
We gaan een vrolijk kleurtje aan ons formulier geven, in plaats van
dat saaie grijs.
Klik met de muis op de balk Detail in de ontwerpweergave. Maak
het eigenschappenvenster actief, de eigenschappen van de detail-
sectie worden getoond. Eventueel kun je de sectie Details uit de
getoonde keuzelijst in het eigenschappenvenster selecteren.
Hierin staan alle objecten uit het formulier.
Selecteer vervolgens in het tabblad Opmaak de eigenschap Achter-
grondkleur. We hoeven ons geen zorgen te maken over het num-
mer dat daar staat, het zou erg lastig zijn als we al die nummers
uit ons hoofd moeten leren om een leuk kleurtje te selecteren. Klik
op de drie puntjes achter de eigenschap Achtergrondkleur. Er ver-
schijnt een venster waaruit we een kleur kunnen kiezen, zie guur
9.5.
Kies hierin de lichtgele kleur en klik op de knop OK. Bekijk het
voorlopige resultaat in de formulierweergave.
Vervolgens gaan we enige cosmetische wijzigen aanbrengen om de
lay-out te verfraaien. Via de Werkset gaan we lijnen trekken en een
label (tekst) boven het formulier plaatsen.
Plaats het formulier weer in de ontwerpweergave.
Sleep de balk Detail ongeveer anderhalve centimeter naar beneden,
zodat er in de Formulierkoptekst ruimte onstaat.
Selecteer in de Werkset het Label, plaats deze met behulp van klik-
en-sleep in de Formulierkoptekst.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
281
Druk op de Enter-toets, zodat het label wordt geselecteerd. Plaats
het eigenschappenvenster op het scherm en verander in de tab
Opmaak de eigenschap Bijschrift in Klant gegevens.
Verander tevens in hetzelfde tabblad de eigenschap Tekengrootte
in 24. Hierdoor wordt de tekst in puntgrootte 24 (groot) weer-
gegeven, zie guur 9.6.
Trek een lijn, via de knop Lijn uit de Werkset, onder het label
Klantgegevens in de Formulierkoptekst. De dikte van de lijn kun-
nen we veranderen door de eigenschap Randbreedte, in het tabblad
Opmaak, te wijzigen in 2 pt.
Figuur 9.5
Figuur 9.6
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
282
De achtergrondkleur van de koptekst is nog grijs, deze moet
dezelfde kleur krijgen als de detailsectie. Dubbelklik daartoe op de
balk Formulierkoptekst of selecteer deze uit de keuzelijst van het
eigenschappenvenster en verander in het eigenschappenvenster de
eigenschap Achtergrondkleur in lichtgeel.
Het telefoonnummer en de postcode zijn niet bij alle klanten vol-
ledig zichtbaar, vergroot daarom die tekstvakken een paar milli-
meter. Het klantnummer wordt in een te groot tekstvak weer-
gegeven, verklein daarom dit tekstvak.
Gebruik ook de Formuliervoettekst om daarin de gewenste naviga-
tieknoppen te plaatsen en een lijn te tonen. Sleep de onderste rand
van de balk Formuliervoettekst ongeveer anderhalve centimeter
naar beneden. Hierdoor worden de grijze rasterlijnen van de voet-
tekst zichtbaar.
Trek ook in de voettekst een lijn, via de knop Lijn uit de Werkset.
Plaats deze boven in de Formuliervoettekst. Verander de kleur
van de voettekst in lichtgeel door op de balk Formuliervoettekst te
klikken en vervolgens de eigenschap Achtergrondkleur te verande-
ren.
Sleep vervolgens de rechterkant van het formulier een aantal centi-
meters naar rechts om ruimte te maken voor de opdrachtknoppen,
zie het voorlopige resultaat in guur 9.6.
We gaan het formulier compleet maken door de gewenste opdracht-
knoppen toe te voegen. Het toevoegen van opdrachtknoppen is in
paragraaf 6.6 toegelicht. In totaal zijn er acht opdrachtknoppen
nodig, zie guur 9.2. Vijf opdrachtknoppen voor de recordnaviga-
tie (eerste record, vorige record, volgende record, laatste record en
het zoeken naar een
record) en drie opdrachtknoppen voor de recordbewerkingen
(nieuw record creren, record verwijderen en het herstellen van
een bewerking). We gaan de eerste opdrachtknop, eerste record
selecteren, op het formulier plaatsen.
Selecteer in de Werkset de Opdrachtknop en plaats deze links
onder de lijn in de Formuliervoettekst van het formulier.
We hoeven nog geen rekening te houden met de afmetingen en de
exacte plaats op het formulier, dat corrigeren we later. Er wordt
vervolgens een wizard gestart die ons vraagt wat er moet gebeu-
ren als op die knop wordt geklikt, zie guur 9.7. Als de Wizard
niet wordt gestart, klik dan op de knop Wizards voor besturings-
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
283
elementen in de Werkset en plaats opnieuw een opdrachtknop in
het formulier.
Kies uit de Categorien voor Recordnavigatie en hierin de actie
Naar eerste record gaan.
Selecteer in het volgende venster Afbeelding en Naar eerste 2.
Geef in het volgende scherm de opdrachtknop de naam Eerste en
voltooi de wizard.
Zet op dezelfde manier de overige zeven opdrachtknoppen, nog
drie in de Formuliervoettekst en vier in de sectie Detail, op het
scherm, zie guur 9.8. Zet ze ongeveer op de gewenste plaats, zie
guur 9.2.
Geef als laatste de opdrachtenknoppen de juiste afmetingen en
sleep ze naar de gewenste plaatsen.
Selecteer om alle opdrachtknoppen dezelfde afmetingen te geven
de opdrachtknoppen met behulp van Shift+muisklik; hierdoor
kunnen we meerdere elementen tegelijkertijd selecteren.
Figuur 9.7
Categorie Actie Type (Figuur/Picture) Naam
Recordnavigatie Naar vorige record gaan Naar vorige 2 Vorige
Recordnavigatie Naar volgende record gaan Naar volgende 2 Volgende
Recordnavigatie Naar laatste record gaan Naar laatste 2 Laatste
Recordbewerkingen Nieuw record toevoegen Ga naar nieuwe 2 Nieuw
Recordnavigatie Record zoeken Verrekijker 2 Zoek
Recordbewerkingen Record ongedaan maken Ongedaan maken Herstel
Recordbewerkingen Record verwijderen Prullenbak 2 Verwijder
Figuur 9.8
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
284
Activeer het eigenschappenvenster en wijzig de eigenschappen
Breedte en Hoogte in respectievelijk 1,5 cm en 0,6 cm, zie guur
9.9. Access kan de afmetingen automatisch wijzigen in een iets
afwijkend formaat, zie de waarde 1,501 in guur 9.9.
De opdrachtknoppen hebben standaard een Tabstop. Dat wil zeg-
gen: als we met de Tab-toets door de velden van het formulier
stappen, wordt ook gestopt op de opdrachtknoppen. Dat kunnen
we voorkomen door aan te geven dat de opdrachtknoppen geen
Tabstop moeten bezitten.
Selecteer alle opdrachtknoppen met behulp van Shift+muisklik.
Maak vervolgens het eigenschappenvenster actief en zet de eigen-
schap Tabstop, in het tabblad Overige, op Nee.
Sleep de opdrachtknoppen naar hun gewenste plek en onderzoek
het eindresultaat in de formulierweergave. Controleer de werking
van de opdrachtknoppen.
De Zoekknop toont een venster waarin we kunnen opgeven wat
we willen zoeken. Er wordt gezocht in het tekstvak dat actief is,
voordat geklikt wordt op de Zoekknop. Een volledige beschrijving
van dit venster is in paragraaf 5.5.6 toegelicht. Met de herstelknop
kunnen we typefouten herstellen. Stel we wissen per ongeluk de
Figuur 9.9
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
285
postcode van een klant. Door op de herstelknop te klikken komt de
oorspronkelijke postcode weer tevoorschijn.
9.3.2 Formulier Bestemming
Het formulier Bestemming is op precies dezelfde manier gemaakt
als het formulier Klant, zie guur 9.10.
Het enige verschil is dat het Bijschrift Bestemming mutaties
is geworden en dat het formulier is opgeslagen onder de naam
Bestemming.
9.3.3 Formulier Reis
Het formulier Reis is op precies dezelfde manier gemaakt als het
formulier Klant, zie guur 9.11.
Het enige verschil is dat het Bijschrift Reis mutaties is geworden
en dat het formulier is opgeslagen onder de naam Reis.
Figuur 9.10
Figuur 9.11
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
286
9.3.4 Formulier Constant
Het formulier Constant is het eenvoudigste formulier, zie guur
9.12.
In dit formulier kunnen we onze constante gegevens muteren. Aan-
gezien er maar n record in dit formulier zit met de waarden van
onze constanten, zijn alle opdrachtknoppen niet nodig. Navigeren
door de records is niet nodig. Nieuwe records toevoegen of verwij-
deren is niet toegestaan. Het formulier is op dezelfde wijze
gemaakt als het formulier Klant, maar dan zonder de opdracht-
knoppen. Hierbij zijn de labels langer gemaakt en is de naam voluit
geschreven. De tekstvakken moeten hierdoor ook verplaatst wor-
den.
Het Bijschrift is Constant mutaties geworden en is opgeslagen
onder de naam Constant. Als we met de Tab-toets door de velden
van een formulier stappen, wordt automatisch na het laatste veld
het volgende record voorgezet. Dat mag in dit formulier niet ge-
beuren, aangezien er maar n record is. Een nieuw record zou dan
getoond worden. We kunnen voorkomen dat na het laatste veld, via
de Tab-toets, een nieuw record wordt geselecteerd.
Plaats het eigenschappenvenster van het formulier op het scherm.
Selecteer hierin het tabblad Overige en verander de eigenschap
Werking tabtoets in Huidige record.
Tip: Tijdens het werken met een database zul je merken dat de data-
base erg groot kan worden. Access slaat namelijk achter de scher-
men alles op. Ook als je bijvoorbeeld een record, formulier of rap-
port verwijdert, blijft dit in de database onzichtbaar aanwezig.
Om dit fysiek te verwijderen moet je de database comprimeren:
Extra, Database hulpprogrammas, Database comprimeren en her-
Figuur 9.12
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
287
stellen. Soms heeft dit een verbazingwekkende vermindering van
wel 90% tot gevolg. Daarnaast kun je deze optie toepassen als er
een beschadiging aan de gegevens in de database is opgetreden.
9.3.5 Formulier Boeking
De belangrijkste activiteit van het reisbureau, het boeken van rei-
zen, vindt plaats in het formulier Boeking (zie guur 9.13).
Dit formulier wijkt iets af van de vier voorgaande formulieren. Er
is onder andere een extra opdrachtknop in het formulier geplaatst,
waarmee een rapport kan worden afgedrukt. Het rapport is de
getoonde boeking in factuurvorm. Verder zijn er drie rekenvelden
gemaakt. Die rekenvelden maken gebruik van constanten, name-
lijk het percentage korting dat aan kinderen wordt gegeven en het
percentage van de annuleringsverzekering. Hierdoor dienen ook
de gegevens uit de tabel Constant gebruikt te worden. Tevens zijn
er enige macros gemaakt om de juiste werking van dit formulier
mogelijk te maken.
Het ontwerp van het boekingformulier is in overleg met reisbureau
t Zonnetje totstandgekomen. We moeten dus eerst bepalen wat
Figuur 9.13
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
288
op het scherm getoond moet worden. Nadat is vastgelegd wat de
gewenste gegevens zijn, kan het formulier ontworpen worden. We
kunnen de Wizard Formulier gebruiken om alle gegevens op het
scherm te krijgen, door de afzonderlijke tabellen te selecteren en
hieruit de gewenste velden. Bij formulieren waarin n tabel
gebruikt wordt, is dat een handige methode. Gebruiken we meer
tabellen op n formulier, dan is het verstandiger om eerst een
query te maken die alle velden bevat die op het formulier moeten
komen. We kunnen dan tevens een sorteervolgorde aangeven of
gegevens groeperen. In dit voorbeeld hebben we voorafgaand aan
het formulierontwerp een query gemaakt. Die is opgeslagen onder
de naam frmBoeking in het overzicht Querys van het databaseven-
ster. Aan de naam van de query kunnen we zien bij welk formulier
deze gebruikt wordt. De stappen om het formulier te maken wor-
den nu toegelicht. Gebruik de database Basis Zonnetje om de han-
delingen na te spelen.
Selecteer in het overzicht Querys in het databasevenster de optie
Query maken in ontwerpweergave.
Voor de query hebben we vier databasetabellen nodig, namelijk
Boeking, Klant, Reis en Bestemming.
Klik op alle velden die we nodig hebben. Van de tabel Boeking
hebben we alle velden nodig, selecteer daartoe eenvoudig de * in
de tabel Boeking. Er wordt getoond Boeking.*. Selecteer uit de
tabel Klant de velden Naam, Adres, Woonplaats en
Telefoonnummer; uit de tabel Reis de velden Vertrekdatum, Aantal
dagen en Prijs per persoon, en ten slotte uit de tabel Bestemming
de velden Plaats en Land.
Sla vervolgens de query op onder de naam frmBoeking. Hierdoor
kunnen we later in dit overzicht eenvoudig terugzoeken bij welk
formulier ( frm) deze query hoort. Het is verstandig om de query te
controleren in de gegevensbladweergave.
De query is gemaakt, nu gaan we het formulier ontwikkelen.
Selecteer in het databasevenster het overzicht Formulieren en klik
op de knop Nieuw.
Kies Autoformulier: in kolomvorm, selecteer in de keuzelijst de
zojuist gemaakte query frmBoeking en klik op de knop OK.
Sla dit basisontwerp op onder de naam Boeking.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
289
De lay-out moet aangepast worden aan de wensen van het reis-
bureau. Op dezelfde manier als in het formulier Klant zijn een
aantal wijzigingen aangebracht. Als eerste zijn de eigenschappen
van het formulier gewijzigd, zie guur 9.4. Alleen de eigenschap
Bijschrift is veranderd in Boeking mutaties.
In de Formulierkoptekst is een label en een lijn getrokken. Tevens
is de achtergrondkleur van die sectie veranderd in lichtgeel.
Sleep de onderste rand van de balk Formuliervoettekst anderhalve
centimeter naar beneden en plaats in die sectie bovenin een lijn.
Verander ook in de sectie Formuliervoettekst de achtergrondkleur
in lichtgeel.
Klik hierna op de balk Detail en verander de achtergrondkleur in
lichtgeel.
Verplaats vervolgens alle velden zodanig dat dezelfde lay-out ont-
staat als in guur 9.13.
Vervolgens zijn de tekstvakken waarin geldbedragen worden
getoond verkleind. Enkele andere tekstvakken zijn juist vergroot
aangezien niet alle gegevens volledig werden weergegeven.
De volgende stap is het plaatsen van de opdrachtknoppen. Op
dezelfde wijze als in het formulier Klant kunnen de opdrachtknop-
pen op het formulier worden geplaatst. De vier opdrachtknoppen
voor de navigatie worden onder de lijn in de Formuliervoettekst
geplaatst. De vier opdrachtknoppen die gelijk zijn aan de knoppen
in het formulier Klant kunnen aan de rechterkant van het formu-
lier, in de sectie Detail, worden geplaatst. Hiervoor moet het for-
mulier aan de rechterkant vergroot worden.
De opdrachtknop die een factuur (rapport) van de boeking afdrukt
op de printer is een bijzondere opdrachtknop. Die is pas op het for-
mulier geplaatst nadat het rapport van de factuur is gemaakt. Het
maken van dit rapport wordt in de volgende paragraaf toegelicht.
Deze opdrachtknop is niet met de Wizard gemaakt. De beschik-
bare opdrachtknoppen van de Wizard voldoen niet. We hebben
hiervoor een macro gemaakt. Na het klikken op de knop wordt die
macro gestart, deze drukt het rapport af.
Om die opdrachtknop op het formulier te plaatsen voeren we de
volgende acties uit.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
290
Plaats het formulier in de ontwerpweergave.
Klik in de Werkset op de knop Wizards voor besturingselementen.
Let op, de Wizard wordt nu uitgeschakeld!
Plaats een opdrachtknop op het formulier, ongeveer op de gewens-
te plaats. Er wordt nu geen Wizard gestart. Als toch de Wizard
wordt gestart, annuleer deze dan. Herstel de oorspronkelijke
instelling van de Wizards voor besturingselementen, zodat in de
Werkset de Wizard weer actief is voor de besturingselementen.
Plaats het eigenschappenvenster van de zojuist gemaakte opdracht-
knop op het scherm. Verander in het tabblad Overige, de eigen-
schappen Naam in Drukaf en Knopinfo in Factuur afdrukken. De
tekst van de eigenschap Knopinfo wordt getoond zodra we met de
muiswijzer boven de opdrachtknop komen.
Selecteer het tabblad Opmaak en klik in de eigenschap Afbeelding
op de drie puntjes. Hierdoor wordt een venster getoond met
alle mogelijke guren voor op de opdrachtknop, zie guur 9.14.
Selecteer hieruit de Printer en klik op de knop OK.
Wijzig in ditzelfde tabblad de afmetingen van de opdrachtknop
(1,5 cm 0,6 cm) en sleep de opdrachtknop naar zijn gewenste
plaats.
Als we nu op de opdrachtknop klikken, gebeurt er helemaal niets.
Er wordt geen actie uitgevoerd. Die actie gaan we middels een
macro maken. Die macro zullen we later in deze paragraaf toelich-
ten.
Eerst maken we de sectie Detail af. Er zijn drie rekenvelden op
het formulier, te weten Subtotaal, Annuleringskosten en Totaal
bedrag. Voor Subtotaal en Annuleringskosten zijn onze constanten
nodig. Het Subtotaal is het bedrag van de volwassenen tezamen
met het bedrag dat voor de kinderen betaald moet worden. Voor
kinderen wordt een kortingspercentage gehanteerd, dat in de tabel
Constant is opgeslagen. De Annuleringskosten worden bepaald
Figuur 9.14
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
291
door een percentage van het subtotaal. Het percentage van de annu-
leringsverzekering ligt ook opgeslagen in de tabel Constant. Zoals
eerder opgemerkt heeft de tabel Constant geen enkele relatie met
de overige tabellen uit de database. Deze wordt alleen gebruikt
als de constante gegevens nodig zijn. De constante gegevens staan
ook in het formulier Constant. We kunnen dus gebruikmaken van
de tabel Constant of van het formulier Constant. Wij maken in al
onze voorbeelden gebruik van het formulier Constant. De tabel
Constant werkt niet in alle gevallen correct, vandaar onze keuze.
Om de gegevens uit het formulier Constant te kunnen benaderen
moet het formulier geopend zijn. Dat betekent: als we het formu-
lier Boeking openen, moet ook het formulier Constant geopend
worden. We kunnen dat met behulp van een macro automatisch
laten uitvoeren. Bij het sluiten van het formulier Boeking moet dan
uiteraard het formulier Constant ook gesloten worden. Ook hier-
voor gaan we een macro maken. Het maken van de macros wordt
later in deze paragraaf toegelicht. In de ontwerpfase hebben we die
macros nog niet gemaakt en openen we zelf (handmatig) het for-
mulier Constant.
Activeer het databasevenster, terwijl het formulier Boeking in de
ontwerpfase actief blijft.
Klik op het overzicht Formulieren en open het formulier Constant.
Selecteer weer het venster van het formulier Boeking, in de ont-
werpfase. Beide formulieren zijn nu geopend! Nu kunnen we de
tekstvakken maken en controleren of de berekeningen goed zijn
ingevoerd.
We plaatsen eerst het tekstvak Subtotaal op het scherm. Klik met
de muis op de knop Tekstvak in de Werkset en plaats het tekstvak
in de Detailsectie.
Plaats het eigenschappenvenster van het bijbehorende label op het
scherm en wijzig de eigenschap Bijschrift, in het tabblad Opmaak,
in Subtotaal.
Klik op het zojuist gemaakte tekstvak en verander de eigenschap
Naam, in het tabblad Overige, in Subtotaal.
Klik op de tab Gegevens en verander de eigenschap
Besturingselementbron in: =[Aantal volwassenen]*[Prijs per
persoon]+[Aantal kinderen] *[Prijs per persoon]*
(1-[Formulieren]![Constant]![KinderKortingPerc]).
Gebruik eventueel de drie puntjes in de eigenschap
Besturingselementbron om de Opbouwfunctie voor expressies te
starten, zodat deze lange formule wat eenvoudiger is in te voeren.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
292
In deze formule wordt het subtotaal uitgerekend. Het bedrag dat
voor de kinderen betaald moet worden, is gelijk aan het aantal
kinderen de prijs per persoon (1 minus het kortingspercentage
voor de kinderen). Het kortingspercentage voor de kinderen wordt
uit het formulier Constant gehaald. Hierdoor wordt er exibel ge-
werkt, we kunnen immers middels het formulier Constant eenvou-
dig een wijziging in het kortingspercentage aanbrengen.
Wijzig de laatste eigenschap Notatie van het tekstvak, in het tab-
blad Opmaak, in Valuta. We kunnen ook als notatie Euro kiezen.
Onafhankelijk van de valuta-instelling in Windows wordt dan al-
tijd het euro-symbool getoond.
Controleer de formule in de formulierweergave.
Let op: als het formulier Constant niet geopend is, kan deze bere-
kening niet uitgevoerd worden en wordt in het tekstvak, in de for-
mulierweergave, de volgende foutmelding afgedrukt: #Naam?.
Plaats vervolgens het tweede rekenveld op het formulier met de
volgende eigenschappen:
Bijschrift: Annuleringskosten
Naam: Annuleringskosten
Besturingselementbron: =IIf([Annuleringsverzekering];
[Formulieren]![Constant]![AnnuleerPerc] *[Subtotaal];0)
Notatie: Valuta (of Euro).
In de berekening wordt het subtotaal vermenigvuldigd met het per-
centage dat betaald moet worden voor de annuleringsverzekering.
Dat percentage ligt ook opgeslagen als een constante. Echter, als
geen annuleringsverzekering is afgesloten, hoeft er ook niet voor
betaald te worden. Dat wordt gerealiseerd met de IIf()-functie.
Deze is in paragraaf 5.9.3 toegelicht.
Het laatste rekenveld dat toegevoegd moet worden, heeft de vol-
gende eigenschappen:
Bijschrift: Totaal bedrag
Naam: Totaal bedrag
Besturingselementbron: =[Subtotaal]+[Annuleringskosten]
Notatie: Valuta (of Euro).
Sleep vervolgens de drie rekenvelden naar de gewenste plaats op
het formulier en pas hun afmetingen aan.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
293
In het formulier zien we bij het veld Betaalwijze, in formulierweer-
gave, de getallen 1, 2 of 3 staan. In paragraaf 6.1 hebben we voor
de betaalwijze een groepsvak gemaakt, waarbij er drie mogelijk-
heden waren: Contant, Pinnen of Acceptgiro. We gaan hier
opnieuw een groepsvak van maken.
Verwijder als eerste het besturingselement Betaalwijze, hiervoor in
de plaats komt een groepsvak.
Klik met de muis op de knop Groepsvak van de Werkset. De
Wizard moet in de werkset actief zijn.
Verplaats hierna de muis naar het formulier en plaats het groeps-
vak op ongeveer de gewenste plaats. De Wizard wordt actief.
Typ de labelnamen Contant, Pinnen en Acceptgiro.
Kies in het volgende venster voor Ja, de standaardoptie is:
Acceptgiro.
Accepteer in het scherm dat hierna verschijnt de standaardwaarden
1, 2 en 3 die met de labelnamen overeenkomen. Achter de scher-
men worden niet de labelnamen opgeslagen, maar de bijbehorende
getallen.
Geef in het volgende venster aan dat de geselecteerde optie opge-
slagen moet worden in het veld Betaalwijze. Kies de tweede optie,
Opslaan in dit veld, en selecteer het veld Betaalwijze.
Selecteer in het voorlaatste venster Selectievakjes en Normaal.
Kies als laatste de naam Betaalwijze voor het groepsvak.
Het groepsvak staat in het formulier, de keuzemogelijkheden wor-
den onder elkaar afgebeeld, maar we zien ze liever naast elkaar.
Ook wordt het kader in het uiteindelijke formulier niet getoond, zie
guur 9.13. De verschillende elementen van het groepsvak moeten
verplaatst worden.
Selecteer in de ontwerpweergave het groepsvak.
Verplaats alleen het label Betaalwijze naar de gewenste plaats,
onder het label Annuleringsverzekering. Let op: als we met de
muiswijzer boven het groepsvak komen, verschijnt een handje met
vijf vingers of met de wijsvinger. Het handje met de vijf vingers
verplaatst alle elementen die geselecteerd zijn en het handje met
de wijsvinger alleen het aangewezen element. Om alleen het label
Betaalwijze te selecteren moet dus de wijsvinger zichtbaar zijn,
anders verplaatsen alle elementen zich.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
294
Selecteer het label Contant en sleep het naar de gewenste plaats
(nu wel het handje van de muiswijzer gebruiken, zodat het keuze-
vakje n het label tegelijkertijd verplaatst worden). Verplaats ook
de overige twee labels.
Maak het kader van het groepsvak zo klein mogelijk, zodat de
Formuliervoettekst tegen het groepsvak geplaatst kan worden.
De laatste verandering die met het groepsvak uitgevoerd moet wor-
den, is het onzichtbaar maken van het kader. Denk erom dat het
kader niet verwijderd kan worden, anders wordt het gehele groeps-
vak verwijderd. Selecteer het kader en activeer het eigenschappen-
venster. Klik op de tab Opmaak en wijzig de eigenschap Randstijl
in Transparant.
Het formulier nadert zijn eindstadium. Er zijn nog enige wijzigin-
gen die aangebracht moeten worden. Met de Tab-toets kunnen
alle elementen van het formulier benaderd worden, dat is niet
wenselijk. Alleen de velden die ingevoerd moeten worden bij het
boeken van een reis moeten een tabstop hebben, dus klantnummer,
reisnummer en de boekinggegevens. De andere elementen op het
formulier mogen geen tabstop hebben.
Selecteer in de ontwerpweergave van het formulier met behulp
van Shift+muisklik de volgende elementen: alle opdrachtknop-
pen, de drie rekenvelden, de velden Naam, Adres, Woonplaats,
Telefoonnummer, Vertrekdatum, Aantal dagen, Prijs per persoon,
Plaats en Land.
Activeer het eigenschappenvenster, klik op de tab Overige en ver-
ander de eigenschap Tabstop in Nee.
De velden die geen tabstop hebben, kunnen wel benaderd worden
met de muis, we kunnen gewoon in het veld klikken. Voor de drie
rekenvelden willen we dat voorkomen, er valt immers niets in die
velden te veranderen of te zoeken.
Selecteer de drie rekenvelden in de ontwerpweergave (Shift+
muisklik) en activeer het eigenschappenvenster.
Klik op de tab Gegevens en wijzig de eigenschap Ingeschakeld in
Nee. De drie rekenvelden krijgen automatisch een andere achter-
grondkleur en zijn niet meer met de muis te benaderen.
De adresgegevens en de reisgegevens zijn ook met de muis te bena-
deren. Hierdoor kunnen we per ongeluk gegevens wijzigen. Stel
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
295
dat we per ongeluk het veld Prijs per persoon wijzigen, dan geldt
dat direct ook voor alle andere boekingen die naar die reis zijn
geboekt. Of we wijzigen per ongeluk de vertrekdatum. Alle reizen
naar die bestemming hebben dan direct die nieuwe vertrekdatum,
met alle gevolgen van dien. Als de vertrekdatum van een reis wel
moet worden gewijzigd, moet dat in het formulier Reis veranderd
worden. We kunnen die velden niet uitschakelen zoals met de
rekenvelden is gebeurd. We zouden dan niet meer kunnen zoeken
op onze gegevens. Om te kunnen zoeken op een bepaald waarde,
moeten we met de muis in het veld klikken, waarin gezocht moet
worden. Vervolgens klikken we op de knop Zoek. Uitschakelen
kan om die reden dus niet. Maar Access biedt uitkomst, we kunnen
een eigenschap veranderen, waardoor we met de muis wel het veld
kunnen selecteren, maar niet kunnen wijzigen.
Selecteer tegelijkertijd, met Shift+muisklik, de velden: Naam,
Adres, Woonplaats, Telefoonnummer, Aantal dagen, Prijs per per-
soon, Bestemming.Plaats, Land en Vertrekdatum.
Activeer het eigenschappenvenster en klik op de tab Gegevens.
Wijzig de eigenschap Vergrendeld in Ja.
Er is nog n wijziging nodig in het formulierontwerp. Als we
in de formulierweergave met de Tab-toets door de velden lopen,
wordt er geen logische volgorde aangehouden. Door het ver-
plaatsen van onze velden hebben we geen logische tabvolgorde
meer. De tabvolgorde kunnen we veranderen door, in de ontwerp-
weergave van het formulier, in het menu te kiezen voor Beeld,
Tabvolgorde: dit kan ook met een rechtermuisklik (snelmenu). Er
wordt een venster getoond met de tabvolgorde, zie guur 9.15
Figuur 9.15
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
296
Hierin kunnen we door te selecteren en te slepen de tabvolgorde
wijzigen. Het klantnummer moet bovenaan komen te staan, dan
het reisnummer en vervolgens de boekinggegevens, zie guur 9.15.
De tabvolgorde n het veld betaalwijze doet niet ter zake. Van die
elementen hebben we de tabstop immers uitgeschakeld.
Het ontwerp van het formulier is klaar. Ten slotte gaan we de
macros die nodig zijn voor de juiste werking van dit formulier
maken.
Macros van het formulier Boeking
Het werken met macros is in hoofdstuk 8 toegelicht. De macros
van onze toepassing zijn ondergebracht in macrogroepen, zie even-
tueel hoofdstuk 8. De groepen zijn zo verdeeld dat alle macros van
n formulier of rapport onder n macrogroep vallen. Willen we
een macro van een bepaald formulier of rapport bestuderen, open
dan in het databasevenster het overzicht Macros. De groepsnaam
van de macro heeft dezelfde naam als het formulier of rapport,
voorafgegaan door respectievelijk de letters frm of rpt. In ons voor-
beeld zijn de macros van het formulier Boeking te vinden onder de
naam frmBoeking in het overzicht Macros van het databaseven-
ster.
We gaan de macros maken die nodig zijn voor het formulier
Boeking.
Klik op het overzicht Macros van het databasevenster. Klik op de
knop Nieuw. Het macrovenster wordt getoond, zie guur 9.16.
Mocht er in het macrovenster de kolommen Macronaam en
Voorwaarde niet voorkomen, klik dan in de werkbalk op de knop-
pen Macronamen en Voorwaarden. De kolom Voorwaarde is voor
de macros van het formulier Boeking niet noodzakelijk.
Er zijn voor het formulier Boeking drie macros nodig. Een macro
die automatisch het formulier Constant opent als het formulier
Boeking wordt geopend. Een macro die uitgevoerd wordt als op de
opdrachtknop Printer wordt geklikt. Deze macro moet een rap-
port op de printer afdrukken. De laatste macro sluit het formulier
Constant als het formulier Boeking wordt gesloten.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
297
Voer de eerste macro in zoals weergegeven in guur 9.17, en sla de
macrogroep op onder de naam frmBoeking.
De macro frmBoeking.Open opent met de actie FormulierOpenen
het formulier Constant. Met het argument Venstermodus kunnen
we de weergave van het formulier opgeven. Wij hebben geselec-
teerd Verborgen, waardoor het formulier wel geopend wordt, maar
niet getoond. We zijn immers alleen genteresseerd in het formulier
Boeking en niet in het formulier Constant.
De tweede macro moet een rapport afdrukken. Er wordt een fac-
tuur in rapportvorm naar de printer gestuurd, zie guur 9.18.
Figuur 9.16
Figuur 9.17
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
298
De macro frmBoeking.Afdrukken opent met de actie Rapport-
Openen het rapport Boeking. Dit rapport moet al gemaakt zijn.
In de volgende paragraaf, De rapporten, wordt het maken van
dit rapport toegelicht. Wanneer we echter een rapport van de
boeking afdrukken, worden alle boekingen afgedrukt, in dit
voorbeeld dus alle facturen. Wij willen alleen de factuur van de
actieve boeking, die op het scherm staat, afdrukken. We moeten
dus een voorwaarde kunnen invoeren. Met de opdrachtknop-
wizard kunnen we dit niet realiseren. We kunnen met de Wizard
wel een opdrachtknop maken die een rapport afdrukt, maar dan
zonder voorwaarde, dus alle facturen zouden dan afgedrukt wor-
den. Bij de actie RapportOpenen kunnen we in het argument
WHERE-voorwaarde een criteria opgeven. De voorwaarde luidt:
[Boekingnummer]=[Formulieren]![Boeking]![Boekingnummer].
Het boekingnummer uit het rapport moet gelijk zijn aan het (zicht-
bare) boekingnummer van het formulier Boeking. Hierdoor wordt
alleen het rapport van de boeking die op het scherm staat geselec-
teerd en afgedrukt.
Zoals te zien is in guur 9.18, zijn er twee extra macro-acties
toegevoegd. Indien een nieuw gemaakte boeking direct wordt af-
gedrukt, treedt zonder deze extra macro-acties een foutmelding
op. Een nieuwe boeking wordt pas opgeslagen in de database
nadat de recordwijzer verplaatst is. Drukt men direct op de knop
Afdrukken, dan kan het record nog niet gevonden worden in de
database en volgt een foutmelding. We hebben dit via een trucje
Figuur 9.18
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
299
voorkomen. We verplaatsen tijdelijk de recordwijzer naar het
volgende record. De zojuist toegevoegde gegevens worden nu
opgeslagen in de database. Vervolgens herstellen we de oorspron-
kelijke recordwijzer door naar het vorige record te gaan. Hiervoor
dienen twee extra macro- acties toegevoegd te worden voordat
de actie RapportOpenen wordt uitgevoerd. De eerste actie is
NaarRecordGaan met het argument Volgende en de tweede actie is
NaarRecordGaan met het argument Vorige.
De derde macro moet het formulier Constant sluiten, zie guur
9.19.
De macro frmBoeking.Sluit sluit met de actie Sluiten het formu-
lier Constant. Bij het argument Opslaan kunnen we aangeven of
tijdens het opslaan de gegevens bewaard moeten worden of niet,
eventueel na het vragen van een bevestiging. Aangezien het formu-
lier Constant alleen maar gebruikt is om gegevens te lezen, maakt
het niet uit wat we hier kiezen, alle drie opties zijn goed.
De macros zijn gemaakt, maar nu moeten ze nog gestart worden
bij een bepaalde gebeurtenis. Zo moet de macro frmBoeking.Open
gestart worden als het formulier Boeking wordt geopend. De macro
frmBoeking.Afdrukken moet gestart worden na het klikken op de
opdrachtknop met printerpictogram. De laatste macro frmBoeking.
Sluit moet geactiveerd worden als het formulier Boeking wordt
gesloten.
Figuur 9.19
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
300
Selecteer het overzicht Formulieren in het databasevenster en open
het formulier Boeking in de ontwerpweergave.
Plaats het eigenschappenvenster van het formulier op het scherm.
Klik hierin op de tab Gebeurtenis. Selecteer hierin de eigenschap
Bij openen. Kies uit de keuzelijst de macro frmBoeking.Open, zie
guur 9.20.
Hierdoor wordt bij het openen van het formulier Boeking de
macrogroep frmBoeking geopend en de macro frmBoeking.Open
gestart. Die opent vervolgens automatisch het formulier Constant,
die noodzakelijk is voor het formulier Boeking.
Op identieke wijze hebben we in hetzelfde venster in de eigenschap
Bij sluiten de macro frmBoeking.Sluit geselecteerd, zie guur 9.20.
Klik op de opdrachtknop met het printerpictogram en kies in het
tabblad Gebeurtenis de eigenschap Bij klikken. Selecteer uit de
keuzelijst de macro frmBoeking.Afdrukken. Na het klikken op die
knop zal de gewenste macro gestart worden.
Het formulier is klaar. Test de macros, pas eventueel de afmeting
van het formulier aan en sla het formulier op.
9.3.6 Formulier Datumbereik vertreklijst
Dit formulier wordt voor de volledigheid hier toegelicht, zie guur
9.21.
Figuur 9.20
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
301
Het formulier wordt alleen gebruikt voor het afdrukken van de
vertreklijst. We kunnen een datumbereik opgeven, waarna het
rapport van de Vertreklijst van alle reizen die voldoen aan het inge-
voerde bereik wordt afgedrukt. Zon voorwaarde hebben we eerder
gemaakt met een exibele query, maar de voorwaarde opvragen in
een formulier toont veel professioneler.
Selecteer in het overzicht Formulieren de optie Formulier maken in
ontwerpweergave.
We moeten een aantal eigenschappen van het formulier wijzigen.
Plaats het eigenschappenvenster van het formulier op het scherm
en verander de instellingen zoals toegepast in al onze voorgaan-
de formulieren, zie eventueel guur 9.4. Alleen de eigenschap
Bijschrift is Datumbereik voor vertreklijst geworden.
Plaats vervolgens twee tekstvakken in het venster. De labels krij-
gen de teksten Begindatum: en Einddatum:. Selecteer het eerste
tekstvak en activeer het eigenschappenvenster. Verander de eigen-
schap Naam, tabblad Overige, in Begindatum. Voer dezelfde op-
drachten uit voor het tweede tekstvak en kies als naam Einddatum.
Om ervoor te zorgen dat datums ingevoerd kunnen worden, veran-
deren we de eigenschap Notatie, in het tabblad Opmaak, in Korte
datumnotatie voor beide tekstvakken. Er mogen geen ongeldige
datums voor het bereik ingevoerd worden. Plaats de volgende
eigenschappen in de tab Gegevens van de tekstvakken.
Figuur 9.21
Tekstvak Eigenschap Instelling
Begindatum Standaardwaarde Date()+1
Validatieregel <=[Einddatum]
Validatietekst Datumbereik is niet correct.
Einddatum Standaardwaarde Date()+8
Validatieregel >=[Begindatum]
Validatietekst Datumbereik is niet correct.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
302
Versleep de tekstvakken vervolgens naar een geschikte plaats in
het venster.
Zet twee opdrachtknoppen, zonder de Wizard, in het venster.
Klik daartoe op de knop Wizards voor besturingselementen in de
Werkset. De Wizard wordt dan (tijdelijk) niet meer automatisch
gestart.
Activeer na het plaatsen van de twee opdrachtknopen de Wizards
voor besturingselementen weer, zodat standaard in de Werkset de
Wizard weer wel actief is voor de besturingselementen.
Selecteer de eerste opdrachtknop en activeer het eigenschappen-
venster. Verander de eigenschap Bijschrift in &OK en verander de
eigenschap Naam in OK. Het &-teken (ampersand) dient in
de formulierweergave om een streepje onder de O te plaatsen.
Hierdoor kan die opdrachtknop ook geselecteerd worden door mid-
del van de toetsencombinatie Alt+O, zoals gebruikelijk binnen
Windows-toepassingen.
Voer dezelfde opdrachten uit voor de tweede opdrachtknop en
verander het bijschrift in &Annuleer en de naam in Annuleer. De
beide opdrachtknoppen mogen geen tabstop hebben (eigenschap
Tabstop). Sleep de opdrachtknoppen vervolgens naar een geschikte
plaats.
Ten slotte moet de detailsectie van het formulier dezelfde achter-
grondkleur krijgen als de overige formulieren. Kies de lichtgele
kleur voor de eigenschap Achtergrondkleur, tabblad Opmaak. Pas
de afmetingen van het formulier aan in de formulierweergave en
sla het formulier op
onder de naam Datumbereik vertreklijst.
Macros van het formulier Datumbereik vertreklijst
Onder de opdrachtknoppen OK en Annuleer worden macros
gestart. De macros van het formulier Datumbereik vertreklijst
krijgen als naam voor de macrogroep frmDatumbereik vertreklijst,
zie guur 9.22.
Klik op de knop Nieuw, in het overzicht Macros van het database-
venster. Voer de macros vervolgens in.
De volledige macro is zichtbaar in guur 9.22.
De macro laat het rapport Vertreklijst afdrukken. Alleen gegevens
die aan de voorwaarden voldoen, worden afgedrukt. Om de
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
303
records in dit rapport te beperken tot die welke voldoen aan de
waarden van de datums op het formulier Datumbereik vertrek-
lijst, moet een voorwaarde ingevoerd worden bij het argument
WHERE-voorwaarde. Het besturingselement Vertrekdatum komt
uit het rapport Vertreklijst. Vervolgens wordt aangegeven dat de
vertrekdatum tussen de twee datums uit de tekstvakken van het
formulier Datumbereik vertreklijst moet liggen. We moeten de
volledige beschrijving gebruiken voor de verwijzing naar de beide
tekstvakken. Deze kunnen eventueel met de opbouwfunctie voor
expressies ingevoerd worden.
Terzijde
Merk op dat Between en And ook in de Nederlandse versie van
Access in het Engels ingevoerd moeten worden.
Figuur 9.22
Macro frmDatumbereik vertreklijst.OK
Actie Argument Instelling
RapportOpenen Rapportnaam Vertreklijst
Beeld Afdrukken
WHERE-voorwaarde [Vertrekdatum] Between
[Formulieren]![Datumbereik
vertreklijst]![BeginDatum] And
[Formulieren]![Datumbereik
vertreklijst]![Einddatum]
Sluiten Opslaan Nee
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
304
De tweede actie sluit direct na het printen automatisch het formu-
lier Datumbereik vertreklijst.
De macro is klaar. Hierna moet hij gestart kunnen worden na de
gebeurtenis klikken op de opdrachtknop OK van het formulier
Datumbereik vertreklijst.
Selecteer de opdrachtknop OK in de ontwerpweergave en activeer
vervolgens het eigenschappenvenster.
Kies tab Gebeurtenisen en selecteer in de eigenschap Bij klikkende
macro frmDatumbereik vertreklijst.OK.
Nu gaan we de opdrachtknop Annuleer instellen. Hiervoor is n
macroactie gemaakt.
De volledige macro is zichtbaar in guur 9.22. De enige actie van
deze macro is het sluiten van het actieve formulier. Deze opdracht-
knop had eventueel ook met de Wizard gemaakt kunnen worden.
De macro is klaar, vervolgens moet hij gestart kunnen worden na
de gebeurtenis klikken op de opdrachtknop Annuleer van het for-
mulier Datumbereik vertreklijst.
Doe dit op dezelfde wijze zoals besproken bij de opdrachtknop
OK, selecteer nu de macro frmDatumbereik vertreklijst.Annuleer.
Het formulier kan nog niet getest worden omdat het aangeroepen
rapport nog niet bestaat! Dit gaan we in de volgende paragraaf
doen.
9.4 De rapporten
In deze paragraaf gaan we de rapporten toelichten die bij de toe-
passing van reisbureau t Zonnetje behoren. Er zijn vier rapporten
nodig. In de eerste plaats een rapport voor het afdrukken van de
boekinggegevens in factuurvorm. Dit rapport kan worden opge-
Macro frmDatumbereik vertreklijst.Annuleer
Actie Argument Instelling
Sluiten Opslaan Nee
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
305
roepen vanuit het formulier Boeking. Klikken we in het formulier
Boeking op de opdrachtknop met het printericoontje, dan wordt de
macro frmBoeking.Afdrukken gestart. Die macro is besproken in
de paragraaf van het formulier Boeking. Het ligt voor de hand om
eerst het rapport te maken. Is het rapport naar wens, dan kan de
macro gemaakt worden.
Het tweede rapport is een alfabetische klantenlijst; het derde een
overzicht van vertrekkende reizigers, de Vertreklijst. Als laatste
maken we een rapport waaruit we kunnen aezen wat de omzet
per reis is en de totale omzet van het reisbureau. Deze drie rappor-
ten kunnen afgedrukt worden vanuit het submenu Overzichten. Dit
bevat drie opdrachtknoppen waarmee we de overzichten kunnen
afdrukken.
9.4.1 Rapport Boeking
Met dit rapport tonen we het boekingsformulier in factuurvorm op
de printer, zie guur 9.23.
Figuur 9.23
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
306
Zoals guur 9.23 laat zien, staan in het rapport meer gegevens
dan in het formulier Boeking. We vinden hier ook de gegevens
Postcode, Prijs per kind, Totaal volwassenen, Totaal kinderen
en Nog te betalen. Behalve de postcode zijn de andere gegevens
zogenoemde procesgegevens: gegevens die op eenvoudige wijze
uit andere gegevens berekend kunnen worden. Hierbij dient opge-
merkt te worden dat de Prijs per kind gelijk is aan de Prijs per per-
soon minus een korting. Het kortingspercentage is voor alle reizen
gelijk. Dit percentage is vastgelegd in de tabel Constant, in het veld
KinderKortingPerc.
De procesgegevens liggen niet in de database opgeslagen. We kun-
nen ze laten berekenen in zogeheten rekenvelden. We gaan in het
rapport die berekeningen uitvoeren.
We gaan het rapport ontwerpen. We maken een query voor het rap-
port, met de naam rptBoeking, met de gegevens die in het rapport
komen, exclusief de procesgegevens. De benodigde velden worden
in guur 9.24 getoond.
Kies in het databasevenster het overzicht Querys en kies de optie
Query maken in ontwerpweergave.
Kies de tabellen Boeking, Klant, Reis en Bestemming.
Selecteer de benodigde velden, zoals die in guur 9.24 zijn aan-
gegeven. In de tabel Boeking kunnen we het sterretje selecteren,
hierdoor worden alle velden uit de tabel Boeking geselecteerd.
Tabel Veld
Boeking * (alle velden)
Klant Naam
Adres
Postcode
Woonplaats
Telefoonnummer
Reis Vertrekdatum
Aantal dagen
Prijs per persoon
Bestemming Plaats
Land
Werelddeel
Figuur 9.24
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
307
Sla nadat alle velden zijn opgegeven de query op met de naam
rptBoeking. Hieraan kunnen we zien dat deze query bij het rapport
boeking hoort.
Het rapport is niet een standaardrapport dat snel met de Wizard
te maken is. We moeten een eigen lay-out ontwerpen. Wel kun-
nen we de Wizard gebruiken om snel alle velden op het rapport te
plaatsen. Door die te verplaatsen kunnen we de gewenste lay-out
maken.
Kies in het databasevenster het overzicht Rapporten en selecteer de
optie Rapport maken met wizard.
Selecteer in het eerste scherm van de Wizard de zojuist gemaakte
query rptBoeking en selecteer hieruit alle velden.
Geef in het volgende scherm op vanuit welke tabel we de gegevens
wensen te zien; kies volgens Boeking.
In het volgende scherm kunnen we opgeven hoe de gegevens
gegroepeerd moeten worden. Dat is niet nodig, ga naar het volgen-
de scherm van de Wizard.
Hierin kunnen we een sorteervolgorde aangeven. Aangezien maar
n afdruk wordt gemaakt, is een volgorde niet van belang.
Geef in het volgende scherm aan hoe het rapport opgemaakt moet
worden. Kies voor In kolomvorm en Staand.
Het scherm hierna dient om het opmaakproel te selecteren.
Selecteer het opmaakproel Vet.
Accepteer in het laatste scherm de voorgestelde titel (naam)
Boeking. Van het rapport wordt een afdrukvoorbeeld getoond.
Plaats het rapport in de ontwerpweergave. Het dient aangepast te
worden aan onze wensen. We gaan eerst de detailsectie, het
gedeelte waarin de gegevens worden afgedrukt, aanpassen aan
onze wensen.
Verplaats alle besturingselementen, behalve Boekingnummer,
ongeveer tien centimeter naar beneden. Het selecteren van alle
besturingselementen, behalve Boekingnummer, kunnen we een-
voudig realiseren door met de muis een rechthoek over die velden
te trekken. Hierdoor worden alle besturingselementen geselecteerd
en kunnen we deze in n keer verslepen. In het bovenste gedeelte
van de detailsectie is nu ruimte gecreerd.
Zet alle besturingselementen op hun plaats. Let op: hierbij moe-
ten we niet voorbij het raster komen dat wordt getoond in de
ontwerpweergave. De gegevens passen anders niet, of niet vol-
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
308
ledig, binnen de breedte van het papier. De labels van de bestu-
ringselementen Postcode en Klantnummer moeten we verwijderen.
De labels van Aantal volwassenen en Aantal kinderen moeten we
wijzigen in respectievelijk: Volwassenen en Kinderen.
De Wizard heeft automatisch een randstijl gekozen voor de bestu-
ringselementen van de velden. Tijdens het afdrukken wordt om
de waarden van de besturingselementen een kader geplaatst. Die
randstijl vinden wij in dit voorbeeld niet geschikt. Selecteer alle
besturingselementen van de velden (Shift+muisklik) en plaats
vervolgens het eigenschappenvenster op het scherm en kies uit
de tab Opmaak de eigenschap Randstijl. Verander de randstijl in
Transparant.
Hierna gaan we de rekenvelden maken. Als eerste maken we het
rekenveld Prijs per kind. Kies in de Werkset voor Tekstvak en
verplaats de muis naar de positie op het scherm waar het rekenveld
moet komen.
Een tekstvak maakt automatisch een label. Verander het bijschrift
van het label in Prijs per kind. Selecteer het tekstvak en verander
de eigenschap Naam, tabblad Overige, in Prijs per kind.
Klik op het tabblad Gegevens en zet de formule =[Prijs per per-
soon] * (1 [Formulieren]![Constant]![KinderKortingPerc]) in
de eigenschap Besturingselementbron, zie guur 9.25. Merk op dat
in de tabel Constant het veld KinderKortingPerc als fractie staat
(0,20) en dat de notatie van het veld Percentage is.
Deze formule kan ook via de Opbouwfunctie voor expressies
opgebouwd worden, zoals in hoofdstuk 8 is toegelicht. Het kortings-
percentage voor kinderen komt uit de tabel Constant. Aangezien
Figuur 9.25
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
309
het formulier Constant al geopend is, bij het boeken van de reis,
kunnen we dat formulier nu ook gebruiken. Ontwerpen we dit
rapport onafhankelijk van het formulier Boeking, dan moet het
formulier Constant eerst nog geopend worden om deze berekening
te kunnen maken! We kunnen controleren of het rekenveld goed
werkt door een afdrukvoorbeeld van het rapport te laten tonen.
Kies uit de menubalk Beeld, Afdrukvoorbeeld of doe dit via de
knop Beeld op de werkbalk. Krijgen we een foutmelding zoals
#Naam? of #Fout, open dan eerst het formulier Constant. Het
rekenveld voor het totale bedrag van de volwassenen wordt op
soortgelijke wijze gemaakt.
Selecteer opnieuw een tekstvak in de Werkset en verplaats de muis
naar de positie waar het besturingselement moet komen. Het label
dat automatisch wordt gecreerd bij het tekstvak kunnen we ver-
wijderen (eerst selecteren en vervolgens op de Delete-toets druk-
ken). Verander de eigenschappen Naam en Besturingselementbron
van het nieuwe tekstvak in respectievelijk Totaal volwassenen en
=[Aantal volwassenen] *[Prijs per persoon]. Controleer de wer-
king van het besturingselement in het afdrukvoorbeeld.
Het maken van de overige rekenvelden gaat op dezelfde manier.
Maak de overige vijf rekenvelden en verander de eigenschappen
volgens het schema van guur 9.26.
Voor het berekenen van de annuleringskosten is gebruikgemaakt
van de functie IIf(). Als een annuleringsverzekering is afgesloten,
worden de annuleringskosten berekend met behulp van het per-
centage uit het formulier Constant. Heeft men geen annulerings-
verzekering afgesloten, dan zijn er geen kosten. Merk op dat het
annuleringspercentage als fractie (0,04) ligt opgeslagen in de tabel
Constant en dat het scheidingsteken is ingesteld op puntkomma (;).
Eigenschap: Naam Eigenschap: Besturingselementbron
Totaal kinderen =[Aantal kinderen]*[Prijs per kind]
Subtotaal =[Totaal volwassenen]+[Totaal kinderen]
Annuleerkosten =IIf([Annuleringsverzekering];[Formulieren]
![Constant]![AnnuleerPerc]*[Subtotaal];0)
Totaal =[Subtotaal]+[Annuleerkosten]
Nog te betalen =[Totaal]-[Betaald bedrag]
Figuur 9.26
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
310
Het veld Annuleringsverzekering is een selectievakje. We willen
echter de tekst Ja of Nee zien in plaats van een vinkje.
Verwijder het besturingselement Annuleringsverzekering.
Plaats vervolgens via de werkset een tekstvak op de vrijgevallen
plaats.
Verander de labeltekst van het tekstvak in Annuleringsverzekering.
Plaats het eigenschappenvenster van het nieuwe tekstveld op het
scherm.
Wijzig van het tekstvak de eigenschap Notatie tabblad Opmaak
in Ja/Nee. Besturingselementbron tabblad Gegevens
in Annuleringsverzekering en Naam tabblad Overige in
Annuleringsverzekering.
Alle rekenvelden zijn gemaakt. Echter, het besturingselement
Betaalwijze toont de getallen 1, 2 of 3. Het besturingselement
Betaalwijze is een groepsvak, waarin we kunnen kiezen voor
Constant, Pinnen of Acceptgiro. Het groepsvak slaat niet die tek-
sten op, maar de overeenkomstige getallen, hier 1, 2 of 3. Bij het
tonen van het veld Betaalwijze worden die getallen afgedrukt en
niet de bijbehorende teksten. Als we de bijbehorende tekst wensen
te tonen, moeten we een tekstvak maken dat op basis van de
waarde van het veld Betaalwijze de juiste tekst toont. Hiervoor
heeft Access de functie Choose(), die een waarde uit een lijst met
argumenten selecteert en deze waarde als resultaat geeft. De volle-
dige syntaxis van de functie is: Choose(index; optie-1[; optie-2; ...
[; optie-n]]). Het eerste argument Index is een getal. Op basis van
dat getal wordt de eerste, tweede, of n-de optie geselecteerd: in ons
voorbeeld Choose([Betaalwijze]; Contant; Pinnen; Accept
giro). Is de waarde van Betaalwijze 1, dan wordt het woord
Contant afgedrukt; is de waarde van Betaalwijze 2, dan wordt de
tekst Pinnen afgedrukt, enzovoort.
Wijzig van het besturingselement Betaalwijze de eigenschap Naam
in TekstBetaalwijze.
Verander de eigenschap Besturingselementbron in
=Choose([Betaalwijze]; Contant; Pinnen; Acceptgiro).
Access beschikt ook over de functie Switch(). De volledige syn-
taxis van de functie luidt: Switch(expr-1; waarde-1[; expr-2; waar-
de-2 ... [; expr-n,waarde-n]]). Hiermee kunnen we paren
expressies en waarden opgeven.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
311
Bijvoorbeeld: Switch([SoortRelatie]= D; Debiteur;[SoortRela-
tie]=C; Crediteur) of Switch([Betaalwijze] =1; Contant;
[Betaalwijze]=2; Pinnen; [Betaalwijze]=3; Acceptgiro).
De rekenvelden moeten nog van een juiste opmaak worden voor-
zien. Selecteer daartoe alle rekenvelden (Shift+muisklik) en plaats
vervolgens het eigenschappenvenster op het scherm. Kies de tab
Opmaak en selecteer de eigenschap Notatie. Kies in de keuzelijst
de notatie Valuta of Euro.
Verfraai ten slotte de detailsectie met enige lijnen. De Wizard heeft
n lijn al in de detailsectie geplaatst. Verwijder deze lijn en voeg
vier lijnen toe, zie guur 9.23, waarvan twee over de volledige
breedte van de detailsectie. Na het plaatsen van de lijnen kunnen
deze iets dikker gemaakt worden door de eigenschap Randbreedte,
in de tab Opmaak, de waarde 2 te geven. Voeg ten slotte nog twee
lijnen toe die dienen om het subtotaal en totaal te scheiden.
De detailsectie is nu af. We gaan de Paginakoptekst maken.
Door de Wizard is geen paginakoptekst gemaakt, wel een rapport-
koptekst.
Maak ruimte voor de paginakoptekst door de balk van de detail-
sectie omlaag te slepen. In de paginakoptekst worden de gegevens
van het reisbureau getoond, zie guur 9.23. De teksten zijn alle-
maal labels. Het label met het bijschrift Boeking kan uit de Rap-
portkoptekst naar de Paginakoptekst worden gesleept. Het speciale
effect van het label linksboven Reisbureau t Zonnetje is gemaakt
door de eigenschappen Voorgrondkleur en Achtergrondkleur van
het label te veranderen in respectievelijk wit en zwart. Van dat
label is ook de grootte van het lettertype veranderd in puntgrootte
20. De paginakoptekst is klaar. De rapportkoptekst kan verwijderd
worden. Sleep daartoe de balk van paginakoptekst omhoog.
Als laatste veranderen we de Paginavoettekst van het rapport. De
Wizard heeft aan de rechterkant in de paginavoettekst een tekstvak
geplaatst waarin het actieve paginanummer getoond wordt en het
totale aantal paginas. Hierin is gebruikgemaakt van de eigen-
schappen Pagina en Paginas. Aangezien in dit rapport maar n
pagina wordt afgedrukt, verwijderen we dat tekstvak.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
312
Willen we op een ander rapport wel die informatie afdrukken, ga
dan als volgt te werk. Plaats een tekstvak in de voettekst. Start
in de eigenschap Besturingselementbron de Opbouwfunctie voor
expressies. Kies in de linkerkolom van het opbouwfunctievenster
voor Gangbare expressies. Maak vervolgens uit de middelste
kolom een keuze.
Het rapport is nu bijna klaar en het toont alle gewenste gegevens,
hoewel dat er iets te veel kunnen zijn. Als er namelijk geen kinde-
ren mee op reis gaan, wordt bij Aantal kinderen de waarde 0 af-
gedrukt, de Prijs per kind wordt getoond en Totaal kinderen heeft
ook als waarde 0. We willen die regel in het rapport dan niet tonen.
Hiervoor moet een macro gemaakt worden; deze maken we onder
de groepsnaam rptBoeking, zodat we direct kunnen zien dat die
macro bij het rapport Boeking hoort.
Macro van het rapport Boeking
We moeten een macro maken die controleert of in de gemaakte
boeking ook kinderen op reis gaan. Als er geen kinderen op de
boeking staan vermeld, wordt in het rapport geen informatie over
kinderen vermeld. Binnen de macrogroep krijgt die macro de
naam ToonKinderen (zie guur 9.27).
De volledige macro wordt getoond in guur 9.27.
Figuur 9.27
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
313
Gaan er geen kinderen op reis, dan worden de besturingselementen
die de kindergegevens tonen onzichtbaar gemaakt. Let op de drie
puntjes in de voorwaarde! Hierdoor wordt de voorwaarde voor de
volgende actie herhaald. Alle gegevens die op het rapport staan
die met kinderen te maken hebben, worden hierdoor onzichtbaar
gemaakt. Deze macro zou nu klaar zijn, er wordt namelijk maar
n bladzijde door het rapport afgedrukt. Voor ieder nieuw rapport
wordt namelijk de standaardinstelling, alle gegevens op het rapport
tonen, hersteld.
We hebben de macro uitgebreid door de gegevens van de kinderen
opnieuw zichtbaar te maken als er wel kinderen in de boeking
staan vermeld. Hierdoor kunnen we het rapport desgewenst ook
gebruiken om over een bepaalde periode de boekingen af te druk-
ken. Het is dan niet nodig een heel nieuw rapport te maken. Als we
bijvoorbeeld in n keer tien boekingen zouden laten afdrukken
en op de eerste boeking staan geen kinderen, worden de gegevens
Macro rptBoeking.ToonKinderen
Voorwaarde Actie Argument Instelling
[Aantal kinderen]=0 WaardeInstellen Item [Aantal kinderen].[Visible]
Expressie Nee
WaardeInstellen Item [Aantal kinderen Bijschrift].[Visible]
Expressie Nee
WaardeInstellen Item [Prijs per kind].[Visible]
Expressie Nee
WaardeInstellen Item [Label prijs per kind].[Visible]
Expressie Nee
WaardeInstellen Item [Totaal kinderen].[Visible]
Expressie Nee
MacroStoppen
WaardeInstellen Item [Aantal kinderen].[Visible]
Expressie Ja
WaardeInstellen Item [Aantal kinderen Bijschrift].[Visible]
Expressie Ja
WaardeInstellen Item [Prijs per kind].[Visible]
Expressie Ja
WaardeInstellen Item [Label prijs per kind].[Visible]
Expressie Ja
WaardeInstellen Item [Totaal kinderen].[Visible]
Expressie Ja
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
314
van de kinderen op de boeking onzichtbaar gemaakt. Die instelling
blijft echter voor de volgende negen afdrukken ingesteld, zodat op
geen enkel volgend overzicht de kindergegevens worden getoond,
ook al gaan er wel kinderen mee op reis. Door onze uitbreiding
wordt de standaardinstelling na iedere afgedrukte boeking her-
steld, zodat weer alle gegevens worden getoond. Het formulier
Constant is hierbij wel noodzakelijk, we kunnen dit dan openen op
het moment dat het rapport wordt geopend. Via de eigenschap Bij
openen van het rapport kan dat gerealiseerd worden. De macro-
groep rptBoeking dient in dat geval ook uitgebreid te worden met
een macro die het formulier Constant opent.
De macro rptBoeking.ToonKinderen moet uitgevoerd worden op
het moment dat de gegevens uit de detailsectie opgemaakt worden,
de gebeurtenis Bij opmaken.
Selecteer het overzicht Rapporten in het databasevenster en open
het rapport Boeking in de ontwerpweergave.
Klik met de muis op de balk van de detailsectie en plaats het eigen-
schappenvenster op het scherm. Kies daarin de tab Gebeurtenis.
Selecteer uit de eigenschappen van de detailsectie Bij opmaken.
Selecteer uit de keuzelijst rptBoeking.ToonKinderen. Hierdoor
wordt bij het opmaken van de detailsectie uit het rapport de macro-
groep rptBoeking geopend en de macro rptBoeking.ToonKinderen
gestart.
Open ter controle het formulier Boeking en laat een boeking in
factuurvorm op de printer afdrukken.
9.4.2 Rapport Klantenlijst
Nu volgt het eenvoudigste rapport van de toepassing: een alfabeti-
sche klantenlijst, zie guur 9.28.
Dit rapport kunnen we met de Wizard Rapport snel maken. We
zullen voor de uniformiteit gebruikmaken van een query.
Klik in het overzicht Querys van het databasevenster en selecteer
de optie Query maken in ontwerpweergave.
Selecteer in het venster de tabel Klant.
Selecteer alle velden uit de tabel Klant (het sterretje is voldoende).
Sla de query op onder de naam rptKlantenlijst.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
315
Activeer in het overzicht Rapporten op de optie Rapport maken
met wizard.
Selecteer de zojuist gemaakte query rptKlantenlijst en vervolgens
alle velden uit die query.
In het daaropvolgende venster kunnen we groepeerniveaus aan-
geven. In het klantenoverzicht komen die niet voor.
In het volgende venster wordt de sorteervolgorde aangegeven, kies
voor Naam. Kies hierna de optie In tabelvorm en Staand.
In het voorlaatste venster kan een stijl opgegeven worden, kies de
stijl Vet.
Geef het rapport de titel (naam) Klantenlijst.
Een voorbeeld van de klantenlijst wordt vervolgens op het beeld-
scherm getoond. Het kan zijn dat niet alle kopteksten volledig
worden weergegeven. Dat heeft te maken met de printer die is aan-
gesloten en ingesteld in Windows. Onze lijsten worden afgedrukt
met een HP Laserjet 5000 en daarmee zijn de kopteksten Postcode
en Telefoonnummer niet volledig te zien. Mocht dit bij de gebruikte
printer ook het geval zijn, dan is dat op de volgende wijze eenvou-
dig te verhelpen.
Plaats het rapport in de ontwerpweergave. Maak het label Adres
in de Paginakoptekst iets korter. Verplaats hierna het
label Postcode iets naar links en maak het iets langer. Het label
Figuur 9.28
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
316
Postcode is nu zichtbaar. Doe hetzelfde met de labels Woonplaats
en Telefoonnummer. Eventueel kunnen we de kopteksten ook
inkorten, bijvoorbeeld Telefoonnummer wijzigen in Telefoonnr.
Controleer vervolgens de wijzigingen in het afdrukvoorbeeld.
Macro van het rapport Klantenlijst
Het rapport Klantenlijst is klaar. Als we het rapport openen, wordt
het als afdrukvoorbeeld getoond. In de uiteindelijke toepassing
moet de klantenlijst direct afgedrukt kunnen worden. Hiervoor
hebben we een macro nodig. Die macro wordt gestart vanuit een
menu-item dat met schakelborden wordt gemaakt. Meer hierover is
te vinden in paragraaf 9.5, Schakelborden. We kunnen hierdoor de
macro nog niet testen. Voor de macro is de macrogroep rptKlan-
tenlijst gemaakt.
Hiermee wordt het rapport geopend en wordt het direct naar de
printer gestuurd, door in het argument Beeld voor de instelling
Afdrukken te kiezen.
9.4.3 Rapport Vertreklijst
Het rapport toont per vertrekdatum per reisnummer de klanten die
vertrekken, zie guur 9.29.
Het rapport is gemaakt met de Wizard Rapport. Het afdrukken van
het rapport vindt plaats vanuit het formulier Datumbereik vertrek-
lijst. In dat formulier worden een begindatum en een einddatum
gevraagd. Alle reizen binnen die grenzen worden getoond in het
rapport Vertreklijst. Het formulier Datumbereik vertreklijst is bij
de formulieren van de toepassing al toegelicht, zie guur 9.21. Het
rapport Vertreklijst is als eerste gemaakt en daarna het formulier
Datumbereik vertreklijst.
Maak een query genaamd rptVertreklijst.
Kies uit de tabel Reis de velden Vertrekdatum en Reisnummer.
Kies uit de tabel Bestemming de velden Plaats en Land, en uit de
Macro rptKlantenlijst.Afdrukken
Actie Argument Instelling
RapportOpenen Rapportnaam Klantenlijst
Beeld Afdrukken
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
317
tabel Klant de velden Naam en Woonplaats. Als laatste nemen we
uit de tabel Boeking de velden Aantal volwassenen en Aantal kin-
deren.
Hierna gaan we het nieuwe rapport maken. Selecteer in het over-
zicht Rapporten de optie Rapport maken met wizard. Kies de
zojuist gemaakte query rptVertreklijst en selecteer hiervan alle
velden.
In het volgende scherm van de Wizard wordt gevraagd hoe we de
gegevens willen weergeven, we kiezen volgens Reis.
Voeg in het volgende scherm groepeerniveaus toe, zie guur 9.30.
We hebben voor het rapport twee groepeerniveaus nodig, name-
lijk op vertrekdatum en daarbinnen op reisnummer. Kies eerst het
groepeerniveau Vertrekdatum.
Standaard wordt in Access op datumvelden per maand gegroe-
peerd. Dat is in ons voorbeeld niet wenselijk en we gaan dat aan-
passen.
Klik op Opties voor groeperen.... Kies bij Groepeerintervallen
voor Normaal en klik op OK.
Figuur 9.29
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
318
Kies nog een groepeerniveau Reisnummer en ga naar het volgende
scherm.
Hierin kunnen we een sortering aanbrengen in de detailsectie.
Kies voor Naam.
Kies de gewenste opmaak: Met interval en Staand.
In het voorlaatste scherm kunnen we een proel aan het rapport
geven, selecteer Vet.
Geef in het laatste venster de titel (naam) Vertreklijst aan het rap-
port. Het resultaat wordt getoond als afdrukvoorbeeld.
De koptekst van het rapport is niet helemaal naar wens. We kun-
nen die eenvoudig aanpassen.
Plaats het rapport in de ontwerpweergave. Selecteer in de
Paginakoptekst het label Aantal volwassenen.
Zet het eigenschappenvenster op het scherm en verander in de tab
Opmaak de eigenschap Bijschrift in Volw.. Verander zo ook het
bijschrijft van het label Aantal kinderen in Kind..
Afhankelijk van de aangesloten en ingestelde printer dienen de
labels van de kopteksten aangepast te worden. Onze lijsten worden
afgedrukt met
een HP Laserjet 5000 en hiermee wordt het label Woonplaats niet
volledig afgedrukt. Dit is eenvoudig te verhelpen.
Figuur 9.30
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
319
Maak in dezelfde sectie, Paginakoptekst, het label Volw. aan de
linkerkant iets kleiner en maak het label Woonplaats aan de rech-
terkant iets groter, zodat het volledig wordt getoond.
Het rapport is bijna gereed, we kunnen nog een verjning aanbren-
gen. Het rapport wordt gestart door het formulier Datumbereik
vertreklijst. In dat formulier kunnen we een begin- en een eind-
datum opgeven. Hierna wordt het rapport Vertrekdatum afgedrukt
met alle reizen die in het opgegeven bereik vallen. Stel echter dat
we een bereik opgeven dat geen gegevens oplevert. Er wordt dan
een leeg formulier afgedrukt. Dat kunnen we
ondervangen met een macro, gemaakt in de macrogroep rptVer-
treklijst.
Macro van het rapport Vertreklijst
We moeten een macro maken die controleert of er paginas getoond
worden. Zo niet, dan mag het rapport niet worden afgedrukt.
Binnen de macrogroep rptVertreklijst heeft die macro de naam
GeenGegevens, zie guur 9.31.
De volledige macro wordt getoond in guur 9.31.
Figuur 9.31
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
320
Deze macro wordt geactiveerd als er geen gegevens zijn om af te
drukken. In de eerste actie van de macro wordt het afdrukken van
het rapport geannuleerd, middels de actie GebeurtenisAnnuleren.
De tweede actie stelt de gebruiker via een bericht daarvan op te
hoogte. De laatste actie, die misschien minder makkelijk te
begrijpen is, stopt lle macros. Er is immers nog een macro actief,
namelijk de macro die het afdrukken heeft gestart, frmDatum-
bereik vertreklijst.Ok. Die macro heeft maar twee acties: de eer-
ste actie is het openen van het rapport Vertreklijst en de tweede
het sluiten van het formulier Datumbereik vertreklijst. Door de
actie AlleMacrosStoppen wordt die tweede actie net uitgevoerd.
Hierdoor blijft, na de melding dat er niets valt af te drukken, het
formulier Datumbereik vertreklijst op het scherm. Desgewenst kan
dan een nieuw bereik ingevoerd worden. De gemaakte macro rpt-
Vertreklijst.GeenGegevens wordt gestart via de gebeurtenis geen
gegevens van het rapport.
Open het rapport Vertreklijst in de ontwerpweergave en plaats het
eigenschappenvenster van het rapport op het scherm.
Kies het tabblad Gebeurtenis en selecteer uit de keuzelijst
van de eigenschap Bij geen gegevens de macro rptVertreklijst.
GeenGegevens.
Controleer de werking van het rapport Vertreklijst in combinatie
met het formulier Datumbereik vertreklijst. Open daartoe het for-
mulier Datumbereik vertreklijst.
9.4.4 Rapport Omzetlijst
De omzetlijst laat per reisnummer de behaalde omzet zien. Tevens
wordt het totale bedrag dat tot nu toe betaald is voor dat reisnum-
mer afgedrukt. Ook het percentage dat het reisnummer heeft bij-
gedragen aan de totale omzet wordt weergegeven. Als een reis in
het geheel niet is geboekt, wordt die reis getoond zonder omzet, zie
guur 9.32.
Macro rptVertreklijst.GeenGegevens
Actie Argument Instelling
GebeurtenisAnnuleren
Berichtvenster Bericht Bereik levert geen gegevens op.
Pieptoon Nee
Type Informatie
Titel Bericht
AlleMacrosStoppen
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
321
De omzetlijst is gemaakt met de Wizard Rapport. Hierna zijn
enkele kleine cosmetische veranderingen aangebracht. De
omzetlijst is als volgt gemaakt. Om de omzet te bepalen is de tabel
Constant noodzakelijk. De prijs per kind is namelijk afhankelijk
van de korting die wordt gegeven voor een kind. Kinderen krijgen
een kortingspercentage op de Prijs per persoon. Dat percentage is
vastgelegd in de tabel Constant in het veld KinderKortingPerc. In
onze voorbeelden hebben we geen gebruik gemaakt van de tabel
Constant, maar van het formulier Constant, dat uiteraard dezelfde
gegevens bevat. In onze voorbeelden hebben we hiervoor gekozen
omdat de tabel Constant niet in alle situaties is toegestaan. Het
formulier Constant kan wel altijd gebruikt worden.
Voor het ontwerpen van het rapport moet het formulier Constant
geopend worden, we hebben immers gegevens uit dat formulier
nodig. Als het rapport gereed is, zorgen we er met behulp van
macros voor dat het formulier Constant automatisch verborgen
wordt geopend en gesloten.
Figuur 9.32
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
322
Kies in het databasevenster het overzicht Formulieren en open het
formulier Constant. Minimaliseer het formulier eventueel.
Ga vervolgens naar het overzicht Querys en kies de optie Query
maken in ontwerpweergave. Kies in het venster de tabellen Reis,
Bestemming en Boeking. Let op, selecteer eerst de tabel Reis, dan
Bestemming en als laatste Boeking.
Als er in de tabel Reis een reis voorkomt waarvoor geen boekingen
bestaan, dient die reis, zonder omzet, ook in het overzicht voor te
komen. In een standaard-relatie (inner join) tussen de tabel Reis
en een andere tabel worden reisnummers die niet geboekt zijn niet
getoond. Hiervoor moeten we een speciale relatie leggen, een
zogeheten left of right outer join.
Dubbelklik op de relatie die getoond wordt op het scherm tussen
de tabel Reis en de tabel Boeking. Hierdoor wordt een venster
getoond met de Joineigenschappen, zie guur 9.33.
Selecteer de tweede optie. Hierin staat: alle records uit de tabel
Reis opnemen en alleen die records uit de tabel Boeking waarvoor
de gekoppelde velden identiek zijn. Nu worden alle reizen getoond,
ook als er geen enkele boeking voor bestaat.
Dit noemen we een left outer join, vandaar dat de tabel Reis
als eerste geopend moet worden. Hierdoor staat de tabel aan de
linkerkant ten opzichte van de overige tabellen. We hadden de
tabel Reis ook als laatste kunnen selecteren. De tabel staat dan
aan de rechterkant van de andere tabellen. Optie 3 uit het venster
Joineigenschappen moet dan geselecteerd worden, een zogenaam-
de right outer join.
Figuur 9.33
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
323
Hierna selecteren we de velden voor de omzetlijst. Kies uit de
tabel Reis de velden Reisnummer en Vertrekdatum. Kies uit de
tabel Bestemming de velden Plaats en Land. Kies ten slotte uit de
tabel Boeking het veld Betaald bedrag.
Maak vervolgens een rekenveld Omzet. Klik met de muis in het
eerstvolgende lege vakje van de rij Veld. Plaats daar de volgende
formule, eventueel gebruikmakend van Shift-F2 (zoomen):
Omzet: [Aantal volwassenen]*[Prijs per persoon] +[Aantal
kinderen]*[Prijs per persoon]*(1-[Formulieren]![Constant]!
[KinderKortingPerc]). We zien dat in deze berekening het formu-
lier Constant is gebruikt. Controleer de query in de gegevensblad-
weergave.
Hierbij plaatsen we vier kanttekeningen:
Bij bepaalde reisnummers wordt geen betaald bedrag en omzet
getoond. Dat zijn de reizen die nog geen enkele boeking hebben.
De gegevens worden (nog) niet gegroepeerd. Het groeperen voeren
we uit in de Wizard Rapport. Die Wizard biedt bij het groeperen
een aantal extra opties waarvan we gebruik kunnen maken.
De volgorde waarin we de velden in de query plaatsen, is van
belang. De Wizard Rapport rangschikt de gegevens zoals ze wor-
den aangeboden: in ons voorbeeld eerst het veld Betaald bedrag en
dan Omzet.
Om niet-gerelateerde records te tonen kan ook gebruikgemaakt
worden van een wizard. Kies hiervoor in het overzicht Querys de
optie Nieuw, Wizard Niet-gerelateerde records.
Sluit het venster en sla de query op onder de naam rptOmzetlijst.
Kies het overzicht Rapporten en selecteer de optie Rapport maken
met wizard.
Selecteer de zojuist gemaakte query rptOmzetlijst waarvan alle
velden in het rapport dienen te komen.
In het volgende scherm van de Wizard kunnen we groepeerniveaus
aangeven. Klik op Reisnummer, we moeten namelijk groeperen op
reisnummer; we wensen tenslotte per reisnummer de totale omzet.
Geef in het volgende scherm een sorteervolgorde op en selecteer
opties voor totalen. Aangezien we groeperen op reisnummer, is
de standaard sorteervolgorde op reisnummer. Dat hoeven we niet
te veranderen. Wel gaan we opties voor totalen opgeven: klik op
Opties voor totalen..., zie guur 9.34.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
324
We willen de som van de velden Betaald bedrag en Omzet.
Selecteer in het vak Weergeven de optie Details en totalen en zet
een vinkje bij Percentage van totaal berekenen voor som. Hierdoor
worden de gewenste percentages getoond. Klik vervolgens op OK.
In het volgende scherm kunnen we een indeling van het rapport
opgeven. Selecteer Links uitlijnen 1 en Staand.
Geef in het voorlaatste scherm een opmaakproel op, kies het
opmaakproel Vet.
Geef als laatste een titel (naam) aan het rapport: Omzetlijst. De
omzetlijst wordt vervolgens als afdrukvoorbeeld op het scherm
getoond. Eventueel kunnen we ter controle een afdruk maken van
de omzetlijst.
De omzetlijst is nog niet helemaal naar wens. We zijn alleen gen-
teresseerd in de totalen en niet in de detailgegevens. Als een reis
tien keer is geboekt, worden tien keer vertrekdatum, plaats en land
getoond. En keer lijkt ons voldoende. In het venster Opties voor
totalen (zie guur 9.34) hebben we Details en totalen geselecteerd.
Als we in dat venster Alleen totalen hadden geselecteerd, zouden
de velden Vertrekdatum, Plaats en Land niet meer getoond wor-
den. Beide opties voldoen niet voor het overzicht dat we wensen,
maar we kunnen met een kleine aanpassing het overzicht wel naar
wens maken.
Plaats de omzetlijst in de ontwerpweergave.
Sleep met de muis de balk Detail ongeveer n centimeter naar
beneden, zodat het koptekstgebied iets groter wordt.
Figuur 9.34
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
325
Verwijder uit de sectie Detail de besturingselementen Betaald
bedrag en Omzet.
Selecteer in de sectie Detail tegelijkertijd de besturingselementen
Vertrekdatum, Plaats en Land (Shift+muisklik). Sleep ze onder de
bijbehorende labels in de sectie Koptekst (Reisnummer).
Verwijder de detailsectie door de Voettekst (Reisnummer) omhoog
te slepen (voettekstbalk vastzetten tegen detailbalk). Als we de
detailbalk, in de eerste actie, te veel naar beneden hebben gesleept,
kunnen we deze nu omhoog slepen.
Het label behorende bij het percentage heeft als tekst Standaard
(foutje in Access). We gaan die tekst veranderen in Percentage.
Selecteer het label Standaard in de sectie Voettekst (Reisnummer)
en wijzig de eigenschap Bijschrift, in het tabblad Opmaak, in
Percentage. Door de langere tekst dient tevens de grootte van het
label vergroot te worden.
De som van Betaald bedrag en die van Omzet worden niet in de
opmaak Valuta getoond. Selecteer het tekstveld Som Van Betaald
bedrag en wijzig in de tab Opmaak de eigenschap Notatie in
Valuta of Euro. Voer dit tevens uit voor het tekstveld Som Van
Omzet.
Het totaal betaalde bedrag en de totale omzet, die op de laatste
pagina worden getoond, zijn ook niet voorzien van de opmaak
Valuta. Die twee tekstvelden staan in het rapport in de sectie
Rapportvoettekst. Verander ook voor die twee tekstvelden de
eigenschap Notatie in Valuta of Euro.
Bekijk het resultaat als afdrukvoorbeeld. Let in het bijzonder op de
reizen die meermalen geboekt zijn.
De labels vertrekdatum en Betaald bedrag worden niet volledig
getoond (afgedrukt op een HP Laserjet 5000). Ook het euro-sym-
bool wordt bij het totale omzetbedrag niet getoond. We kunnen dit
eenvoudig veranderen door de labels iets groter te maken.
Plaats het rapport in de ontwerpweergave. Selecteer het label
Vertrekdatum en maak het aan de rechterkant iets groter. Selecteer
het label Betaald bedrag en maak het aan de linkerkant iets groter.
Kies in sectie Rapportvoettekst het tekstvak Omzet Eindtotaal
Som en maak het aan de rechterkant iets langer.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
326
Het rapport is, op de macros na, klaar. Nog enige opmerkingen
over het rapport:
De lijst is afgedrukt op een HP Laserjet 5000. Als een andere prin-
ter is aangesloten en ingesteld, kan de lay-out van het overzicht iets
afwijken.
Zijn er bij een bepaalde reis geen boekingen, dan wordt wel een
record getoond, het record van de reis, maar totalen worden niet
getoond (ook geen nullen).
De besturingselementen Betaald bedrag en Omzet hebben we van
het rapport verwijderd. We hadden ze, met behulp van hun eigen-
schappen (Zichtbaar), ook onzichtbaar kunnen maken.
Voor de berekening van de percentages wordt gebruikgemaakt
van de eindtotalen Betaald bedrag Eindtotaal Som en Omzet
Eindtotaal Som. Deze worden in de voettekst van het rapport
getoond. Access doorloopt namelijk twee keer het rapport. De
eerste keer worden de expressies in de detailregels berekend, de
groepstotalen en eindtotalen bepaald en de lengte van het rapport
gecontroleerd, zodat het aantal paginas bekend is. De tweede keer
worden de expressies opgelost die verwijzen naar groepstotalen
en eindtotalen. Hierdoor is het mogelijk in de detailsectie of lagere
niveaus verwijzingen te plaatsen naar hogere niveaus. Dit is een
zeer krachtige mogelijkheid van rapporten binnen Access.
Als we in een groepssectie een rekenveld uit de detailsectie wen-
sen te sommeren, is het niet toegestaan om te verwijzen naar het
betreffende rekenveld. De gemaakte berekening moet dan herhaald
worden. Een voorbeeld: in de detailsectie hebben we een rekenveld
Regelbedrag met hierin de berekening =[Aantal] * [Prijs]. In de
groepssectie is het niet toegestaan om =Som([Regelbedrag]) te
gebruiken, we moeten de berekening herhalen =Som([Aantal] *
[Prijs]).
Als het wenselijk is om kopteksten en bijbehorende gegevens op
n pagina weer te geven, kan een eigenschap van die sectie aan-
gepast worden. Verander in het tabblad Opmaak de eigenschap
Nieuwe rij of kolom in Voor en Na sectie.
In dit rapport wordt gebruikgemaakt van het formulier Constant
en niet van de tabel Constant. Het zou in dit rapport een foutmel-
ding opleveren. Voor diegene die genteresseerd is in het waarom:
de tabel Constant heeft geen relaties met de andere tabellen uit de
database. Bij inner joins tussen de databasetabellen en de tabel
Constant levert dat geen probleem op. Alle geselecteerde records
worden verbonden met de tabel Constant. Maken we een left of
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
327
right outer join in combinatie met de tabel Constant, dan krijgen
we een melding op het scherm dat die relatie niet is toegestaan.
Zonder de tabel Constant werkt de left of right outer join goed en
kunnen we probleemloos gebruikmaken van de
informatie uit het formulier Constant.
Macros van het rapport Omzetlijst
Bij dit rapport hebben we drie macros nodig: n om het formulier
Constant te openen zodra het rapport wordt opgeroepen; n om
het formulier Constant te sluiten nadat het rapport is afgedrukt,
en ten slotte een macro om het rapport te openen en direct naar de
printer te sturen. Die macro wordt gestart vanuit een menu dat met
schakelborden wordt gemaakt. Meer hierover vinden we in para-
graaf 9.5, Schakelborden. De macros zijn opgeslagen in
macrogroep rptOmzetlijst, zie guur 9.35.
De volledige macro wordt getoond in guur 9.35. Hiermee wordt
het formulier Constant verborgen geopend.
Figuur 9.35
Macro rptOmzetlijst.Open
Actie Argument Instelling
FormulierOpenen Formuliernaam Constant
Beeld Formulier
Venstermodus Verborgen
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
328
De volledige macro wordt getoond in guur 9.35. Het formulier
Constant wordt gesloten. Opslaan is niet noodzakelijk, er is im-
mers niets veranderd.
De volledige macro wordt getoond in guur 9.35. Hiermee wordt
het rapport geopend en direct naar de printer gestuurd, door in het
argument Beeld voor de instelling Afdrukken te kiezen.
De eerste macro moet geactiveerd worden tijdens het openen van
de omzetlijst en de tweede macro wordt in werking gezet zodra het
rapport van de omzetlijst wordt gesloten.
Plaats daartoe de omzetlijst in de ontwerpweergave op het scherm
en activeer vervolgens het eigenschappenvenster van het rapport.
Klik op het tabblad Gebeurtenis en selecteer in de keuzelijst Bij
openen de macro rptOmzetlijst.Open en in de eigenschap Kies bij
sluiten voor rptOmzetlijst.Sluiten.
De derde macro zal gestart worden door een optie uit het schakel-
bord te selecteren. Meer hierover in de volgende paragraaf.
9.5 Schakelborden
De toepassing is bijna klaar: alle querys, formulieren en rapporten
zijn gemaakt, alleen de menus en submenus moeten nog gemaakt
worden. In paragraaf 9.2 is al toegelicht dat deze menus niet ver-
ward mogen worden met menubalken. Deze menus worden
Macro rptOmzetlijst.Sluiten
Actie Argument Instelling
Sluiten Objecttype Formulier
Objectnaam Constant
Opslaan Nee
Macro rptOmzetlijst.Afdrukken
Actie Argument Instelling
RapportOpenen Rapportnaam Omzetlijst
Beeld Afdrukken
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
329
gemaakt met vensters. Om naamsverwarring te voorkomen wor-
den ze binnen Access schakelborden genoemd. Het hoofdmenu van
de toepassing wordt door het schakelbord getoond in guur 9.36.
Menus en submenus zijn in Access eenvoudig te maken met scha-
kelborden. In paragraaf 9.2 zijn deze al vastgelegd.
In onze toepassing hebben we drie menus (schakelborden)
nodig: een hoofdmenu en twee submenus. In het hoofdmenu
komen drie items, te weten Boekingen, Overzichten en Onderhoud.
Selecteren we het item Boekingen, dan komen we direct in het
formulier Boeking. Dit formulier wordt het meest toegepast bin-
nen reisbureau t Zonnetje, vandaar dat het direct te selecteren is in
het hoofdmenu. Kiezen we n van de twee overige items uit het
hoofdmenu, dan komen we in de submenus. Verder komt in ieder
menu een keuzemogelijkheid Sluiten om n menuniveau terug te
selecteren. In het hoofdmenu wordt dan de toepassing afgesloten.
Hoofdmenu
Boekingen
Overzichten
Onderhoud
Sluiten
Figuur 9.36
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
330
Kiezen we in het hoofdmenu het item Overzichten, dan komen we
in het submenu Overzichten. Hierin wordt een overzicht getoond
van alle mogelijke overzichten (rapporten/lijsten) binnen de toe-
passing. Na het selecteren worden de rapporten op de printer
afgedrukt.
Submenu Overzichten
Klantenlijst
Vertreklijst
Omzetlijst
Sluiten
Na de keuze Onderhoud uit het hoofdmenu komen we in het sub-
menu Onderhoud. Hierin kunnen we een keuze maken uit het
onderhouden van de basisgegevens. Zo kunnen we toevoegen, ver-
wijderen en wijzigingen doorvoeren in de basisgegevens.
Submenu Onderhoud
Klanten
Reizen
Bestemmingen
Constanten
Sluiten
Nu we precies weten hoe de verschillende menus eruit moeten
zien, gaan we de menus maken met de optie Schakelbordbeheer
van Access.
Kies in de menubalk Extra de optie Databasehulpprogrammas,
Schakelbordbeheer. Als nog geen schakelbord is gemaakt voor de
toepassing, volgt een melding hierover en wordt gevraagd of we
een schakelbord willen maken. We beantwoorden dit bevestigend.
Er worden nu automatisch twee acties ondernomen. Er wordt een
tabel Switchboard Items gemaakt en het formulier Schakelbord.
Merk op dat ook in de Nederlandstalige versie de tabel in het
Engels wordt weergegeven. Het formulier Schakelbord toont de
verschillende menus. Met de tabel Switch-board Items hebben we
verder niets te maken. Access maakt gebruik van die tabel om de
verschillende menu-onderdelen (schakelborden) te registreren. In
het schakelbordformulier dat gemaakt wordt kunnen we, zoals zal
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
331
blijken uit de toelichting, enige persoonlijke aanpassingen aanbren-
gen. Het onderdeel schakelbordbeheer opent het dialoogvenster
Schakelbordbeheer, zie guur 9.37.
In dit venster kunnen we menus en schakelbordpaginas opge-
ven. Standaard wordt al n hoofdmenu aangemaakt, namelijk
Hoofdschakelbord. We gaan twee nieuwe (sub)menus (schakel-
borden) maken.
Klik op de knop Nieuw. In het venster kunnen we de naam van het
nieuwe schakelbord opgeven.
Wijzig de naam in Overzichten en klik op OK.
Klik nogmaals op de knop Nieuw, wijzig de naam in Onderhoud
en klik op OK. De drie menus (schakelborden) zijn nu gemaakt.
Vervolgens moeten de menus van items worden voorzien.
Selecteer Hoofdschakelbord en klik op Bewerken. In dit dialoog-
venster kunnen we de items (onderdelen) van het hoofdmenu
opgeven, zie guur 9.38.
Figuur 9.37
Figuur 9.38
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
332
Voordat we de menu-items gaan speciceren, veranderen we eerst
de naam van het hoofdschakelbord.
Verander de naam Hoofdschakelbord in Hoofdmenu. Klik hierna
op de knop Nieuw. Er volgt een venster waarin we het eerste
menu-item kunnen invoeren, zie guur 9.39.
Typ in het eerste item Tekst de tekst van het eerst menu-item,
Boekingen.
Geef daarna op wat er moet gebeuren als deze optie wordt gese-
lecteerd. De verschillende mogelijkheden worden in de keuzelijst
getoond. Aangezien het formulier Boeking moet worden geopend,
selecteren we Formulier openen in bewerkingsmodus.
Selecteer in de derde keuzelijst het formulier dat geopend moet
worden, Boeking. Merk op dat het derde vakje afhankelijk is van
het tweede. In dit voorbeeld worden alle formulieren uit de toepas-
sing getoond.
Klik vervolgens op OK, we komen terug in het vorige venster.
We deniren meteen het tweede item uit het hoofdmenu,
namelijk Overzichten. Klik opnieuw op knop Nieuw in het venster
Schakelbordpagina bewerken.
Typ bij Tekst: Overzichten.
Kies in de tweede keuzelijst, Opdracht, voor Naar schakelbord
gaan. We moeten immers een submenu (schakelbord) openen.
Selecteer in de derde keuzelijst Overzichten en klik op de knop
OK. Schakelbordbeheer weet nu dat voor dit item het schakelbord
(submenu) Overzichten getoond moet worden.
Het laatste item van het hoofdmenu moet nog gedenieerd worden.
Klik opnieuw op de knop Nieuw in het venster Schakelbordpagina
bewerken. Voer achtereenvolgens in: Onderhoud, Naar
Schakelbord gaan en Onderhoud. Klik vervolgens op de knop OK.
Ten slotte is het de bedoeling dat een menu afgesloten kan worden.
Het hoofdmenu wordt afgesloten terwijl de submenus terugkeren
naar het hoofdmenu.
Figuur 9.39
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
333
Klik voor de laatste keer voor het hoofdmenu op de knop Nieuw.
Voer achtereenvolgens in: Sluiten en Toepassing afsluiten. Merk op
dat er maar twee items zijn. Klik hierna op de knop OK.
Het hoofdmenu is klaar. Klik op de knop Sluiten in het venster
Schakelbordpagina bewerken.
Er dient nog opgemerkt te worden dat in dit menu ook items gewij-
zigd of verwijderd kunnen worden, of op een andere plaats in het
menu gezet kunnen worden met de knoppen Omhoog en Omlaag.
Verder is het belangrijk te weten dat er maximaal acht items in n
menu passen.
Nu moeten de submenus Overzichten en Onderhoud nog gemaakt
worden. Dit gaat op dezelfde wijze.
Selecteer in het venster Schakelbordbeheer het item Overzichten
en klik hierna op de knop Bewerken.
In het volgende venster, Schakelbordpagina bewerken, kunnen we
de items van dit menu (schakelbord) opgeven. Klik op de knop
Nieuw en kies achtereenvolgens Klantenlijst, Macro uitvoeren en
rptKlantenlijst .Afdrukken.
Om de klantenlijst af te drukken hebben we immers voor het rap-
port Klantenlijst een macro gemaakt, genaamd rptKlantenlijst.
Afdrukken, die de klantenlijst direct naar de printer stuurt. We
kunnen in de tweede keuzelijst ook Rapport openen selecteren,
maar dan wordt het rapport als afdrukvoorbeeld getoond. We wil-
len het rapport echter direct naar de printer sturen, vandaar dat de
macro voor het rapport Klantenlijst noodzakelijk is.
Klik na de selecties op de knop OK.
Voer de vorige acties nog drie maal uit. Hieronder volgt een
beschrijving van de gegevens die moeten worden ingevoerd.
Argument Instelling
Tekst Vertreklijst
Opdracht Formulier openen in bewerkingsmodus
Formulier Datumbereik vertreklijst
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
334
De Vertreklijst wordt afgedrukt nadat eerst een formulier,
Datumbereik vertreklijst, op het scherm is getoond waarin we een
begin- en einddatum kunnen opgeven. Voor de Vertreklijst is het
niet noodzakelijk om een macro te maken die het overzicht af-
drukt, aangezien dat door de macro van het formulier Datumbereik
vertreklijst wordt uitgevoerd.
De omzetlijst dient met een macro gestart te worden, zodat deze
direct naar de printer gestuurd kan worden.
Kiezen we deze optie in het menu, dan gaan we n niveau
terug, naar het hoofdmenu. De menu-items voor het sub-
menu Overzichten zijn gedenieerd; we kunnen het venster
Schakelbordpagina bewerken afsluiten door op de knop Sluiten te
klikken.
Het laatste schakelbord (submenu Onderhoud) gaan we op dezelf-
de wijze maken.
Selecteer in het venster Schakelbordbeheer de optie Onderhoud en
klik op de knop Bewerken.
Hierna moeten de vijf items uit het submenu Onderhoud gede-
nieerd worden. We doen dit op dezelfde wijze als bij het submenu
Overzichten. Hieronder volgen de gegevens die ingevoerd moeten
worden.
Argument Instelling
Tekst Omzetlijst
Opdracht Macro uitvoeren
Macro rptOmzetlijst.Afdrukken
Argument Instelling
Tekst Sluiten
Opdracht Naar Schakelbord gaan
Schakelbord Hoofdmenu
Argument Instelling
Tekst Klanten
Opdracht Formulier openen in bewerkingsmodus
Formulier Klant
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
335
Het formulier Klant wordt geactiveerd onder dit item:
Het formulier Reis wordt geopend onder dit item:
Het formulier Bestemming wordt geactiveerd onder dit item:
Het formulier Constant wordt geopend onder dit item.
Wordt deze optie uit het menu gekozen, dan gaan we n
niveau terug, naar het hoofdmenu. De menu-items voor sub-
menu Overzichten zijn gedenieerd, we kunnen het venster
Schakelbordpagina bewerken afsluiten door op de knop Sluiten te
klikken. De menus (schakelborden) zijn gemaakt.
Sluit alle vensters van Schakelbordbeheer en kies in het database-
venster het overzicht Formulieren.
Open het formulier Schakelbord en controleer de werking van de
gemaakte menus.
Het formulier Schakelbord wordt in een afwijkende kleur getoond
ten opzichte van onze overige formulieren. We gaan het formulier
Argument Instelling
Tekst Reizen
Opdracht Formulier openen in bewerkingsmodus
Formulier Reis
Argument Instelling
Tekst Bestemmingen
Opdracht Formulier openen in bewerkingsmodus
Formulier Bestemming
Argument Instelling
Tekst Constanten
Opdracht Formulier openen in bewerkingsmodus
Formulier Constant
Argument Instelling
Tekst Sluiten
Opdracht Naar Schakelbord gaan
Schakelbord Hoofdmenu
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
336
Schakelbord op een aantal punten aanpassen, zodat het overeen-
stemt met onze overige formulieren. We kunnen het formulier
Schakelbord aanpassen aan onze eigen wensen zolang de detail-
sectie, het gedeelte waar de knoppen zitten, niet wordt veranderd.
Plaats het formulier Schakelbord in de ontwerpweergave op het
scherm.
Open het eigenschappenvenster van het formulier. Het schakelbord
is in een aantal secties verdeeld.
Selecteer de HorizontalHeaderBox (dat is de bovenste sectie).
Verwijder deze sectie (via Knippen).
De tekst t Zonnetje is met schaduw afgebeeld. Dit is gerealiseerd
door twee labels vlak onder elkaar te plaatsen. Selecteer Label2 en
verwijder dit label (Delete-toets).
Selecteer Label1. Verander in het tabblad Opmaak de eigenschap
Voorgrondkleur in zwart (klik op de drie puntjes) en de eigen-
schap Tekengewicht in Vet.
Nu plaatsen we de gebruikte lichtgele formulierkleur in de detail-
sectie. Klik op de balk Detail of selecteer deze uit de keuzelijst en
verander in het eigenschappenvenster, tab Opmaak, de eigenschap
Achtergrondkleur in lichtgeel door op de drie puntjes te klikken.
De linkerkant van het schakelbord is gereserveerd voor een af-
beelding. Met behulp van een tekenprogramma hebben wij voor
reisbureau t Zonnetje een afbeelding samengesteld, de naam is:
ZonLogo.gif.
Selecteer de sectie Picture van het schakelbord en selecteer in
het eigenschappenvenster de eigenschap Figuur, in het tabblad
Opmaak. Klik op de drie puntjes en kies voor het gif-plaatje
Zonlogo.
Verder kunnen we overwegen om de eigenschap Systeemmenu
van het formulier Schakelbord uit te schakelen, zodat alleen via de
knop Sluiten het formulier beindigd kan worden. Wij hebben dat
niet gedaan, zodat we met de X-knop kunnen sluiten zonder de
database af te sluiten. Het schakelbord is aangepast aan onze
smaak.
Bekijk het resultaat in de formulierweergave en pas eventueel de
afmetingen aan. Klik in de menubalk op de knop Opslaan om die
afmetingen vast te leggen.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
337
Om de toepassing volledig te maken moeten we nog een verande-
ring aanbrengen. We wensen het formulier Schakelbord meteen te
starten zodra de database wordt geopend; we komen dan meteen
in het hoofdmenu. Dat kan gerealiseerd worden door een macro
te maken met de naam AutoExec, waarin staat dat het formulier
Schakelbord geopend moet worden. Er is echter een betere metho-
de, waarbij we extra instellingen kunnen aangeven, zoals het
onderdrukken van het databasevenster.
Selecteer daartoe in de menubalk Extra de optie Opstarten..., het
formulier Opstarten wordt getoond, zie guur 9.40.
Bij Toepassingsnaam kunnen we eventueel een afwijkende titel
opgeven. Kies voor de titel Reisbureau.
In de keuzelijst Formulier/pagina weergeven kunnen we opgeven
welk formulier geopend moet worden zodra de database wordt
gestart.
Selecteer het formulier Schakelbord.
In het vakje Toepassingspictogram kunnen we een pictogram
opgeven voor de toepassing. Wij hebben op de cd-rom een picto-
gram voor onze database staan, genaamd t Zonnetje.ico. Door te
klikken op de drie puntjes kunnen we aangeven waar het picto-
gram te vinden is. We moe-ten de map aanwijzen waarin we de
gegevens van de cd-rom hebben gekopieeerd. In guur 9.40 wordt
een map geselecteerd waarin we de database en overige bestanden
hebben geplaatst. Op de statusbalk van Windows wordt nu het pic-
togram, een tropisch eiland, zichtbaar.
Verwijder het vinkje bij Databasevenster weergeven. Hierdoor
wordt het databasevenster niet meer getoond. Verwijder ook het
Figuur 9.40
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
338
vinkje bij Statusbalk weergeven. De Access statusbalk wordt dan
niet meer weergegeven.
De Menubalk en een Snelmenubalk veranderen we niet. In het
onderste deel van het scherm kunnen we een aantal opties met
betrekking tot menu- en werkbalken opgeven. Verwijder het
vinkje bij Volledige menus toestaan, Access gebruikt dan een
reeks beknopte ingebouwde menus, die bijvoorbeeld geen opmaak-
opdrachten bevatten. De standaard snelmenus wensen we niet, alle
mogelijkheden zitten al in de formulieren en knoppen ingebouwd.
Verwijder daartoe het vinkje bij Standaardsnelmenus toestaan. De
ingebouwde werkbalk mag niet getoond worden in onze toepas-
sing. Verwijder het vinkje bij Ingebouwde werkbalken toestaan.
Evenmin willen we dat de werkbalken gewijzigd kunnen worden,
verwijder daartoe het vinkje bij Wijzigingen in werkbalk/menu
toestaan.
In het geavanceerde gedeelte: de speciale toetsen, zoals F11 om het
databasevenster te tonen of Ctrl+F11 om te kunnen schakelen tus-
sen de aangepaste menubalk en de ingebouwde menubalk, zijn niet
wenselijk. Vink daartoe Speciale Access-toetsen gebruiken af.
Klik op de knop OK en start de toepassing opnieuw. De werkbalk
is verdwenen, de menubalk is verkleind en bij de applicatie is een
pictogram te zien.
Let op!
Iedere keer als de toepassing wordt gestart, wordt de verkleinde
menubalk getoond. Het aanbrengen van wijzigingen in de database
is niet meer mogelijk. De werkbalk en de ingebouwde menubalk
worden niet meer getoond. Om de toepassing te starten zonder de
opgegeven instellingen uit het menu Opstarten, starten we de toe-
passing met de Shift-toets ingedrukt!
Hiermee is de applicatie voltooid en kunnen we ermee aan de slag.
Nu volgen nog enige opmerkingen over het operationeel maken
van de applicatie.
Tijdens het bouwen van de applicatie neemt de omvang van de
database toe. Allerlei overbodige gegevens worden door Access
achter de schermen bewaard. Die overbodige gegevens kun-
nen verwijderd worden door in het menu Extra te kiezen voor
Databasehulpprogrammas, Database comprimeren en herstellen.
De omvang van de database zal aanzienlijk verkleind worden.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
339
Iedereen die weet dat een toepassing volledig te benaderen is door
deze op te starten met de Shift-toets ingedrukt, kan eenvoudig
(ongewenste) wijzigingen aan onze toepassing aanbrengen.
We kunnen een compacte versie van de database maken door
in het menu Extra voor Databasehulpprogrammas te kiezen.
Selecteer vervolgens Mde-bestand maken. Het hulpprogramma
vraagt om een naam en locatie voor het opslaan van onze com-
pacte versie. Er wordt een versie gemaakt met de extensie Mde.
Deze versie compileert de code, die automatisch is gemaakt door
de Wizard van de opdrachtknoppen, en comprimeert de database.
Om wijzigingen door te voeren in het ontwerp van onze database,
dienen we onze oorspronkelijke versie te gebruiken. Aangezien de
Mde-versie compacter is, werkt deze sneller dan de originele ver-
sie!
Als we de applicatie willen verspreiden onder gebruikers die niet
over een volledige versie van Access beschikken, kunnen we een
speciaal pakket kopen, genaamd Access Developer Extentions.
Hiermee kunnen we een runtime-versie van onze toepassingen
maken en deze distribueren.
Copyright 2007 Academic Service
Copyright 2007 Academic Service
10 SQL, Structured Query
Language
Bij de bovenstaande opsomming gaan we ervan uit dat de leerlin-
gen een case uitwerken waarbij de docent/begeleider de rol van
opdrachtgever/gebruiker speelt.
10.1 Inleiding
Bij het werken met databases hebben we ons tot nu toe beperkt tot
het werken met n standaardpakket op de pc. Er bestaan echter
nog vele andere databasepakketten, met name voor toepassingen
op grotere computers. Enkele bekende grote databasemanagement-
systemen (DBMSen) zijn Oracle, Ingres, SQLserver en DB2. Een
kenmerk van deze pakketten is dat ze geschikt zijn voor het bedie-
nen van vele gebruikers tegelijkertijd en het verwerken van grote
hoeveelheden gegevens.
Als gebruikers informatie willen opvragen uit de gebruikte
database, dienen zij zich te bedienen van de vraagtaal die in
het gebruikte pakket is opgenomen. In principe betekent dit dat
voor ieder DBMS een andere vraagtaal moet worden gebruikt.
Gelukkig ondersteunen vrijwel alle pakketten tegenwoordig een
gemeenschappelijke vraagtaal: SQL.
SQL, Structured Query Language, is in eerste aanzet ontwikkeld
door IBM, maar intussen gevolueerd tot een standaard. Kunnen
we werken met deze vraagtaal, dan betekent dit dus dat we infor-
matie kunnen opvragen uit vele databasesystemen.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
342
In dit hoofdstuk zullen we ons beperken tot het formuleren van
querys. Het toevoegen van gegevens aan de database of het wij-
zigen hiervan zal slechts zijdelings worden besproken. De reden
daarvoor is het feit dat bij het toevoegen en wijzigen van gegevens
vrijwel altijd gebruikgemaakt wordt van een applicatieprogramma,
dat de gebruiker op interactieve manier laat werken. Kennis van
SQL is daarbij eigenlijk niet noodzakelijk.
Ook voor het formuleren van standaard-querys zullen vaak appli-
caties ontwikkeld worden. Het is echter ondoenlijk om voor iedere
informatiebehoefte, zeker voor die welke slechts sporadisch optre-
den, een applicatie op te zetten. Dat kost te veel tijd en geld.
Binnen Access kunnen we voor het opvragen van informatie altijd
gebruikmaken van de query wizard, waardoor het lijkt alsof we
geen kennis van SQL hoeven te hebben. Op de achtergrond vormt
Access de query echter wel om tot SQL. Deze code is ook op te
vragen.
De reden om in dit boek toch SQL op te nemen is tweeledig. Ener-
zijds kunnen we met SQL terecht bij ieder modern DBMS, waar-
onder Oracle of DB2. Anderzijds zijn er enkele soorten opvragin-
gen en bewerkingen die we binnen Access alleen maar met SQL
kunnen uitvoeren. We kunnen dus ook binnen Access niet om SQL
heen.
10.2 Begrippen
Ter herinnering enige begrippen. SQL ziet de gegevens alsof deze
liggen opgeslagen in tabellen. Tijdens het logisch ontwerp spraken
we over entiteittypen. Een tabel bestaat uit een aantal rijen (ofte-
wel entiteit-occurrences) en kolommen (oftewel attribuuttypen).
Tabel ARTIKEL
Artikelnummer Omschrijving Verkoopprijs Voorraad Leveranciercode
64447 V-snaar 56,00 5 J3633
75558 Accu 225,00 2 K3773
84494 Stuurhoes 23,95 4 P4774
46644 Binnenspiegel 37,50 1 J3633
enzovoort
kolommen
Rijen
Copyright 2007 Academic Service
10 SQL, Structured Query Language
343
Om iedere rij uniek te kunnen identiceren is er een gegeven, of
een combinatie van gegevens die iedere rij uniek maken, de pri-
maire sleutel. In de tabel Artikel is dat het artikelnummer. In een
rij kunnen gegevens voorkomen die verwijzen naarde sleutel van
een (andere) tabel. Deze gegevens (of combinatie ervan) worden
vreemde sleutel (foreign key) genoemd. Een voorbeeld hiervan is
de leveranciercode. Die verwijst immers naar een soortgelijke tabel
waarin de gegevens van de leveranciers liggen opgeslagen en waar
we een leverancier kunnen identiceren met behulp van de code.
Om de betrouwbaarheid van de gegevens te waarborgen, worden
er aan de tabellen enkele eisen gesteld:
Een primaire sleutel mag geen overbodige attributen bevatten
(minimaliteiteis).
Er mogen geen dubbele rijen voorkomen en een primaire sleutel
moet altijd een gedenieerde waarde hebben (identity integrity).
Iedere waarde die een vreemde sleutel aanneemt, moet ook als
sleutelwaarde voorkomen (referential integrity).
Kolommen bevatten alleen elementaire gegevens, samengestelde
gegevens dienen dus opgesplitst te worden.
10.3 Opbouw hoofdstuk
In dit hoofdstuk zal worden gewerkt met twee verschillende data-
bases. De eerste betreft een database van een bibliotheek, die zal
worden gebruikt om de theorie toe te lichten aan de hand van enige
voorbeelden. Daarnaast dient een aantal opdrachten te worden
gemaakt, waarbij deze database moet worden gebruikt. Deze
opdrachten kunnen niet op de computer worden uitgewerkt, omdat
de betreffende database alleen op papier bestaat. De antwoorden
van de opdrachten staan op de meegeleverde cd-rom bij dit boek.
De tweede database betreft een database van een groothandel in
alcoholische dranken. Vraag deze aan de docent. De naam is Alco
en hij zal worden gebruikt om je vaardigheden in de praktijk te
toetsen. De praktijkgerichte opdrachten moeten worden uitgewerkt
met behulp van deze database.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
344
10.4 Database Bibliotheek (theorieopdrachten)
Een grote bibliotheek heeft meerdere lialen. Van alle uitgaven
kunnen er meerdere exemplaren aanwezig zijn, zelfs in n liaal.
Een lezer mag alleen maar boeken lenen in het eigen liaal. Lezers
kunnen uitgeleende boeken laten reserveren. Men maakt gebruik
van zes verschillende tabellen, met de volgende opbouw:
LEZER UITGAVE UITLENING
Lezernr ISBN * Lezernr
Naam Titel * Exemplaarnr
Adres Schrijver * Huurdatum
Postcode Uitgeverij * Retourdatum (datum waarop
Plaats Prijs * boek is teruggebracht)
Telefoon
Geboortedatum
* Filiaalnr
FILIAAL EXEMPLAAR RESERVERING
Filiaalnr Exemplaarnr * Lezernr
FilAdres * Filiaalnr * ISBN
FilPostcode * ISBN * Datum
FilPlaats
FilTelefoon
De primaire sleutels zijn onderstreept. Vreemde sleutels zijn voor-
zien van een sterretje.
Het bijbehorende ER-diagram is weergegeven in guur 10.1.
o.b.v. ISBN o.b.v. ISBN
o.b.v. lezernr
o.b.v. filiaalnr o.b.v. filiaalnr
o.b.v. lezernr
o.b.v. exemplaarnr
Reservering Uitgave
Filiaal Lezer
Uitlening
Exemplaar
Figuur 10.1
Copyright 2007 Academic Service
10 SQL, Structured Query Language
345
10.5 Database Alco (praktijkopdrachten)
Een groothandel in alcoholische dranken maakt onder meer
gebruik van de onderstaande tabellen.
ARTIKEL SOORT PRODUCTGROEP
Artikelcode Soortnr Productgroepnr
* Soortnr * Productgroepnr Productnaam
Jaar Naam
Inhoud Kleur
Adviesverkoopprijs Alcoholpercentage
Opvoorraad
FACTUUR FACTUURREGEL AFNEMER
Factuurnummer * Factuurnummer Afnemernummer
* Afnemernummer * Artikelcode Naam
Factuurdatum Verkoopaantal Adres
Verkoopprijs Postcode
Plaats
Regio
De primaire sleutels zijn onderstreept. Vreemde sleutels zijn voor-
zien van een sterretje.
Het bijbehorende ER-diagram is weergegeven in guur 10.2.
10.6 Opvragingen uit n tabel
De volgende voorbeelden hebben betrekking op de bibliotheek-
database. Om gegevens uit tabellen op te vragen moeten we
gebruikmaken van het SELECT-commando, dat de volgende
opbouw bezit:
factuurregel factuur afnemer
Artikel Soort Productgroep
o.b.v. artikelcode
o.b.v. productgroepnr o.b.v. soortnr
o.b.v. afnemernr o.b.v. factuurnr
Figuur 10.2
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
346
SELECT <te tonen kolom> [,<te tonen kolom>]
FROM <tabelnaam>
[ WHERE <voorwaarde> ] ;
De teksten tussen de scherpe haken <> geven aan dat daar de
betreffende gegevens dienen te worden ingevuld. Alles tussen
rechte haken [] geeft aan dat het gebruik van dat gedeelte toegesta-
an, maar niet verplicht is. De afsluitende puntkomma geeft het
einde van de opdracht aan. Deze is verplicht, omdat anders wordt
gewacht met de uitvoering van het commando.
Het overzicht wordt getoond in rijen. Per geselecteerde rij uit de
tabel worden de gevraagde kolommen afgedrukt. De uitvoer
bestaat dus ook weer uit een tabel.
De namen van alle lezers uit Rotterdam:
SELECT naam
FROM lezer
WHERE plaats = Rotterdam ; (let op de aanhalingstekens)
Uitvoer :
NAAM
Jansen
Pietersen
Gerritsen
enzovoort
De titels en prijzen van alle boeken van Hermans:
SELECT titel, prijs
FROM uitgave
WHERE schrijver = Hermans ;
Uitvoer :
TITEL PRIJS
Onder professoren 34,95
Donkere kamer van Damocles 29,95
enzovoort.
voorbeelden
Copyright 2007 Academic Service
10 SQL, Structured Query Language
347
Terzijde
Let op! Standaard wordt door SQL onderscheid gemaakt tussen
hoofd- en kleine letters! Binnen Access wordt hierin echter
(standaard) geen onderscheid gemaakt.
De adressen en telefoonnummers van alle lialen die binnen Breda
gelegen zijn:
SELECT ladres, ltelefoon
FROM liaal
WHERE lplaats = Breda ;
Alle gegevens afdrukken van alle lezers:
SELECT *
FROM lezer ;
We zien dat het niet noodzakelijk is om een voorwaarde op te
nemen in het SELECT-statement. Tevens zien we het gebruik van
het teken *, wat aangeeft dat alle kolommen van de genoemde
tabel moeten worden afgedrukt.
We kunnen bij de WHERE-optie gebruikmaken van meerdere
voorwaarden tegelijkertijd. De afzonderlijke voorwaarden kunnen
we door de logische operatoren OR of AND met elkaar verbinden.
Bij het door elkaar gebruiken van OR en AND is het verstandig
met haakjes te werken, om de juiste voorwaarden te combineren.
De titels van de boeken van Wolkers die minder dan 25, kosten,
en de titels van de boeken van Campert die bij uitgeverij de brede
letter zijn uitgegeven.
SELECT titel
FROM uitgave
WHERE (schrijver = Wolkers
AND prijs < 25 )
OR (schrijver = Campert
AND uitgeverij = de brede letter) ;
Bij het opgeven van voorwaarden, moeten we teksten omgeven
door aanhalingstekens; getallen kunnen we direct opnemen.
voorbeeld
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
348
Als we in een voorwaarde een datumaanduiding willen gebrui-
ken, moeten we de datum standaard aangeven volgens het formaat
mm-dd-jj, omgeven door twee hekjes. De datum 2 april 1955
moeten we dus opgeven als #4-2-55# of als #04-02-55#. De eeuw-
aanduiding laten we standaard weg, tenzij we Windows anders
hebben ingesteld. Hoe we de datum precies moeten intoetsen, is
afhankelijk van de instellingen van Windows. Ga dat dus zelf even
na. Ongeacht de datuminstelling van Windows moeten we binnen
het SQL-deel van Access altijd met de Amerikaanse notatiewijze
te werken, dus eerst de maand- en daarna pas de dagaanduiding!
We kunnen ook gebruikmaken van een alternatieve Amerikaanse
notatie, te weten: dd-MMM-jj, waarbij de maand wordt aangege-
ven door de eerste drie letters. De datum 3 mei 1981 wordt dan
#3-MAY-81#. In de Nederlandse versie gebruiken we uiteraard
#3-MEI-81#.
Terzijde
De datumnotatie tussen hekjes is geen standaard SQL-notatie en
werkt alleen in Access-SQL. In andere databases wordt een
andere datumnotatie gebruikt. Hetzelfde geldt voor de hieronder
besproken jokers (wildcards). In standaard SQL worden respec-
tievelijk _ en % gebruikt. Standaard werkt Access voor wat
betreft SQL met de standaard ANSI 89. Deze wijkt op een aantal
punten af van de standaard ANSI 92 die door de meeste andere
systemen wordt gebruikt. Om beter aan te sluiten bij de praktijk
(MS SQL-server) is het daarom vanaf versie 2000 mogelijk om
Access zo in te stellen dat ook dit zich houdt aan de standaard
ANSI 92. Maar querys die gemaakt zijn volgens de ene
standaard, kunnen niet zonder meer gebruikt worden in de
andere. Vooral bij het gebruik van wildcards zijn er belangrijke
verschillen. In dit boek is ervoor gekozen om Access te gebrui-
ken volgens de standaard ANSI 89. In bijlage B staat meer infor-
matie over hoe je kunt overschakelen naar ANSI 92.
In de voorwaarden kunnen we gebruikmaken van:
1. = , > , < , <= , >= en <>
WHERE prijs >= 49
Copyright 2007 Academic Service
10 SQL, Structured Query Language
349
2. BETWEEN ... AND ..... (De grenswaarden voldoen ook!)
IN ( waardenverzameling )
NOT
LIKE Bij de operator LIKE kunnen we gebruikmaken van de
tekens ? en/of *. Het teken ? geeft aan dat op die
positie n willekeurig teken moet staan. Het teken *
geeft aan dat op die plaats gn teken hoeft te staan,
of n willekeurig teken, of een hele serie willekeurige
tekens.
IS NULL Vergelijken op een leeg veld. Let op, gebruik niet het
teken =, maar het woord IS.
WHERE prijs BETWEEN 20 AND 30
WHERE prijs IN ( 10, 15, 27, 49 )
WHERE prijs NOT IN ( 10, 15, 27, 49 )
WHERE schrijver LIKE ?olk*
De laatste voorwaarde selecteert dus bijvoorbeeld de schrijvers
Wolkers, Tolkien en Kolk.
WHERE Geboortedatum LIKE 02-03-*
Welke lezers zijn er op 3 februari jarig? Let op, nu zijn de nullen
wel verplicht en de datum moet als tekst zijn opgegeven!
WHERE schrijver <> Wolkers
OR schrijver IS NULL
Zonder de toevoeging OR schrijver IS NULL worden de boeken
waarbij geen schrijver is opgenomen niet afgedrukt omdat een
vergelijking met een leeg veld altijd de waarde FALSE oplevert.
Door een extra voorwaarde op te nemen en dus expliciet te testen
op een leeg veld, worden ook deze rijen opgenomen in de uitvoer-
tabel.
WHERE DatumRetour - DatumLenen > 7
Wie heeft er langer dan een week geleend? Het verschil tussen
twee datums levert het aantal dagen dat daartussen ligt. We kun-
nen dus gewoon met datums rekenen!
WHERE Geboortedatum BETWEEN 05-01-88 AND 05-31-88
Welke lezers zijn er in Mei 1988 geboren?
voorbeelden
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
350
Het kan voorkomen dat bij bepaalde opvragingen meerdere keren
dezelfde rij zou worden afgedrukt. Als we bijvoorbeeld alle woon-
plaatsen van de lezers laten afdrukken, zullen diverse woonplaat-
sen zeer waarschijnlijk meerdere keren voorkomen. Als we alle
geproduceerde rijen slechts n maal in het overzicht willen opne-
men, dan breiden we het SELECT-statement uit met de toevoeging
DISTINCT. Door de verwerkingswijze van DISTINCT blijkt dat
de uitvoer nu ook automatisch gesorteerd is op volgorde van de te
tonen kolommen.
SELECT DISTINCT woonplaats
FROM lezer ;
Om een overzicht van de namen van de schrijvers met de naam
van de uitgeverij van het betreffende boek te krijgen, zonder dub-
bele combinaties, formuleren we het volgende commando:
SELECT DISTINCT schrijver, uitgeverij
FROM uitgave ;
Hierbij kan wel de naam van een schrijver meerdere keren voor-
komen, evenals de naam van een uitgeverij, maar iedere combina-
tie wordt hoogstens n keer in het overzicht opgenomen.
Opgaven
10.1 Verzorg aan de hand van de tabellen die behoren bij de bibliotheek-
database de volgende overzichten:
a. Alle gegevens van alle uitgaven.
b. De telefoonnummers en postcodes van alle lezers uit Leiden die
nog niet meerderjarig zijn.
c. De namen van de schrijvers die ooit een boek hebben uitgege-
ven bij uitgeverij De dunne kaft.
d. De namen van de uitgeverijen die ooit een boek van Wolkers
hebben uitgebracht.
e. De datums waarop lezer 64489 boeken heeft geleend, na 1980.
f. De nummers van de lialen die minimaal n exemplaar heb-
ben van het boek met ISBN 9062335306.
10.2 Wanneer kan het voorkomen dat in een overzicht meerdere rijen
hetzelfde zijn? Gebruik in het antwoord de term primaire sleutel.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
351
10 SQL, Structured Query Language
351
10.3 a. Geef een mening omtrent het opnemen van de kolom Prijs in
de tabel UITGAVE.
b. Geef een mening omtrent de opbouw van de sleutel in de tabel
UITLENING.
10.7 SQL gebruiken in Access
Om binnen Access met SQL te werken moeten we eerst de betref-
fende database openen via Bestand, Database openen. Selecteer
het overzicht Querys. Om een nieuwe query te ontwerpen gebrui-
ken we de knop Nieuw.
Uit de geboden mogelijkheden in guur 10.3, Nieuwe query, kie-
zen we voor het ontwerpen in de Ontwerpweergave. Op het scherm
wordt nu guur 10.4 getoond, waarin we kunnen opgeven welke
tabellen we bij onze query willen gebruiken.
Figuur 10.3
Figuur 10.4
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
352
Omdat we in de SQL-query zelf opgeven welke tabellen we wen-
sen te gebruiken, sluiten we het venster Tabel toevoegen direct af,
via de knop Sluiten, zonder een tabel te selecteren.
Het scherm dat nu gepresenteerd wordt (zie guur 10.5), is bedoeld
om op de Access-manier, dus muisgestuurd, de querys te ontwer-
pen. We kunnen nu het scherm selecteren waarin we zelf SQL-
querys kunnen invoeren (guur 10.6) door in het menu te kiezen
voor Beeld, SQL, of door gebruik te maken van de knop Beeld,
links in de werkbalk.
We zien dat het woord SELECT al voor ons is neergezet. We kun-
nen nu de query intoetsen, waarna we hem kunnen laten uitvoeren
door op de knop Uitvoeren te drukken (de toets met het uitroep-
teken). Ook kunnen we in het menu kiezen voor Query, Uitvoeren.
Op het scherm wordt de uitvoer van de query getoond, of een fout-
melding omdat de query niet juist is opgesteld. In het laatste geval
kunnen we na het lezen van de foutmelding kiezen voor OK en de
query direct verbeteren.
Als de query foutloos is en dus wordt uitgevoerd zal Access het
resultaat op het scherm plaatsen. Deze uitvoer kunnen we op de
gebruikelijke wijze afdrukken op papier: via Bestand, Afdrukken
of door gebruik te maken van de knop Afdrukken.
Figuur 10.5
Copyright 2007 Academic Service
10 SQL, Structured Query Language
353
We keren weer terug naar het ontwerpscherm door in het menu
te kiezen voor Beeld, SQL of door weer gebruik te maken van de
knop Beeld. In het laatste geval moeten we het bij die knop beho-
rende menu even naar beneden trekken door te klikken op de knop
en vervolgens te kiezen voor SQL.
Een eenmaal ontwikkelde query kunnen we bewaren via Bestand,
Sluiten. Ook kunnen we het ontwerpscherm afsluiten. In dat geval
zal Access ons vragen of we de query wensen te bewaren en zo ja,
onder welke naam.
Bestaande querys openen we door ze in het overzicht Querys te
selecteren en vervolgens te kiezen voor Ontwerpen. Bestaande
querys kunnen we ook direct laten uitvoeren door ze te selecteren
en vervolgens te kiezen voor Openen. Ook querys die zijn ontwor-
pen met een wizard, zonder gebruik te maken van SQL, kunnen
we altijd in SQL opvragen. Daartoe selecteren we de betreffende
query in het ontwerpscherm en kiezen vervolgens Beeld, SQL.
Ook het omgekeerde is meestal mogelijk.
Let op! Standaard SQL gaat ervan uit dat de namen van de kolom-
men altijd uit n woord bestaan. Bij Access kunnen we echter
kolomnamen uit meerdere woorden laten bestaan. Deze namen
Figuur 10.6
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
354
kunnen we dan alleen in een SQL-query gebruiken als we de
betreffende naam tussen rechte haken plaatsen, dus SELECT
[Aantal kamers], [Totale oppervlakte] .... Dit geldt ook voor de
namen van de tabellen.
In dit hoofdstuk gebruiken we SQL binnen Access. Om SQL te
kunnen gebruiken, hebben we op zich Access niet nodig. Een zelf-
standig programma dat toegang verschaft tot de gewenste database
voldoet. Een dergelijk programma is het programma S(impel)QL,
dat door A.H.J. Kuipers, docent aan de Hogeschool Rotterdam,
ontwikkeld is en dat door het onderwijs gratis te gebruiken is. Dit
programma maakt via MS JetSQL verbinding met de database en
kan zelfs worden gebruikt zonder dat Access op de PC is genstal-
leerd. Het programma houdt zich aan de ofcile SQL-standaard,
dit in tegenstelling tot Access dat hier op een aantal plekken net
even iets van afwijkt. Je vindt het programma S(impel)QL en een
uitvoerige handleiding op de bij dit boek behorende CD.
Opgave
10.4 Voer de volgende opdrachten uit aan de hand van de Alco-data-
base.
a. Start Access of S(impel)QL en activeer de database Alco.
Gebruik bij de beantwoording de beschrijving van de database
zoals je deze terug vindt in paragraaf 10.5.
b. Laat alle gegevens van de afnemers afdrukken.
c. Welke productsoorten worden er aangeboden? Laat naam, kleur
en alcoholpercentage afdrukken.
d. Welke facturen zijn er verstuurd op 28 of 29 juni 2005? Laat de
factuurnummers afdrukken.
e. Welke Artikelen hebben een adviesverkoopprijs onder de
25 euro en een voorraad van meer dan 30 stuks? Laat het soort-
nummer en jaartal afdrukken.
f. Welke rode dranken met een alcoholpercentage van 10 of meer
kunnen worden geleverd. Laat het productgroepnummer en de
naam afdrukken.
g. Bij welke artikelen is geen adviesverkoopprijs opgenomen?
h. Op welke dagen hebben we gefactureerd?
i. Toon alle artikelen uit de productgroepen wijn, port, rose en
sherry.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
355
10.8 Eenvoudige opvragingen uit meerdere tabellen
In de vorige paragraaf hebben we ons beziggehouden met het uit-
voeren van opvragingen uit n enkele tabel. Vaak zullen de
gegevens echter uit meerdere tabellen komen. We maken dan
gebruik van hetzelfde SELECT-statement, maar geven bij het
FROM-gedeelte nu meerdere tabellen op.
SELECT <te tonen kolom> [,<te tonen kolom>]
FROM <tabelnaam> [,<tabelnaam>]
[ WHERE <voorwaarde> ] ;
Als we meerdere tabellen opgeven, wordt iedere rij uit de ene
tabel gecombineerd met alle andere rijen uit de andere tabellen.
We noemen dit een join. Als we twee tabellen met ieder 100 rijen
combineren, ontstaan dus 10.000 rijen! Bij grote tabellen neemt
het totale aantal gegenereerde rijen explosief toe. Deze explosie
dienen we tegen te gaan. Het is vrijwel altijd zinloos om alle rijen
uit de ene tabel te combineren met alle rijen uit de andere tabel. We
mogen alleen de zinvolle combinaties toestaan. Daartoe maken we
gebruik van het WHERE-gedeelte.
We geven een voorbeeld: een overzicht van de namen en num-
mers van de lezers die in een liaal in Breda hun boeken lenen. We
vinden de naam van een lezer in de tabel LEZER. Of een liaal
in Breda ligt, is te vinden in de tabel FILIAAL. We kunnen nu
de rijen uit de tabel LEZER uitbreiden met de rijen uit FILIAAL.
Het combineren van twee rijen heeft alleen maar zin voor die
rijen waarbij een gelijk liaalnummer optreedt. De rij uit de tabel
FILIAAL met liaalnummer 12 combineren we dus alleen met die
rijen uit LEZER waar ook liaalnummer 12 staat vermeld. Bedenk
dat liaalnr in LEZER een vreemde sleutel is, waarbij verwezen
wordt naar liaalnr in FILIAAL.
SELECT lezer.naam, lezer.lezernr
FROM lezer , liaal
WHERE lezer.liaalnr = liaal.liaalnr
AND liaal.lplaats = Breda ;
Hierbij is allereerst opgegeven wat er in het overzicht moet worden
opgenomen. Daarbij moet de kolomnaam voorafgegaan worden
voorbeeld
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
356
door de naam van de bijbehorende tabel, van elkaar gescheiden
door een punt. De tabelnaam mag achterwege gelaten worden als
de kolomnaam uniek is voor de in het FROM-gedeelte opgesomde
tabellen. Ook goed is dus:
SELECT naam, lezernr
FROM lezer , liaal
WHERE lezer.liaalnr = liaal.liaalnr
AND lplaats = Breda ;
Vervolgens wordt opgegeven uit welke tabellen gegevens benodigd
zijn. Hierna worden de juiste rijen van de tabellen met elkaar ge-
combineerd. In dit geval gebeurt dit op basis van gelijk liaalnum-
mer. Bovendien wordt er alleen maar gecombineerd voor de rijen
uit FILIAAL waarbij geldt dat in de kolom plaats de waarde Breda
staat. Omdat een lezer slechts in n liaal boeken mag lenen, en
omdat de lezernummers uniek zijn, zullen er in het overzicht geen
dubbele rijen voorkomen.
We willen een overzicht van de titels van de boeken die lezer
355267 in januari 2001 geleend heeft.
De gegevens komen uit de tabellen UITLENING, EXEMPLAAR
en UITGAVE. Voor het tot stand brengen van de juiste combina-
ties moeten we kijken naar de in de tabellen overeenkomende
kolommen. Voor het op de juiste manier combineren komen we
dan op de volgende beperkingen:
WHERE uitlening.exemplaarnr = exemplaar.exemplaarnr
AND exemplaar.isbn = uitgave.isbn
Daarnaast hebben we nog te maken met beperkingen die uit de
vraagstelling volgen, te weten:
AND uitlening.lezernr = 355267
AND uitlening.datum >= #1-1-01#
AND uitlening.datum <= #1-31-01# ( of BETWEEN )
Om het typewerk te beperken zullen we niet steeds de volledige
naam opnemen bij de kolomaanduiding, maar een zogeheten alias.
Daarbij geven we in het FROM-gedeelte voor de tabellen een alias-
naam op, door de tabelnaam te laten volgen door de door ons
voorbeeld
Copyright 2007 Academic Service
10 SQL, Structured Query Language
357
gewenste alias-naam, gescheiden door een spatie. Bij het aandui-
den van de tabellen moeten we vervolgens de alias-naam gebrui-
ken.
SELECT DISTINCT u.titel
FROM uitgave u , exemplaar e, uitlening ul
WHERE ul.exemplaarnr = e.exemplaarnr
AND e.isbn = u.isbn
AND ul.lezernr = 355267
AND ul.datum>= #1-1-01#
AND ul.datum<= #1-31-01# ;
In de query is de toevoeging DISTINCT opgenomen omdat een
titel meerdere keren kan voorkomen in het overzicht. De lezer kan
immers meer dan eens hetzelfde boek lenen!
We kunnen een SQL-query in Access (geen standaard SQL) exi-
bel maken, op dezelfde wijze die we eerder zijn tegengekomen bij
het werken met gewone Access-querys. Daartoe gebruiken we in
een voorwaarde een variabele. De naam hiervan mag niet gelijk
zijn aan de naam van een kolom uit een van de betrokken tabel-
len. Voordat de query wordt uitgevoerd, zal Access om de waarde
vragen die aan de variabele moet worden toegekend. We kunnen
van de voorgaande query de uitvoer exibel maken door de laatste
twee regels te wijzigen in:
AND ul.datum >= Startdatum
AND ul.datum <= Einddatum ;
Access vraagt zowel voor de variabele Startdatum als voor de
variabele Einddatum de waarde. Deze waarde zal in de query
worden ingevuld. Daarna wordt de query pas uitgevoerd. We kun-
nen nu dus ook een overzicht opvragen over heel 1997, of over de
eerste week van mei, of van het derde kwartaal, of...
We kunnen ook een overzicht maken van alle titels waarvoor een
reservering bestaat. Merk op dat het opnemen van DISTINCT
noodzakelijk is.
SELECT DISTINCT u.titel
FROM uitgave u , reservering r
WHERE u.isbn = r.isbn ;
voorbeeld
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
358
Tip: Uit een tabel alle kolommen nodig? Maak dan gebruik van het
teken *.
Bijvoorbeeld : lezer.*
of exemplaar.liaalnr, uitgave.*
of e.liaalnr, u.*
Opgaven
10.5 Verzorg aan de hand van de tabellen die behoren bij de bibliotheek-
database de volgende overzichten:
a. De namen van de lezers die ooit een boek van Wolkers hebben
geleend.
b. Een overzicht van alle gegevens van de lezers die lenen bij lia-
len die in Leiden gelegen zijn.
c. Alle titels van de boeken die in Rotterdamse lialen aanwezig
zijn.
d. Een overzicht van alle boekgegevens van boeken met dezelfde
titel als de door Campert geschreven boeken. (Aanwijzing: we
kunnen een tabel ook met zichzelf combineren.)
10.6 Voer de volgende opdrachten uit aan de hand van de Alco-data-
base.
a. Start Access of S(impel)QL en activeer de database Alco.
Gebruik bij de beantwoording de beschrijving van de database
zoals je deze terug vindt in paragraaf 10.5
b. Aan wie is op 29 juni 2005 een factuur verstuurd? Laat naam,
adres, postcode en plaats afdrukken.
c. Welke whiskys hebben een alcoholpercentage hoger dan 40?
Laat productnaam, soortnummer en naam afdrukken.
d. Aan wie hebben we op 30 juni 2005 n of meer essen
Riesling des Cigognes gefactureerd? Laat het factuurnummer
en afnemernummer afdrukken.
e. Welke wijnen uit het jaar 1996 hebben we in het assortiment?
Laat de naam, inhoud en adviesverkoopprijs afdrukken.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
359
10.9 Wijzigen van de volgorde
Tot nu toe is de volgorde waarin de rijen van de uitvoertabel
werden getoond willekeurig totstandgekomen. Vaak zal de gebrui-
ker behoefte hebben aan een uitvoer die op een bepaalde wijze
gesorteerd is. Daartoe kunnen we het SELECT-commando uit-
breiden met ORDER BY.
SELECT <te tonen kolom> [,<te tonen kolom>]
FROM <tabelnaam> [,<tabelnaam>]
[ WHERE <voorwaarde> ]
[ ORDER BY <te tonen kolom> [ASC/DESC] ] ;
De toevoeging ORDER BY zal de uitvoer laten zien in volgorde
van de waarden, opgeslagen in de opgegeven kolom. Door meer-
dere kolommen op te geven, gescheiden door een komma, wordt
bij gelijke waarde in de eerste kolom verder gesorteerd op basis
van de daarna opgesomde kolom(men). Met de optie ASC wordt
oplopend gesorteerd (standaard), met de optie DESC wordt de
uitvoer in aopende volgorde gesorteerd. Bij sorteren op meerdere
kolommen kunnen we per kolom de optie ASC of DESC opgeven.
Een overzicht van de boeken aanwezig in Leiden. Getoond moeten
worden: ISBN en titel, gesorteerd op titel.
SELECT DISTINCT u.isbn, titel
FROM uitgave u, exemplaar e, liaal f
WHERE u.isbn = e.isbn
AND e.liaalnr = f.liaalnr
AND lplaats = Leiden
ORDER BY titel ;
Opmerkingen
1. Omdat de kolomnamen titel en lplaats uniek zijn voor de
gebruikte tabellen, is het niet noodzakelijk daar een tabelnaam of
alias toe te voegen.
2. De toevoeging ASC mag worden weggelaten, omdat dit de stan-
daardsorteervolgorde is.
3. De toevoeging DISTINCT is gebruikt omdat van een boek meer
dan n exemplaar aanwezig kan zijn. Hiervan hoeft slechts n
keer opgave gedaan te worden.
voorbeeld
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
360
Een overzicht van alle titels en prijzen. In alfabetische volgorde
van titel, bij gelijke titel dalend op prijs.
SELECT titel, prijs
FROM uitgave
ORDER BY titel, prijs DESC
Opgaven
10.7 Verzorg aan de hand van de tabellen die behoren bij de bibliotheek-
database de volgende overzichten:
a. Een lijst met alle gegevens van alle lezers, gesorteerd op naam.
Bij
gelijke naam moet verder worden gesorteerd op woonplaats.
b. Een lijst van de nu uitgeleende boeken (titel en schrijver), gesor-
teerd op exemplaarnummer.
c. Een lijst met daarop alle liaalgegevens, gesorteerd op post-
code.
10.8 Voer de volgende opdrachten uit aan de hand van de Alco-data-
base.
a. Start Access of S(impel)QL en activeer de database Alco.
Gebruik bij de beantwoording de beschrijving van de database
zoals je deze terug vindt in paragraaf 10.5
b. Geef een lijst met alle gegevens van alle klanten, gesorteerd op
naam.
c. Geef een lijst met alle door ons te leveren productnamen, gesor-
teerd op productnaam.
d. Geef een overzicht van alle artikelen op volgorde van aopende
esinhoud. Bij gelijke esinhoud sorteren op oplopend jaartal
en bij gelijk jaartal doorsorteren op aopende adviesverkoop-
prijs.
e. Geef een overzicht van namen van de afnemers voor wie we
op 29 of 30 juni 2005 een factuur hebben aangemaakt. Laat het
factuurnummer, de factuurdatum en de naam van de afnemer
afdrukken, op volgorde van naam.
f. Welke rode wijnen kunnen we leveren? Laat de naam, es-
inhoud en adviesverkoopprijs tonen. De duurste es moet als
eerste worden getoond, de goedkoopste als laatste.
voorbeeld
Copyright 2007 Academic Service
10 SQL, Structured Query Language
361
10.10 Rekenkundige bewerkingen
We kunnen de gegevens uit tabellen op een rekenkundige manier
laten bewerken. Daartoe staan ons in standaard-SQL de volgende
functies ter beschikking:
MIN ( <kolomnaam> ) Bepaalt de kleinste optredende waarde in
de uitvoertabel, voor de opgegeven kolom.
MAX ( <kolomnaam> ) Bepaalt de grootste optredende waarde
in de uitvoertabel, voor de opgegeven kolom.
AVG ( <numerieke kolom> ) Bepaalt de gemiddelde waarde
in de uitvoertabel aan de hand van de getallen in de opgegeven
kolom.
COUNT ( * ) Bepaalt het aantal rijen in de uitvoertabel.
COUNT ( <kolomnaam> ) Bepaalt het aantal rijen met een niet-
lege kolomwaarde in de genoemde kolom van de uitvoertabel.
COUNT ( DISTINCT <kolomnaam> ) Bepaalt het aantal ver-
schillende waarden dat optreedt in de genoemde kolom van de
uitvoertabel. Als we Access hebben ingesteld volgens de standaard
ANSI 89 dan wordt deze functie niet ondersteund. Bij het gebruik
van de standaard ANSI 92 wel. Voor meer toelichting, zie bijlage
B. De op de CD bijgeleverde tool S(imple)QL ondersteunt deze
functie (uiteraard) wel.
SUM ( <numerieke kolom> ) Bepaalt de som van de getallen in
de opgegeven kolom van de uitvoertabel. Ook hier is (ofcieel) de
toevoeging DISTINCT toegestaan en ook dit wordt door Access,
ingesteld op de standaard ANSI 89, niet ondersteund.
Het aantal uitgaven waarbij een schrijver bekend is:
SELECT COUNT (schrijver)
FROM uitgave ;
De prijs van het duurste boek.
SELECT MAX(prijs)
FROM uitgave ;
Het aantal schrijvers waarvan boeken aanwezig zijn:
SELECT COUNT (DISTINCT schrijver)
FROM uitgave ;
voorbeeld
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
362
Deze query werkt wel in standaard SQL, maar helaas niet in
Access, wel in S(imple)QL!
De gemiddelde prijs van de boeken :
SELECT AVG(prijs) of SELECT SUM(prijs)/COUNT(*)
FROM uitgave FROM uitgave ;
In de twee laatstgenoemde querys kunnen we twee verschillende
antwoorden vinden, omdat functies die op velden werken (bijvoor-
beeld AVG en SUM), lege velden (NULL) buiten beschouwing
laten, en COUNT(*) doet dat niet!
Opmerkingen
1. De volgende query zal leiden tot een foutmelding omdat de kolom
plaats meerdere waarden kan opleveren en de functie slechts n.
Het totale aantal lezers uit Dordrecht:
SELECT plaats , COUNT(*)
FROM lezer
WHERE plaats = Dordrecht ;
We kunnen deze query wel anders formuleren:
SELECT MIN(plaats) , COUNT(*)
FROM lezer
WHERE plaats = Dordrecht ;
Uitvoer:
MIN(plaats) COUNT(*)
Dordrecht 1283
Omdat in de uitvoertabel alleen de kolomwaarde Dordrecht voor-
komt, zal als minimumwaarde ook Dordrecht worden gevonden.
2. Omdat door het opgeven van bewerkingen de kop boven een kolom
een vreemd opschrift krijgt, kunnen we expliciet opgeven welke
tekst als koptekst moet worden afgedrukt. Dit is niet beperkt tot
de resultaten van bewerkingen, we mogen dit ook doen bij gewone
kolommen. We geven hiertoe achter de bewerking de toevoeging
AS, gevolgd door het door ons gewenste opschrift.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
363
SELECT MIN(plaats) AS Plaats , COUNT(*) AS Aantal
FROM lezer
WHERE plaats = Dordrecht ;
Uitvoer:
Plaats Aantal
Dordrecht 1283
3. Behalve de eerdergenoemde functies kent Access er nog veel meer,
die hier echter niet besproken worden. We kunnen via de ingebou-
wde hulp meer informatie opvragen.
Opgaven
10.9 Verzorg aan de hand van de tabellen die behoren bij de bibliotheek-
database de volgende overzichten:
a. Het aantal uitgeleende exemplaren van Wolkers.
b. Het aantal exemplaren van het boek Onder professoren van
Hermans dat aanwezig is in de Rotterdamse lialen.
c. De gemiddelde prijs van de uitgeleende boeken.
d. Het aantal uitgaven waarvan geen prijs bekend is.
e. De geboortedatum van de oudste lezer.
f. Het aantal uitleningen gedurende de maand januari 2001.
g. Het aantal uitgaven dat nu uitgeleend is.
10.10 Voer de volgende opdrachten uit aan de hand van de Alco-data-
base.
a. Start Access of S(impel)QL en activeer de database Alco.
Gebruik bij de beantwoording de beschrijving van de database
zoals je deze terug vindt in paragraaf 10.5
b. Hoeveel klanten hebben we?
c. Hoeveel facturen zijn er verstuurd op 29 Juni 2005?
d. Hoeveel essen hebben we op dit moment totaal in voorraad?
e. Wat is de gemiddelde adviesverkoopprijs van wijnen uit het jaar
1999?
f. Wat kost de duurste rode wijn?
g. Van welke whisky hebben we het kleinste aantal essen op
voorraad? Toon het gevonden aantal.
h. Van welke whisky hebben we het grootste aantal liters op voor-
raad? Toon het gevonden aantal.
i. Voor welk bedrag is er op 29 Juni 2005 gefactureerd aan klan-
ten die niet uit Rotterdam komen?
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
364
10.11 Groeperen
Vaak hebben gebruikers de wens gegevens gegroepeerd op een
gemeenschappelijk kenmerk ter beschikking te hebben. Om aan
deze wens te voldoen, is het mogelijk het SELECT-statement uit te
breiden met de toevoeging GROUP BY.
SELECT <te tonen kolom> [,<te tonen kolom>]
FROM <tabelnaam> [,<tabelnaam>]
GROUP BY <kolomnaam> [,<kolomnaam>]
[HAVING <voorwaarde(n)> ] ;
De toevoeging GROUP BY <kolomnaam> zal de rijen groeperen
op basis van de waarden in de genoemde kolom. Per gevonden
groep wordt vervolgens de uitvoer gegenereerd. Er ontstaat daarbij
per gevonden groep slechts n rij, de groepsrij. Als gevolg hiervan
mogen in het SELECT-gedeelte dan ook alleen maar de kolom-
men worden genoemd die ook in de GROUP BY-regel voorkomen.
Andere kolommen zijn niet toegestaan, omdat er in die kolommen
verschillende waarden kunnen voorkomen. Welke van die waarden
zou moeten worden afgedrukt? In het SELECT-gedeelte mogen
wel functies worden gebruikt, omdat een functie altijd precies n
waarde oplevert.
Een overzicht van alle schrijvers waarvan boeken aanwezig zijn:
SELECT schrijver
FROM uitgave
GROUP BY schrijver ;
Alle schrijvers komen slechts n maal in het overzicht voor.
Een alternatieve oplossing:
SELECT DISTINCT schrijver
FROM uitgave ;
De onderstaande query is NIET toegestaan:
SELECT schrijver, titel
FROM uitgave
GROUP BY schrijver ;
voorbeeld
voorbeeld
Copyright 2007 Academic Service
10 SQL, Structured Query Language
365
Na het groeperen op schrijver(naam) kan de naam worden afge-
drukt. De naam heeft immers in de betreffende groep van uit-
gegeven boeken steeds dezelfde waarde. Maar de titel kan niet
worden afgedrukt omdat iedere uitgave in principe een andere titel
heeft. Welke titel zou moeten worden geselecteerd?
Een overzicht van alle schrijvers, tezamen met het aantal door hen
geschreven boeken:
SELECT schrijver, COUNT(*)
FROM uitgave
GROUP BY schrijver ;
Van iedere schrijver worden de naam en het aantal aangetroffen
titels afgedrukt. Bedenk dat we nu wel een kolom kunnen combi-
neren met een functie, omdat beide nu slechts n waarde
opleveren. Als we een functie combineren met een GROUP BY,
dan werkt de functie per groep!
Met de toevoeging HAVING kunnen we bepalen welke groepen in
het overzicht moeten worden opgenomen. Wat WHERE doet met
rijen, doet HAVING met groepen. Bij HAVING is echter het
gebruik van functies toegestaan.
Een overzicht van de schrijvers die meer dan tien titels op hun
naam hebben staan:
SELECT schrijver
FROM uitgave
GROUP BY schrijver
HAVING COUNT(*) > 10 ;
Een overzicht van de uitgebrachte boeken per schrijver per uit-
geverij, tezamen met het aantal uitgebrachte boeken:
SELECT schrijver, uitgeverij, COUNT(*)
FROM uitgave
GROUP BY schrijver, uitgeverij ;
Een GROUP BY mag dus bestaan uit meerdere kolommen. Per
unieke combinatie wordt in dat geval een rij in de uitvoertabel
opgenomen.
voorbeeld
voorbeeld
voorbeeld
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
366
Per schrijver de prijs van het duurste boek dat door hem of haar is
geschreven:
SELECT schrijver, MAX(prijs)
FROM uitgave
GROUP BY schrijver ;
Er gelden enkele specieke eigenschappen bij het gebruik van
GROUP
BY:
1. In het SELECT-gedeelte mogen alleen die kolommen worden
opgesomd die ook voorkomen in het GROUP BY-gedeelte, als-
mede functies. Het is overigens niet verplicht het GROUP BY-
argument op te nemen in de SELECT-regel.
2. Functies werken nu per groep en mogen wel kolommen bevatten
waarop niet wordt gegroepeerd.
3. Per groep wordt slechts n rij in de uitvoertabel opgenomen.
4. We kunnen groeperen aan de hand van meerdere kolommen. Per
unieke combinatie ontstaat een rij.
5. We kunnen met HAVING voorwaarden opleggen aan de groepen.
Alleen groepen die voldoen aan de voorwaarde worden opgeno-
men in de uitvoertabel. We mogen hier alleen de kolommen
gebruiken die ook in het GROUP BY-gedeelte voorkomen, als-
mede functies.
Eerder hebben we gezien dat bij een SELECT-commando ook de
toevoegingen WHERE en ORDER BY kunnen worden gebruikt.
Dat blijft uiteraard zo.
SELECT <te tonen kolom> [,<te tonen kolom>]
FROM <tabelnaam> [,<tabelnaam>]
[ WHERE <voorwaarde(n)> ]
GROUP BY <kolomnaam>
[ HAVING <voorwaarde(n)> ]
[ ORDER BY <te tonen kolom> [ASC/DESC] ] ;
De volgorde waarin de diverse stappen worden doorlopen, is nu als
volgt:
1. Welke tabellen gebruiken? (FROM)
2. Welke rijen selecteren? (WHERE)
voorbeeld
Copyright 2007 Academic Service
10 SQL, Structured Query Language
367
3. Welke groepen maken? (GROUP BY)
4. Welke groepen selecteren? (HAVING)
5. Welke kolommen in de uitvoer? (SELECT)
6. Welke volgorde in de uitvoer? (ORDER BY)
Een overzicht van de lialen met meer dan 1000 leden die voor
1980 geboren zijn. Ook het betreffende aantal moet worden
afgedrukt. Het overzicht moet worden gesorteerd op het aantal
aangetroffen leden.
SELECT liaalnr, COUNT(*)
FROM lezer
WHERE geboortedatum < #1-1-80#
GROUP BY liaalnr
HAVING COUNT(*) > 1000
ORDER BY COUNT(*) ;
Hier wordt allereerst de tabel lezer geselecteerd. Uit deze tabel
worden de leden geselecteerd die voor 1980 geboren zijn. Deze
leden worden vervolgens gegroepeerd op liaalnummer. Per
groep wordt bekeken of er meer dan 1000 rijen aanwezig zijn. Als
dit zo is, wordt het liaalnummer, alsmede het aantal aangetrof-
fen rijen, opgenomen in de uitvoertabel. (Per groep wordt slechts
n maal het liaalnummer afgedrukt, omdat dubbele rijen in de
uitvoertabel automatisch worden geschrapt.) Ten slotte wordt de
uitvoertabel gesorteerd op het aangetroffen aantal, en getoond op
het scherm.
Willen we ook de naam van het liaal tonen, dan moeten we even-
eens de tabel Filiaal gebruiken en deze op basis van het liaal-
nummer koppelen met de tabel Lezer. Vervolgens moeten we ons
realiseren dat we in de SELECT-regel niet zonder meer de kolom
lplaats kunnen opnemen, omdat we deze kolom niet noemen in
het GROUP BY-gedeelte. Bedenk echter dat na het groeperen op
basis van het liaalnummer in iedere afzonderlijke groep steeds
n en dezelfde liaalnaam is opgenomen. Door hiervan alfa-
betisch gezien de kleinste te tonen, met behulp van de functie
MIN, krijgen we precies wat we wensen, namelijk de naam van
het liaal. De query ziet er dan als volgt uit:
voorbeeld
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
368
SELECT f.liaalnr, COUNT(*), MIN(lnaam)
FROM lezer l, liaal f
WHERE l.liaalnr = f.liaalnr
AND geboortedatum < #1-1-80#
GROUP BY f.liaalnr
HAVING COUNT(*) > 1000
ORDER BY COUNT(*) ;
Een alternatieve oplossing is gebaseerd op de gedachte dat na
het groeperen op basis van liaalnummer in iedere groep (per
gevonden liaal) steeds dezelfde plaatsnaam vermeld staat. Door
niet alleen te groeperen op liaalnummer, maar daarnaast op
liaalplaats, vergroot je het aantal groepen dus niet! Maar omdat je
nu ook op plaats groepeert, kun je dit gegeven wel opnemen in de
SELECT-regel. Je krijgt dan:
SELECT f .liaalnr, COUNT(*), lnaam
FROM lezer l, liaal f
WHERE l.liaalnr = f.liaalnr
AND geboortedatum < #1-1-80#
GROUP BY f.liaalnr, lnaam
HAVING COUNT(*) > 1000
ORDER BY COUNT(*) ;
Als algemene regel zouden we kunnen aanhouden: wat in SELECT
staat (behalve functies) staat ook bij de GROUP BY.
Een overzicht met daarop het lezernummer, de lezernaam en het
aantal door de lezer geleende boeken:
SELECT l.lezernr, naam, count(*)
FROM lezer l, uitlening u
WHERE l.lezernr = u.lezernr
GROUP BY l.lezernr, naam;
Idem, maar nu alleen voor de lezers uit Rotterdam:
SELECT l.lezernr, naam, count(*)
FROM lezer l, uitlening u
WHERE l.lezernr = u.lezernr
AND plaats = Rotterdam
GROUP BY l.lezernr, naam;
voorbeeld
voorbeeld
Copyright 2007 Academic Service
10 SQL, Structured Query Language
369
Idem maar nu alleen voor de lezers uit Rotterdam die minder dan
100 boeken hebben geleend:
SELECT l.lezernr, naam, count(*)
FROM lezer l, uitlening u
WHERE l.lezernr = u.lezernr
AND plaats = Rotterdam
GROUP BY l.lezernr, naam
HAVING count(*) < 100 ;
Opgaven
10.11 Verzorg aan de hand van de tabellen, behorend bij de bibliotheek-
database de volgende overzichten:
a. Het aantal boeken per schrijver dat nu is uitgeleend.
b. Het aantal leden per woonplaats, gesorteerd per woonplaats;
in het overzicht dienen alleen de plaatsen met meer dan
1000 leden te worden opgenomen.
c. Per liaal het gemiddelde aantal in 2001 per lezer uitgeleende
boeken; het overzicht moet in volgorde van oplopend aantal
worden getoond.
d. Per uitgeverij het totaal aantal aanwezige boeken waarvan de
aanschafprijs meer dan 25, bedraagt.
e. Per uitgeverij het aantal uitgegeven boeken, geschreven door
Wolkers.
f. Geef per exemplaar het aantal uitleningen in 2005 (huurdatum).
Toon exemplaarnummer, ISBN, titel en aantal uitleningen.
10.12 Voer de volgende opdrachten uit aan de hand van de Alco-data-
base.
a. Start Access of S(impel)QL en activeer de database Alco.
Gebruik bij de beantwoording de beschrijving van de database
zoals je deze terug vindt in paragraaf 10.5
b. Geef per plaats het aantal afnemers. Laat plaatsnaam en aantal
afdrukken op volgorde van oplopend aantal. Bij gelijk aantal
doorsorteren op plaatsnaam.
c. Geef per productgroep het aantal artikelen en de gemiddelde,
hoogste en laagste adviesverkoopprijs. Laat naast de berekende
waarden ook de productnaam afdrukken.
d. Geef per factuur het totale factuurbedrag, het factuurnummer
en de naam van de afnemer.
voorbeeld
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
370
Databaseontwikkeling 4 Access 2003
370
e. Geef per soort rode wijn het totale aantal essen en het totale
aantal liters dat we op voorraad hebben. Laat ook de naam
afdrukken. Het overzicht moet op volgorde van naam worden
gepresenteerd.
f. Van welke producten hebben we meer dan 100 liter in voor-
raad? Laat de productnaam afdrukken.
g. Van welke soort hebben we in Juni 2005 meer dan 10 essen
verkocht? Laat de naam en het aantal essen afdrukken, op
volgorde van dalend aantal essen.
10.12 Subquerys
Soms willen we een SQL-opdracht opgeven waarbij we met een
tussenresultaat willen of moeten werken. Bijvoorbeeld bij de
vraagstelling: Welke boeken zijn duurder dan de gemiddelde boe-
kenprijs? Om die vraag te kunnen beantwoorden zullen we eerst
de gemiddelde boekenprijs moeten bepalen. De onderstaande
query levert die waarde op.
SELECT AVG(prijs)
FROM uitgave ;
Stel dat hier een bedrag van 27,50 wordt gevonden. Dan kunnen
we nu met de volgende query de vraag beantwoorden.
SELECT *
FROM uitgave
WHERE prijs > 27.5 ;
We hebben nu echter twee querys ingevoerd en afzonderlijk
van elkaar laten uitvoeren. Dit kan ook met n query waarbij
we de twee eerder opgestelde querys in elkaar schuiven door te
bedenken dat de door ons opgegeven waarde in de laatste query
de uitvoer van de eerste query is. We plaatsen de query die de
gemiddelde prijs opleverde op de plaats waar we zojuist de
gevonden waarde noteerden en omgeven deze met ronde haken.
We krijgen dan:
Copyright 2007 Academic Service
10 SQL, Structured Query Language
371
SELECT *
FROM uitgave
WHERE prijs > ( SELECT AVG(prijs)
FROM uitgave ) ;
We hebben nu gebruik gemaakt van een subquery. Deze subquery,
omsloten door ronde haken, wordt als eerste uitgevoerd en als het
ware vervangen door de gegenereerde uitvoer, de gemiddelde prijs.
Hierna wordt dan de hoofdquery uitgevoerd en worden de boeken
bepaald die duurder zijn dan de gemiddelde prijs.
We kunnen gebruik maken van meer dan n subquery tegelijker-
tijd. Bijvoorbeeld bij het oplossen van de vraag: van welk boek ligt
de prijs het dichtst onder de gemiddelde prijs?
We beginnen weer met het bepalen van de gemiddelde boekprijs.
SELECT AVG(prijs)
FROM uitgave ;
Vervolgens gaan we alle prijzen achterhalen die onder deze gemid-
delde waarde liggen.
SELECT prijs
FROM uitgave
WHERE prijs < ( SELECT AVG(prijs)
FROM uitgave ) ;
Van al deze prijzen zijn we eigenlijk alleen maar genteresseerd in
de grootste waarde omdat die het dichtst onder de gemiddelde aan-
koopprijs ligt. We krijgen dan:
SELECT MAX (prijs)
FROM uitgave
WHERE prijs < ( SELECT AVG(prijs)
FROM uitgave ) ;
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
372
Tenslotte willen we nu nog weten voor welk boek (of boeken) deze
prijs geldt.
SELECT *
FROM uitgave
WHERE prijs = ( SELECT MAX(prijs)
FROM uitgave
WHERE prijs <( SELECT AVG(prijs)
FROM uitgave ) );
We hebben nu gebruik gemaakt van twee (geneste) subquerys die
beide zijn omgeven door ronde haken. Bedenk daarbij dat de laat-
ste subquery deel uit maakt van de middelste subquery en dat dus
de afsluitende ronde haak hiervan achter de laatste subquery moet
worden geplaatst.
Als laatste inleidende voorbeeld zullen we de vraag beantwoorden:
welke boeken (uitgaven) zijn in 2004 niet uitgeleend?
Om deze vraag te kunnen beantwoorden moeten we bedenken dat
een bibliotheek wel bijhoudt welke boeken er worden uitgeleend
maar niet welke boeken NIET worden uitgeleend. We moeten
daarom de vraag voor ons zelf iets andere formuleren: zoek uit
welke boeken er in 2004 wel zijn uitgeleend en bepaal vervolgens
welke boeken daar niet bij zitten. Om te bepalen welke boeken er
in 2004 zijn uitgeleend kunnen we gebruik maken van de onder-
staande query.
SELECT uitgave.*
FROM uitgave, exemplaar, uitlening
WHERE uitgave.isbn = exemplaar.isbn
AND exemplaar.exemplaarnr =
uitlening.exemplaarnummer
AND huurdatumBETWEEN #1-1-2004#
AND #31-12-2004# ;
Deze query levert van de WEL uitgeleende boeken alle gegevens.
Nu hoeven we niet alle gegevens te zien, alleen maar dat wat de
boeken uniek identiceert, het ISBN dus. We krijgen dan:
Copyright 2007 Academic Service
10 SQL, Structured Query Language
373
SELECT uitgave.isbn
FROM uitgave, exemplaar, uitlening
WHERE uitgave.isbn = exemplaar.isbn
AND exemplaar.exemplaarnr =
uitlening.exemplaarnummer
AND huurdatumBETWEEN #1-1-2004#
AND #31-12-2004# ;
Als uitvoer krijgen we nu een lijst met alle nummers van de wel
in 2004 uitgeleende boeken. Nu kunnen we op zoek gaan naar de
boeken waarvan het nummer NIET in deze lijst voorkomt. Die
boeken zijn dan immers niet in 2004 uitgeleend. We krijgen:
SELECT *
FROM uitgave
WHERE isbn niet in de eerder gevonden lijst.
Voor de eerder gevonden lijst kunnen we nu de eerder opgestelde
query gebruiken en deze als subquery opnemen. We krijgen:
SELECT *
FROM uitgave
WHERE isbn NOT IN
( SELECT uitgave.isbn
FROM uitgave, exemplaar, uitlening
WHERE uitgave.isbn = exemplaar.isbn
AND exemplaar.exemplaarnr =
uitlening.exemplaarnummer
AND huurdatum BETWEEN #1-1-2004#
AND #31-12-2004#) ;
Het gebruik van subquerys is aan te raden voor het beantwoorden
van vragen waarvoor de oplossing zich niet zo eenvoudig laat
beschrijven. Door het probleem, en dus ook de oplossing, op te
splitsen in deelproblemen en deeloplossingen, is het vaak eenvou-
diger om tot een correcte oplossing te komen.
Bij subquerys kunnen we onder andere de volgende twee hoofd-
constructies tegenkomen. Met deze constructies kunnen vrijwel
alle overzichten worden gegenereerd.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
374
1. Een kolomwaarde vergelijken met n waarde
Geef de namen van de lezers die op dezelfde datum geboren zijn
als lezernr 4773.
SELECT lezernr, naam
FROM lezer
WHERE geboortedatum= (SELECT geboortedatum
FROM lezer
WHERE lezernr = 4773 ) ;
De subquery levert de geboortedatum van lezer 4773 (n waarde)
op. In de hoofdquery wordt van iedere lezer de geboortedatum
daarmee vergeleken. In plaats van het teken = mogen we ook alle
andere ongelijkheid-operatoren gebruiken.
2. Een kolomwaarde vergelijken met een waardenverzameling
(IN/ALL)
Geef de exemplaarnummers van de boeken geschreven door
Wolkers, gesorteerd op nummer.
SELECT exemplaarnr
FROM exemplaar
WHERE isbn IN (SELECT isbn
FROM uitgave
WHERE schrijver = Wolkers )
ORDER BY exemplaarnr ;
Allereerst worden alle isbns gegenereerd die te maken hebben
met een boek van Wolkers. Vervolgens wordt van ieder exemplaar
bekeken of het bijbehorende isbn voorkomt in de zojuist gevonden
verzameling.
Geef de titel(s) van het duurste boek(en):
SELECT titel
FROM uitgave
WHERE prijs >= ALL (SELECT prijs
FROM uitgave );
Allereerst wordt een tussentabel gegenereerd met alle prijzen.
Vervolgens wordt bij ieder boek nagegaan of de prijs van dat
Copyright 2007 Academic Service
10 SQL, Structured Query Language
375
betreffende boek groter dan of gelijk is aan alle waarden (ALL) die
in de zojuist gegenereerde verzameling voorkomen. En alleen voor
de grootste waarde geldt dat. Een alternatieve oplossing hier zou
zijn:
SELECT titel
FROM uitgave
WHERE prijs = (SELECT MAX(prijs)
FROM uitgave ) ;
Daarbij wordt eerst in de subquery de hoogste prijs bepaald.
Daarna wordt in de hoofdquery bekeken voor welke uitgave(n) die
hoogste prijs geldt.
Geef alle titels van boeken van Wolkers die ook door andere schrij-
vers zijn gebruikt:
SELECT titel
FROM uitgave
WHERE schrijver = Wolkers
AND titel = IN (SELECT titel
FROM uitgave
WHERE schrijver <> Wolkers ) ;
Ook hier wordt eerst weer een tussentabel gegenereerd, die nu
alle titels bevat van boeken geschreven door andere schrijvers.
Vervolgens worden alle titels van de boeken van Wolkers met deze
verzameling vergeleken; titels die daarin voorkomen, worden afge-
drukt.
Opmerkingen met betrekking tot subquerys
1. In een subquery mag in het SELECT-gedeelte slechts n kolom
(zonder DISTINCT) of functie gebruikt worden (standaard SQL).
2. Een subquery mag alleen voorkomen als rechterlid van een voor-
waarde.
3. Een subquery moet een waarde of een waardenverzameling ople-
veren die overeenstemt met het linkergedeelte van de voorwaarde.
4. Een subquery mag alleen voorkomen in een voorwaarde bij
WHERE of bij HAVING (of AND/OR).
5. De subquery moet tussen ronde haken worden geplaatst.
6. Na een subquery kan de gewone query worden voortgezet.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
376
SELECT ......
FROM ......
WHERE ......
AND ... IN (SELECT ......
FROM ......
WHERE ......
AND ...... )
GROUP BY .......
ORDER BY ....... ;
1. Geef de naam van de schrijver met het grootste aantal titels op
zijn naam. Allereerst zullen we dan per schrijver het aantal titels
moeten bepalen. Hierbij moeten we de tabel Uitgave gebruiken en
hier per schrijver tellen, dus gebruikmaken van GROUP BY.
SELECT COUNT(*)
FROM uitgave
GROUP BY schrijver
Vervolgens gaan we dit nogmaals doen en zullen we de naam
afdrukken van de schrijver waarvoor geldt dat het getelde aantal
groter dan of gelijk is aan alle zojuist gevonden waarden. Denk
eraan dat we groter of gelijk moeten nemen, omdat de subquery
ook het aantal van de schrijver met het grootste aantal vindt!
SELECT schrijver
FROM uitgave
GROUP BY schrijver
HAVING COUNT(*) >= ALL (SELECT COUNT(*)
FROM uitgave
GROUP BY schrijver ) ;
2. Wie is de oudste lezer?
Eerst bepalen we van alle geboortedatums de kleinste waarde (dat
wil zeggen het langst geleden, dus het oudst). Vervolgens lopen we
alle lezers langs om te kijken of hun geboortedatum gelijk is aan
de gevonden kleinste waarde. Van die lezer(s) drukken we de
gegevens af.
voorbeelden
Copyright 2007 Academic Service
10 SQL, Structured Query Language
377
SELECT *
FROM lezer
WHERE geboortedatum = (SELECT MIN ( geboortedatum )
FROM lezer ) ;
3. Welke schrijver heeft het grootste aantal titels op zijn naam?
Eerst in de subquery per schrijver (GROUP BY) het aantal titels
bepalen. We selecteren alleen de gevonden aantallen. Vervolgens
in de hoofdquery nog een keer per schrijver tellen en het gevonden
aantal vergelijken met de zojuist gevonden waarden. Is het aantal
uit de hoofdquery groter dan of gelijk aan alle gevonden waarden,
dan hebben we de grootste. Van deze schrijver selecteren we de
naam.
SELECT schrijver
FROM uitgave
GROUP BY schrijver
HAVING COUNT(*) >= ALL ( SELECT COUNT(*)
FROM schrijver
GROUP BY schrijver ;
4. Welke lezers hebben geen boeken gereserveerd?
Een bibliotheek houdt wel bij welke lezer welke boeken leent
en reserveert, maar natuurlijk niet welke lezers niet lenen of
reserveren. Daarom moeten we het probleem via een omweg bena-
deren. Omdat de bibliotheek wel bijhoudt wie er wel een boek
heeft gereserveerd, zullen we de nummers van die lezers bepalen.
Vervolgens onderzoeken we bij iedere lezer of zijn/haar nummer
voorkomt in de zojuist gevonden verzameling. We krijgen dan:
SELECT lezernr, naam
FROM lezer
WHERE lezernr NOT IN ( SELECT lezernr
FROM reservering ) ;
5. Dezelfde vraag als hiervoor, maar nu alleen van de lezers uit
Rotterdam. Bovendien moet de geproduceerde uitvoer op volgorde
van naam worden gepresenteerd.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
378
SELECT lezernr, naam
FROM lezer
WHERE lezernr NOT IN ( SELECT lezernr
FROM reservering )
AND Plaats = Rotterdam
ORDER BY naam ;
6. Welke lezers hebben boeken geleend die ook door andere lezers
uit dezelfde woonplaats zijn geleend? We zullen in dit geval eerst
uitzoeken welke boeken ook werkelijk door lezers zijn geleend. We
stellen dan de volgende query op:
SELECT isbn
FROM lezer l, uitlening ul, exemplaar e
WHERE l.lezernr = ul.lezernr
AND ul.exemplaarnr = e.exemplaarnr
Nu worden alle geleende boeken getoond. Wij willen echter
alleen de boeken die geleend zijn door lezers uit dezelfde woon-
plaats als een andere lezer. Stel dat de betroffen lezer woont in
Emmen. We zouden dan de query moeten uitbreiden met AND
plaats = Emmen en krijgen dan:
SELECT isbn
FROM lezer l, uitlening ul, exemplaar e
WHERE l.lezernr = ul.lezernr
AND ul.exemplaarnr = e.exemplaarnr
AND plaats = Emmen
Nu kunnen we de query opstellen die de lezers toont die ook zon
boek hebben geleend. We krijgen dan:
SELECT l.lezernr, naam
FROM lezer l, uitlening ul, exemplaar e
WHERE l.lezernr = ul.lezernr
AND ul.exemplaarnr = e.exemplaarnr
AND isbn IN (SELECT isbn
FROM lezer l, uitlening ul, exemplaar e
WHERE l.lezernr = ul.lezernr
AND ul.exemplaarnr = e.exemplaarnr
AND plaats = Emmen )
Copyright 2007 Academic Service
10 SQL, Structured Query Language
379
Er wordt nu steeds gekeken of de lezer uit Emmen komt, wat uiter-
aard niet juist is. In de subquery moeten we kijken of de woon-
plaats van de lezer uit de subquery gelijk is aan de woonplaats
van de lezer uit de hoofdquery. Daartoe geven we de lezertabellen
uit beide deelquerys respectievelijk alias l1 en l2 en verbinden
vervolgens de woonplaatsen met elkaar via de voorwaarde: AND
l1.plaats = l2.plaats. We krijgen nu uiteindelijk:
SELECT l1.lezernr, naam
FROM lezer l1, uitlening ul, exemplaar e
WHERE l1.lezernr = ul.lezernr
AND ul.exemplaarnr = e.exemplaarnr
AND isbn IN ( SELECT isbn
FROM lezer l2, uitlening ul,
exemplaar e
WHERE l2.lezernr = ul.lezernr
AND ul.exemplaarnr =
e.exemplaarnr
AND l1.plaats = l2.plaats ) ;
We noemen de bovenstaande query gecorreleerd, omdat in de
subquery gegevens gebruikt worden uit de hoofdquery. SQL zal nu
eerst in de hoofdquery een lezer selecteren en voor deze lezer de
subquery gaan uitvoeren. Pas daarna wordt de tweede lezer in de
hoofdquery geselecteerd. De subquery wordt nu niet, zoals gebrui-
kelijk, slechts n keer doorlopen, maar vele malen, namelijk voor
iedere rij uit de hoofdquery. De uitvoering van een gecorreleerde
query kan dus wel enige tijd in beslag nemen!
Opgaven
10.13 Verzorg aan de hand van de tabellen die behoren bij de bibliotheek-
database de volgende overzichten:
a. Een overzicht van de lezers die een boek gelezen hebben dat
nog niet door andere lezers uit hetzelfde liaal gelezen is.
b. Van welke schrijvers er geen boeken gereserveerd zijn.
c. Welke uitgeverij het grootste aantal titels heeft uitgebracht.
d. Welke schrijvers slechts voor n uitgeverij hebben geschreven.
e. Welke exemplaren nog nooit zijn uitgeleend.
f. Welke titel het meest is uitgeleend.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
380
Databaseontwikkeling 4 Access 2003
380
g. Het boek met de hoogste aanschafprijs.
h. Het aantal lezers dat in januari 2001 geen boeken heeft geleend.
i. Het boek waarvoor de meeste reserveringen bestaan.
10.14 Voer de volgende opdrachten uit aan de hand van de Alco-data-
base.
a. Start Access of S(impel)QL en activeer de database Alco.
Gebruik bij de beantwoording de beschrijving van de database
zoals je deze terug vindt in paragraaf 10.5
b. Geef een overzicht van de artikelen waarvan het aantal essen
dat op voorraad is boven de gemiddelde voorraad ligt.
c. Wat is de prijs van de duurste es wijn? Laat ook de naam
afdrukken.
d. Wie heeft er in Juni 2005 geen factuur gekregen?
e. Welke artikelen zijn in Juni 2005 niet verkocht?
f. Wie heeft de factuur met het hoogste factuurbedrag ontvangen?
g. Welke Rotterdamse afnemer heeft het grootste aantal facturen
ontvangen?
h. Welke artikelen vallen er in dezelfde productgroep als het arti-
kel met de grootste adviesverkoopprijs?
i. Wie heeft er een wijn uit 1995 besteld die ook door iemand uit
een andere woonplaats is besteld?
j. Welke artikelen zijn duurder dan de gemiddelde artikelprijs in
hun productgroep?
10.13 Speciale joins en views
Normaal gesproken zullen bij het combineren van tabellen alleen
rijen uit de ene tabel worden gecombineerd met rijen uit de andere
tabel als de verbindende waarde in beide rijen wordt aangetroffen
en gelijk is.
De query:
SELECT titel, u.isbn, exemplaarnr, liaalnr
FROM uitgave u, exemplaar e
WHERE u.isbn = e.isbn
zal alleen de titels van de uitgaven tonen waarvan het isbn ook
in de tabel Exemplaar voorkomt. Een uitgave waarvan nog geen
Copyright 2007 Academic Service
10 SQL, Structured Query Language
381
exemplaar in de bibliotheek aanwezig is waarvan het isbn dus
niet in de tabel Exemplaar voorkomt wordt niet getoond; ook niet
alleen de titel, zonder exemplaarnummer en liaalnummer.
Willen we deze uitgaven toch zien, dan moeten we niet de hiervoor
genoemde combinatie gebruiken, de zogenaamde inner join, maar
een outer join. Een outer join kent twee varianten, de left join en de
right join.
Als we een left join gebruiken, worden alle rijen uit de tabel die
aan de linkerkant van de toevoeging left join staat, getoond in de
uitvoer ongeacht het feit of er in de tabel rechts van de toevoe-
ging left join een bijbehorende rij is gevonden.
Om in dit voorbeeld ook de titels te krijgen van boeken die nog
niet in de bibliotheek aanwezig zijn, wijzigen we de query in:
SELECT titel, u.isbn, e.exemplaarnr, liaalnr
FROM uitgave u LEFT JOIN exemplaar e
ON u.isbn = e.isbn
Normaal gesproken koppelen we met de regel WHERE. Deze is
nu vervangen door de regel ON om duidelijk te maken dat op die
voorwaarde gecombineerd moet worden. Van alle uitgaven worden
de titel en het ISBN getoond; alleen van uitgaven waarvan exem-
plaren aanwezig zijn in de bibliotheek worden ook het bijbehoren-
de exemplaarnummer en liaalnummer getoond.
De right join werkt op soortgelijke wijze. Nu worden alle rijen uit
de tabel rechts van de toevoeging right join getoond, ongeacht het
feit of er overeenkomstige rijen in de tabel links van de toevoeging
right join worden gevonden. Door de tabellen onderling te verwis-
selen krijgen we feitelijk weer de eerder besproken left join!
Als tweede voorbeeld formuleren we de query waarmee we kun-
nen nagaan welke lezers op dit moment welke boeken hebben
geleend. Heeft een lezer op dit moment geen boeken geleend, dan
moeten wel zijn/haar nummer en naam worden getoond.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
382
SELECT l.lezernr, naam, exemplaarnr, huurdatum
FROM lezer l LEFT JOIN uitlening u
ON l.lezernr=u.lezernr
WHERE retourdatum IS NULL ;
De voorwaarde waarop de combinatie (join) is gebaseerd, wordt
voorafgegaan door ON. De bijkomende voorwaarde volgt op
gebruikelijke wijze achter WHERE.
Views
Bij het werken met gegevensbestanden wordt er vaak gewerkt met
views. Een view is een bepaalde blik op een database waarbij over
het algemeen slechts een selectie van de gegevens wordt getoond.
Op de verkoopafdeling van een groothandel ziet men bijvoorbeeld
van een klant wel het aeveradres maar niet het factuuradres. Een
medewerker van de nancile afdeling ziet juist wel het factuur-
adres en waarschijnlijk niet het aeveradres. Een verkoper ziet
alleen maar de klanten die tot zijn rayon behoren, terwijl zijn afde-
lingschef alle klanten te zien krijgt. Binnen Access kunnen views
heel eenvoudig als query gedenieerd worden. Vervolgens worden
niet meer de afzonderlijke tabellen benaderd, maar alleen de
betreffende query. Zo kunnen we een query opstellen die alleen
maar de klanten uit Rotterdam laat zien. Deze query kunnen we
vervolgens opslaan onder de naam RotterdamseKlanten. De
betreffende verkoper opent in het vervolg deze query in plaats
van de originele tabel(len).
Binnen SQL worden views gedenieerd met het commando
CREATE VIEW. Bij het bovenstaande voorbeeld krijgen we:
CREATE VIEWRotterdamseKlanten AS ( SELECT *
FROM Afnemer
WHERE Plaats = Rotterdam ) ;
Hierna kan de verkoper werken met:
SELECT * FROM RotterdamseKlanten ;
Het bovenstaande CREATE VIEW commando wordt (helaas) door
Access niet ondersteund, daar moet je gebruik maken van querys
die immers hetzelfde bewerkstelligen. De tool S(imple)QL, mee-
geleverd op de bij het boek behorende CD, ondersteunt views wel
volledig.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
383
Een view is dynamisch. Hiermee bedoelen we dat het niet zo is
dat tijdens het deniren van de view eenmalig de SELECT wordt
uitgevoerd en dat de dan gegenereerde uitvoer voortaan gebruikt
wordt als de view wordt aangeroepen. De view zou dan juist sta-
tisch zijn. Met dynamisch bedoelen we dat op het moment dat de
view wordt gebruikt, volgens de denitie die er aan te grondslag
ligt, de query wordt uitgevoerd. De gegevens zijn dus altijd actueel.
Een view behoeven we niet echt aan te maken (CREATE). We
kunnen een view ook direct gebruiken in een SQL-opdracht, ook
binnen Access!
In paragraaf 10.10 hebben we gezien dat standaard Access geen
COUNT ( DISTINCT .. ) kent. Door gebruik te maken van het
view-mechanisme kunnen we hier een alternatieve oplossing voor
opstellen. De vraag luidt: van hoeveel schrijvers hebben we een
boek in huis? Een correcte oplossing die Access echter niet onder-
steunt:
SELECT COUNT (DISTINCT schrijver)
FROM uitgave, exemplaar
WHERE uitgave.isbn = exemplaar.isbn ;
Een alternatieve oplossing met behulp van een view:
SELECT COUNT (*)
FROM (SELECT DISTINCT (schrijver)
FROM uitgave, exemplaar
WHERE uitgave.isbn = exemplaar.isbn );
Een ander voorbeeld.
Hoeveel lezers hebben in 2004 een boek van J.K. Rowlings
geleend? Geef ook het totale aantal uitleendagen.
Als een lezer meerdere keren een boek van Rowlings heeft geleend
mag hij toch maar n keer meetellen. We zullen dus ook nu weer
gebruik moeten maken van COUNT DISTINCT.
Een juiste oplossing binnen standaard SQL:
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
384
SELECT COUNT(DISTINCT lezernr),
SUM(Retourdatum Huurdatum + 1)
FROM uitgave, exemplaar, uitlening
WHERE uitgave.isbn = exemplaar.isbn
AND exemplaar.exemplaarnr = uitlening.exemplaarnr
AND YEAR(huurdatum) = 2004
AND schrijver = J.K. Rowlings ;
Met behulp van een view:
SELECT COUNT(*), SUM(aantalperklant)
FROM (SELECT lezernr, SUM(eind begin + 1)
AS aantalperklant
FROM uitgave, exemplaar, uitlening
WHERE uitgave.isbn = exemplaar.isbn
AND exemplaar.exemplaarnr =
uitlening.exemplaarnr
AND YEAR(huurdatum) = 2004
AND schrijver = J.K. Rowlings
GROUP BY lezernr );
10.14 SQL, meer mogelijkheden
Naast het SELECT-statement kent SQL uiteraard veel meer
mogelijkheden. Deze vallen echter buiten het bestek van dit boek,
mede omdat men binnen Access dezelfde functionaliteit via andere
methodieken heeft gemplementeerd. Denk daarbij bijvoorbeeld
aan het deniren van een tabel. Toch vinden wij het op zijn plaats
om een aantal belangrijke SQL- en Access-mogelijkheden kort toe
te lichten.
Toevoegen van gegevens
INSERT INTO uitgave (isbn,titel,schrijver,uitgeverij,prijs)
VALUES (9062335306,Korte gras,Hennekorf,
Korte Pen, 45.90);
Hierbij wordt eerst gezegd dat de actie bestaat uit het toevoe-
gen van rijen aan de genoemde tabel ( INSERT INTO uitgave).
Vervolgens wordt vermeld in welke kolommen een waarde moet
worden geplaatst. Het is namelijk niet noodzakelijk om direct alle
Copyright 2007 Academic Service
10 SQL, Structured Query Language
385
velden een waarde te geven. Ten slotte worden de in te voegen
waarden opgenomen (VALUES). Hierbij wordt de eerstgenoemde
waarde in het eerstgenoemde veld geplaatst. De tweede waarde in
het veld dat als tweede is genoemd, enzovoort.
Deze manier van invoegen kun je goed gebruiken om via een web-
pagina ingevoerde gegevens toe te voegen aan een tabel. Daarbij
moet je dan wel een script/programmeertaal gebruiken die spe-
ciaal voor webtoepassingen is ontwikkeld.
Wijzigen van gegevens
UPDATE lezer
SET naam = Jansen , adres = Kerkstraat 23 ,
plaats = Delft
WHERE lezernr = 4773;
Allereerst wordt de tabel genoemd waarin de wijziging moet wor-
den doorgevoerd (UPDATE). Vervolgens wordt vermeld in welk
veld de waarde moet worden aangepast. Ten slotte staat vermeld
onder welke voorwaarde dit moet gebeuren. Zonder voorwaarde
wordt de wijziging namelijk in alle records doorgevoerd!
Verwijderen van gegevens
DELETE FROM reservering
WHERE lezernr = 4773;
Hier wordt eerst de tabel genoemd waaruit moet worden ver-
wijderd (DELETE FROM). Vervolgens worden de voorwaarden
opgesomd waaronder de verwijdering moet plaatsvinden.
Samenvoegen van uitvoertabellen
Dit kan alleen via SQL gerealiseerd worden, niet via de standaard-
opvraagfaciliteiten van Access!
SELECT lezernr
FROM lezer
WHERE liaalnr = 14
UNION
SELECT lezernr
FROM uitlening
WHERE huurdatum = 2-15-97;
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
386
Dubbele records in de uitvoer worden automatisch onderdrukt.
Willen we deze wel zien, dan moeten we verbinden via UNION
ALL.
In ieder van de afzonderlijke deelquerys mogen andere kolommen
worden geselecteerd. Zo kun je de lezernummers uit de tabel lezer
zonder probleem combineren met de huurdatums uit de tabel uit-
lening. In feite worden er dan gewoon twee afzonderlijke querys
uitgevoerd waarvan de uitvoer aan elkaar geplakt wordt.
Een zinvolle toepassing van een UNION zou kunnen liggen in
het afdrukken van een lijst met personen die moeten worden uit-
genodigd voor een schoolrenie. Daarbij moeten de gegevens uit
de tabel STUDENT worden gecombineerd met de gegevens uit de
tabel DOCENT. Om te voorkomen dat iemand twee brieven krijgt
(een student die later docent is geworden) maken we gebruik van
UNION ALL.
SELECT naam, adres, postcode, woonplaats
FROM student
UNION ALL
SELECT naam, adres, postcode, plaats
FROM docent ;
Copyright 2007 Academic Service
A Veldeigenschappen
Tijdens het ontwerpen van een tabel kunnen we niet alleen
opgeven welke velden we in de tabel wensen op te nemen, we
kunnen ook de eigenschappen van het veld instellen. Er bestaan in
totaal dertien verschillende eigenschappen. Deze kunnen we echter
niet altijd instellen omdat ze niet altijd relevant zijn. Afhankelijk
van het soort veld kunnen we een eigenschap wel of niet instel-
len. We kunnen dit ook achteraf doen door de bestaande tabel te
openen in de Ontwerpweergave.
In deze bijlage komen alle eigenschappen kort aan bod.
Figuur A.1
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
388
Veldlengte
Hiermee stellen we de Veldlengte in bij velden van het type Tekst,
Numeriek en Autonummering. De lengte voor een tekst-veld staat
standaard ingesteld op 50, maar deze kan variren tussen 0 en 255.
Het is zaak de lengte zo in te stellen dat het veld niet te veel ruimte
in beslag neemt. Gelet op de ruimte stellen we deze waarde zo laag
mogelijk in. Zorg er wel voor dat alle gegevens, ook de gegevens
die we in de toekomst nog zullen invoeren, in het veld passen.
Bij een veld van het type numeriek wordt de veldlengte opgegeven
door in te stellen welk soort getal we willen kunnen verwerken.
Hier kunnen we kiezen uit:
byte alleen gehele getallen van 0 tot en met 255;
integer alleen gehele getallen, tussen 32768 en +32767;
lange integer alleen gehele getallen tussen 2.147.483.648 en
2.147.483.647;
enkele precisie getal met maximaal 7 decimalen, tussen
3,410
38
en
+3,410
38
;
dubbele precisie getal met maximaal 15 decimalen, tussen
1,79710
308
en +1,79710
308
;
decimaal getal met maximaal 28 decimalen, tussen 10
28
en
+10
28
. In het veld Precisie kunnen we het totale aantal bij te houden
cijfers opgeven. In het veld Schaal geven we op hoeveel cijfers we
achter de komma willen kunnen plaatsen;
replicatie id een getal bedoeld voor het uniek identiceren van
objecten; wordt hier verder buiten beschouwing gelaten.
Hierbij geldt dat naar beneden toe de benodigde geheugenruimte
toe- en de verwerkingssnelheid afneemt. Het is dus zaak het type
zo te kiezen dat zo min mogelijk geheugenruime wordt gebruikt
maar wel alle gewenste waarden kunnen worden opgenomen. Bij
een veld van het type Autonummering kunnen we voor de veld-
lengte alleen kiezen uit lange integer en replicatie id. Hoewel
Access hier zelf de nummering bijhoudt, kunnen we wel benvloe-
den wat het eerstvolgende nummer moet worden.
Stel we willen in de database Reisbureau in de tabel Klant de
eerstvolgende waarde van het klantnummer op 4000 zetten:
Copyright 2007 Academic Service
A Veldeigenschappen
389
Open dan eerst de tabel Klant en zorg ervoor dat klantnummer niet
langer een sleutelveld is.
Creer een nieuwe tabel en neem in deze tabel n veld op, met
eveneens de naam klantnummer, maar nu van het type numeriek,
lange integer.
Voer in deze tabel vervolgens n record in en geef daarbij aan
klantnummer de waarde 3999, dus n minder dan de waarde
waarmee we straks willen beginnen.
Sluit de tabel vervolgens weer af.
Maak nu een query aan, in de ontwerpweergave en baseer deze
query op de zojuist gemaakte tabel. Neem het veld klantnummer
op.
Selecteer vervolgens in de menubalk Query, Toevoegquery en geef
op dat we de gegevens willen toevoegen aan de tabel Klant.
Laat de query uitvoeren.
Open hierna de tabel Klant en verwijder het zojuist toegevoegde
record, met de waarde 3999. Zorg er ook voor dat de originele
sleutelinstelling weer wordt ingesteld, dus klantnummer weer aan-
wijzen als sleutel.
Als we nu een nieuw record toevoegen, zullen we zien dat Access
automatisch de waarde 4000 toekent als eerstvolgende klantnum-
mer.
Het is overigens verstandig om voordat we de vorenstaande actie
ondernemen de database te defragmenteren en te comprimeren.
Hierbij wordt onder andere alle overtollige ruimte uit de database
verwijderd. Tevens wordt het autonummer op de eerstvolgende
startwaarde gezet, dat wil zeggen op n hoger dan de hoogste
waarde die in gebruik is. Hebben we als test in een database
gewerkt en gebruikgemaakt van een autonummer, dan kunnen we
na het verwijderen van alle testgegevens het comprimeren
gebruiken om de startwaarde van het autonummer weer op 1 te
zetten. Om te comprimeren selecteer je achtereenvolgens: Extra,
Databasehulpprogrammas, Database comprimeren en herstellen.
Notatiewijze
Met de eigenschap Notatie kunnen we opgeven hoe gegevens
moeten worden gepresenteerd naar buiten toe. Deze eigenschap
heeft geen invloed op de waarde van het veld zelf, alleen op de
presentatiewijze. Zo kan een tekst, opgeslagen in kleine letters,
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
390
op het scherm gepresenteerd worden als een tekst in hoofdletters.
Afhankelijk van het soort veld kunnen we de notatiewijze instel-
len.
Voor een tekst-veld kunnen we gebruikmaken van:
@op de positie van dit teken wordt het ingetypte teken of een spa-
tie getoond;
& op de positie hiervan wordt het teken getoond; als er niets is
ingetoetst, wordt er niets getoond;
< alles wordt in kleine letters weergegeven;
> alles wordt in hoofdletters weergegeven.
We kunnen twee secties opgeven. De eerste sectie bevat de notatie
voor een veld waarin een waarde staat vermeld, de tweede sectie
bevat de opmaak voor een leeg veld, een veld zonder waarde. De
secties worden door een puntkomma van elkaar gescheiden.
Om een artikelcode te tonen volgens het formaat twee tekens, punt,
vier tekens, punt, n teken, in hoofdletters, kunnen we gebruik-
maken van de notatie >@@.@@@@.@;[rood]onbekend. Als er
geen waarde wordt ingevuld, wordt dit dus met de tekst onbekend
weergegeven (in het rood). De bovengenoemde eigenschappen
gelden ook voor velden van het type memo.
Voor een veld van het type numeriek hebben we de keuze uit een
aantal standaardinstellingen:
Standaard getalnotatie het getal wordt weergegeven zoals het is
ingevoerd.
Valuta geldbedrag, het scheidingsteken voor duizendtallen wordt
gebruikt; negatieve getallen worden tussen haakjes geplaatst, stan-
daard worden er twee decimalen getoond.
Euro de valutanotatie wordt gebruikt, waarbij altijd het eurosym-
bool wordt getoond, onafhankelijk van het in Windows ingestelde
valutasymbool;
Vast er wordt ten minste n cijfer weergegeven, zonder duizend-
talteken, standaard worden er twee decimalen getoond.
Standaard het scheidingsteken voor duizendtallen wordt gebrui-
kt; de standaardinstelling van het aantal decimalen is 2.
voorbeeld
Copyright 2007 Academic Service
A Veldeigenschappen
391
Percentage de waarde wordt met 100 vermenigvuldigd en er
wordt een procentteken (%) toegevoegd; de standaardinstelling
van het aantal decimalen is 2.
Wetenschappelijk de standaard wetenschappelijke notatie wordt
gebruikt, dus machten van tien.
Naast de standaardinstellingen kunnen we bij getallen ook een
eigen presentatiewijze deniren. We kunnen dan gebruikmaken
van:
. (punt) het scheidingsteken voor duizendtallen;
, (komma) het decimale scheidingsteken;
0 tijdelijke cijferaanduiding; geeft altijd een cijfer
(eventueel 0) weer;
# tijdelijke cijferaanduiding; geeft een cijfer of niets
weer;
geeft het euroteken weer (alleen in de
Nederlandstalige versie)
$ geeft de dollaraanduiding weer (alleen in de
Engelstalige versie);
% percentage: de waarde wordt vermenigvuldigd met
100 en er wordt een procentteken toegevoegd;
E of e wetenschappelijke notatie, met een minteken ()
bij negatieve exponenten en geen teken bij
positieve exponenten; te gebruiken in combinatie
met andere symbolen, bijvoorbeeld 0,00E-00 of
0,00E00;
E+ of e+ wetenschappelijke notatie, met een minteken bij
negatieve exponenten en een plusteken (+) bij posi-
tieve exponenten; te gebruiken in combinatie met
andere symbolen, bijvoorbeeld 0,00E+00.
We kunnen bij getallen werken met vier secties, van elkaar geschei-
den door een puntkomma. Deze bevatten achtereenvolgens de
opmaak voor positieve getallen, voor negatieve getallen, voor de
waarde nul (het getal nul) en ten slotte voor de Null-waarde (leeg
veld). Voorbeeld : #.##0,00; #.##0,00 Negatief!;Nul;
Onbekend. Door deze instelling worden getallen altijd getoond
als bedragen, voorafgegaan door het euroteken. Er wordt altijd
minimaal n cijfer voor het decimaalteken getoond en altijd twee
decimalen. Bij negatieve bedragen (tweede sectie) wordt achter
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
392
het bedrag het woord Negatief! afgedrukt. De waarde 0 (derde
sectie) wordt als woord uitgeschreven. In een leeg veld (sectie vier)
wordt de tekst Onbekend getoond. De bovengenoemde eigen-
schappen gelden ook voor velden van het type valuta.
Voor een veld van het type datum/tijd hebben we de keuze uit een
aantal standaardinstellingen:
Standaard datumnotatie als de waarde alleen uit een datum
bestaat, wordt geen tijd weergegeven en als de waarde alleen uit
een tijd bestaat, wordt geen datum weergegeven; de instelling is
een combinatie van de instellingen Korte datumnotatie en Lange
tijdnotatie, bijvoorbeeld:
3-04-98 17:34:00.
Lange datumnotatie lange aanduiding, volgt de instelling van
Windows zelf; standaard staat deze op de weergave: Vrijdag 3
april 1998.
Middellange datumnotatie middellange aanduiding, bijvoorbeeld:
3-apr-98.
Korte datumnotatie korte notatie, volgt de instelling van
Windows zelf; standaard staat deze op de weergave: 3-4-98.
Waarschuwing: bij deze instelling wordt aangenomen dat datums
tussen 1-1-00 en 31-12-29 datums uit de eenentwintigste eeuw
zijn (dat wil zeggen, er wordt uitgegaan van de jaren van 2000 tot
2029); datums tussen 1-1-30 en 31-12-99 worden verondersteld uit
de twintigste eeuw te zijn (dat wil zeggen, er wordt uitgegaan van
de jaren van 1930 tot 1999).
Lange tijdnotatie lange aanduiding voor de tijd, volgt de instel-
ling van Windows zelf; standaard aangeduid met bijvoorbeeld:
17:34:23.
Middellange tijdnotatie middellange aanduiding, bijvoorbeeld:
5:34 PM.
Korte tijdnotatie korte aanduiding, bijvoorbeeld: 17:34.
Naast de standaardinstellingen kunnen we ook een eigen presenta-
tiewijze deniren. We kunnen dan gebruikmaken van:
: scheidingsteken binnen de tijdaanduiding, aan te
passen binnen Windows zelf;
/ scheidingsteken binnen de datum;
c als de vooraf gedenieerde Standaard datumnota-
tie;
Copyright 2007 Academic Service
A Veldeigenschappen
393
d dag van de maand in n of twee cijfers, afhanke-
lijk van wat nodig is (van 1 tot en met 31);
dd dag van de maand (altijd) in twee cijfers;
ddd eerste twee letters van de dag;
dddd volledige naam van de dag;
ddddd als de vooraf gedenieerde Korte datumnotatie;
dddddd als de vooraf gedenieerde Lange datumnotatie;
w dag van de week (van 1 tot en met 7);
ww week van het jaar (van 1 tot en met 53);
m maand van het jaar in n of twee cijfers;
mm maand van het jaar (altijd) in twee cijfers;
mmm eerste drie letters van de maand;
mmmm volledige naam van de maand;
k datum weergegeven als kwartaal van het jaar (van
1 tot en met 4);
j dag van het jaar (van 1 tot en met 366);
jj laatste twee cijfers van het jaartal (van 01 tot en
met 99);
jjjj volledig jaartal in vier cijfers;
u uren in n of twee cijfers;
uu uren in (altijd) twee cijfers;
n minuten in n of twee cijfers;
nn minuten in (altijd) twee cijfers;
s seconden in n of twee cijfers;
ss seconden in (altijd) twee cijfers;
ttttt als de vooraf gedenieerde Lange tijdnotatie;
AM/PM tijdaanduiding in maximaal 12 uren, met toevoe-
ging van de hoofdletters AM (s ochtends) of PM
(s middags);
am/pm maximaal 12 uren, maar nu met toevoeging van de
kleine letters am (s ochtends) of pm (s middags);
A/P maximaal 12 uren, met toevoeging van de hoofd-
letter A (s ochtends) of P (s middags);
a/p maximaal 12 uren, met toevoeging van de kleine
letter a (s ochtends) of p (s middags);
AMPM maximaal 12 uren, met de aanduiding van ochtend
of middag, zoals gedenieerd in Windows zelf.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
394
Voor een veld van het type Ja/nee hebben we de keuze uit drie
standaardinstellingen:
Waar/onwaar;
Ja/nee;
Aan/uit.
We kunnen ook zelf de eigenschappen instellen; daartoe beschik-
ken we over drie secties. De eerste sectie blijft ongebruikt, we
gaan dus direct met een ; door naar de tweede sectie. Daar geven
we op welke waarde getoond moet worden als de waarde Waar, Ja
of Aan is. In de derde sectie geven we de waarde op die we wensen
te tonen in het geval de waarde van het veld Onwaar, Nee of Uit
is. Bijvoorbeeld: de notatie ;Betalend lid;Ere lid zal de tekst
Betalend lid tonen als de waarde van het invoer veld op Ja staat.
In het andere geval wordt de tekst Ere lid getoond.
Omdat een veld van het type Ja/Nee standaard wordt weergegeven
als afvinkvakje, wordt de presentatiewijze voornamelijk gebruikt
bij het laten uitvoeren van querys en rapporten.
Bij alle velden, ongeacht het type, kunnen we gebruikmaken van:
het teken !, er wordt dan rechts uitgelijnd in plaats van links;
het teken *, de beschikbare ruimte wordt nu opgevuld met het op
het *-teken volgende symbool;
alle andere tekens worden letterlijk in het veld weergegeven als we
ze omsluiten met dubbele aanhalingstekens of (ieder afzonderlijk)
laten voorafgaan door het teken \.
We kunnen ook de kleur instellen door deze op te geven tussen
rechte haken, bijvoorbeeld [rood]. We kunnen kiezen uit zwart,
blauw, groen, lichtblauw, rood, lila, geel en wit.
Invoermasker
Met een Invoermasker kunnen we per teken opgeven welke invoer
is toegestaan. Daarbij kunnen we gebruikmaken van de volgende
symbolen:
Copyright 2007 Academic Service
A Veldeigenschappen
395
0 verplichte invoer van een cijfer (0 t/m 9), het plus- en min-
teken zijn niet toegestaan;
9 invoer van cijfer (0 t/m 9) of een spatie, niet verplicht, het
plus- en minteken zijn niet toegestaan;
# invoer van cijfer (0 t/m 9), spatie of het plus- of minteken,
niet verplicht;
L letters A t/m Z, verplichte invoer;
? letters A t/m Z, niet verplicht;
A letter of cijfer, verplicht;
a letter of cijfer, niet verplicht;
& willekeurig teken of spatie, verplicht;
C willekeurig teken of spatie, niet verplicht;
,.:;-/ scheidingstekens voor decimalen, duizendtallen, datum en
tijd, het echte teken is afhankelijk van de instellingen in
Windows zelf;
> maakt van alle volgende tekens hoofdletters;
< maakt van alle volgende tekens kleine letters;
! lijnt rechts uit;
\ het hieropvolgende teken wordt letterlijk weergegeven.
We kunnen als masker ook het woord Wachtwoord opgeven. De
invoer wordt dan behandeld alsof het een wachtwoord is. Ieder
ingevoerd teken wordt weergegeven door een asterisk.
We kunnen bij het werken met een invoermasker gebruikmaken
van drie secties. In de eerste sectie geven we het masker zelf op. In
de tweede sectie geven we op of we de letterlijke-weergave-tekens
(volgend op \) in de tabel willen opslaan wanneer we gegevens
invoeren. Als we in deze sectie 0 typen, worden alle letterlijke
tekens (bijvoorbeeld de haakjes in een invoermasker voor een tele-
foonnummer) samen met de waarde opgeslagen. Als we 1 typen
of de sectie leeg laten, worden alleen de tekens opgeslagen die we
daadwerkelijk intoetsen. In de derde sectie geven we het teken op
waarmee we spaties in het invoermasker wensen weer te geven.
Om een bankrekening in te toetsen volgens het formaat
12.34.56.789, waarbij we de punten zelf niet opslaan, geven we de
volgende notatie op: 00\.00\.00\.000;1;. Een postcode kan volgens
de layout 0000\ >LL;1 De spatie (tussen de tekens \ en >) wordt nu
niet opgenomen in het bestand.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
396
Door niet zelf een masker in te toetsen maar op de knop met de
drie puntjes te drukken, starten we een Wizard die het instellen
van een masker vereenvoudigt doordat de uitwerking van de instel-
ling direct op het scherm wordt getoond, zie guur A.2. De Wizard
start overigens alleen bij invoermaskers voor velden van het type
tekst en datum/tijd.
We kunnen hier een eerste keuze maken. Selecteer het masker
dat het best aan onze wensen voldoet. Druk daarna op de knop
Volgende. Door op de knop Lijst bewerken te drukken, kun je
een aantal standaardmaskers bewerken en blijvend veranderen.
Je verandert daarmee dus de standaardwaarde zelf. Ook kun je
zelfgedenieerde standaardmaskers toe voegen.
In het scherm van guur A.3 kunnen we het masker aanpassen
voor het veld waarmee we bezig zijn. Een wijziging die we hier
aanbrengen, is dus alleen voor dit ene veld geldig. Tevens kunnen
we hier aangeven met welk teken we het veld willen vullen. Dit
teken wordt later overschreven door de ingetoetste tekens. Hierna
kunnen we naar de volgende stap van de Wizard gaan.
We dienen nu (zie guur A.4) op te geven of de door ons gebruikte
symbolen uit het masker ook moeten worden opgeslagen of niet.
Hiermee krijgen we de mogelijkheid de veldlengte te verkleinen.
We slaan de vaste symbolen immers niet op in de tabel, maar pre-
senteren deze wel in de in- en uitvoer doordat we deze symbolen
Figuur A.2
Copyright 2007 Academic Service
A Veldeigenschappen
397
hebben opgenomen in het masker. Ten slotte voltooien we het
masker.
Let op! Als we gebruikmaken van een invoermasker en tegelijker-
tijd van de eigenschap Notatie, heeft de eigenschap Notatie prio-
riteit bij het weergeven van de gegevens.
Figuur A.3
Figuur A.4
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
398
Bijschrift
Normaal wordt als kolomnaam, of als veldnaam in een formulier,
de naam van het betreffende veld gebruikt zoals die is opgegeven
bij het deniren van de tabel. Met de eigenschap Bijschrift kun-
nen we een andere tekst opgeven die als bijschrift moet worden
gebruikt.
Standaardwaarde
Met deze eigenschap kunnen we een veld van een nieuw record
automatisch laten vullen met een Standaardwaarde. Dit is handig
als we in een veld vaak dezelfde waarde moeten invullen. We kun-
nen hier ook gebruikmaken van functies. Bij een datumveld kun-
nen we bijvoorbeeld gebruikmaken van de functie DATE() om de
huidige datum te noteren. Uiteraard kunnen we tijdens het daad-
werkelijk invoeren van gegevens de standaardwaarde wijzigen in
een andere waarde.
Validatieregel
Met een Validatieregel kunnen we controleren of de door de
gebruiker ingetoetste waarde voldoet aan de beperkingen zoals
we die hebben opgegeven. We kunnen een validatieregel direct
invoeren, maar ook gebruikmaken van de opbouwfunctie voor
expressies zoals we die ook zijn tegengekomen bij het opstellen
van querys.
Door een validatieregel op te geven dient de gebruiker ook altijd
iets in te voeren. Het is niet toegestaan het veld leeg te laten, tenzij
we dit expliciet opgeven in de validatieregel en bij de eigenschap
Vereist.
Om een numerieke waarde te controleren waarvan de waarde moet
liggen tussen 10 en 250, geven we de volgende regel op: >=10
AND <=250. Ook in de Nederlandstalige versie dienen we de uit-
drukking AND te gebruiken! Een tekst van vijf tekens, waarvan
de eerste letter een A is, waarbij het ook is toegestaan om niets in
te vullen: LIKE A???? OR IS NULL. Let erop dat we ook de
waarde van Vereist moeten instellen op No!
Copyright 2007 Academic Service
A Veldeigenschappen
399
Validatietekst
Als we gebruikmaken van een Validatietekst, zal Windows een
standaardmelding tonen op het moment dat er onjuiste invoer is
ingegeven. Willen we een eigen melding laten tonen, dan kunnen
we de tekst hier opgeven.
Vereist
De eigenschap Vereist gebruiken we om op te geven of een veld
verplicht een waarde moet krijgen of dat men het ook leeg mag
laten.
Lengte nul toegestaan
De eigenschap Lengte nul toegestaan bepaalt of we lege invoer
toestaan of niet. Deze eigenschap werkt direct samen met de eigen-
schap Vereist. Is de eigenschap Vereist op Nee ingesteld, dan is
lege invoer (bijvoorbeeld direct op Enter of op de spatiebalk druk-
ken) toegestaan. In het veld wordt dan de Null-waarde geplaatst.
Staat de waarde van de eigenschap Vereist op Ja, dan hebben we de
volgende twee mogelijkheden; deze zijn afhankelijk van de waarde
van de eigenschap Lengte Nul Toegestaan:
Ja: drukken op Enter is niet toegestaan, drukken op de spatiebalk
wel.
Nee: geen van de beide bovenstaande acties is toegestaan.
Gendexeerd
Met de eigenschap Gendexeerd kunnen we opgeven of bij het
betreffende veld een index moet worden aangemaakt (en bijgehou-
den) of niet. Een index zorgt ervoor dat het zoeken in en sorteren
op het betreffende veld aanzienlijk sneller verloopt. Moeten we
vaak zoeken naar waarden in een bepaald veld, dan is het ver-
standig op dat veld een index te deniren. Access creert zelf
automatisch een index voor ieder sleutelattribuut. Vanuit een sleu-
telwaarde worden vaak gerelateerde gegevens in andere bestanden
gezocht. Om dit zoeken te versnellen is het verstandig om in die
bestanden, op basis van de betreffende vreemde sleutel, een index
te laten genereren. Met name bij grote hoeveelheden gegevens zal
het uitvoeren van querys hierdoor aanzienlijk versneld worden.
Het aanbrengen van wijzigingen in de tabel wordt nu wel iets ver-
traagd omdat de index steeds opnieuw moet worden bijgewerkt.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
400
We kunnen de eigenschap instellen op drie waarden:
Nee er wordt nu geen index aangemaakt.
Ja, (Duplicaten Ok) er wordt een index gemaakt waarbij dubbele
waarden zijn toegestaan. Deze waarde dienen we dus in te stellen
bij de index die we aanleggen op basis van een vreemde sleutel.
Ja (Geen duplicaten) er wordt een index gemaakt waarin geen
duplicaten mogen worden opgenomen, zoals bij een sleutelveld
gebruikelijk is.
Vaak is een index op een enkel veld voldoende, soms echter niet.
Bijvoorbeeld: voor het bijhouden van een agenda moet de combi-
natie datum en tijd uniek zijn, maar de afzonderlijke velden hoeven
dat niet te zijn!
Willen we een index op meerdere velden tegelijkertijd, dan moeten
we gebruikmaken van het venster Indexen, te bereiken via de
menukeuze Beeld, Indexen.
In het venster (zie guur A.5) voegen we de gewenste index toe
aan de reeds bestaande indexen. We geven eerst de index een naam
in de kolom Indexnaam. Hierna geven we in de kolom Veldnaam
de verschillende te combineren velden op. Deze velden plaatsen we
onder elkaar op verschillende regels, waarbij we bij het tweede en
volgende veld de kolom Indexnaam leeg laten. Vervolgens geven
we in de kolom Sorteervolgorde, per veld, de gewenste volgorde
aan, Oplopend of Aopend.
Onder in het scherm kunnen we vervolgens nog drie eigenschap-
pen opgeven:
Primair moet de index als primaire sleutel dienst doen? Hiermee
verwijderen we een eventueel al eerder opgegeven primaire sleutel.
Uniek moet de waarde in het (gecombineerde) veld uniek zijn of
niet.
Null-waarden negeren moeten lege velden ook in de index wor-
den opgenomen of niet.
In dit scherm kunnen we ook bestaande indexen wijzigen of ver-
wijderen. We verwijderen een index door de betreffende regel te
markeren en vervolgens op de toets Delete te drukken.
Copyright 2007 Academic Service
A Veldeigenschappen
401
Unicode compressie
Access ondersteunt, net als de andere Ofce-modules, het
Unicode-schema. Hiermee is het mogelijk in plaats van de gebrui-
kelijke 256 tekens ruim 65000 verschillende tekens te gebruiken.
Dit betekent echter wel dat velden van het type Tekst, Memo en
Hyperlink twee keer zoveel ruimte in beslag nemen als wanneer er
geen gebruik gemaakt wordt van Unicode. Indien we de Unicode-
compressie bij een veld toestaan worden de normale tekens zoals
die voorkomen in de West-Europese talen toch gecomprimeerd
opgeslagen. Voor afwijkende tekens, bijvoorbeeld een Grieks of
Russisch symbool, wordt dan automatisch de niet-gecomprimeerde
opslagwijze gehanteerd. Gelet op een efcint gebruik van schij-
fruimte is het verstandig om het comprimeren altijd toe te staan.
Alleen indien we afwijkende tekens gebruiken en we gegevens
willen kunnen uitwisselen met andere 32-bits applicaties (geen
Ofce-modules) die eveneens Unicode ondersteunen, is het ver-
standig de compressie uit te schakelen.
IME-modus / IME-zinmodus
IME staat voor Input Method Editor. Dit is een programma waar-
mee gewone toetsaanslagen, bij het gebruik van de Oost-Aziatische
talen, kunnen worden omgezet naar specieke Oost-Aziatische
karakters. Met behulp van de eigenschappen IME-Modus en IME-
zinmodus kunnen we instellen hoe er in het betreffende veld moet
worden omgegaan met de ingevoerde toetsaanslagen. Het werken
met deze twee eigenschappen heeft alleen maar zin als je de IME
van de gewenste taal daadwerkelijk hebt genstalleerd. Je hebt hier-
bij de keuze uit Chinees, Japans en Koreaans. De gewenste IME
kun je downloaden vanaf de ofcile Windows Ofcewebpagina.
Figuur A.5
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
402
Infolabels
Een infolabel (Smarttag) kun je gebruiken om aan een veld
een bepaalde vooraf gedenieerde standaardactie te koppelen.
Microsoft heeft een aantal standaardacties ontwikkeld, gericht op
het gebruik van Microsoft Ofce. Deze acties stellen je bijvoor-
beeld in staat om snel een email te versturen, een afspraak te plan-
nen of een naam toe te voegen aan de lijst met contactpersonen.
Maar er bestaan ook acties die niet zo zeer gericht zijn op Outlook
maar op andere zaken, bijvoorbeeld het ophalen van nancile
gegevens over een bedrijf. Ook andere partijen dan Microsoft heb-
ben standaardacties ontwikkeld. Heb je een infolabel aan een veld
gekoppeld dan zal, zodra je het veld selecteert, het infolabelsym-
bool verschijnen. Door hier met de rechtermuistoets op te klikken
kun je de actie starten.
Wil je infolabels bij gebruik van het gegevensblad niet tonen,
dan kun je dit bereiken door via Extra, Opties naar het tabblad
Gegevensblad te gaan en hier voor de betreffende keuze het vinkje
weg te halen.
Copyright 2007 Academic Service
B Opties
Tijdens het werken met Access zullen we merken dat het program-
ma een aantal vooraf ingestelde standaardwaarden kent, bijvoor-
beeld de standaardlengte van een tekstveld of de plaats waar de
databases worden opgeslagen. Deze waarden kunnen we voor het
grootste deel zelf wijzigen. Enkele belangrijke standaardinstellin-
gen worden hierna nader toegelicht.
Willen we een standaardwaarde wijzigen, dan kiezen we in het
menu voor Extra, Opties. Vervolgens wordt het scherm dat is afge-
beeld in guur B.1 getoond. Verdeeld over elf tabbladen vinden we
alle instellingen waarvan we de waarde kunnen wijzigen. De zes
belangrijke en voor iedereen bruikbare tabbladen worden hierna
kort toegelicht. Dit zijn achtereenvolgens Weergave, Algemeen,
Bewerken/zoeken, Toetsenbord, Gegevensblad en Tabellen/que-
rys. De overige tabbladen worden hier verder buiten beschouwing
gelaten omdat deze buiten de doelstellingen van dit boek liggen.
Weergave
In het tabblad Weergave kunnen we opgeven wat we op het scherm
wensen te zien. We regelen dit door het betreffende item wel of
niet af te vinken (zie guur B.1).
Als eerste kunnen we opgeven of we de Statusbalk onder in het
scherm wensen te zien. Op deze balk staat onder andere vermeld
in welke modus Access zich bevindt. Ook staan daar vaak korte
aanwijzingen.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
404
Als tweede kun je opgeven of je het Taakvenster dat Access stan-
daard direct na het opstarten van het programma toont, wilt zien
of niet. In het taakvenster kun je direct een bestaande database
openen of een nieuwe database aanmaken. Ook zie je een kort
overzicht van de databases die je het laatst hebt gebruikt. In dit
boek gaan we ervan uit dat dit venster wordt getoond.
De derde instelling, Snelkoppeling voor nieuwe objecten, geeft
aan of in het databasescherm niet alleen de echte objecten (tabel-
len, rapporten, enzovoort) worden getoond maar ook de specieke
snelkoppelingen, bijvoorbeeld Rapport maken in ontwerpweergave
of Rapport maken met wizard.
De vierde instelling, Verborgen objecten, komt soms goed van
pas. We kunnen namelijk objecten uit de database (tabellen,
querys, enzovoort) verbergen. Daartoe klikken we er in het data-
basescherm met de rechtermuisknop op. Vervolgens kiezen we
Eigenschappen en vinken we de instelling Verborgen af. Het object
wordt nu niet langer in het databasescherm getoond. Daardoor
kunnen we het echter ook niet meer benaderen om de instelling
waarmee we het hebben verborgen, te herroepen. Door in dit tab-
blad de eigenschap Verborgen objecten af te vinken zorgen we
ervoor dat ook de verborgen objecten weer getoond worden, alleen
nu voorafgegaan door een lichtgrijs pictogram. Omdat we nu het
object weer kunnen selecteren, kunnen we de eigenschap verber-
gen eventueel weer opheffen.
Figuur B.1
Copyright 2007 Academic Service
B Opties
405
De vijfde instelling is gevaarlijk. We kunnen daarmee de sys-
teemtabellen zichtbaar maken in het databasescherm. In deze
tabellen houdt Access voor zichzelf bij hoe de database is opge-
bouwd: welke tabellen, welke relaties, welke querys, enzovoort
deze bevat. Door in deze tabellen wijzigingen aan te brengen
kunnen we de database ernstig beschadigen. Vink het kenmerk
Systeemobjecten dus niet af, tenzij je daarmee een speciale bedoe-
ling hebt.
De zesde instelling bepaalt of er pictogrammen op de taakbalk
moeten worden getoond voor iedere geopend object of scherm. Om
de pictogrammen te tonen dienen we wel Internet Explorer Active
Desktop genstalleerd te hebben.
Ten slotte kunnen we ook nog aangeven of we bij het ontwerpen
van macros een Kolom met namen en/of een Kolom met voor-
waarden wensen te zien. Ook de wijze van klikken om objecten in
het databasevenster te openen kun je nog opgeven.
Algemeen
In het tabblad Algemeen, zie guur B.2, kunnen we de
Afdrukmarges instellen. Hiermee bepalen we de vrije ruimte aan
de boven-, onder- en zijkant van het papier bij het afdrukken.
Figuur B.2
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
406
Tevens kunnen we hier opgeven welke map (folder) we wensen te
gebruiken als Standaarddatabasemap. In deze map zullen nieuwe
databases worden geplaatst en bestaande databases worden opge-
zocht, tenzij we speciek een andere map opgeven.
Verder kunnen we opgeven welke taal we wensen te gebruiken
bij het bepalen van de Sorteervolgorde voor nieuwe database. De
sorteervolgorde kan namelijk van land tot land verschillen, mede
als gevolg van tekens die in de ene taal wel en in de andere taal
niet voorkomen. Deze instelling heeft geen invloed op de sorteer-
volgorde van bestaande databases.
Met de instelling Automatische naamcorrectie kunnen we instel-
len of Access gegevens moet bijhouden om een verbetering in een
naam later ook op andere plaatsen automatisch door te voeren.
Tevens kunnen we aangeven of de automatische verbeteringen
direct doorgevoerd moeten worden en of hiervan een logboek moet
worden bijgehouden. We hebben ook de mogelijk om aan te geven
of jaartallen in de geopende database, of zelfs in alle databases,
met vier cijfers moeten worden getoond of niet. Deze instelling is
onafhankelijk van de datuminstelling zoals die is opgegeven in het
conguratiescherm van Windows zelf. In het veld Laatst gebruikte
bestanden geven we aan of we bij het openen van het menu-item
Bestand de laatst gebruikte bestanden wensen te zien en zo ja,
welk aantal. Het item Comprimeren bij sluiten bepaalt of we data-
bases bij het opslaan willen laten comprimeren of niet. Access
zorgt er zelf voor dat bij het openen van databases eventueel wordt
gedecomprimeerd. De compressie die hier wordt gerealiseerd, is
bij lange na niet zo goed als de compressie die bij speciale com-
pressieprogrammas zoals PKZIP wordt behaald.
We kunnen ook opgeven of we gebruik wensen te maken van
geluidseffecten bij bijvoorbeeld het optreden van fouten of uit-
zonderlijke situaties, Feedback met geluid. De te gebruiken gelui-
den kunnen we binnen Windows zelf instellen. Wees voorzichtig
in het gebruik van geluiden omdat gebruikers zich snel ergeren aan
overbodige, steeds terugkerende geluiden.
Met de instelling Persoonlijke gegevens uit dit bestand verwij-
deren, kunnen we afdwingen dat de persoonlijke gegevens zoals
naam en bedrijf wel of niet worden opgenomen in de algemene
Copyright 2007 Academic Service
B Opties
407
eigenschappen van een database. De algemene eigenschappen van
een database kun je opvragen via Bestand, Eigenschappen. Met de
knop Webopties roep je een scherm op waarin je een aantal web-
gerelateerde eigenschappen instelt, zoals de kleur waarmee een al
dan niet gevolgde weblink moet worden weergegeven.
Serviceopties geeft de mogelijkheid om gebruik te maken van
Microsoft Online. Bij het gebruik van de help-functie worden
dan niet alleen de hulpbestanden gebruikt die op de PC aanwezig
zijn, maar ook de online (op het web) aangeboden hulpbestanden.
Tevens krijg je hiermee de beschikking over via het web aan-
geboden sjablonen en mediafragmenten. Via deze optie kun je ook
aangeven of je wilt meewerken aan het leveren van feedback aan-
gaande het gebruik van Microsoft software. Deze feedback ver-
loopt geheel geautomatiseerd en in de achtergrond. Op regelmatige
tijdstippen worden (niet-persoonsgebonden) gegevens omtrent
gebruik, uitzonderingen, foutmeldingen etc. naar Microsoft verstu-
urd.
Bewerken/zoeken
In het tabblad Bewerken/zoeken kunnen we als eerste opgeven
wat de standaardmethode zoeken/vervangen moet zijn. Deze stan-
daardmethode wordt voorgesteld als we gegevens gaan zoeken
in een tabel via de menukeuze Bewerken, Zoeken. De standaard-
methode kunnen we hier wijzigen, zie guur B.3.
Verder kunnen we opgeven bij welke bewerkingen er volgens ons
om Bevestigen gevraagd moet worden voordat de bewerking daad-
werkelijk wordt uitgevoerd.
De andere instellingen hebben te maken met het gebruik van een
Formulierlter. We kunnen dan opgeven bij welk soort veld (wel
of niet gendexeerd) we wel of geen Lijst met waarden wensen aan
te bieden. In een dergelijke lijst worden alle in het betreffende veld
voorkomende waarden getoond. We kunnen dan de lterwaarde
bekend maken door de betreffende waarde te selecteren. Ook kun-
nen we hier de waarde instellen die opgeeft: Geen lijsten weer-
geven waarvoor meer dan het volgende aantal records is gelezen.
Lijsten waarbij minder dan het opgegeven aantal records is betrok-
ken, worden getoond. Lijsten waarbij meer dan het opgegeven aan-
tal records is betrokken, worden onderdrukt.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
408
Toetsenbord
In het tabblad Toetsenbord kunnen we als eerste opgeven wat de
wijze van Verplaatsing met Enter moet zijn op het moment dat
we op de toets Enter drukken, zie guur B.4. We kunnen ervoor
kiezen om de cursor niet te verplaatsen, te verplaatsen naar het
volgende veld of te verplaatsen naar het volgende record. In het
laatste geval zullen we waarschijnlijk met de Tab-toets van veld
naar veld springen.
Ook kunnen we opgeven wat de Focus na verplaatsing moet zijn.
Moet de cursor na het verplaatsen naar een ander veld aan het
begin van het veld staan, aan het einde van het veld, of moet het
gehele veld direct zijn geselecteerd (gemarkeerd).
Met de instelling Werking van pijltoetsen geven we op of we met
het gebruik van de toetsen en naar het volgende teken of
naar het volgende veld wensen te springen. In het laatste geval
kunnen we met behulp van de toets F2 binnen een veld toch naar
een volgend teken gaan.
De instelling Cursor stopt bij eerste/laatste veld, bepaalt of we met
de toetsen en wel of niet door kunnen gaan naar een vorig/
volgend record in de lijst.
Figuur B.3
Copyright 2007 Academic Service
B Opties
409
Gegevensblad
In het tabblad Gegevensblad kunnen we de opmaak van de
gegevensbladen instellen, zie guur B.5.
De instellingen voor Standaardkleuren, Standaardlettertype,
Standaardweergave van rasterlijnen, Standaardkolombreedte,
Standaardceleffect en Animatie weergeven kunnen we aanpassen.
Figuur B.4
Figuur B.5
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
410
Met name de instelling voor de standaardbreedte voor kolommen
kan waarschijnlijk goed van pas komen. Je kunt hier ook opgeven
of je eventuele aanwezige infolabels (smarttags) wel of niet wilt
zien bij het werken met tabellen en formulieren. De mogelijkheid
kan met name een rol spelen bij het werken met databases die door
derden worden aangeleverd en waarbij ongewenste standaardacties
aan de infolabels zijn toegekend.
Tabellen/querys
Het tabblad Tabellen/querys is bedoeld om de standaard bij het
ontwerpen van tabellen en querys in te stellen, zie guur B.6.
Als eerste kunnen we de Standaardveldlengten opgeven. Voor
tekst bedraagt deze 50 tekens, maar het is aan te bevelen deze te
verlagen tot 25. De standaardlengte voor getallen is gesteld op
lange integer, waarbij we dus gehele getallen van 2.147.483.648
tot en met 2.147.483.647 kunnen invoeren.
Vervolgens kunnen we het Standaardveldtype instellen en onder
welke omstandigheden er automatisch indexen moeten worden
aangemaakt, AutoIndex bij importeren/maken.
Op formulieren en rapporten maak je gebruik van de velden zoals
deze in de tabellen/querys voorkomen. Neem je een veld uit een
Figuur B.6
Copyright 2007 Academic Service
B Opties
411
tabel voor het eerst op in het ontwerp van een formulier/rapport,
dan worden automatisch alle eigenschappen van dat veld mee-
genomen, bijvoorbeeld dat het een numeriek veld is met twee deci-
malen. Wijzig je later de eigenschappen van het veld in de
onderliggende tabel (je wilt bijvoorbeeld een valutanotatie), dan
wil je waarschijnlijk dat deze wijziging ook wordt doorgevoerd in
alle formulieren/rapporten waar dit veld gebruikt wordt, of juist
niet! Je kunt Access zo instellen dat in dat geval een overzicht
wordt getoond van alle formulieren/rapporten waar dit veld
gebruikt wordt en je de mogelijkheid wordt gegeven de eigen-
schappen ook in die formulieren/rapporten aan te passen. Je moet
daartoe aangeven dat de knoppen voor de bijwerkopties voor
eigenschappen dienen te worden weergegeven.
Bij de instellingen van het query-ontwerp geven we eerst de instel-
ling Tabelnamen weergeven op. Hiermee bepalen we of de namen
van de tabellen in het ontwerpraster moeten worden vermeld of
niet. De instelling Alle velden weergeven bepaalt of bij het maken
van een query alle velden uit de betrokken tabellen moeten worden
getoond of alleen de door ons geselecteerde velden. De instelling
AutoJoin activeren bepaalt of Access zelf tabellen moet koppelen
of dat we dat handmatig moeten doen. Deze instelling zorgt ervoor
dat bij het gebruik van meer dan n tabel alleen de juiste combi-
naties worden gemaakt, op basis van velden die in beide tabellen
voorkomen en in n van de tabellen de sleutel vormen. Je vindt
hier ook de mogelijkheid om het lettertype en de tekengrootte op te
geven zoals die tijdens het ontwerpen van de query moeten worden
gebruikt. De instelling Uitvoeringsmachtigingen bepaalt of alleen
de eigenaar van een query wijzigingen in de query mag aanbren-
gen of dat ook gebruikers van de query dat mogen, gebaseerd op
de aan de gebruiker algemeen toegekende rechten.
De optie Met SQL-Server compatibele syntaxis (ANSI 92) bepaalt
of je wilt werken met de standaard ANSI 92 of met de standaard
ANSI 89. Access werkt bij SQL met de standaard ANSI 89. Deze
standaard is dan ook in dit boek aangehouden. Zolang je werkt met
Access-databases geeft dit weinig tot geen beperkingen. Maar als
je gegevens wilt ontsluiten die in een professioneel DBMS zoals
MS SQL-server liggen opgeslagen, moet je de standaard ANSI 92
gebruiken omdat MS SQL-server volgens die standaard werkt.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
412
Er zitten echter verschillen tussen de beide standaards die direct
gevolgen kunnen hebben voor de geproduceerde uitvoer. Een
belangrijk detail waarin de beide standaarden van elkaar verschil-
len, is bijvoorbeeld het gebruik van wildcards. De een gebruikt
een * en de ander een %-teken. De query SELECT plaats FROM
Bestemming WHERE plaats LIKE B* levert in de ene standaard
alle plaatsen op waarvan de naam met de letter B begint. In de
andere standaard wordt er geen uitvoer geproduceerd omdat daar
letterlijk naar de tekst B* wordt gezocht. En die wordt niet aan-
getroffen! Door dit soort verschillen is het dan ook niet mogelijk
om beide standaarden door elkaar te gebruiken. Je moet een keuze
maken. Bedenk dat bij het overschakelen naar de standaard ANSI
92, door het aanvinken van het betreffende veld, je alle querys
moet controleren op juist functioneren. In dit boek gaan we ervan
uit dat er wordt gewerkt volgens de standaard van Access, dus
ANSI 89.
Naast de mogelijkheid om makkelijk te werken met bijvoorbeeld
MS SQL-server, biedt ANSI 92 ook de mogelijkheid om:
rechten toe te kennen / te herroepen met GRANT en REVOKE;
DISTINCT te gebruiken bij rekenkundige functies;
de omvang van de uitvoer te beperken met LIMIT TO .. ROWS.
Copyright 2007 Academic Service
C Een grote, uitgewerkte
opdracht
In deze bijlage wordt een uitgewerkt voorbeeld gegeven van een
opdracht waarin alle aspecten aan de orde komen zoals die in dit
boek zijn toegelicht in de hoofdstukken 1 tot en met 7. Er wordt
uitgegaan van een gegeven informatiebehoefte. Via de techniek
van het normaliseren wordt hieruit de informatiebehoefte bepaald.
Vervolgens wordt de informatiebehoefte vertaald naar een Access-
database en worden de tabellen gevuld met gegevens. Ten slotte
wordt er een aantal querys, formulieren en rapporten ontwikkeld
waarmee de opgeslagen informatie ontsloten wordt. Docenten kun-
nen vergelijkbare opgaven verkrijgen bij de auteurs van het boek.
Voor meer informatie hierover verwijzen we naar het voorwoord.
De opdracht
Een tweewielcentrum in Almelo verkoopt etsen, brommers en
scooters. Sinds enige jaren heeft men de klanten ook de mogelijk-
heid gegeven om brommers en scooters te leasen. Om de gegevens
hiervan bij te houden maakt men onder andere gebruik van de vol-
gende overzichten.
In guur C.1 wordt per leasecontract vastgelegd wie welke brom-
mer of scooter least, vanaf welke datum en tegen welk bedrag.
Tevens wordt na aoop van het contract de datum vastgelegd waar-
op het contract eindigt. Men kan een contract per maand opzeg-
gen. Er geldt wel een opzegtermijn van twee maanden. Tenslotte
houdt men per contract ook de betalingsgegevens bij. De prijs per
maand is gebaseerd op het merk en type brommer of scooter dat
wordt gehuurd en van het feit of men ook een verzekering via het
tweewielcentrum heeft afgesloten. In dat geval ontvangt men een
korting van 10% op het standaard leasebedrag per maand.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
414
In guur C.2 wordt per merk en type de prijs bijgehouden die men
per maand in rekening brengt.
a. Logisch ontwerp
a.1. Normaliseer beide guren. Licht de normalisaties toe, denk
daarbij aan het toelichten van proces-, samengestelde en con-
stante gegevens. Licht ook de sleutelkeuze toe.
Figuur C.1
Figuur C.2
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
415
a.2. Integreer de normalisaties tot n geheel en ontwerp het bij-
behorende ERD.
a.3. Bij de onderdelen d, e en f kan sprake zijn van nog niet
genoemde attributen. Voeg deze (indien van toepassing) toe
aan de betreffende objecten.
b. Technisch ontwerp
b.1. Ontwerp de tabellen met behulp van Access. Zorg ervoor dat
bij vreemde sleutels alleen uit de bijbehorende sleutelwaarde
kan worden gekozen door gebruik te maken van een combo-
box (zie hoofdstuk 5). Neem in de kolom Beschrijving een
korte omschrijving op.
b.2. Leg tussen de tabellen alle bestaande relaties en dwing daar-
bij de controle op referentile integriteit af.
c. Opbouwen tabellen
c.1. Vul de bestanden met gegevens. Zorg ervoor dat de inhoud
van de tabellen een rele afspiegeling van de werkelijkheid is,
zonder je te verliezen in het invoeren van een eindeloze reeks
van gegevens. Zorg er ook voor dat alle hierna opgenomen
opgaven kunnen worden uitgevoerd en getest.
c.2. Maak een invoerformulier waarmee in n van de tabellen,
n waarbij geen sprake is van een vreemde sleutel, gegevens
kunnen worden ingevoerd. Zorg ervoor dat dit formulier net-
jes, overzichtelijk en uitnodigend is.
d. Opvragen gegevens
d.1. Verzorg een query waarmee alle klantgegevens worden gepre-
senteerd van klanten die per automatische incasso betalen. Op
volgorde van postcode.
d.2. Verzorg een query waarmee een overzicht wordt verkregen
met daarop per leasecontract het merk, type, prijs per maand
en de naam en de woonplaats van de klant. Het overzicht
moet liggen op volgorde van woonplaats. Bij gelijke woon-
plaats moet worden doorgesorteerd (oplopend) op merk.
d.3. Hoeveel leasecontracten zijn er in 2002 afgesloten, die nog
steeds doorlopen en waarbij ook direct de verzekering via ons
is afgesloten?
d.4. Verzorg per plaats het totale aantal afgesloten en nu nog lopen-
de leasecontracten. Toon het overzicht op volgorde van plaats-
naam.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
416
d.5. Verzorg een query waarmee per contract het totaal aan betaal-
de bedragen wordt getoond. Laat ook het aantal betalingen
en de naam van de klant tonen. Het overzicht moet liggen op
volgorde van dalend totaalbedrag.
e. Manipuleren gegevens
e.1. Verzorg een query waarmee het bedrag per maand wordt aan-
gepast. Leasebedragen boven de 20, moeten met 2% wor-
den verhoogd. Alle andere moeten met 3% worden verhoogd.
Maak voordat je dit test een kopie van je database!
e.2. Verzorg een query waarmee alle contracten, beindigd op of
voor een door de gebruiker op te geven datum, worden ver-
wijderd. Maak voordat je dit test een kopie van de database!
f. Rapporten
f.1. Verzorg een rapport waarmee guur C.2 kan worden gegene-
reerd.
f.2. Verzorg een rapport waarmee guur C.1 kan worden gegene-
reerd, nadat het nummer van het betreffende contract is inge-
voerd. Tip: maak een exibele query.
Uitwerking
a. Logisch ontwerp
a.1. Normaliseer beide guren. Licht de normalisaties toe, denk daar-
bij aan het toelichten van proces-, samengestelde en constante
gegevens. Licht ook de sleutelkeuze toe.
We beginnen met het normaliseren van guur C1. In dit overzicht
zien we allereerst de gegevens van het tweewielcentrum zelf. Dit
zijn vaste, constante gegevens die we niet opnemen. Vervolgens
zien we een aantal gegevens van de klant, de gegevens van het
geleaste voertuig, gegevens omtrent het contract en tenslotte een
aantal keer gegevens omtrent de verrichte betalingen. Dit levert de
onderstaande nulde normaalvorm.
0 NV (contractnummer, klantnummer, naam, adres, postcode,
plaats, telefoonnummer, geboortedatum, merk, type,
ingangsdatum, beindigingdatum, verzekering, maand-
bedrag, RG (betaal-datum, betaald bedrag))
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
417
Per contract wordt een uniek nummer gebruikt. Het contractnum-
mer kan dus als sleutel worden gebruikt. Alle gegevens worden n
keer vermeld, met uitzondering van de betaalgegevens, die dus zijn
opgenomen in een herhalende groep, repeating group. Omdat er
per maand een afwijkend bedrag kan zijn betaald, kan het betaalde
bedrag niet worden gezien als een procesgegeven.
1 NV (contractnummer, klantnummer, naam, adres, postcode,
plaats, telefoonnummer, geboortedatum, merk, type, in-
gangsdatum, beindigingdatum, verzekering, maandbedrag)
(contractnummer, betaaldatum, betaald bedrag)
De herhalende groep is apart genomen. Omdat er per contract
meerdere bedragen kunnen zijn betaald, maar nooit twee maal op
dezelfde datum, bestaat de sleutel in de nieuwe groep uit de combi-
natie contractnummer, betaaldatum.
2 NV = 1 NV
Er is in n groep sprake van een samengestelde sleutel, maar het
daarin opgenomen niet-sleutelattribuut is afhankelijk van de
gehele sleutel.
3 NV (contractnummer, klantnummer, merk, type, ingangsdatum,
beindigingdatum, verzekering, maandbedrag) (contract-
nummer, betaaldatum, betaald bedrag) (klantnummer,
naam, adres, postcode, plaats, telefoonnummer, geboorte-
datum)
Er is een nieuwe groep ontstaan met daarin de gegevens van de
klant. Deze gegevens hebben immers op zich niets te maken met
het contractnummer.
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
418
We vinden dus uiteindelijk:
CONTRACT (contractnummer, klantnummer, merk, type,
ingangsdatum, beindigingdatum, verzekering,
maandbedrag)
BETALING (contractnummer, betaaldatum, betaald bedrag)
KLANT (klantnummer, naam, adres, postcode, plaats,
telefoonnummer, geboortedatum)
We zullen nu guur C.2 normaliseren.
0 NV (merk, type, prijs per maand)
Ook hier geldt dat de gegevens van het tweewielcentrum als con-
stanten beschouwd kunnen worden. Er is ook geen sprake van een
herhalende groep. Omdat de prijs per maand afhankelijk is van het
merk en type, bestaat de sleutel uit de combinatie van deze twee
gegevens.
Vervolgens geldt dat de gevonden nulde normaalvorm ook direct
de eerste, tweede en derde normaalvorm is. We krijgen dus uitein-
delijk:
VOERTUIG (merk, type , prijs per maand)
a.2. Integreer de normalisaties tot n geheel en ontwerp het bij-
behorende ERD.
De integratie geeft in eerste instantie de onderstaande vier tabel-
len.
CONTRACT (contractnummer, klantnummer, merk, type,
ingangsdatum, beindigingdatum, verzekering,
maandbedrag)
BETALING (contractnummer, betaaldatum, betaald bedrag)
KLANT (klantnummer, naam, adres, postcode, plaats,
telefoonnummer, geboortedatum)
VOERTUIG (merk, type , prijs per maand)
Door de integratie ontstaat er plotseling een procesgegeven. Het
maandbedrag in de tabel CONTRACT is na integratie een pro-
cesgegeven geworden, omdat dit bedrag ook kan worden afgeleid
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
419
uit de prijs per maand uit de tabel VOERTUIG, tezamen met het
gegeven verzekering uit de tabel CONTRACT. Immers, als er geen
verzekering is afgesloten, geldt dat het maandbedrag gelijk is aan
de prijs per maand. Als er wel een verzekering bij afgesloten is,
wordt er een korting van 10% op de prijs per maand verleend. Dus
uit het feit of er wel of niet een verzekering is afgesloten, kan in
combinatie met de prijs per maand het maandbedrag worden ber-
ekend. We laten het maandbedrag dus achterwege. We krijgen dan:
CONTRACT (contractnummer, klantnummer, merk, type,
ingangsdatum, beindigingdatum, verzekering)
BETALING (contractnummer, betaaldatum, betaald bedrag)
KLANT (klantnummer, naam, adres, postcode, plaats,
telefoonnummer, geboortedatum)
VOERTUIG (merk, type , prijs per maand)
Dit levert het volgende ERD op:
Bij een contract kunnen nul, een of meer betalingen horen. Een
betaling hoort bij precies n contract. Bij een contract hoort pre-
cies n klant, maar een klant kan wel meerdere contracten hebben
lopen. Omdat we een klantgegeven pas opnemen in de database als
er een contract is opgesteld, hoort er bij iedere klant minstens n
contract.
Bij een contract hoort n type voortuig. Bij een bepaald type
voertuig kunnen we nul, n of meer contracten vinden.
a.3. Bij de onderdelen d, e en f kan sprake zijn van nog niet genoemde
attributen. Voeg deze (indien van toepassing) toe aan de betref-
fende tabellen.
Bij vraag d.1 is sprake van automatische incasso. Dit moeten we
toevoegen aan de tabellen. Het gegeven moet worden toegevoegd
aan de tabel CONTRACT om het mogelijk te maken dat een klant
o.b.v. contractnummer o.b.v. klantnummer
o.b.v. merk + type
Betaling Contract Klant
Voertuig
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
420
per contract bepaalt of hij wel of niet via automatische incasso wil
betalen. We krijgen dus uiteindelijk:
CONTRACT (contractnummer, klantnummer, merk, type,
ingangsdatum, beindigingdatum, verzekering,
aut incasso)
BETALING (contractnummer, betaaldatum, betaald bedrag)
KLANT (klantnummer, naam, adres, postcode, plaats,
telefoonnummer, geboortedatum)
VOERTUIG (merk, type , prijs per maand)
b. Technisch ontwerp
b.1. Ontwerp de tabellen met behulp van Access. Zorg ervoor dat
bij vreemde sleutels alleen uit de bijbehorende sleutelwaarde kan
worden gekozen door gebruik te maken van een combobox (zie
hoofdstuk 5). Neem in de kolom Beschrijving een korte omschrij-
ving op.
De ontworpen tabellen kun je terugvinden in database TWEEWIEL-
CENTRUM. Deze database is te vinden op de cd-rom die bij het
boek is geleverd. Een afdruk van de ontworpen tabellen is weer-
gegeven in de guren C.3 tot en met C.6
Figuur C.4
Figuur C.5
Figuur C.3
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
421
b.2. Leg tussen de tabellen alle bestaande relaties en dwing daarbij de
controle op referentile integriteit af.
De relaties zoals weergegeven in het ERD zijn ook opgenomen in
de database TWEEWIELCENTRUM. Een afdruk is te vinden in
guur C.7
c. Opbouwen tabellen
c.1. Vul de bestanden met gegevens. Zorg ervoor dat de inhoud van de
tabellen een rele afspiegeling van de werkelijkheid is, zonder je
te verliezen in het invoeren van een eindeloze reeks van gegevens.
Zorg er ook voor dat alle hierna opgenomen opgaven kunnen wor-
den uitgevoerd en getest.
De inhoud van de tabellen kan worden teruggevonden in de data-
base TWEEWIELCENTRUM. Voor de overzichtelijkheid is de
inhoud van de tabellen ook hier weergegeven in de guren C.8 tot
en met C.11.
Figuur C.6
Figuur C.7
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
422
contract- klant- merk type ingangs- beindigings- verzekering aut incasso
nummer nummer datum datum
1 6 Asprilla Exclusiv 13-3-2002 Ja Ja
2 4 Garvin Luxe 13-3-2002 Nee Nee
3 9 Asprilla Exclusiv 16-5-2002 Nee Ja
4 3 Vespa GHT 31-5-2002 Ja Ja
5 2 Asprilla Rimi 1-6-2002 Nee Nee
6 1 Garvin Modio 1-6-2002 1-9-2002 Nee Nee
7 1 Vespa Pronto 1-9-2002 Nee Nee
8 5 Garvin Luxe 13-10-2002 Ja Ja
9 7 Vespa GHT 24-1-2003 Ja Ja
10 8 Garvin Luxe 26-1-2002 26-3-2003 Nee Ja
11 4 Asprilla Rimi 3-1-2003 Ja Ja
12 8 Vespa Pronto 26-3-2003 Nee Nee
Figuur C.8
contractnummer betaaldatum betaald bedrag
2 1-4-2002 C 9,00
1 1-4-2002 C 16,00
1 1-5-2002 C 23,40
2 1-5-2002 C 12,50
3 1-6-2002 C 13,00
1 1-6-2002 C 23,40
5 1-7-2002 C 32,00
4 1-7-2002 C 18,00
6 1-7-2002 C 13,75
3 1-7-2002 C 13,00
1 1-7-2002 C 23,40
2 1-7-2002 C 25,00
4 1-8-2002 C 18,00
3 1-8-2002 C 13,00
5 1-8-2002 C 32,00
6 1-8-2002 C 13,75
1 1-8-2002 C 23,40
4 1-9-2002 C 18,00
6 1-9-2002 C 13,75
2 1-9-2002 C 25,00
3 1-9-2002 C 13,00
5 1-9-2002 C 32,00
1 1-9-2002 C 23,40
5 1-10-2002 C 32,00
7 1-10-2002 C 22,50
1 1-10-2002 C 23,40
2 1-10-2002 C 12,50
3 1-10-2002 C 13,00
4 1-10-2002 C 9,00
1 1-11-2002 C 23,40
zie vervolg
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
423
8 1-11-2002 C 5,00
7 1-11-2002 C 22,50
3 1-11-2002 C 13,00
4 1-11-2002 C 9,00
5 1-11-2002 C 32,00
2 1-11-2002 C 12,50
8 1-12-2002 C 12,50
2 1-12-2002 C 12,50
5 1-12-2002 C 32,00
4 1-12-2002 C 36,00
3 1-12-2002 C 13,00
1 1-12-2002 C 23,40
7 1-12-2002 C 22,50
7 1-1-2003 C 22,50
5 1-1-2003 C 32,00
3 1-1-2003 C 13,00
2 1-1-2003 C 12,50
8 1-1-2003 C 12,50
4 1-1-2003 C 18,00
1 1-1-2003 C 23,40
8 1-2-2003 C 12,50
4 1-2-2003 C 18,00
9 1-2-2003 C 6,00
7 1-2-2003 C 22,50
5 1-2-2003 C 25,00
10 1-2-2003 C 3,50
11 1-2-2003 C 26,00
1 1-2-2003 C 23,40
3 1-2-2003 C 13,00
11 1-3-2003 C 28,80
10 1-3-2003 C 12,50
9 1-3-2003 C 18,00
8 1-3-2003 C 12,50
1 1-3-2003 C 23,40
5 1-3-2003 C 25,00
7 1-3-2003 C 22,50
3 1-3-2003 C 13,00
contractnummer betaaldatum betaald bedrag
Figuur C.9
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
424
c.2. Maak een invoerformulier waarmee in n van de tabellen, n
waarbij geen sprake is van een vreemde sleutel, gegevens kunnen
worden ingevoerd. Zorg ervoor dat dit formulier netjes, overzich-
telijk en uitnodigend is.
Er is voor gekozen dit formulier te ontwerpen voor de tabel
KLANT. Voor het ontwerp is gebruikgemaakt van de wizard.
Een afdruk van het formulier is weergegeven in guur C.12
en kan in de database worden teruggevonden onder de naam
KLANTINVOER.
Figuur C.10
klant- naam adres postcode plaats telefoon- geboorte-
nummer nummer datum
1 Jansen, Jan Kerkstraat 2 7607 BS Almelo 0546753796 1-3-1982
2 Walters, Wouter Merelstraat 13 7605 BG Almelo 0546758869 27-12-1981
3 Verploeg, Koen Oranjestraat 164 7461 DK Rijssen 0548442943 31-3-1982
4 Wit, Erica de Almeloseweg 182 7614 LB Mariaparochie 0546433839 15-11-1982
5 Boer, Koen de Eikenlaan 10 7461 XS Rijssen 0548499303 28-3-1979
6 Gerets, Monique 1e lageveldsweg 2 7641 RM Wierden 0546933302 3-12-1981
7 Gerets, Jannie 1e lageveldsweg 2 7641 RM Wierden 0546933302 3-12-1981
8 Hoofd, Eric Hofstraat 13 7607 AB Almelo 0546749941 26-12-1982
9 Mens, Hans Ravelstraat 42 7604 HZ Almelo 0546747732 18-11-1981
merk type prijs per maand
Asprilla Exclusiv C 26,00
Asprilla GT C 29,00
Asprilla Rimi C 32,00
Garvin Luxe C 12,50
Garvin Modio C 13,75
Vespa GHT C 20,00
Vespa Pronto C 22,50
Figuur C.11
Figuur C.12
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
425
d. Opvragen gegevens
d.1. Verzorg een query waarmee alle klantgegevens worden gepresen-
teerd van klanten die per automatische incasso betalen. Op vol-
gorde van postcode.
De query is opgeslagen onder de naam Aut-incasso. Figuur C.13
bevat een afdruk van het ontwerpscherm. Figuur C.14 toont de
gegenereerde uitvoer.
d.2. Verzorg een query waarmee een overzicht wordt verkregen met
daarop per leasecontract het merk, type, prijs per maand en de
naam en de woonplaats van de klant. Het overzicht moet liggen
op volgorde van woonplaats. Bij gelijke woonplaats moet worden
doorgesorteerd (oplopend) op merk.
De query is opgeslagen onder de naam MerkperPlaats. Figuur C.15
bevat een afdruk van het ontwerpscherm. Figuur C.16 toont de
gegenereerde uitvoer.
Figuur C.13
Figuur C.14
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
426
d.3. Hoeveel leasecontracten zijn er in 2002 afgesloten, die nog steeds
doorlopen en waarbij ook direct de verzekering via ons is afgeslo-
ten?
De query is opgeslagen onder de naam Aantal2002Verzekering.
Figuur C.17 bevat een afdruk van het ontwerpscherm. Figuur C.18
bevat de gegenereerde uitvoer.
Figuur C.15
Figuur C.16
Figuur C.17
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
427
d.4. Verzorg per plaats het totale aantal afgesloten en nu nog lopende
leasecontracten. Toon het overzicht op volgorde van plaatsnaam.
Om dit probleem op te lossen is er eerst een query ontworpen die
een overzicht geeft van de lopende contracten. Deze query is
opgeslagen onder de naam LopendeContracten. Figuur C.19 bevat
een afdruk van het ontwerpscherm. Figuur C.20 bevat de gegener-
eerde uitvoer.
Hierna is de uitvoer van de vorige query, met dus alleen de lopende
contracten, gebruikt om per plaats het aantal contracten te bepalen.
Deze query is opgeslagen onder de naam AantalContractenPer-
Plaats. Figuur C.21 bevat een afdruk van het ontwerpscherm.
Figuur C.22 bevat de gegenereerde uitvoer.
Figuur C.18
Figuur C.19
Figuur C.20
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
428
d.5. Verzorg een query waarmee per contract het totaal aan betaalde
bedragen wordt getoond. Laat ook het aantal betalingen en de
naam van de klant tonen. Het overzicht moet liggen op volgorde
van dalend totaalbedrag.
De query is opgeslagen onder de naam TotaalPerContract. Figuur
C.23 bevat een afdruk van het ontwerpscherm. Figuur C.24 bevat
de gegenereerde uitvoer.
Figuur C.21
Figuur C.22
Figuur C.23
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
429
e. Manipuleren gegevens
e.1. Verzorg een query waarmee het bedrag per maand wordt aan-
gepast. Leasebedragen boven de 20, moeten met 2% worden
verhoogd. Alle andere moeten met 3% worden verhoogd. Maak
voordat je dit test een kopie van de database!
De query is opgeslagen onder de naam VerhoogMaandbedragen.
Figuur C.25 bevat een afdruk van het ontwerpscherm. Er is gebrui-
kgemaakt van de IIF-functie om de wijziging tot stand te brengen.
e.2. Verzorg een query waarmee alle contracten, beindigd op of voor
een door de gebruiker op te geven datum, worden verwijderd.
Maak voordat je dit test een kopie van je database!
De query is opgeslagen onder de naam VerwijderBeeindigdeCont
racten. Figuur C.26 bevat een afdruk van het ontwerpscherm. Om
deze query goed te laten verlopen dient de relatie tussen Contract
Figuur C.24
Figuur C.25
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
430
en Betaling te zijn ingesteld op Gerelateerde records trapsgewijs
verwijderen. Hierdoor zullen ook de betalingen van de betrokken
contracten worden verwijderd!
f. Rapporten
f.1. Verzorg een rapport waarmee guur C.2 kan worden gegenereerd.
Het rapport is opgeslagen onder de naam Prijslijst. Figuur C.27
bevat een afdruk van het ontwerpscherm. Figuur C.28 bevat de
gegenereerde uitvoer.
Figuur C.26
Figuur C.27
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
431
f.2. Verzorg een rapport waarmee guur C.1 kan worden gegenereerd,
nadat het nummer van het betreffende contract is ingevoerd. Tip:
maak een exibele query.
Om dit rapport te kunnen maken is eerst een query ontworpen
waarbij alle benodigde gegevens worden gegenereerd. Er is bij de
bouw van de query voor gezorgd dat eerst om een contractnummer
wordt gevraagd. De gegevens van het bijbehorende contract wor-
den vervolgens gegenereerd. Deze query is opgeslagen onder de
naam BetalingenPerContract.
Vervolgens is op basis van deze query het rapport opgemaakt.
Het rapport is opgeslagen onder de naam OverzichtPerContract.
Figuur C.29 bevat een afdruk van het ontwerpscherm. Figuur C.30
bevat de gegenereerde uitvoer.
Figuur C.28
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
432
Figuur C.29
Figuur C.30
Copyright 2007 Academic Service
433
Index
Symbolen
&-teken 256
A
achtergrondkleur 255
actiekolom 248
afbeeldingen 151
afdrukken 88
afhankelijk kader 152
Algemeen 405
alias 356
Alleen lijst 163
AND 347
applicatie 5, 271
argumenten 248
ASC 359
attribuut 26, 36, 70
attribuutwaarde 36
AVG 361
B
Back Color 255
Backup 123
besturingselementnaam 263
BETWEEN 348
bewerken 407
bijeenhouden 223
bij geen gegevens 320
bij klikken 268
bij openen 269
bij opmaken 314
bijschrift 221, 398
bij sluiten 300
Border Style 222
breedte 284
C
Caption 221
Check Box 145
Combo Box 156
Command Button 180
Common Expressions 312
conceptueel datamodel 14
Conditions 264
constante gegevens 25
constantentabel 273
ControlTip Text 184
converteren 7
COUNT 361
D
database 9
aanmaken 71
openen 351
selecteren 77
database-administrator 14
datadictionary 60
datamodel 14
DataPageSize 208
datumaanduiding 348
DELETE FROM 385
derde normaalvorm 33
DESC 359
detail 215
DISTINCT 350
DividingLines 280
draaigraeken 192
draaitabellen 185
dubbele repeterende groep 47, 52
duplicaten verbergen 216
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
434
E
eerste normaalvorm 28
elementaire gegevens 25
Enabled 168
entiteit 36
entiteit-occurence 36
Entiteit-Relatie-Diagram 36
ExpandedByDefault 208
Expression Builder 260
F
exibele query 226
Font Size 281
Font Weight 222
Fore Color 311
foreign key 38
formaat modus 154
kader niet vullen 154
kader vullen 154
uitsnede 154
formulier(en) 145
autoformulier 135
gebruiken 140
wizard 137
formulierkiezer 170
formulierkoptekst 280
formuliervoettekst 282
FROM 346
functie
Choose() 310
IIf() 292
Switch() 310
functioneel datamodel 14
G
gangbare expressies 312
gebeurtenis 268
gegeven 2
manipuleren 416, 429
opvragen 415, 425
gegevensanalyse 20
gegevensbank 9
gegevensblad 409
gegevenstructuur 7
groepeerinterval 223
groeperen 364
groeperen op 223
groepskoptekst 223
groepsvak 149
groepsvoettekst 223
GROUP BY 364
Group Footer 223
Group Header 223
Group Interval 223
Group On 223
H
handje met vijf vingers 293
handje met wijsvinger 293
HAVING 365
Height 284
Hide Duplicates 216
homoniemen 58
hoofdformulier 165
hoogte 284
I
identity integrity 343
IIF 115
IN 349
inconsistent 5
indexeren 399
informatie 2
informatie-analyse 20
informatiebehoefte 20
ingeschakeld 168, 294
inner join 322, 381
INSERT INTO 384
integreren 59
integriteit 2
invoermasker 394
IS NULL 349
Copyright 2007 Academic Service
I ndex 435
J
join 355
joineigenschappen 108
K
kandidaat-sleutels 27
Keep Together 223
keuzelijsten 156
met invoervak 156
zonder invoervak 156
klassieke bestandsorganisatie 9
knopinfo 184
kolombreedte 86
kolommen 342
vastzetten 88
verbergen 87
verplaatsen 87
koptekst 362
L
label 280
left join 381
left outer-join 322
lengte nul toegestaan 399
lettertype 85
lijn 222
LIKE 349
LimitToList 163
Line 222
List Box 157
Locked 168
logisch ontwerp 414, 416
M
macro
AlleMacrosStoppen 320
Berichtvenster 249
CancelEvent 320
FilterToepassen 250
FormulierOpenen 258
GebeurtenisAnnuleren 320
GoToControle 263
MacroStoppen 267
Maximaliseren 249
NaarBesturingselementGaan 263
OpenForm 258
OpenReport 298
RapportOpenen 298
SetValue 258
Sluiten 250
StopAllMacros 320
StopMacro 267
TabelOpenen 248
VorigFormaat 250
WaardeInstellen 258
macrogroep 257
macronaam 248
Macro Name 248
macrostap 252
Main Switchboard 331
MAX 361
Mde-bestand 339
meerdere tabellen 355
menustructuur 275
metagegevens 62
MIN 361
Min.- en max.-knop 280
minimaliteit-eis 343
Min Max Buttons 280
modaal 257
modaalvenster 257
Modal 257
N
naam 290
Name 290
navigatieknoppen 279
NavigationButtons 279
NewRowOrCol 326
niet-afhankelijk kader 152
nieuwe rij of kolom 326
normaliseren 23
Copyright 2007 Academic Service
Databaseontwikkeling 4 Access 2003
436
notatiewijze 389
nulde normaalvorm 23
O
OLE-objecten 151
On Open 269
ontwerpweergave 351
opbouwen tabellen 415
opbouwfunctie voor expressies 260
opdrachtknoppen 180
opmaak 85
opstarten 337
opties voor groeperen 228
opties voor totalen 239
OR 347
ORDER BY 359
outer join 381
P
Page Footer 215
Page Index 179
Pages 311
pagina 311
pagina-index 179
paginakoptekst 215
paginavoettekst 215
primaire sleutel 343
procesgegevens 26
programma 271
Q
query
bijwerk~ 119
gecorreleerd 379
groepeer~ 116
selectie~ 100, 112
verwijder~ 120
R
randbreedte 281
randstijl 222
rapporten 211, 416, 430
afdrukken 134
autorapport 124
etiketten 131
verwijzingen 259
wizard 126
rapportkoptekst 214
rapportvoettekst 215
record 70
~kiezers 279
~locking 16
lteren 81
sorteren 81
toevoegen 80
vervangen 83
verwijderen 81
wijzigen 80
zoeken 82
recordbegrenzingslijnen 280
RecordSelectors 279
redundantie 5
referential integrity 343
referentile integriteit 90
afdwingen 92
rekenkundige bewerkingen 361
rekenveld 185
relaties 90
toepassen 94
toevoegen 91
verwijderen 94
relationele database 13
repeterende groep 26
Report Footer 215
right join 381
right outer join 322
rijen 342
rijhoogte 86
runtime versie 339
S
schakelbordbeheer 330
schakelborden 329
schuifbalken 279
Copyright 2007 Academic Service
I ndex 437
ScrollBars 279
SELECT 346
selectievakje 145
Single Step 252
Size Mode 154
Clip 154
Zoom 154
sleutelattribuut 27
sleutelveld 76
speciale joins 380
SQL 341
standaardwaarde 398
starten 251
subformulier 165
subformulier/subrapport 176
subquerys 370
SUM 361
Switchboard Manager 330
switchboards 329
synoniemen 59
systeemmenu 257
T
tabbesturingselement 175
tabbladen 174
tabel 4, 342
aanmaken 73
aanpassen 79
selecteren 78
tabellen/querys 410
Tab Stop 182
tabstop 182
tabvolgorde 295
technisch ontwerp 415, 420
tekengewicht 222
tekengrootte 281
tekstuitlijning 225
Text Align 225
toepassing 271
toetsenbord 408
Toggle Button 147
trapsgewijs bijwerken 92
trapsgewijs verwijderen 92
tweede normaalvorm 31
U
uitvoeren 352
Unbound Object Frame 152
UNC 202
unieke records 116
unieke waarden 116
UNION 385
UPDATE 385
V
validatieregel 398
validatietekst 399
VBA-code 269
veld 70
veldlengte 388
vereist 399
vergrendeld 168, 295
view 14
Visual Basic for Applications 269
volgorde 359
voorbeeldopgave 413
voorgrondkleur 311
voorwaarden 264
vreemde sleutel 38, 343
W
wachtwoord 395
weergave 403
werking tabtoets 286
WHERE 346
WHERE-voorwaarde 250
Where Condition 250
wisselknop 147
wizard opzoeken 157
wizards voor besturingselementen 149
Z
zoeken 407
Copyright 2007 Academic Service