Vous êtes sur la page 1sur 458

Databaseontwikkeling 4 Access 2007

Databaseontwikkeling 4
Access 2007

Ben Groenendijk

Meer informatie over deze


en andere uitgaven kunt u
verkrijgen bij:
Sdu Klantenservice
Postbus 20014
2500 EA Den Haag
tel.: (070) 378 98 80
www.sdu.nl/service
2010 Sdu Uitgevers bv,
Den Haag
Academic Service is een
imprint van Sdu Uitgevers bv
1e druk, februari 2010
Vormgeving en omslag:
Studio Bassa, Culemborg
Zetwerk: Redactiebureau
Ron Heijer, Markelo
ISBN 978 90 395 2602 6
NUR 124

Alle rechten voorbehouden. Alle auteursrechten en databankrechten ten aanzien van deze uitgave worden uitdrukkelijk
voorbehouden. Deze rechten berusten bij Sdu Uitgevers bv.
Behoudens de in of krachtens de Auteurswet 1912 gestelde
uitzonderingen, mag niets uit deze uitgave worden verveelvoudigd, opgeslagen in een geautomatiseerd gegevensbestand
of openbaar gemaakt in enige vorm of op enige wijze, hetzij
elektronisch, mechanisch, door fotokopien, opnamen of enige
andere manier, zonder voorafgaande schriftelijke toestemming
van de uitgever.
Voorzover het maken van reprograsche verveelvoudigingen uit deze uitgave is toegestaan op grond van artikel 16 h
Auteurswet 1912, dient men de daarvoor wettelijk verschuldigde vergoedingen te voldoen aan de Stichting Reprorecht
(postbus 3051, 2130 KB Hoofddorp, www.reprorecht.nl).
Voor het overnemen van gedeelte(n) uit deze uitgave in
bloemlezingen, readers en andere compilatiewerken (artikel
16 Auteurswet 1912) dient men zich te wenden tot de Stichting
PRO (Stichting Publicatie- en Reproductierechten Organisatie,
Postbus 3060, 2130 KB Hoofddorp, www.cedar.nl/pro). Voor
het overnemen van een gedeelte van deze uitgave ten behoeve
van commercile doeleinden dient men zich te wenden tot de
uitgever.
Hoewel aan de totstandkoming van deze uitgave de uiterste zorg is besteed, kan voor de afwezigheid van eventuele
(druk)fouten en onvolledigheden niet worden ingestaan en
aanvaarden de auteur(s), redacteur(en) en uitgever deswege
geen aansprakelijkheid voor de gevolgen van eventueel voorkomende fouten en onvolledigheden.
All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted in any form
or by any means, electronic, mechanical, photocopying, recording or otherwise, without the publishers prior consent.
While every effort has been made to ensure the reliability of
the information presented in this publication, Sdu Uitgevers
neither guarantees the accuracy of the data contained herein
nor accepts responsibility for errors or omissions or their consequences.

Woord vooraf

Dit boek is bestemd voor de niveau 4-opleiding ICT-beheerder en


Applicatieontwikkelaar op basis van de competentiegerichte eindtermen voor MBO-ICT die vanaf 2008 van kracht zijn.
Bij de ontwikkeling van de leerstof voor de nieuwe competentiegerichte eindtermen is ervoor gekozen om de competenties van de
kerntaken in samenhang te behandelen. Zeker bij het onderwerp
databases is het logisch om de competenties van zowel het ontwikkelen (ontwerpen/realiseren) als het beheren/onderhouden van
een informatiesysteem aan de hand van de toepassing van de populaire applicatie Access (in dit geval versie 2007) te behandelen.
In dit boek is gestreefd naar een praktische benadering van de
informatie- en gegevensanalyse. Het verdient aanbeveling om de
inhoud van dit boek af te wisselen met de inhoud van de afzonderlijke uitgave over informatieanalyse. De kandidaat kan met dit
boek over Access 2007 zelfstandig de opdrachten maken en daarvoor terugvallen op de eerder behandelde theorie. De docent kan
als begeleider optreden, maar als hij dat verkiest ook klassikaal
de theoretische onderdelen behandelen. In ieder geval zal de deelnemer in of buiten het klaslokaal veel tijd aan de computer doorbrengen. Aan het einde van dit deel moet de deelnemer in staat zijn
zelfstandig een eenvoudige probleemanalyse uit te voeren en deze
uit te werken in een werkende, gebruikersvriendelijke relationele
databasetoepassing.
In het boek wordt ieder onderwerp eerst besproken en toegelicht,
waarbij volop gebruik gemaakt is van relevante schermafdrukken.
Vervolgens wordt er bij ieder onderwerp een opgave aangeboden
waarin de theoretische kennis direct praktisch kan worden toegepast. In de opgaven wordt een aantal bestaande databases gebruikt.
Op de hierin opgeslagen gegevens moeten vervolgens de nodige
bewerkingen worden uitgevoerd.

vi

Databaseontwikkeling 4 Access 2007

Het is niet noodzakelijk eerst het deel Informatieanalyse te behandelen alvorens over te gaan op het deel gegevensanalyse en eventueel te besluiten met SQL. De delen staan los van elkaar en kunnen
dus in willekeurige volgorde naast of na elkaar gebruikt worden.
Uiteraard moet er bij dit boek gewerkt kunnen worden met Microsoft Access versie 2007 in de Nederlandse versie. De bij dit boek
behorende databases kunnen gedownload worden via de pagina bij
dit boek op www.academicservice.nl. Van elk hoofdstuk zijn de
uitwerkingen van de opgaven ook bij deze bestanden te vinden.
Bij dit boek is een docentenhandleiding beschikbaar. Hierin is per
hoofdstuk toegelicht op welke wijze het betreffende hoofdstuk zou
kunnen worden behandeld. Verder wordt bij de in het boek opgenomen vragen extra toelichting gegeven. U kunt de docentenhandleiding aanvragen via het e-mailadres: accountmanagement@sdu.nl.
Daarnaast zijn van de hoofdstukken 3 en 4 (normaliseren) de opgaven en voorbeelden als PowerPoint presentaties beschikbaar.
Bovendien zijn er cases om de deelnemers extra te laten oefenen
met het opzetten, inrichten en gebruiken van databases. Een voorbeeld van een uitgewerkte case is te vinden in bijlage C.
De eerste twee serie cases richt zich met name op de eerste zeven
hoofdstukken van het boek, dus normaliseren, eenvoudige bewerkingen in Access en het werken met rapporten en formulieren.
De derde serie cases richt zich op het werken met SQL. Daarbij is
ook een vrij grote database beschikbaar.
Iedere serie cases bestaat uit 18 verschillende opgaven. De opgaven
zijn in Word-formaat beschikbaar en dus eventueel nog aan te passen aan uw eigen wensen. De cases worden bij de docentenhandleiding meegestuurd. Vragen of opmerkingen over dit boek zijn
welkom. Stuur deze aan b.j.groenendijk@hro.nl.
Ben Groenendijk

februari 2010

vii

Inhoud
Inleiding

xi

1
1.1
1.2
1.3
1.4
1.5

Gegevens en betrouwbaarheid
Gegevens en informatie
Integriteit
Consistentie en redundantie
Klassieke en moderne wijze van gegevensopslag
Samenvatting

1
1
2
4
6
10

2
2.1
2.2
2.3

Relationele databases
Databasemanagementsysteem
Relationele databases
Samenvatting

13
13
16
21

3
3.1
3.2
3.3
3.4
3.5
3.6
3.7

Normaliseren, inleiding
Stap 1, de nulde normaalvorm
Stap 2, de eerste normaalvorm
Stap 3, de tweede normaalvorm
Stap 4, de derde normaalvorm
Terminologie
Entiteit Relatie Diagram (ER-Diagram)
Samenvatting

23
23
28
31
33
37
38
43

4
4.1
4.2
4.3
4.4
4.5
4.6

Normaliseren, verdieping
Dubbele (geneste) repeterende groepen
Dubbele (opeenvolgende) repeterende groepen
Opmerkingen met betrekking tot normaliseren
Integreren
Datadictionary
Samenvatting

49
49
58
61
63
66
69

5
5.1
5.2
5.3
5.4

Eenvoudige bewerkingen in Access


Inleiding
Het programma Access starten
De database en de tabel creren
Een bestaande database openen

75
75
76
77
84

viii

Databaseontwikkeling 4 Access 2007

5.5
5.6
5.7
5.8
5.9

Records manipuleren
Met meerdere tabellen tegelijkertijd werken
Gegevens selecteren en manipuleren
Rapporten
Formulieren

89
96
102
137
151

6
6.1
6.2
6.3
6.4
6.5
6.6
6.7

Uitgebreide formulieren
Keuzemogelijkheden
Bijlagen
Keuzelijsten
Hoofd- en subformulieren
Tabbladen
Opdrachtknoppen
Draaitabellen/Draaigraeken

161
161
168
173
184
193
199
205

7
7.1
7.2
7.3
7.4

Uitgebreide rapporten
Rapport zonder duplicaten
Rapport met groepen
Rapport met meerdere groepen
Rapport met veel rekenvelden

221
221
227
239
247

8
8.1
8.2
8.3

Macros
Een eenvoudige macro
Een eenvoudige ingesloten macro
Geavanceerde macros

259
260
266
270

9
9.1
9.2
9.3
9.4
9.5

Het bouwen van een toepassing


Tabellen en relaties
Menustructuur
De formulieren
De rapporten
Voltooien van de toepassing

287
288
292
294
316
330

10
10.1
10.2
10.3
10.4

SQL, Structured Query Language


Inleiding
Begrippen
Opbouw hoofdstuk
Database Bibliotheek (theorieopdrachten)

343
343
344
345
346

ix

Inhoud

10.5 Database Alco (praktijkopdrachten)


10.6 Opvragingen uit n tabel
10.7 SQL gebruiken in Access
10.8 Eenvoudige opvragingen uit meerdere tabellen
10.9 Wijzigen van de volgorde
10.10 Rekenkundige bewerkingen
10.11 Groeperen
10.12 Subquerys
10.13 Speciale joins en views
10.14 SQL, meer mogelijkheden

347
347
353
356
360
362
365
371
382
385

Veldeigenschappen

389

Opties

405

Een grote, uitgewerkte opgave

421

Index

441

Inleiding

Datases zijn in het dagelijkse leven niet meer weg te denken. Van
een afgestudeerde op MBO-niveau mag worden verwacht dat hij/
zij kennis van en inzicht in databases heeft. Naast de theoretische
kennis dienen er ook praktische vaardigheden aanwezig te zijn.
Dit boek beoogt de kennis van en vaardigheden met databases aan
te reiken. Dat gebeurt door stapsgewijs in te gaan op het totale proces van het (op papier) ontwerpen van een database tot het gebruik
van de database (in Microsoft Access) om de benodigde informatie
te genereren.
Allereerst zal het ontwerpen van databases ter sprake komen.
Hierbij wordt de techniek van het normaliseren gehanteerd.
Uitgaande van een informatiebehoefte zal via het normalisatieproces de informatiestructuur bepaald worden. Deze structuur
wordt vervolgens grasch weergegeven door middel van een
Entiteit Relatie Diagram. Hierbij geldt dat hoofdstuk 3 de basis legt
en hoofdstuk 4 een verdieping aanbrengt. Hierna wordt besproken
hoe een gevonden gegevensstructuur kan worden omgezet in een
database, gebruikmakend van het programma Access. De database
wordt gebouwd, gevuld en ten slotte gebruikt voor het opvragen
van informatie.
De volgende stap die wordt gezet, is die waarbij de wijze van gegevens opvragen steeds meer geautomatiseerd zal worden. Er zullen
formulieren, rapporten en macros worden ontworpen en gebruikt.

xii

Databaseontwikkeling 4 Access 2007

De ontworpen rapporten, formulieren en macros worden vervolgens gebruikt bij het opzetten van een applicatie. Bij het opzetten
van de applicatie zal niet worden geprogrammeerd in de zin van
het ouderwetse coderen. De applicatie wordt gebouwd door op
grasche wijze bouwstenen te selecteren, deze iets aan te passen
en vervolgens samen te voegen tot professioneel ogende applicaties.
Omdat databases algemeen toepasbaar zijn, wordt het boek afgesloten met een hoofdstuk waarin de standaard vraagtaal SQL
wordt behandeld. Deze taal wordt niet alleen door Access ondersteund, maar door vrijwel ieder databasemanagementpakket dat op
de markt te verkrijgen is. Enige kennis van deze taal is dus onontbeerlijk.

Gegevens en
betrouwbaarheid

In dit hoofdstuk wordt aan de hand van voorbeelden de historie


van klassieke gegevensopslag in computersystemen besproken. In
de begintijd van de automatisering werd veelal per afdeling geautomatiseerd, eerst de afdeling Boekhouding, dan de Inkoopafdeling,
vervolgens de afdeling Verkoop en ten slotte het Voorraadbeheer.
Dit wordt eilandautomatisering genoemd. Die verschillende eilandjes kunnen niet of slecht gegevens met elkaar uitwisselen. Hierdoor
worden er bijvoorbeeld 30 scooters aan een winkel verkocht die
helemaal niet in het magazijn staan. Het informatiesysteem wordt
dan onbetrouwbaar genoemd. Hiervoor is uiteraard een oplossing
gevonden, de database. De ontwikkeling van eilandautomatisering
naar database wordt in dit hoofdstuk toegelicht. Verder worden
belangrijke begrippen zoals integriteit, consistentie, redundantie en
betrouwbaarheid toegelicht.

1.1

Gegevens en informatie

Computers zijn niet meer weg te denken uit onze maatschappij.


Ze nemen een steeds belangrijker plaats in. Wij kunnen onder
andere met de computer spelletjes spelen, e-mailen, internetten, werkstukken maken met behulp van een tekstverwerker of
multimediapresentaties maken. Bedrijven en instellingen kunnen
niet meer functioneren zonder computers. Alle gegevens voor de
bedrijfsvoering worden opgeslagen in de computer. Denk hierbij
aan klantgegevens, artikelgegevens, leveranciergegevens, productiegegevens. Van onszelf liggen ook bij vele instanties gegevens
opgeslagen. Van iedere volwassen inwoner van Nederland liggen
de persoonsgegevens in honderden computersystemen opgesla-

Databaseontwikkeling 4 Access 2007

gen. Denk hierbij aan de banken, verzekeringsmaatschappijen,


belastingdienst, gemeentelijke instellingen, sportverenigingen,
motorrijtuigadministratie, school, krantadministratie, salarisadministratie, enzovoort.

gegevens

informatie

De begrippen gegevens en informatie worden nogal eens door


elkaar gehaald. Gegevens zijn feiten of gebeurtenissen die op een
bepaalde manier zijn vastgelegd. Bijvoorbeeld adresgegevens op
papier, maar ook het vastleggen van diezelfde gegevens in de computer, valt onder deze denitie, net als fotos, geluid of beelden.
Informatie is de betekenis die aan die gegevens ontleend kan worden. Een telefoonboek staat vol met gegevens. De gegevens daarin
worden informatie als we het telefoonnummer van iemand willen
opzoeken. Het gevonden telefoonnummer betekent iets voor ons. In
dezelfde gegevens kunnen verschillende soorten informatie zitten.
Na een repetitieweek worden per klas alle behaalde cijfers van de
leerlingen op een lijst weergegeven. Voor de leerling zijn de behaalde cijfers informatie. Voor een docent Engels zijn in hetzelfde
overzicht de cijfers die voor het vak Engels zijn behaald informatie.

1.2

muteren

integriteit

Integriteit

Gegevens in computersystemen moeten zo opgeslagen worden


dat ze eenvoudig zijn op te vragen en dat ze eenvoudig gemuteerd
kunnen worden. Onder muteren verstaan we het toevoegen, wijzigen of verwijderen van gegevens. Tevens mogen die gegevens
geen onjuistheden of onduidelijkheden bevatten. We noemen dit de
integriteit van het computersysteem. Hiermee bedoelen we dat de
gegevens in het computersysteem een juiste weergave moeten zijn
van de werkelijkheid. Het cijfer zeven voor een repetitie wiskunde
moet ook op de computeruitdraai van de cijferlijst een zeven zijn
en niet een vier. Als de computer toont dat het banksaldo 120 euro
in het rood is, terwijl het in het zwart moet zijn, is er duidelijk iets
mis. Het computersysteem geeft dan niet de werkelijkheid weer, de
integriteit van het computersysteem voldoet niet, het is een onbetrouwbaar informatiesysteem. Dit lijkt misschien allemaal logisch,
maar dat is in vele praktijkgevallen nog niet het geval. Met twee
voorbeelden zullen we dit duidelijk maken.

1 Gegevens en betrouwbaarheid

Na een verhuizing ontvangen mensen nogal eens onduidelijke brieven zoals in de volgende brief:
Basketbalvereniging Dunky
Postbus 2050
3070 AB Rotterdam
M.C. den Hoed
Leiweg 12
2907 TV Capelle a/d IJssel
Geachte mevrouw Den Hoed,
Hierbij ontvangt u uw nieuwe teamgegevens en het trainingschema voor het
komende basketbalseizoen. Hieronder staan de gegevens zoals deze in ons
computersysteem liggen opgeslagen.
M.C. den Hoed
Larenstraat 26
2984 EK Ridderkerk
Team: dames 1
Training: maandag van 19.00-20.30, woensdag van 19.30-21.00
Indien er onvolledige of onjuiste gegevens zijn vermeld, kunt u telefonisch contact opnemen met de heer Verkerk (010 4830554).

Er is met deze brief iets merkwaardigs aan de hand. Het adres in


Capelle aan den IJssel (links bovenin) is het nieuwe en correcte
adres. Op diezelfde brief staat ook het oude adres in Ridderkerk.
Volgens de basketbalvereniging is dat ook het nieuwe adres. De
persoonsgegevens staan dus ten minste twee keer opgeslagen in
hun computersysteem, waarbij de adreswijziging maar n keer
is doorgevoerd. De gegevens zijn dus op een onjuiste manier opgeslagen. Mevrouw Den Hoed zal ongetwijfeld weten waar zij nu
woont, maar de basketbalvereniging heeft nu twee tegenstrijdige
adressen geregistreerd en weet het niet meer.
Een ander voorbeeld: bij een verhuizing naar een koopwoning
wordt vaak ook een nieuwe hypotheek afgesloten. Vanwege het
nancile risico is het gebruikelijk om naast de hypotheek ook een
levensverzekering af te sluiten. Zo ook in dit voorbeeld. Naast de
hypotheek zijn bij dezelfde maatschappij twee levensverzekeringen
afgesloten, voor elke partner een. Na ontvangst van de sleutel van
het nieuwe huis is een adreswijziging naar de verzekeringsmaatschappij gestuurd. Tot zover geen problemen, maar in de maand
januari kwamen er geen overzichten van de levensverzekeringen.
Bij navraag naar het uitblijven van deze overzichten werd aan de
telefoon gevraagd om de postcode en het huisnummer. Deze bleken

Databaseontwikkeling 4 Access 2007

echter niet in het systeem van de verzekeringsmaatschappij voor te


komen. Toch is er meermalen post op het nieuwe adres ontvangen.
Bij verder speurwerk bleek dat de levensverzekeringsoverzichten
naar het oude adres gestuurd waren, omdat dat nog steeds in de
administratie als juist vermeld stond. Blijkbaar was de adreswijziging wel aangebracht bij de afdeling Hypotheken maar niet in de
levensverzekeringadministratie. Na deze constatering en de aanpassing bij de levensverzekeringsmaatschappij kwamen al snel de
gegevens van de levensverzekering. De adresgegevens waren dus
in twee verschillende computersystemen opgeslagen.

1.3

Consistentie en redundantie

De gegevens zouden opgeslagen kunnen zijn zoals in guur 1.1. In


computertermen noemen we dit bestanden of tabellen.
Figuur 1.1

Levensverzekering
PolisNaam
nummer

Adres

Postcode Plaats

Polisbedrag Premie

6798316

R. Ederzeel

Hoofdweg 67

1067 RT

Amsterdam

191.000,00

6798317

T. de Vries

Steenstraat 34

1380 VB

Weesp

161.000,00

62,50
40,50

6798318

E. van der
Wouden

Nieuwendam 67 1621 AP

Hoorn

145.000,00

124,80

6798319

E.R. Spruyt

Ringweg 56

1200 GH

Hilversum

127.000,00

113,90

6798320

B.J.
Larenstraat 26
Groenendijk

2984 EK

Ridderkerk

168.000,00

48,50

Hypotheek
Hyponummer

Naam

33-812347

R. van Dam

Loefweg 56

3965 JJ

Houten

113.500,00

33-812348

T. de Vries

Steenstraat 34

1380 VB

Weesp

191.000,00

5,9

33-812349

R. Ederzeel

Hoofdweg 67

1067 RT

Amsterdam

113.500,00

5,8

33-812350

B.J.
Leiweg 12
Groenendijk

2907 TV

Capelle a/d
IJssel

127.000,00

6,0

33-812351

E. van der
Wouden

Nieuwendam 67 1621 AP

Hoorn

181.500,00

5,9

33-812352

R. van Dam

Loefweg 56

Houten

168.000,00

5,5

Adres

Postcode Plaats

3965 JJ

Hypotheek Rente
Bedrag
Perc.
6,1

1 Gegevens en betrouwbaarheid

Merk op dat niet iedereen die een hypotheek afsluit ook voorkomt
bij de levensverzekeringen. Men kan namelijk zon verzekering
al bij een andere maatschappij hebben. Daarnaast kan een levensverzekering afgesloten worden zonder een hypotheek. De gegevens
kunnen dus in die beide systemen in een andere volgorde voorkomen.
Als een hypotheek gelijktijdig met een levensverzekering wordt
afgesloten, komen in beide bestanden nieuwe vermeldingen. De
adresgegevens worden dan twee keer opgeslagen. Hierdoor kunnen
er problemen ontstaan, zoals in het voorbeeld van guur 1.1 bij
B.J. Groenendijk. Maar ook bij R. van Dam kunnen er problemen
ontstaan. R. van Dam heeft namelijk nog een vakantiewoning
waarop ook een hypotheek is afgesloten.

inconsistent

redundantie

In deze voorbeelden zijn de gegevens in tegenspraak met elkaar.


Groenendijk woont volgens de computer in Ridderkerk n in
Capelle a/d IJssel. Met een moeilijk woord zeggen we dat de gegevens inconsistent (onbetrouwbaar) zijn. Het is dus niet zo gemakkelijk om gegevens in een computersysteem op te slaan en ervoor
te zorgen dat de gegevens consistent blijven. We moeten er dan
voor zorgen dat dezelfde gegevens niet meerdere keren opgeslagen
worden. Het meerdere keren opslaan van gegevens noemt men
redundantie. Redundantie betekent overtolligheid. Het is helemaal
niet nodig om gegevens meerdere keren in de computer op te slaan,
n keer is voldoende.
Toch komt het meervoudig opslaan van gegevens vaak voor. In
een recent onderzoek bij een niet nader te noemen grote gemeente
bleken persoonsgegevens in 37 verschillende computerbestanden
opgeslagen te zijn! Hoe kan zoiets ontstaan met onze moderne
computers? Of liever, hoe komen we ervan af? Daarvoor moeten
we een aantal jaren in de historie teruggaan.
De levensverzekeringmaatschappij ging automatiseren. Hiervoor
werd een computerprogramma (applicatie) gemaakt waarmee de
gegevens ingevoerd, opgeslagen en afgedrukt konden worden.
Later ging die levensverzekeringmaatschappij ook hypotheken verstrekken. Hiervoor werd ook een applicatie gemaakt waarmee men
de afgesloten hypotheken kon registreren. Bij het verkopen van de
hypotheken bemerkte men dat de klanten ook graag een inboe-

Databaseontwikkeling 4 Access 2007

delverzekering en opstalverzekering (verzekeringen tegen brand,


waterschade, enzovoort) wilden afsluiten. Die gingen ze dus ook
verkopen en er moesten opnieuw twee applicaties gemaakt worden
voor de verkoop van die verzekeringen. Hierdoor is de situatie
zoals afgebeeld in guur 1.2 ontstaan. De rechthoeken stellen de
computerprogrammas voor en de cilinders de bestanden (tabellen)
met de gegevens.
Figuur 1.2
Hypotheek

Hypotheek

Levensverzekering

Inboedelverzekering

Opstalverzekering

Levensverzekering

Inboedelverzekering

Opstalverzekering

De gegevens worden in vier verschillende computersystemen


opgeslagen. Dit noemen we ook wel eilandautomatisering. Iedere
afdeling werkt op zijn eigen eilandje. Hierdoor worden gegevens
meerdere keren opgeslagen. Niet alleen de adresgegevens. Een
hypotheek moet een onderpand hebben en hiervoor is onder andere
de waarde en het bouwjaar van de woning noodzakelijk. Maar de
waarde en het bouwjaar van de woning is ook nodig voor de
opstalverzekering. Om aan de nadelen hiervan tegemoet te komen
is een oplossing bedacht. De vier applicaties die ze gebruiken,
zijn verbeterd door de gezamenlijke gegevens apart op te slaan.
Hierdoor kunnen de verschillende afdelingen gebruikmaken van
n klantenbestand en n woningbestand, zie guur 1.3.
Gegevens worden nu dus niet meer dubbel opgeslagen (geen redundantie) en inconsistentie (onbetrouwbaarheid) wordt voorkomen.

1.4

Klassieke en moderne wijze van gegevensopslag

Dit lijkt een mooie oplossing, maar er ontstaan nieuwe problemen.


Laten we als voorbeeld het klantenbestand nemen. Hierin liggen de
klantgegevens opgeslagen. De klantgegevens die opgeslagen liggen
zijn klantnummer, naam, adres, postcode en plaats. Van

1 Gegevens en betrouwbaarheid

Figuur 1.3
Klant

Hypotheek

Hypotheek

Levensverzekering

Inboedelverzekering

Opstalverzekering

Levensverzekering

Inboedelverzekering

Opstalverzekering

Woning

converteren

iedere klant worden die vijf gegevens opgeslagen, dit wordt de


gegevensstructuur van het klantenbestand genoemd. Stel dat de
afdeling Levensverzekeringen ook graag de geboortedatum van
een klant wenst op te slaan. De gegevensstructuur van het klantenbestand moet hiervoor aangepast worden. Er moet een zesde item
(geboortedatum) aan toegevoegd worden. Het klantenbestand moet
hiervoor geconverteerd worden. Converteren is de oude gegevensstructuur omzetten naar de nieuwe gegevensstructuur: klantnummer, naam, adres, postcode, plaats en geboortedatum. De klantgegevens liggen als een kralenketting opgeslagen. Bijvoorbeeld
10001, T. de Vries, Steenstraat 34, 1380 VB, Weesp, 10002,
R. Ederzeel, Hoofdweg 67, 1067 RT, Amsterdam, 10003, B.J.
Groenendijk, enzovoort. Aangezien nu ook de geboortedatum erbij
moet, worden de eerste vijf gegevens (kraal klantnummer t/m
kraal plaats) van het oude klantenbestand gelezen en deze worden
op de nieuwe ketting geregen (geschreven). Vervolgens wordt een
nieuwe kraal geboortedatum aan de nieuwe ketting toegevoegd.
Vervolgens worden de volgende vijf gegevens van het oude klantbestand gelezen en naar het nieuwe klantenbestand geschreven.

Databaseontwikkeling 4 Access 2007

Vervolgens wordt de geboortedatum van die klant aan het nieuwe


bestand toegevoegd. Dit proces gaat net zo lang door tot alle klantengegevens geconverteerd zijn.

Het klantenbestand is nu geconverteerd zodat klantnummer, naam,


adres, postcode, plaats en geboortedatum van een klant bekend
zijn. Het computerprogramma van de afdeling Levensverzekering
moet nog aangepast worden aan de nieuwe situatie. De geboortedatum was in het oude computerprogramma niet aanwezig en
moet dus worden toegevoegd, zodat deze onder andere ingevoerd
en afgedrukt kan worden. Nadat het computerprogramma van de
afdeling Levensverzekering is aangepast, verloopt voor de afdeling
Levensverzekering alles naar wens. Er werd zelfs een klein feestje
georganiseerd. Op het moment dat er feest werd gevierd op de afdeling Levensverzekeringen sloegen schijnbaar de computers van
de andere afdelingen op hol. Wat is daar namelijk aan de hand? De
applicaties van de overige afdelingen waren niet aangepast, ze zijn
immers niet in de geboortedatum genteresseerd. Maar ze maken
nu wel gebruik van de nieuwe gegevensstructuur, dus inclusief
de geboortedatum. Het computerprogramma van bijvoorbeeld de
afdeling Hypotheken werkt nog steeds met klantnummer, naam,
adres, postcode en plaats. Als nu de klantgegevens van klantnummer 10003 opgeroepen moet worden, weet de computer dat het de
derde klant is (aangenomen dat 10001 het laagste klantnummer
is). Het computerprogramma werkt volgens het principe van de
kralenketting. De derde klant betekent, sla twee keer vijf kralen (klantnummer, naam, adres, postcode en plaats) over en lees
vervolgens kraal elf (klantnummer) tot en met kraal vijftien
(plaats). Echter, door de nieuwe structuur van het klantenbestand
is de elfde kraal nu de plaats van een klant en de twaalfde kraal
geen naam, maar de geboortedatum. Hierdoor verschijnt op het

1 Gegevens en betrouwbaarheid

beeldscherm van de afdeling Hypotheken volslagen onzin en denkt


men dat de computer op hol is geslagen.

Na enig onderzoek komt men tot de ontdekking dat men de applicaties van de andere afdelingen ook moet aanpassen aan de nieuwe
gegevensstructuur van het klantenbestand, ook al zijn ze niet geinteresseerd in de geboortedatum van een klant. In plaats van vijf
gegevens (klantnummer tot en met plaats) moeten in de nieuwe
situatie zes gegevens (klantnummer tot en met geboortedatum)
per klant verwerkt worden. Als een afdeling meer gegevens van
een klant nodig heeft, vergt dat grote aanpassingen aan de computerprogrammas voor alle andere afdelingen die van het klantenbestand gebruikmaken, ook al zijn ze in die nieuwe gegevens niet
genteresseerd.

database

De moderne manier van gegevensopslag voorziet in een oplossing van het hiervoor genoemde probleem. Die moderne manier
van gegevensopslag noemen we een database (gegevensbank).
De oude manier van gegevensopslag noemen we sindsdien klassieke bestandsorganisatie. Er zijn nog veel bedrijven en instellingen die gebruikmaken van die klassieke gegevensopslag. Het zijn
veelal bedrijven die in een vroeg stadium zijn gaan automatiseren,
zoals banken, nancile instellingen, belastingdienst en oliemaatschappijen. Dit wordt de wet van de remmende voorsprong
genoemd. Het millenniumprobleem kwam voor een groot deel op
rekening van die systemen. En daar werden wereldwijd miljarden
euros aan besteed. Het wil overigens niet zeggen dat die systemen
slecht zijn, ze voldoen uitstekend. Ze zijn echter kostbaar in het
onderhoud. Denk hierbij aan een enkele wijziging in de gegevensstructuur. Maar ook bij moderne systemen kunnen problemen
ontstaan als bijvoorbeeld twee bedrijven fuseren. Ook al hebben

10

Databaseontwikkeling 4 Access 2007

ze beide een modern computersysteem voor de gegevensopslag, na


de fusie hebben ze twee moderne systemen waarin klantgegevens
opnieuw dubbel opgeslagen kunnen liggen. Die twee systemen
moeten dan samengevoegd (gentegreerd) worden tot n nieuw
gentegreerd computersysteem. Daar zijn hoge kosten aan verbonden.
In het volgende hoofdstuk zullen we het begrip database toelichten
en in het bijzonder de relationele database.

1.5

Samenvatting

In dit eerste hoofdstuk hebben we besproken wat het verschil is


tussen gegevens (feiten) en informatie (betekenis van die gegevens). Bij eilandautomatisering (klassieke bestandsorganisatie)
worden dezelfde gegevens meerdere keren opgeslagen (redundantie). Hierdoor moeten wijzigingen in die gegevens meerdere
keren doorgevoerd worden. Wordt dit niet consequent gedaan, dan
ontstaan er tegenstrijdigheden in het informatiesysteem (inconsistentie). Om die problemen op te lossen zijn databases ontworpen.
Hierin kunnen de gegevens voor alle bedrijfsprocessen eenduidig
worden opgeslagen en gewijzigd. De mate van juistheid van de informatie die het informatiesysteem produceert, wordt de integriteit
van het informatiesysteem genoemd.
Opgaven
1. Waarom is in de klassieke bestandsorganisatie de kans op inconsistentie (onbetrouwbaarheid) erg groot?
2. Wat wordt verstaan onder redundantie (overtolligheid)?
3. Wat wordt verstaan onder de integriteit van het computersysteem?
4. Converteren van computergegevens, wat bedoelt men daarmee?
5. Waarom zijn computersystemen die gebruikmaken van de klassieke bestandsorganisatie kostbaar in het onderhoud?

1 Gegevens en betrouwbaarheid

11

6. Bij voetbalvereniging HGS wordt de nancile administratie verzorgd door de penningmeester, de heer Van Vliet. De ledenadministratie wordt verzorgd door de heer Rietman. Hiervoor gebruiken
ze beiden hun priv-computer. In de ledenadministratie worden de
adresgegevens en elftalgegevens vastgelegd. De penningmeester
registreert op de computer de adresgegevens en de maandelijkse
betalingen.
a. Welke gegevens zijn redundant opgeslagen?
b. Geef twee voorbeelden waarbij inconsistentie kan ontstaan.
c. Welke afspraken moet de penningmeester maken met de ledenadministrateur om de gegevens betrouwbaar te houden?
7. Veel grote ondernemingen maken nog gebruik van de klassieke
bestandsorganisatie. Waarom is dat?
8. De afdeling Levensverzekering van de hypotheekmaatschappij
wenst voor vrouwen een korting toe te kennen op de maandelijkse
premie. Vrouwen blijken langer te leven dan mannen, waardoor
een korting op de premie mogelijk is. In de klantgegevens moet
hiervoor een nieuw item Geslacht worden toegevoegd, waarin men
Man of Vrouw kan invullen. Wat heeft dat voor gevolgen voor de
automatiseringsafdeling van de afdeling Levensverzekering en
voor de overige afdelingen die van het klantenbestand gebruikmaken?

Relationele databases

In dit hoofdstuk wordt uitgelegd wat een databasemanagementsysteem is. Ook wordt toegelicht wat een datamodel en een relationele database is, en verklaren we enkele begrippen uit de gegevensanalyse.

2.1

DBMS

Databasemanagementsysteem

Een moderne manier van gegevensopslag in een computersysteem


is een database. Hierin zijn de problemen bij gegevensopslag zoals
in hoofdstuk 1 beschreven, opgelost. Gezamenlijke gegevens worden voor de verschillende afdelingen niet meer dubbel opgeslagen,
waardoor redundantie (overtolligheid) en inconsistentie (tegenstrijdigheid) van gegevens wordt voorkomen. Bij een database hoort
een databasemanagementsysteem, afgekort DBMS. Zon DBMS
is afbeeld in guur 2.1. Dit systeem vormt een sluis tussen diverse
computerprogrammas en de gegevensbestanden. Het DBMS regelt

Figuur 2.1
Hypotheek

Levensverzekering

Inboedelverzekering

Opstalverzekering

DBMS

Hypotheek

Levensverzekering

Klant

Woning

Inboedelverzekering

Opstalverzekering

14

Databaseontwikkeling 4 Access 2007

de toevoegingen en wijzigingen in de database en zorgt er dus voor


dat er geen redundantie en inconsistentie kan optreden.

conceptueel of
functioneel

view
databaseadministrator

In het databasemanagementsysteem worden de volledige


gegevensstructuren van alle benodigde bestanden vastgelegd. Zo
wordt daar de gegevensstructuur voor het klantenbestand vastgelegd, klantnummer, naam, adres, postcode, plaats en geboortedatum. Dit is de verzameling gegevens die de vier afdelingen
nodig hebben voor de klantgegevens. Het wil niet zeggen dat een
afdeling alle gegevens nodig heeft, maar de gegevens die ze nodig
hebben, zitten er wel bij. Zo wordt voor alle bestanden de volledige
gegevensstructuur vastgelegd. Dit noemen we het volledige datamodel van de database. Het ontwerpen van het datamodel wordt in
hoofdstuk 3 en hoofdstuk 4 uitgelegd. Het datamodel dat op papier
is ontworpen, wordt ook wel conceptueel of functioneel datamodel
genoemd.
Nadat alle volledige gegevensstructuren zijn vastgelegd, wordt
vervolgens per afdeling vastgelegd welke gegevens zij nodig hebben uit de verschillende bestanden. Zo wordt voor de afdeling
Hypotheken vastgelegd dat zij van het klantenbestand alleen klantnummer, naam, adres, postcode en plaats kunnen oproepen. De
geboortedatum hebben zij niet nodig. De geboortedatum wordt
als het ware verborgen voor de afdeling Hypotheken. Net zoals in
een spreadsheetprogramma kolommen verborgen kunnen worden. Mocht iemand van de klantenadministratie van de afdeling
Hypotheken een overzicht wensen van alle bekende klantengegevens, dan krijgt deze van alle klanten alleen klantnummer, naam,
adres, postcode en plaats te zien. Ondanks dat die persoon alle
gegevens heeft opgevraagd, krijgt deze de geboortedatums van de
klanten niet te zien. Voor de afdeling Hypotheken zijn dat immers
geen relevante gegevens. De afdeling Hypotheken ziet als het ware
van het klantenbestand alleen klantnummer, naam, adres, postcode
en plaats. Zo wordt voor iedere afdeling vastgelegd welke gegevens
ze uit welke gegevensbestanden mogen zien. Men noemt dit de
view op de database, zoals men tegen de database aankijkt. De
volledige structuur van de database is alleen bij het DBMS bekend.
Diegene die het DBMS beheert, noemt men de database-administrator. De database-administrator legt de volledige structuur vast
en per afdeling de view op de database. Ook kan de databaseadministrator de view per afdeling wijzigen, vergroten of verkleinen.

2 Relationele database

15

Als nu de gegevensstructuur van een bestand aangepast moet worden, wordt dat doorgegeven aan de database-administrator. Stel dat
de afdeling Inboedelverzekeringen het telefoonnummer van een
klant wenst, dan wijzigt de database-administrator de gegevensstructuur van het klantenbestand door het telefoonnummer toe te
voegen. Nadat de database-administrator dat heeft gedaan, zal het
DBMS vragen om een bevestiging. Hierna wordt door het DBMS
de conversie van de gegevens die liggen opgeslagen automatisch
uitgevoerd (omzetten van de gegevens naar de nieuwe structuur,
zoals is uitgelegd in hoofdstuk 1). De computerprogrammas van
bijvoorbeeld de afdeling Hypotheken ondervinden hier geen enkele hinder van. Het enige dat zij zien van het klantenbestand is
klantnummer, naam, adres, postcode en plaats. Al zouden er nog
tien andere items van klanten zijn vastgelegd, zij weten dat niet,
waarom zouden ze het ook moeten weten?

autorisatie

We hebben al gezegd dat de view op de database wordt vastgelegd per afdeling. Het kan zelfs verder gaan. We kunnen zelfs per
persoon aangeven wat zijn view op de database is. Veel gegevens
zijn privacygevoelig, vertrouwelijke bedrijfsgegevens of volkomen
nutteloos op deze werkplek. Eigenlijk hoort een medewerker alleen
de beschikking te krijgen over voor hem relevante gegevens. De
medewerker heeft een autorisatie (of permissie) voor deze gegevens, oftewel toestemming om deze gegevens te gebruiken. Zo kan
bijvoorbeeld alleen de personeelsfunctionaris het salaris van een
werknemer zien en de andere personen die gebruikmaken van de
werknemergegevens niet. Vertegenwoordigers die in rayons werken, bijvoorbeeld provincies, zien alleen de klantgegevens uit hun
rayon. Een overzicht van alle klanten levert dan bijvoorbeeld alleen
maar klanten uit de provincie Utrecht.
Met autorisatie (permissie) kunnen we ook vastleggen dat een gebruiker de gegevens alleen mag raadplegen. Het toevoegen, wijzigen of verwijderen van gegevens is dan niet toegestaan. Natuurlijk
zijn alle variaties hierop mogelijk, zoals wel toevoegen van nieuwe
gegevens maar niet het verwijderen van gegevens.
Het DBMS kan nog meer taken uitvoeren, zoals back-ups maken en de database over meerdere computers verspreiden als dat
noodzakelijk is, bijvoorbeeld bij grote ondernemingen. Het DBMS
zorgt er ook voor dat twee personen niet tegelijkertijd hetzelfde

16

Databaseontwikkeling 4 Access 2007

record-locking

gegeven kunnen wijzigen. Dit wordt record-locking genoemd. We


zullen dit toelichten met een voorbeeld. Het bedrijf Sunparks verhuurt vakantiehuisjes in Nederland en Belgi. Die vakantiehuisjes
moeten geboekt worden door Sunparks te bellen. Er zijn meerdere
personen die de reserveringen boeken. De beide verkopers krijgen
tegelijkertijd een familie (Jansen en Maertens) aan de lijn, die
in dezelfde week twee huisjes willen huren. De twee verkopers
toetsen de gewenste vakantieweek in en zien nu beiden op het
beeldscherm van hun computer dat er in die week nog precies
twee huisjes vrij zijn. Tegen de familie Jansen wordt door de ene
verkoper gezegd dat er in die week nog precies twee vakantiehuisjes zijn. De andere verkoper vertelt mevrouw Maertens hetzelfde:
er zijn in die week nog precies twee vakantiehuisjes. Er zijn nu
vier vakantiewoningen geboekt, terwijl er maar twee vakantiehuisjes in die periode vrij waren. Hierdoor zouden de gegevens in
de database niet meer kloppen met de werkelijkheid (integriteit).
Uiteraard helpt het DBMS ons met dit probleem. De verkoper die
als eerste de gegevens van de vrije vakantiehuisjes via de computer oproept, blokkeert tegelijkertijd die gegevens: record-locking.
Iedere andere verkoper kan die gegevens nog wel oproepen, maar
niet meer wijzigen. Op het beeldscherm verschijnt dan een extra
melding waarin staat dat de gegevens door een andere verkoper
zijn geblokkeerd. Nadat deze de boeking heeft afgesloten, wordt
de blokkering opgeheven en wordt het beeldscherm van de andere
verkoper aangepast aan de nieuwe gegevens (refresh). Die ziet de
twee vrije vakantiehuisjes veranderen in nul vrije vakantiehuisjes.

2.2

Relationele databases

Historisch gezien zijn er drie typen databases: eerst kwam de


hirarchische database, toen de netwerkdatabase en ten slotte de
relationele database. De verschillen in deze databases zit in de
manier waarop de gegevens worden opgeslagen om redundantie
en daardoor inconsistentie te voorkomen. De moderne databases
zijn relationele databases. We zullen de werking van de relationele databases aan de hand van een voorbeeld toelichten. Op de
afdeling Hypotheek zijn de hypotheekgegevens nog volgens de
klassieke opslagmethode opgeslagen, zie guur 2.2. Bij de afdeling Levensverzekeringen zijn weer andere gegevens gewenst, zie
guur 2.3, ook op de klassieke manier opgeslagen.

17

2 Relationele database

Figuur 2.2

Hypotheek
Hyponummer

Naam

Adres

Postcode Plaats

33-812347

R. van Dam

Loefweg 56

3965 JJ

Houten

113.500,00

33-812348

T. de Vries

Steenstraat 34

1380 VB

Weesp

91.000,00

5,9

33-812349

R. Ederzeel

Hoofdweg 67

1067 RT

Amsterdam

113.500,00

5,8

33-812350

B.J.
Groenendijk

Leiweg 12

2907 TV

Capelle a/d
IJssel

127.000,00

6,0

33-812351

E. van der
Wouden

Nieuwendam 67 1621 AP

Hoorn

181.500,00

5,9

33-812352

R. van Dam

Loefweg 56

Houten

68.000,00

5,5

3965 JJ

Hypotheek Rente
Bedrag
Perc.
6,1

Figuur 2.3

Levensverzekering
Polisnummer

Naam

Adres

Postcode Plaats

Polisbedrag Premie

6798316

R. Ederzeel

Hoofdweg 67

1067 RT

Amsterdam

90.000,00

62,50

6798317

T. de Vries

Steenstraat 34

1380 VB

Weesp

61.000,00

40,50

6798318

E. van der
Wouden

Nieuwendam 67 1621 AP

Hoorn

145.000,00

124,80

6798319

E.R. Spruyt

Ringweg 56

1200 GH

Hilversum

127.000,00

113,90

6798320

B.J.
Groenendijk

Larenstraat 26

2984 EK

Ridderkerk

68.000,00

48,50

Hierin is duidelijk de redundantie en inconsistentie te zien.


Klantgegevens liggen op de verschillende afdelingen dubbel opgeslagen, waardoor inconsistentie kan optreden. Bijvoorbeeld
B.J. Groenendijk woont bij de afdeling Levensverzekering in
Ridderkerk, terwijl dat Capelle a/d IJssel moet zijn. Ook binnen
n afdeling kan redundantie optreden. De klant R. van Dam heeft
twee hypotheken, zijn woning en vakantiewoning.
Bij relationele databases wordt redundantie en daardoor inconsistentie als volgt opgelost. Men slaat de klantgegevens van alle
afdelingen apart op en geeft aan iedere klant een uniek klantnummer. De gegevens van iedere klant worden slechts n keer opgeslagen. De hypotheekgegevens en polisgegevens van de klanten
worden daarna via het klantnummer gekoppeld (gerelateerd) aan
de klantgegevens, zie guur 2.4.

18

Figuur 2.4

Databaseontwikkeling 4 Access 2007

Klant
Klantnr

Naam

Adres

Postcode

Plaats

10001

T. de Vries

Steenstraat 34

1380 VB

Weesp

10002

R. Ederzeel

Hoofdweg 67

1067 RT

Amsterdam

10003

B.J. Groenendijk

Leiweg 12

2907 TV

Capelle a/d IJssel

10004

E. van der Wouden Nieuwendam 67

1621 AP

Hoorn

10005

E.R. Spruyt

Ringweg 56

1200 GH

Hilversum

10006

R. van Dam

Loefweg 56

3965 JJ

Houten

Hypotheek
Hyponummer

Hypotheek
Bedrag

Rente
Perc.

Klantnr

33-812347

113.500,00

6,1

10006

33-812348

91.000,00

5,9

10001

33-812349

113.500,00

5,8

10002

33-812350

127.000,00

6,0

10003

33-812351

181.500,00

5,9

10004

33-812352

68.000,00

5,5

10006

Polisbedrag

Premie

Klantnr

6798316

91.000,00

62,50

6798317

61.000,00

40,50

10001

6798318

145.000,00

124,80

10004

6798319

127.000,00

113,90

10005

6798320

68.000,00

48,50

10003

Levensverzekering
Polisnummer

10002

Er is geen redundantie meer, alle gegevens zijn maar n keer


opgeslagen. De relatie tussen de hypotheekgegevens en klantgegevens verloopt via het klantnummer. Voor de levensverzekeringgegevens geldt hetzelfde. Een adreswijziging van een klant
wordt in het klantenbestand (tabel Klant) aangebracht. Alle andere
afdelingen beschikken nu direct over de juiste adresgegevens. In
het DBMS moeten niet alleen de gegevensstructuren vastgelegd
worden, maar ook de relaties tussen de verschillende bestanden
(tabellen). De relatie tussen de tabel Klant en de tabel Hypotheek

19

2 Relationele database

luidt: het klantnummer uit de tabel Klant is gelijk aan het klantnummer uit de tabel Hypotheek.
denitie database

Nu kunnen we ook de denitie van een database geven. Een database is een verzameling bij elkaar behorende tabellen inclusief hun
onderlinge relaties.
Als nu een hypotheek in de database wordt opgezocht, worden
automatisch de bijbehorende klantgegevens, via het klantnummer,
in de tabel klant opgezocht, zie guur 2.5.

Figuur 2.5

Hypotheek
Hyponummer Hypotheek
Bedrag

Rente
Perc.

Klantnr

33-812350

127.000,00

6,0

10003

Klantnr

Naam

Adres

Postcode

Plaats

10003

B.J. Groenendijk Leiweg 12

2907 TV

Capelle a/d IJssel

Klant

Maar het kan ook andersom. Als de heer R. van Dam belt voor
informatie over zijn hypotheek, worden de gegevens van de heer
R. van Dam in de computer opgezocht. Door de relatie met de
tabel Hypotheek kunnen die gegevens op het beeldscherm worden
getoond, zie guur 2.6.
Figuur 2.6

Klant
Klantnr

Naam

Adres

Postcode

Plaats

10006

R. van Dam

Loefweg 56

3965 JJ

Houten

Hyponummer Hypotheek
Bedrag

Rente
Perc.

Klantnr

33-812347

113.500,00

6,1

10006

33-812352

68.000,00

5,5

10006

Hypotheek

Tegen de heer Van Dam kan direct gezegd worden: Ik zie dat u
twee hypotheken bij ons hebt afgesloten. Wat kan ik voor u doen?

20

Databaseontwikkeling 4 Access 2007

Door het klantnummer van Van Dam (nummeridenticatie) worden automatisch de bijbehorende klant- en hypotheekgegevens
gevonden.

informatiebehoefte

informatie-analyse

gegevensanalyse

Hoe wordt een database ontworpen? Welke tabellen hebben we


nodig om de gegevens zonder redundantie en inconsistentie op te
slaan? Voordat we een database kunnen ontwerpen, moeten we
ons eerst afvragen welke gegevens we nodig hebben. Per werkplek moet vastgelegd worden welke informatie daar nodig is, de
informatiebehoefte. Dat kan een rapport zijn op papier of bepaalde
klantgegevens op het beeldscherm. Dat moet per werkplek bekeken worden. Een inkoper heeft andere informatie nodig dan een
verkoper. Een belastingambtenaar die de belastingaangifte van
particulieren moet vaststellen, heeft andere informatie nodig dan
zijn collega die de belastingaangifte voor bedrijven moet vaststellen. Uiteraard is het vaststellen van die informatiebehoefte een
ingewikkelde klus. Niet alleen moet vastgesteld worden welke
gegevens waar opgeslagen worden, maar ook vanuit welke invalshoeken er gewerkt wordt. Dit proces wordt informatie-analyse genoemd. Daarna moeten de informatiebehoeften worden vertaald
naar gegevensstructuren, zodat de gegevens zonder redundantie
en inconsistentie worden opgeslagen. We noemen dit gegevensanalyse. We maken daarbij gebruik van een manier die is bedacht
door de Amerikaan Edgar Codd. Dit wordt normaliseren genoemd.
Zo ontstaat op papier de te maken database, het conceptuele of
functionele datamodel. In de volgende twee hoofdstukken wordt
het normaliseren uitgelegd. Het ontworpen datamodel wordt hierna
gebouwd met behulp van een databasepakket. Dat is software
waarin het DBMS aanwezig is, inclusief gereedschappen waarmee
we gegevens via formulieren kunnen invoeren, wijzigen, verwijderen of overzichten/rapporten kunnen afdrukken.
Er zijn vele databasepakketten te koop. Voor de pcs zijn de bekendste pakketten Access en FileMaker. Het databasepakket
Access van Microsoft wordt het meest gebruikt. Vanaf hoofdstuk
5 wordt dit databasepakket uitgelegd. De zware databases die door
middelgrote tot zeer grote ondernemingen worden gebruikt, zijn
bijvoorbeeld Oracle, MySQL en SQL-Server. SQL-Server is de
zware database van Microsoft. De rma Oracle is na Microsoft de
grootste softwarefabrikant ter wereld.
Access wordt veel toegepast op pcs waarbij de database lokaal
op de harde schijf van de computer wordt opgeslagen. Anderen

2 Relationele database

front-end/
back-end

21

kunnen die database niet gebruiken als zij geen toegang hebben
tot de harde schijf van die computer. De grote databases worden
op de hoofdcomputer (server) in het netwerk geplaatst, waardoor
honderden personen van de gegevens in de database gebruik kunnen maken. Vaak is dit een ander databasepakket, zoals Oracle
of SQL-server. Omdat Access eenvoudig is in het gebruik, vooral
bij het maken van allerlei formulieren en rapporten, wordt Access
ook toegepast op pcs (clients) waarbij Access gebruikmaakt van
de Oracle-database of SQL-Server op de server. Access wordt dan
front-end software genoemd en Oracle of SQL-Server op de server
de back-end. Access wordt dan dus alleen gebruikt voor de in- en
uitvoer, niet voor de echte opslag. Dat doet de Oracle-database
of SQL-Server. Het front-end/back-end-principe wordt in grotere
organisaties voor hun databases veel toegepast. De combinatie van
gebruiksgemak aan de front-endkant en degelijkheid aan de backendkant is dan ook een heel aantrekkelijke.
Helaas vergeten vele gebruikers eerst de informatiebehoefte nauwkeurig te bepalen. Het normaliseren van de gegevens wordt dan
niet of slechts intutief uitgevoerd. Al snel na het werken met de
database zullen daardoor problemen ontstaan. Deze worden dan
met trucs, kunst- en vliegwerk opgelost. Uiteraard ontstaat hierdoor weer redundantie en inconsistentie aangezien de gegevens
niet goed geanalyseerd zijn, waardoor het datamodel niet correct
is. Men kan het beste Access spelenderwijs leren door gebruik te
maken van n of twee tabellen. Maar voor een bedrijfsmatige
aanpak dient men eerst de benodigde informatie te verzamelen, te
analyseren en vervolgens te normaliseren. Met het dan ontstane
conceptuele datamodel kunnen in Access de tabellen en relaties
worden gemaakt. Dat wordt ook wel het indelen / inrichten van
de database genoemd. Het op een juiste manier leren werken met
Access wordt vanaf hoofdstuk 5 uitgelegd.

2.3

Samenvatting

In dit hoofdstuk hebben we besproken dat een relationele database een verzameling tabellen is met hun onderlinge relaties. Om
de structuur van een database te ontwerpen moet eerst vastgelegd
worden wat de informatiebehoefte is. Hierin wordt bepaald wat
de gewenste uitvoer van het nieuwe computersysteem is. Die gegevens worden geanalyseerd om tot een datamodel te komen. Dit
ontworpen datamodel kan vervolgens toegepast worden in een
relationele database. Een database beschikt over een database-

22

Databaseontwikkeling 4 Access 2007

managementsysteem (DBMS). Hiermee kunnen de tabellen worden gemaakt, de relaties worden gelegd, de tabellen gevuld worden, gegevens worden geraadpleegd, gemuteerd, enzovoort. Verder
kunnen met behulp van het DBMS rechten worden toegekend en
wordt de integriteit van de database bewaakt. De database wordt
beheerd door de database-administrator. Er zijn verschillende
databasepakketten, zoals Access, MySQL en Oracle. De Accessdatabase is ook te gebruiken aan de gebruikerskant (client) terwijl
de gegevens liggen opgeslagen in een grote database, zoals Oracle
(server). Access is dan de front-end- en Oracle de back-endkant.
Opgaven
1. Omschrijf in het kort de taak van het DBMS.
2. Wat wordt bedoeld met een conceptueel of functioneel datamodel?
3. De rma Innovision verkoopt computers via vertegenwoordigers.
Het is een modern bedrijf, alle gegevens liggen in een relationele
database opgeslagen. Per provincie is n vertegenwoordiger
actief. Als een vertegenwoordiger een afdruk laat maken van alle
klanten uit de database, worden alleen de klanten uit zijn provincie
afgedrukt. Hoe noemen we dit principe?
4. Wat wordt verstaan onder autorisatie?
5. Wat is de taak van de database-administrator?
6. Welke drie typen databases onderscheiden we?
7. Wat wordt bedoeld met informatie-analyse?
8. Wat is record-locking?
9. Reisorganisatie TravelCheap heeft n grote database (Oracle)
waarin alle reizen en boekingen worden opgeslagen. Bij een groot
aantal reisbureaus heeft men Access-software genstalleerd op de
lokale pcs, zodat direct reizen geboekt kunnen worden. Die boekingen worden door middel van datacommunicatie direct in de
Oracle-database verwerkt. De Access-database doet alleen dienst
als in- en uitvoermedium. Hoe wordt dit principe genoemd?

Normaliseren,
inleiding

In dit hoofdstuk laten we aan de hand van een aantal concrete


voorbeelden zien hoe we er achter kunnen komen hoe we een
database moeten inrichten. Daarbij zullen we steeds uitgaan van
de overzichten, informatie, die de gebruiker van de database wenst
te zien. Als er meer dan n gebruiker is, of als er meer dan n
overzicht moet worden getoond, zullen we daar uiteraard rekening
mee houden.

normaliseren

Voor het bepalen van de indeling van de database bestaan verschillende technieken. Wij zullen gebruikmaken van de techniek van
het normaliseren, zoals die door de Amerikaan Edgar Codd in de
jaren zeventig is opgesteld. Normaliseren houdt in dat we in een
viertal stappen de gegevens uiteenrafelen en indelen in een beperkt
aantal, overzichtelijke tabellen. De stappen die we daarbij zullen
uitvoeren, zijn klein van omvang en daardoor goed te begrijpen en
toe te passen. Hierbij geldt echter wel: oefening baart kunst. Alleen
door veel en goed te oefenen kunnen we de kunst van het normaliseren in onze vingers krijgen.

3.1

Stap 1, de nulde normaalvorm

Uitgangspunt van het normaliseren is steeds de informatiebehoefte


van de toekomstige gebruiker van de database. De indeling en
inhoud van de tabellen wordt bepaald door de informatie die de
gebruiker wenst te zien. Stel dat een gebruiker een database wil
met daarin de gegevens van zijn muziekcollectie. Als hij aangeeft
genteresseerd te zijn in het jaar van uitbrengen van de cd, dan zullen we dit jaartal uiteraard moeten opnemen in de database. Als
hij aangeeft absoluut niet te willen weten door welke muziekmaatschappij een cd is uitgegeven, heeft het geen zin om dit gegeven

24

Databaseontwikkeling 4 Access 2007

wel in de database op nemen. Voor een andere opdrachtgever zou


het precies andersom kunnen zijn. Die zou juist wel in de naam
van de maatschappij, maar weer niet in het jaar van uitbrengen
genteresseerd kunnen zijn. Hieruit blijkt dat we niet kunnen praten over een uniek, algemeen geldend ontwerp van een database.
We zullen ons altijd moeten baseren op de gewenste overzichten,
de informatiebehoefte. Deze behoefte kan van gebruiker tot gebruiker verschillen. Het is dus noodzakelijk om tijdens het ontwerpen van een database veel en vaak contact te hebben met de
toekomstige gebruiker. Alleen dan kunnen we ervoor zorgen dat
de indeling van de database past bij de wensen van de gebruiker.
We zullen de theorie uitleggen aan de hand van een praktijkgeval.
Paul, DJ bij de lokale radio, verzorgt driemaal per week een twee
uur durend programma waarin hij zijn favoriete muziek laat horen
en nieuwe cds onder de aandacht wil brengen. Hij krijgt hiervoor
een kleine onkostenvergoeding die hij gebruikt om zijn cd-collectie langzaam uit te breiden. Aan het einde van iedere maand moet
Paul een overzicht inleveren van alle nummers die hij die maand
heeft laten horen. Aan de hand van deze overzichten zorgt de
stichting BUMA/STEMRA ervoor dat de betreffende artiesten een
kleine vergoeding krijgen.
Paul weet meestal aan het einde van de maand niet meer precies wat hij aan het begin van de maand allemaal heeft gedraaid.
Daarom maakt hij het betreffende overzicht (zie guur 3.1) direct
na aoop van het programma. Daarop staat vermeld welke nummers hij heeft gedraaid. Ieder nummer heeft een eigen code. Deze
code is bepaald door een van de medewerkers van het lokale radiostation. Natuurlijk is van ieder nummer ook bekend wat de titel
is en wie de uitvoerende artiest(en) is/zijn. Ten slotte noteert men
ook of het nummer van een gewone cd afkomstig is of dat het op
een single cd staat. Aan het einde van de maand levert hij dan de
stapel met deze dagelijkse overzichten in. Hij is echter al een paar
keer zon dagoverzicht kwijtgeraakt, met alle gevolgen van dien.
Hij vraagt ons daarom om voor hem een database te ontwerpen
waarmee hij aan het einde van de maand het gewenste overzicht
kan maken.
Uitgangspunt voor het ontwerp van een database is dus altijd de
gewenste informatie. Vaak ligt deze wens vast in de vorm van
overzichten die met de database moeten kunnen worden gemaakt,
gegenereerd. We zullen daarom bij het normaliseren altijd uitgaan

25

3 Normaliseren, inleiding

van een of meer overzichten en ervoor zorgen dat de daarop aanwezige informatie kan worden verzorgd. Het door Paul gewenste
overzicht is afgebeeld in guur 3.1.
We nemen aan de hand van guur 3.1 de eerste stap om de gegevens uiteen te rafelen. We krijgen dan de zogenaamde nulde normaalvorm. We bepalen de nulde normaalvorm door alle elementaire, relevante gegevens te bepalen en op te schrijven.
Op ons overzicht staat een aantal verschillende gegevens.
Figuur 3.1

Lokale omroep, DJ Paul


Datum: 17-06-2010
Code
A2734
J7654
P9856
D4532
B7651
B3451
Etc

Titel
HomeTown Glory
Billie Jean
I Known You Love Me
Puzzle Me
Boom Boom Pow
Sweet Dreams
Etc

Artiest(en)
Adele
Michael Jackson
Pitbull
Ilse Delange
Black Eyes Peas
Beyonc
Etc

Soort
C CD
C CD
S Single
C CD
S Single
S Single
Etc

Totaal aantal nummers: 31

Allereerst zien we een koptekst boven het overzicht. Deze koptekst


is op ieder overzicht van Paul hetzelfde (constant), ongeacht de datum en ongeacht de gedraaide nummers. We zouden deze koptekst
kunnen voorbedrukken op het papier. Omdat de koptekst onveranderlijk is, nemen we deze niet op in de database. Constante gegevens nemen we niet op in de database. Deze constanten worden
vaak in een apart bestand (tabel) opgenomen, zodat de gebruiker
wel in staat is wijzigingen aan te brengen. Paul zou bijvoorbeeld
zijn naam willen veranderen in DJ Paul Xtreme.

Terzijde
We zien op dit moment de naam DJ Paul als een constante. We
kunnen ons echter ook afvragen of dit systeem in de toekomst
ook door andere DJs gaat worden gebruikt. In dat geval kunnen we de naam natuurlijk niet als een constante opvatten. Houd
daarom bij alle afwegingen die je maakt tijdens het normaliseren
altijd rekening met mogelijke wensen en uitbreidingen die in de
toekomst een rol kunnen gaan spelen!

26

Databaseontwikkeling 4 Access 2007

Vervolgens zien we een aantal gegevens die iedere keer zullen verschillen: de datum en de gegevens van de gedraaide muziek. Deze
gegevens moeten we natuurlijk wel opnemen in de database omdat
we ze anders kwijt zijn.

procesgegeven

elementaire gegevens
samengestelde
gegevens

kenmerk

Ten slotte zien we onder in het overzicht nog een totaal aantal
getoond. Dit totaal is af te leiden uit het overzicht door simpelweg
het aantal afgedrukte en dus gedraaide nummers te tellen. Als het
totaal niet onder in het overzicht zou staan afgedrukt, zouden we
het zelf op eenvoudige wijze even kunnen bepalen. Het totaal aantal kunnen we daarom ook weglaten uit de database. We noemen
het totaal aantal een procesgegeven. We kunnen het gegeven namelijk bepalen door een rekenproces, in dit voorbeeld tellen van de
regels, te laten uitvoeren. Procesgegevens nemen we nooit op in de
database.
Wat we overhouden aan relevante gegevens bestaat uit: datum,
code, titel, artiest en soort. De aanduiding soort is echter niet
elementair. Met de aanduiding soort bedoelen we twee gegevens,
te weten een soortcode (bijvoorbeeld S) en een soortomschrijving
(bijvoorbeeld Single). We moeten de aanduiding soort daarom
splitsen in twee elementaire gegevens, te weten soortcode en
soortomschrijving. Dit splitsen moeten we altijd doen in het geval
dat we te maken hebben met samengestelde gegevens.
We houden nu dus over de elementaire gegevens: datum, code,
titel, artiest, soortcode en soortomschrijving. In plaats van de term
gegeven zullen we kenmerk (item, element, eigenschap) gebruiken,
zie ook paragraaf 3.5 Terminologie
Met de door ons gevonden kenmerken is iets speciaals aan de
hand. Het eerste kenmerk, de datum, komen we maar n keer tegen. De andere gegevens komen we meerdere keren tegen. Om dit
verschil duidelijk te maken noteren we onze gegevens daarom op
de volgende manier:
datum, RG (code, titel, artiest, soortcode, soortomschrijving)

repeterende groep

Daarbij staat RG voor repeterende groep (repeating group). Alle


gegevens die meerdere keren, repeterend, voorkomen, staan vervolgens tussen ronde haken vermeld.

3 Normaliseren, inleiding

sleutelkenmerk

Het overzicht uit guur 3.1 is het overzicht van 17 juni 2010. Paul
beschikt echter voor iedere dag dat hij een programma heeft gepresenteerd over een dergelijk overzicht. Om uit de hele stapel
met alle overzichten precies het door ons getoonde overzicht te
pakken, moeten we weten van welke datum we iets willen weten.
De datum wijst in ons geval precies n overzicht aan. De datum
geeft ons toegang tot precies n overzicht. We noemen daarom de
datum ook wel het sleutelgegeven ofwel sleutelkenmerk. We geven
het sleutelkenmerk aan door dit te onderstrepen. We hebben nu
uiteindelijk de nulde normaalvorm gevonden. We noteren dit op de
volgende manier:
0 NV

identity integrity

27

(datum, RG (code, titel, artiest, soortcode,


soortomschrijving))

Bij het begrip sleutelkenmerk kunnen we nog het volgende opmerken. Allereerst zal een sleutelkenmerk altijd een waarde moeten
hebben. Stel namelijk dat in onze stapel met overzichten er een
drietal zit waarop de datum niet staat vermeld. Hoe moeten we
dan n van deze overzichten aanwijzen? En bij welke uitzenddag
horen ze thuis?
Daarnaast moet een sleutelwaarde altijd uniek zijn, dit wordt met
een moeilijk woord identity integrity genoemd. Met andere woorden, er mogen in onze stapel geen twee overzichten voorkomen
met daarop dezelfde datum. In dat geval zouden we immers niet
weten welke van de twee de juiste is.
Vervolgens geldt dat een sleutelkenmerk altijd zo minimaal mogelijk moet zijn. Als de datum volstaat als sleutel, dan zal ook de
combinatie dagaanduiding met datum volstaan. We zouden dan de
sleutel datum + dag krijgen (bijvoorbeeld : 23-1-2010 + zaterdag).
Omdat we echter ook met een deel hiervan (datum) als sleutel kunnen werken, zijn we verplicht het overtollige deel, de dagaanduiding, weg te laten. We kunnen volstaan met alleen de datum omdat
bij iedere datum slechts n dagaanduiding hoort.
Verder is belangrijk dat de kenmerken die in aanmerking komen
als sleutelkenmerk gezocht moeten worden buiten de repeterende
groep. In ons voorbeeld is dat alleen het kenmerk datum. Er is dus
geen enkele andere optie.
Ten slotte merken we nog even op dat er soms sprake is van meerdere kenmerken die als sleutelkenmerk zouden kunnen fungeren.

28

Databaseontwikkeling 4 Access 2007

kandidaatsleutels

We noemen dit kandidaatsleutels. Een voorbeeld hiervan is het


leerlingnummer zoals dat op school gebruikt wordt en het nummer
waaronder iemand bij de IB-groep in Groningen bekend is. Ook
het IB-groepnummer is op school bekend. Men heeft daar nu om
een leerling te kunnen aanwijzen twee mogelijkheden, twee kandidaatsleutels. Zou men ook nog het Burgerservicenummer kennen, dan zou er zelfs sprake zijn van een drietal kandidaatsleutels.
Hieruit kiest men er n die als sleutelkenmerk gaat functioneren.
Meestal diegene die uit de eigen organisatie komt, dus op school
zal men kiezen voor het leerlingnummer.
Maak opgave 3.1.

3.2

Stap 2, de eerste normaalvorm

We hebben op dit moment de nulde normaalvorm in handen. Deze


ziet eruit als:
0 NV

(datum, RG (code, titel, artiest, soortcode,


soortomschrijving))

In deze nulde normaalvorm zit een aantal problemen verborgen.


We zullen nu een van de hoofdproblemen aanpakken. Dit zal automatisch resulteren in de eerste normaalvorm. Het probleem dat we
aanpakken, is het probleem dat optreedt als een nummer meerdere
keren door Paul is gedraaid. Iedere keer zal hij steeds alle gegevens van dat nummer noteren, dus code, titel, artiest, soortcode en
soortomschrijving. Het lijkt misschien alsof we slechts n keer
een code, titel, enzovoort noteren, maar de afkorting RG geeft aan
dat we dat herhaaldelijk doen, zo vaak als er nummers gedraaid
zijn. Dat betekent dat als Paul het nummer Billie Jean van Michael
Jackson in een jaar totaal zestig keer heeft gedraaid, hij ook zestig
keer alle gegevens heeft genoteerd. Dat is toch raar? Waarom kunnen we niet volstaan met het n keer noteren van alle gegevens?
Natuurlijk moeten we dan wel iedere keer even noteren dat we dat
nummer hebben gedraaid, maar dat doen we dan kortweg via het
noteren van alleen maar de code. In de eerste normaalvorm wordt
dit probleem gedeeltelijk opgelost.

29

3 Normaliseren, inleiding

We bepalen de eerste normaalvorm door de repeterende groep


apart te nemen en uit te breiden met de sleutel van de originele
nulde normaalvorm. Hierna bepalen we in de nu nieuw gevonden
groep weer een sleutel.
In ons geval bestaat de repeterende groep uit (code, titel, artiest,
soortcode, soortomschrijving). Deze nemen we apart en we voegen
de sleutel (datum) eraan toe.
We krijgen dan een nieuwe groep:
(datum, code, titel, artiest, soortcode, soortomschrijving)
Let erop dat we de datum, hoewel die in de eerste normaalvorm
sleutel was en dus onderstreept, nu niet zonder meer opnieuw onderstrepen! We gaan nu een nieuwe sleutel aanwijzen. We moeten
ons afvagen hoe onze oorspronkelijke informatie, zie guur 3.1,
terug te zien is in de nieuw ontstane groep. We moeten wel beseffen dat in die nieuwe groep alle draaidagen van DJ Paul worden
opgeslagen. Dan weten we namelijk wat we proberen aan te wijzen
en kunnen we bepalen wat een goede sleutelkeuze is. Kijk eens
naar guur 3.2.
Figuur 3.2

Datum

Code

Titel

Artiest

Soortcode

Soortomschrijving

.
16-06-2010
17-06-2010
17-06-2010
17-06-2010
17-06-2010
17-06-2010
17-06-2010
.
18-06-2010
Etc

.
D5651
A2734
J7654
P9856
D4532
B7651
B3451
.
J7654
Etc

.
Outta Here
HomeTown Glory
Billie Jean
I Known You Love Me
Puzzle Me
Boom Boom Pow
Sweet Dreams
.
Billie Jean
Etc

.
Esme Denters
Adele
Michael Jackson
Pitbull
Ilse Delange
Black Eyes Peas
Beyonc
.
Michael Jackson
Etc

.
S
C
C
S
C
S
S
.
C
Etc

.
Single
CD
CD
Single
CD
Single
Single
.
CD
Etc

Ons overzicht, met n datum en de draaigegevens, wordt nu als


regels in een tabel weergegeven. Merk op dat de datum waarop het
nummer gedraaid is, nu voor ieder nummer wordt genoteerd. Om
een sleutel te bepalen moet iedere regel uniek teruggevonden kunnen worden. Om precies n regel op een bepaald formulier aan te
duiden moeten we eerst aangeven naar welke formulier, van welke

30

Databaseontwikkeling 4 Access 2007

datum, we willen kijken. Daartoe dienen we dus de datum op te


geven. Vervolgens selecteren we n enkele regel van het betreffende overzicht door de code van het betreffende nummer op te
geven. Iedere code komt hooguit n keer op een overzicht voor
omdat Paul nooit twee maal hetzelfde nummer in dezelfde uitzending draait. De combinatie van datum en code kan dus fungeren
als sleutel. We krijgen dan:
(datum, code, titel, artiest, soortcode, soortomschrijving)
Omdat de sleutel nu bestaat uit twee kenmerken en omdat een
sleutel altijd minimaal moet zijn, moeten we wel even controleren
of een kleinere sleutel misschien ook voldoet. Dus we gaan na of
alleen de datum als sleutel ook voldoet. Dat is natuurlijk niet zo,
want bij n datum vinden we meerdere nummers die Paul heeft
gedraaid, dus meerdere regels, en we zoeken precies n regel.
Kunnen we misschien volstaan met alleen de code van het nummer
als sleutel? Dat zou kunnen als Paul een nummer nooit meer dan
n keer draait, ook niet op verschillende dagen. Omdat wij weten
dat Paul wel degelijk nummers vaker draait, ontstaat het probleem
dat we een bepaalde code op meerdere overzichten, van verschillende datums, kunnen terugvinden. Een voorbeeld hiervan is te
zien in guur 3.2, code J7654, het nummer Billie Jean van Michael
Jackson. Daardoor wijzen we dus niet slechts n, maar meerdere
regels aan, hoewel die op verschillende overzichten liggen. Dus
alleen de code voldoet ook niet als sleutel. De door ons eerder gekozen, gecombineerde, sleutel is dus de juiste.
We hebben nu echter nog niet de eerste normaalvorm. We moeten
ons werk nog afmaken. Dat doen we door in de originele nulde
normaalvorm de door ons apart genomen repeterende groep te verwijderen en te kijken wat er overblijft. Wat er overblijft, voegen we
als aparte groep toe aan de eerste normaalvorm.
We hadden als nulde normaalvorm gevonden:
(datum, RG (code, titel, artiest, soortcode,
soortomschrijving))

3 Normaliseren, inleiding

31

Door de repeterende groep te verwijderen houden we alleen over:


(datum)
Deze groep voegen we toe. We krijgen dan uiteindelijk de eerste
normaalvorm met twee groepen:
1 NV

(datum)
(datum, code, titel, artiest, soortcode, soortomschrijving)

We zien dat we nu geen repeterende groep meer over hebben. We


zijn dus gedeeltelijk geslaagd in onze opzet. Nog steeds zitten we
met het probleem dat als Paul een nummer vaker draait, we steeds
opnieuw alle gegevens zitten te noteren. We zijn dus nog steeds
niet klaar.
In het toegelichte voorbeeld zien we dat de sleutel uit de nulde normaalvorm (datum) ook in de eerste normaalvorm weer onderdeel
van de sleutel is. Vaak is dat zo, maar lang niet altijd. Let dus goed
op bij het kiezen van een nieuwe sleutel!
Maak opgave 3.2.

3.3

Stap 3, de tweede normaalvorm

Zoals reeds gezegd heeft de door ons gevonden eerste normaalvorm nog steeds het nadeel dat dezelfde gegevens steeds opnieuw
worden opgeslagen. In de volgende stap, de stap naar de tweede
normaalvorm, zullen we dit nadeel grotendeels wegwerken.
Om te komen tot de tweede normaalvorm onderzoeken we in de
eerste normaalvorm of er kenmerken (gegevens) zijn die niet tot de
sleutel behoren (niet onderstreept) en die niet van de gehele sleutel
afhangen, maar slechts van een gedeelte van de sleutel. We zullen
deze moeilijk lijkende regel aan de hand van ons voorbeeld toelichten. We kijken alleen maar naar groepen in de eerste normaalvorm
waarbij de sleutel samengesteld is, dus uit meerdere kenmerken
bestaat. Als die groepen niet bestaan, er zijn alleen maar groepen
met een enkelvoudige sleutel, is de tweede normaalvorm precies

32

Databaseontwikkeling 4 Access 2007

gelijk aan de eerste normaalvorm. We noteren dat dan als 2NV =


1NV. In ons voorbeeld hebben we wel een groep met een samengestelde of meervoudige sleutel:
(datum, code, titel, artiest, soortcode, soortomschrijving)
We moeten nu zoeken naar niet-sleutelkenmerken die slechts afhankelijk zijn van een deel van de sleutel, dus in ons voorbeeld van
alleen de datum of alleen de code. Als je een willekeurige datum
hebt, heb je dan altijd precies n titel, of n artiest, of n soortcode, of n soortomschrijving? Als een antwoord ja is, is er een
afhankelijkheid. Op alle vier de vragen is het antwoord neen. Op
een datum worden meerdere titel, meerdere artiesten, meerdere
soortcodes en meerdere soortomschrijvingen gedraaid. Het kan
best zijn dat op een datum maar n soortcode en soortomschrijving is gedraaid, maar het moet gelden voor alle datums! Datum
levert daarom geen afhankelijkheden op. Vervolgens gaan we het
sleutelkenmerk code controleren op afhankelijkheden. Als je een
code hebt, heb je dan altijd precies n titel, of n artiest, of n
soortcode, of n soortomschrijving? De antwoorden zijn: ja, ja,
ja en ja. Bij een code hoort precies n titel, artiest, soortcode en
soortomschrijving. Alle vier de kenmerken (titel, artiest, soortcode, soortomschrijving) zijn dus afhankelijk van het sleutelkenmerk
code. Van deze kenmerken maken we een aparte gegevensgroep,
samen met het sleutelkenmerk waarvan ze afhankelijk zijn. We
krijgen dan:
(code, titel, artiest, soortcode, soortomschrijving)
In de originele groep laten we de betreffende niet-sleutelkenmerken achterwege. We hadden:
(datum, code, titel, artiest, soortcode, soortomschrijving)
en we krijgen nu dus:
(datum, code)
Let erop dat het sleuteldeel waarvan de niet-sleutelkenmerken afhankelijk waren (code) in deze groep gewoon blijft bestaan.

3 Normaliseren, inleiding

33

De nu gevonden groepen:
(code, titel, artiest, soortcode, soortomschrijving)
(datum, code)
vullen we ten slotte aan met de groepen die we in de eerste normaalvorm al hadden gevonden maar waar geen samengestelde
sleutel in aanwezig was.
We krijgen dan uiteindelijk de tweede normaalvorm, bestaande uit
drie groepen:
2 NV

(code, titel, artiest, soortcode, soortomschrijving)


(datum, code)
(datum)

We hebben nu veel overtolligheid (redundantie) opgeheven. Dat


komt doordat in de eerste groep de code de sleutel is. Ieder nummer wordt hierin hooguit n keer opgenomen. Wordt een nummer
nu vaker gedraaid, dan wordt het zo vaak als nodig opgenomen in
de tweede groep (datum, code). De gegevens van het nummer zelf,
zoals de titel, zijn echter al bekend in de eerste groep en worden
daar dus niet nog eens opgenomen. Het achteraf corrigeren van een
typefout in de naam van de artiest is nu dus eenvoudig, want het
behoeft slechts n maal te worden uitgevoerd.
Maak opgave 3.3.

3.4

Stap 4, de derde normaalvorm

We zijn op dit moment gevorderd tot en met de tweede normaalvorm. We nemen nu de laatste stap, het bepalen van de derde normaalvorm. De door ons gevonden tweede normaalvorm zag eruit
als:
2 NV

(code, titel, artiest, soortcode, soortomschrijving)


(datum, code)
(datum)

34

Databaseontwikkeling 4 Access 2007

Er zit in deze tweede normaalvorm nog een vorm van overtolligheid (redundantie). Die heeft te maken met de kenmerken soortcode en soortomschrijving. Bij ieder nummer staan beide gegevens
opgenomen. Als we de gegevens van 1000 nummers op single
hebben, zal de combinatie S, Single dus 1000 keer zijn opgenomen.
Ook hier zouden we met n keer klaar moeten zijn. Wel bij iedere
single noteren dat het een single is (soortcode = S), maar slechts
n maal noteren dat de code S staat voor de omschrijving Single.
Door deze overtolligheid eruit te halen ontstaat de derde normaalvorm.
Het proces van de derde normaalvorm lijkt op het proces van de
tweede normaalvorm. We zoeken opnieuw naar afhankelijkheden
tussen kenmerken. In de tweede normaalvorm wordt gezocht naar
afhankelijkheden tussen sleutelkenmerken en niet-sleutelkenmerken (alleen bij gegevensgroepen met een samengestelde of
meervoudige sleutel). In de derde normaalvorm gaan we bij alle
gegevensgroepen uit de tweede normaalvorm zoeken naar afhankelijkheid tussen alle niet-sleutelkenmerken (niet-onderstreepte
kenmerken). De kenmerken die afhankelijk zijn, worden verwijderd uit de gegevensgroep en daarvan wordt een aparte gegevensgroep gemaakt. Het kenmerk waarvan ze afhankelijk zijn, wordt in
de nieuwe groep de sleutel. Deze moeilijke lijkende regel zullen we
aan de hand van ons voorbeeld toelichten.
Zoals bekend, we hadden al de volgende 2NV gevonden:
2 NV

(code, titel, artiest, soortcode, soortomschrijving)


(datum, code)
(datum)

In ons voorbeeld hoeven we dus alleen maar in de eerste groep


te kijken, want alleen daar is sprake van een aantal niet-sleutelkenmerken. We gaan deze allemaal langs en vragen ons steeds af
of ze afhankelijk zijn van een ander niet-sleutelkenmerk. Als je
een titel hebt, heb je dan altijd precies n artiest? Als dat zo is,
dan is artiest afhankelijk van de titel. Het antwoord is neen. Een
titel kan meerdere artiesten opleveren. Bijvoorbeeld de titel Fight
For Your Right To Party levert twee artiesten op, namelijk Public
Enemy en de Beastie Boys. Een titel levert ook meerdere soortcodes op en dus ook meerdere soortomschrijvingen. Er is dus geen
enkel niet-sleutelkenmerk afhankelijk van de titel. Hetzelfde geldt

3 Normaliseren, inleiding

35

voor artiest. Een artiest heeft meerdere titels en meerdere soortcodes en soortomschrijvingen. Titel, soortcode en soortomschrijving
zijn dus niet afhankelijk van artiest. Maar als je een soortcode
hebt, dan hoort daar altijd precies n soortomschrijving bij.
Soortomschrijving is daardoor afhankelijk van soortcode. Neem
de twee kenmerken daarom apart in een nieuwe groep:
(soortcode, soortomschrijving)
Daarbij geldt dat de soortcode het sleutelkenmerk zal worden:
vertel ons de code en wij vertellen u de omschrijving. Dus:
(soortcode, soortomschrijving)
In de originele groep laten we nu het afhankelijke niet-sleutelkenmerk(soortomschrijving) achterwege. We houden dan over:
(code, titel, artiest, soortcode)
Let erop dat het kenmerk dat sleutel is geworden in de nieuwe
groep, in de oorspronkelijke groep gewoon blijft bestaan!
Door de beide zojuist gevonden groepen aan te vullen met de andere, niet veranderde groepen uit de tweede normaalvorm, ontstaat
de volgende derde normaalvorm:
3 NV

(soortcode, soortomschrijving)
(code, titel, artiest, soortcode)
(datum, code)
(datum)

Deze derde normaalvorm is het uiteindelijke doel geweest van het


normalisatieproces. Deze nu gevonden groepen kunnen we later op
eenvoudige wijze opnemen in een database. Iedere gevonden groep
zal daarbij worden vertaald in een afzonderlijke tabel. Hierdoor
kunnen we later op relatief eenvoudige wijze alle gegevens invoeren en alle gewenste informatie opvragen. We zullen daar in latere
hoofdstukken uitgebreid op terugkomen.
Eerst moeten we nog een paar afrondende handelingen verrichten.
De eerste handeling bestaat uit het toekennen van namen aan de

36

Databaseontwikkeling 4 Access 2007

gevonden groepen. De eerste groep geven we de naam SOORT,


omdat daarin de soort muziekdrager wordt bijgehouden, single
of cd. De tweede groep noemen we TRACK omdat daarin de
kenmerken van de tracks worden bijgehouden. In de derde groep
worden de gegevens bijgehouden van de nummers die gedraaid
zijn, we kunnen dit zien als een DRAAILIJST. Ten slotte hebben
we nog de laatste groep waarin de datums liggen opgeslagen van
de dagen waarop Paul een programma heeft verzorgd. Deze groep
noemen we DATUM.
3 NV

SOORT
TRACK
DRAAILIJST
DATUM

(soortcode, soortomschrijving)
(code, titel, artiest, soortcode)
(datum, code)
(datum)

We kunnen ons echter afvragen of het zin heeft om deze laatste


groep bij te houden. Immers, een overzicht van alle draaidatums
kunnen we ook aeiden uit de groep DRAAILIJST. Tenslotte
komen alle datums daar ook in voor. Omdat de groep DATUM
verder geen speciale betekenis heeft, kunnen we deze weglaten.
Daardoor gaan er geen gegevens verloren.
We houden dan over:
3 NV

SOORT
(soortcode, soortomschrijving)
TRACK
(code, titel, artiest, soortcode)
DRAAILIJST (datum, code)

Het komt vaker voor dat een van de gevonden groepen in de derde
normaalvorm mag worden weggelaten. Dit zijn dan altijd groepen
waarin alleen maar sleutelkenmerken voorkomen. De groepen
mogen alleen maar worden weggelaten als daardoor verder geen
informatie verloren gaat. Niet iedere groep die bestaat uit alleen
maar sleutelkenmerken mag dus worden weggelaten! Controleer
altijd terdege. De groep DRAAILIJST mag in ons voorbeeld niet
weggelaten worden omdat daar nu precies in staat welke nummers
op welke datum zijn gedraaid. Zonder deze groep zouden we
alleen maar de gegevens van de nummers hebben. En dan kunnen
we dus niet het door Paul gewenste overzicht maken.

3 Normaliseren, inleiding

37

Ten slotte willen we nog even opmerken dat het niet altijd zo is
dat er bij de stap van de ene naar de andere normaalvorm altijd
iets gedaan kan worden. Regelmatig blijken twee normaalvormen
gelijk aan elkaar te zijn. In dat geval zullen we gebruikmaken van
een verkorte notatiewijze. Als de derde normaalvorm gelijk blijkt
te zijn aan de tweede normaalvorm, noteren we bij de derde normaalvorm: 3NV = 2NV.
Maak opgave 3.4.

3.5

Terminologie

Tijdens het normalisatieproces hebben we voornamelijk gesproken


in termen van gegevens, groepen met gegevens, en kenmerken. In
de literatuur zijn echter ook andere termen voor gegevensgroepen
en kenmerken.
3 NV

attribuut
attribuutwaarde

entiteit

entiteit-occurence

SOORT
(soortcode, soortomschrijving)
TRACK
(code, titel, artiest, soortcode)
DRAAILIJST (datum, code)

In plaats van kenmerken wordt in de literatuur gesproken over attributen. Zo staat in het bovenstaande voorbeeld onder andere het
attribuut titel vermeld. Een attribuut kan een bepaalde waarde
aannemen, de zogenaamde attribuutwaarde. Bij het attribuut titel
zou de attribuutwaarde Billie Jean kunnen optreden. De attributen zien we in het schema van guur 3.3 terug als kolommen.
Attributen beschrijven groepen, groepen die voor de gebruiker,
in ons geval Paul, betekenisvol zijn. In plaats van de term groep
gebruiken ze in de literatuur de term entiteit. In de voorgaande
derde normaalvorm komen we de entiteiten SOORT, TRACK en
DRAAILIJST tegen. De entiteit TRACK bevat dus de gegevens
van alle tracks die voor PAUL van belang zijn. Een afzonderlijke
track wordt wel een entiteit-occurence genoemd. Deze bevat dus
alle gegevens van n enkele track, de afzonderlijke rijen in het
schema van guur 3.3.

38

Figuur 3.3

Databaseontwikkeling 4 Access 2007

Entiteit : TRACK
Attributen
Code

Titel

Artiest

Soortcode

A2734

HomeTown Glory

Adele

J7654

Billie Jean

Michael Jackson

P9856

I Know You Love Me Pitbull

..
Entiteit-occurences
Attribuutwaarden

Deze termen worden veel toegepast in de literatuur, aangezien


Edgar Codd ze heeft gebruikt. Edgar Codd was wiskundige en
heeft op basis daarvan dit model uitgedacht. Een praktisch model
in de vorm van een relationele database is pas later ontwikkeld.
Om het nog iets ingewikkelder te maken: de gevonden gegevensgroepen vormen later de basis bij het maken van de database (de
technische implementatie). De entiteiten worden dan tabellen of
bestanden genoemd. Attribuuttypen worden kolommen of velden
genoemd en een specieke regel (entiteit-occurrence) rij of record.
In dit boek blijven we de termen kenmerken (items, elementen,
eigenschappen) en groepen (gegevensgroepen) gebruiken. Maar
wil je op internet iets opzoeken over normaliseren, zoek dan op de
termen zoals door Edgar Codd toegepast.

3.6

Entiteit Relatie Diagram (ER-Diagram)

In ons voorbeeld zijn in totaal drie groepen gevonden. Deze drie


groepen hangen niet als los zand aan elkaar maar hebben duidelijk
met elkaar te maken.
3 NV

SOORT
(soortcode, soortomschrijving)
TRACK
(code, titel, artiest, soortcode)
DRAAILIJST (datum, code)

Om te achterhalen welke nummers er op een bepaalde datum


gedraaid zijn, dienen we in de groep DRAAILIJST de door ons

39

3 Normaliseren, inleiding

gewenste datum op te zoeken. Die komen we daar meerdere keren


tegen, iedere keer in combinatie met de code van een gedraaide
track. Als we willen weten welke tracks dat precies zijn, moeten
we met de gevonden codes naar de groep TRACK om daar de
betreffende codes op te zoeken. We vinden dan titel, artiest en
soortcode. Op soortgelijke wijze kunnen we bij iedere track de
juiste soort opzoeken aan de hand van de soortcode. Zie guur 3.4.
Figuur 3.4

DRAAILIJST
Datum

Code

16-06-2010 D5651
17-06-2010 A2734
17-06-2010 J7654
17-06-2010 P9856
17-06-2010 D4532
17-06-2010 B7651
17-06-2010 B3451
....

....

18-06-2010 J7654
....

....

TRACK
Code

Titel

Artiest

Soortcode

....

....

....

....

A2734

HomeTown Glory

Adele

A3212

Never Say Never

Armin van Buuren C

B3451

Sweet Dreams

Beyonc

B7651

Boom Boom Pow

Black Eyes Peas

B7689

I Gotta Feeling

Black Eyes Peas

D5651

Outta Here

Esme Denters

D4532

Puzzle Me

Ilse Delange

J1987

Beat It

Michael Jackson

J7654

Billie Jean

Michael Jackson

P9856

I Know You Love Me Pitbull

....

....

....

SOORT
Soortcode

Soortomschrijving

Single

CD

S
....

40

Databaseontwikkeling 4 Access 2007

Het bijzoeken van gegevens lukt natuurlijk alleen maar als de codes in DRAAILIJST ook voorkomen in TRACK. In dat geval zouden namelijk de titel en artiest er niet bijgezocht kunnen worden.
We kunnen dan ook onze draailijsten niet meer laten afdrukken.
Een probleem dus.

vreemde sleutel

referentile integriteit

Om dit te voorkomen zullen we een aantal dingen afspreken. Als


eerste de term vreemde sleutel (foreign key). Hiermee wordt bedoeld een kenmerk (of kenmerken) dat verwijst naar de sleutel in
een groep. In ons voorbeeld is er sprake van een tweetal vreemde
sleutels. Als eerste het kenmerk code in DRAAILIJST. Dit is een
vreemde sleutel omdat het verwijst naar de sleutel van de groep
TRACK. Merk op dat code zelf geen sleutel is in DRAAILIJST,
maar een onderdeel van de sleutel. Ook het kenmerk soortcode in
TRACK is een vreemde sleutel, want het verwijst naar de sleutel
van de groep SOORT (soortcode).
Vreemde sleutels verwijzen in het algemeen naar andere groepen.
Dit lukt alleen maar als iedere waarde die de vreemde sleutel
aanneemt ook als sleutelwaarde voorkomt in de groep waarnaar
verwezen wordt. Met andere woorden: als in de DRAAILIJST de
code A2734 voorkomt, moet deze waarde ook voorkomen als
code in TRACK, met daarbij de naam van de artiest en de titel
van het nummer. Je zou anders muziek gedraaid hebben (code in
DRAAILIJST), van een track (code in TRACK) dat niet bestaat.
De eis dat iedere waarde die een vreemde sleutel aanneemt ook als
sleutelwaarde moet voorkomen in de andere groep, staat bekend
onder de eis van referentile integriteit (referential integrity).
Andersom geldt deze eis niet. Er kan in TRACK best een
waarde voor code voorkomen die we nog niet tegenkomen in
DRAAILIJST. De track is dan gewoon nog nooit gedraaid in
het programma! Zoals uit de derde normaalvorm blijkt, kan een
vreemde sleutel zelf deel van een sleutel zijn. Kijk naar het kenmerk code in de tabel DRAAILIJST. Een vreemde sleutel kan echter ook een niet-sleutelkenmerk zijn. Kijk maar naar het kenmerk
soortcode in de tabel TRACK.
Via de vreemde sleutels zijn de groepen met elkaar verbonden
(gerelateerd). Deze relaties geven we graag weer door middel van
een diagram, omdat dat over het algemeen veel duidelijker is. Dit

41

3 Normaliseren, inleiding

Entity Relationship
Diagram

diagram noemen we Entiteit Relatie Diagram oftewel een Entity


Relationship Diagram, kortweg ER-Diagram.
Om weer te geven dat twee groepen iets gemeenschappelijks hebben, via een vreemde sleutel, nemen we de beide groepen op door
middel van een rechthoek en verbinden deze beide rechthoeken
door middel van een rechte lijn. Tevens vermelden we bij de lijn op
basis van welke vreemde sleutel de relatie bestaat. De relaties zijn
altijd n-op-veel.

Figuur 3.5

TRACK

DRAAILIJST

o.b.v. code

SOORT

o.b.v. soortcode

We zien dat de lijnen aan de ene kant eindigen in een enkelvoudig


einde van de lijn en aan de andere kant eindigen in een vertakt
einde van de lijn. Als we vanuit de groep DRAAILIJST naar de
groep TRACK gaan, komen we aan via een enkelvoudig einde van
de lijn. Dat betekent dat iedere regel in DRAAILIJST, steeds te
maken heeft met n track. Andersom, gaan we uit van TRACK en
gaan we naar DRAAILIJST, dan komen we bij een vertakt einde
van de lijn uit. Dat betekent dat we bij iedere regel uit TRACK, dus
bij ieder nummer, meer dan n regel uit DRAAILIJST kunnen
vinden. Dat is ook logisch want een nummer kan meerdere keren
zijn gedraaid.
Het bepalen of er een enkelvoudig einde of een vertakt einde moet
worden getekend, is eenvoudig. Aan de kant van de lijn waar de
sleutel is, is het enkelvoudige einde van de lijn. Een sleutelwaarde
moet immers altijd uniek zijn en kan dus maar n keer voorkomen, dus een enkelvoudig einde. De andere kant van de lijn is dan
automatisch de veel-kant of veel-tak, omdat relaties altijd n-opveel zijn.
Soms staat aan het einde van een veel-tak een rondje, zie guur
3.5. Dat rondje kan gelezen worden als de waarde nul. De veel-tak
kan dan bestaan uit 0, 1 of meer regels (rijen). Staat het rondje er
niet, dan bestaat de veel-tak uit 1, 2 of meer regels (rijen). De
0-vorm komt het meest voor. In ons voorbeeld kan het voorkomen
dat een regel (rij) uit de groep TRACK, bijvoorbeeld bij een nieuwe CD, nog niet door DJ Paul is gedraaid. Die track komt dan

42

Databaseontwikkeling 4 Access 2007

0-keer voor in de groep DRAAILIJST. Hetzelfde geldt voor de


veel-tak bij TRACK. In ons voorbeeld komt de 0-waarde niet
voor (er zijn meerdere C- en S-waarden in TRACK), maar als een
nieuwe soort wordt toegevoegd, bijvoorbeeld DVD, in de groep
SOORT, dan kan het zijn dat DJ Paul die nog niet heeft gedraaid.
Het soort DVD komt dan 0-keer voor in TRACK.
Hieronder staan de mogelijkheden weergegeven:
 er worden n of meer rijen gevonden:
 er worden nul, n of meer rijen gevonden:
Opmerkingen ER-Diagrammen
 Het is soms lastig om alle relaties tussen de verschillende gegevensgroepen te vinden. Om alle relaties te vinden tussen de verschillende gegevensgroepen gaat je als volgt te werk. Begin bij
de eerste gegevensgroep, in ons voorbeeld SOORT. Soortcode is
de sleutel. Zoek nu in alle andere gegevensgroepen naar dit kenmerk (wel of niet onderstreept, dat maakt niets uit). In TRACK
dus. Nu is er een relatie tussen SOORT en TRACK op basis van
soortcode. Een relatie is altijd n-op-veel. Soortcode is de sleutel
in SOORT, en dus uniek, daar is dan de n kant. De andere kant
is dan automatisch veel. Neem dan de tweede gegevensgroep,
TRACK. De sleutel hiervan is code. Zoek nu in alle andere gegevensgroepen of daar het kenmerk code voorkomt. Dat is bij de gegevensgroep DRAAILIJST. Nu is er een relatie tussen TRACK en
DRAAILIJST op basis van het kenmerk code. In TRACK is code
de sleutel, daar is dus de n kant. De andere kant is dan automatisch veel. Nu naar de laatste groep DRAAILIJST. De sleutel is
datum en code samen. Zoek nu in alle andere groepen of die combinatie voorkomt. De combinatie (datum en code samen) komt niet
voor in SOORT en TRACK, dus vanuit DRAAILIJST zijn er geen
n-op-veel relaties. Nu heb je alle relaties gevonden.
 Als een gegevensgroep een samengestelde sleutel heeft, moet voor
een n-op-veel relatie alle kenmerken van de sleutel voorkomen
in de andere gegevensgroep. Bijvoorbeeld, als de sleutel in een
gegevensgroep artikelnr en locatienr samen is, bestaat een nop-veel relatie met een andere gegevensgroep, als in die groep ook
de kenmerken artikelnr en locatienr aanwezig zijn. De volgorde
maakt daarbij niet uit. Er is dan een relatie op basis van artikelnr +
locatienr.

3 Normaliseren, inleiding

43

 ER-diagrammen worden in de literatuur op verschillende manieren


weergegeven. Het principe is bij alle typen wel hetzelfde.
Maak opgave 3.5.

3.7

Samenvatting

In dit hoofdstuk hebben we de eerste beginselen van het normaliseren geleerd. Daarbij rafelen we de ongestructureerde gegevens,
zoals die op een overzicht worden getoond, in een aantal stappen
uiteen tot een gestructureerd geheel. Daarbij maken we gebruik
van de techniek van het normaliseren.
Eerst stellen we de nulde normaalvorm op door alle elementaire
gegevens te noteren. Daarbij laten we alle vaste teksten (constanten) en procesgegevens achterwege. We bepalen de sleutel. Het
bepalen van de sleutel doen we ook bij iedere volgende stap.
Vervolgens bepalen we de eerste normaalvorm door de repeterende groep te verwijderen.
Hierna bepalen we de tweede normaalvorm. Daarbij nemen we alle
kenmerken apart die slechts van een deel van de sleutel afhangen
en niet van de gehele sleutel.
Ten slotte bepalen we de derde normaalvorm. Daarbij nemen we
alle kenmerken apart die helemaal niet van de sleutel afhangen,
maar die van een ander niet-sleutelkenmerk afhangen.
Nadat we derde normaalvorm hebben gevonden, gaan we na of er
misschien groepen zijn die weggelaten mogen worden zonder dat
we informatie verliezen. We hoeven hierbij alleen maar de groepen
te onderzoeken die uit alleen maar sleutelkenmerken bestaan.
De gegevensstructuur die we nu hebben gevonden, geven we
vervolgens grasch weer door middel van een Entiteit Relatie
Diagram (ER-Diagram). We laten daarbij de relatie tussen de
diverse gegevensgroepen zien. Deze relaties zijn gebaseerd op
vreemde sleutels. Een vreemde sleutel mag alleen maar waarden
aannemen die ook in de overeenkomstige andere groep voorkomen
(referentile integriteit).

44
44

Databaseontwikkeling 4 Access 2007

Opgaven
3.1 Nulde normaalvorm
a. In de nulde normaalvorm mogen geen procesgegevens worden
opgenomen. Geef aan waarom dat is en gebruik in het antwoord
de termen efcint ruimtegebruik en consistentie.
b. In een bibliotheek zal men de afzonderlijke boeken moeten kunnen aanduiden. Hiertoe zullen zij een sleutelkenmerk hebben
gedenieerd. Zou men hiervoor het ISBN gebruiken? Verklaar
het antwoord.
c. Gegeven het overzicht uit guur 3.6. Stel hiervan de nulde normaalvorm op.
Figuur 3.6

Garage t Vuurtje
Populierendreef 3
4334 CE Middelburg

Uw dealer in de regio

Klant: 5775
J. Jansen
Kerstraat 45
4339 FT Middelburg
Kenteken

Datum APK

53-SN-DH
52-XK-HG

7 mei
23 oktober

Totaal aantal autos: 2

3.2 Eerste normaalvorm


a. Gegeven is het overzicht uit guur 3.7. Iemand heeft daarbij de
volgende nulde normaalvorm gevonden.
0 NV (bestelnummer, naam klant, RG (artikelnr,
omschrijving, prijs p/s, aantal), kortings%)
Waarom zijn het bedrag per regel, het subtotaal, het kortingsbedrag en het eindtotaal niet opgenomen in de nulde normaalvorm?
Bepaal uitgaande van de genoemde nulde normaalvorm de eerste normaalvorm.
b. Ga uit van de nulde normaalvorm die je eerder bij opgave 3.1c
gevonden hebt en bepaal de daarbij behorende eerste normaalvorm. Controleer goed of de gekozen sleutel niet korter kan.

45
45

3 Normaliseren, inleiding

Figuur 3.7

Vuurwerkpaleis t zesde vingertje


Den Haag
Bestelnummer: 68839
Klant: Piet Verhoef

Artikelnr
233
358
168

Omschrijving

Prijs per stuk

Aantal

Bedrag

3,00
25,00
12,95

10
1
2

30,00
25,00
25,90

Subtotaal:
Korting 10%:
Te voldoen:

80,90
8,09
72,81

Slof astronauten
1000 klapper
Sterrenregen

U ontvangt 10% korting tegen inlevering van deze bon uit de krant, of 5% korting indien uw
totaalbedrag meer dan 150,00 euro bedraagt.
Alle bedragen in euros, inclusief BTW.

3.3 Tweede normaalvorm


a. Gegeven is het overzicht uit guur 3.8. Iemand heeft daarbij de
volgende eerste normaalvorm gevonden.
1 NV (bestelnummer, naam klant, kortings%)
(bestelnummer, artikelnr, omschrijving, prijs p/s,
aantal)
Bepaal uitgaande van de bovenstaande eerste normaalvorm de
tweede normaalvorm.
Figuur 3.8

Vuurwerkpaleis t zesde vingertje


Den Haag
Bestelnummer: 68839
Klant: Piet Verhoef

Artikelnr
233
358
168

Omschrijving
Slof astronauten
1000 klapper
Sterrenregen

Prijs per stuk

Aantal

Bedrag

3,00
25,00
12,95

10
1
2

30,00
25,00
25,90

Subtotaal:
Korting 10%:
Te voldoen:

80,90
8,09
72,81

U ontvangt 10% korting tegen inlevering van deze bon uit de krant, of 5% korting indien uw
totaalbedrag meer dan 150,00 euro bedraagt.
Alle bedragen in euros, inclusief BTW.

46
46

Databaseontwikkeling 4 Access 2007

b. Wat is het wezenlijke verschil tussen de 1 NV zoals die bij opgave 3.3a is gegeven en zoals die hieronder staat afgedrukt?
1 NV (bestelnummer, naam klant)
(bestelnummer, artikelnr, omschrijving, prijs p/s, aantal,
kortings%)
3.4 Derde normaalvorm
a. Iemand heeft de volgende tweede normaalvorm gevonden. Deze
hoort bij een order die door een klant is geplaatst. Daarbij geldt
dat de korting, het percentage, alleen maar afhankelijk is van
het aantal dat men van n artikel koopt. Bij n stuk ontvangt
men 2% korting, bij twee stuks 3%, bij drie stuks 5%, enzovoort. Ten slotte geldt dat iedere klant een eigen uniek klantnummer heeft dat altijd voor hem gebruikt wordt.
2 NV (ordernummer, klantnummer, klantnaam)
(ordernummer, artikelnr, aantal, kortings%)
(artikelnr, omschrijving, prijs p/s)
Bepaal uitgaande van deze tweede normaalvorm de derde normaalvorm.
b. Een voetbalvereniging maakt gebruik van (onder andere) het
overzicht van guur 3.9. Een lid van de vereniging hoeft geen
commissiewerk te doen, maar mag het wel. Indien gewenst kan
hij (of zij) zelfs deel uitmaken van meerdere commissies.
Normaliseer het overzicht tot en met de derde normaalvorm.
Figuur 3.9

Commissie : BC Barcommissie
Lidnummer

Naam

Telefoon

34

L. Ketelaar

06-20898761

122

V. Borrelaar

06-23909871

307

M. Vervat

06-75413212

c. Het overzicht van guur 3.10 wordt bij een muziekschool gebruikt om bij te houden wie welk instrument bespeeld. Een lid
kan meerdere instrumenten bespelen. Normaliseer dit overzicht
tot en met de derde normaalvorm.

47
47

3 Normaliseren, inleiding

Figuur 3.10

Muziekschool: BeHappy
Instrument: TR Trompet
Categorie: 12 Blazers
Lidnr
Naam
Woonplaats
154321
S. Mahabier
Delft
276543
M. Ooijen
Pijnacker
254345
M. den Hoed
Rijswijk
etc.

Telefoonnr
06-10876711
06-11887765
06-12995486

3.5 Entiteit Relatie Diagram


a. Gegeven is de volgende genormaliseerde gegevensstructuur.
Geef hier de vreemde sleutels aan door deze gestippeld te onderstrepen.
ELFTAL
LEIDER
LID

(elftalcode, leidercode)
(leidercode, leidernaam, telefoonnummer)
(lidcode, lidnaam, lidadres, lidplaats, elftalcode)

Teken ook het bijbehorende ER-Diagram.


b. Gegeven is de volgende genormaliseerde gegevensstructuur. Geef hier de vreemde sleutels aan door deze gestippeld
te onderstrepen. Ter informatie: het gaat om een deel van de
administratie van een camping. Van een boeking worden de
belangrijke gegevens bijgehouden. Bij iedere boeking wordt
bijgehouden welke personen er zullen verblijven in verband met
het nachtregister. Er kan in meerdere gedeelten betaald worden.
Het eerste deel moet worden betaald binnen vier weken na de
boekdatum, het laatste deel moet betaald worden uiterlijk zes
weken voor de geplande aankomstdatum. Per boeking wordt er
steeds n campingplaats geboekt.
GAST
BOEKING
PLAATS
REGISTER
BETALING

(gastnummer, naam, adres, postcode, plaats,


geboortedatum, telefoonnummer)
(boekingnummer, boekdatum, aankomstdatum,
vertrekdatum, plaatsnummer)
(plaatsnummer, voorzieningen, bedrag per
nacht)
(gastnummer, boekingnummer)
(boekingnummer, betaaldatum, betaald bedrag)

Teken ook het bijbehorende ER-Diagram.

48
48

Databaseontwikkeling 4 Access 2007

c. Gegeven is het volgende ER-Diagram. Beantwoord op basis van


dit ER-Diagram de gestelde vragen.
WERKNEMER

o.b.v. werknemernummer









CHEF

AFDELING

o.b.v. chefnummer

Kan een chef meerdere afdelingen onder zijn beheer hebben?


Kan een afdeling geleid worden door meerdere chefs?
Kan een werknemer bij meerdere afdelingen zijn ingedeeld?
Kan er een afdeling zijn zonder werknemers?
Kan er een afdeling zijn zonder chef?
Kan er een werknemer zijn zonder afdeling?
Kan er een chef zijn zonder werknemers?

Normaliseren,
verdieping

Dit hoofdstuk is een verdieping van de stof zoals die in hoofdstuk 3 is behandeld. In dit hoofdstuk gaan we moeilijker typen
overzichten normaliseren. Dit zijn overzichten waar meer dan
n repeterende groep in voorkomt. Er zijn twee manieren om die
overzichten te normaliseren. Die worden beide besproken. Daarna
wordt het integreren van gegevensgroepen toegelicht en het begrip
data-dictionary.

4.1

Dubbele (geneste) repeterende groepen

In deze paragraaf kijken we naar een type overzicht zoals dat in


de praktijk veelvuldig gebruikt wordt. In dit voorbeeld is er sprake
van een dubbele repeterende groep. Aan de hand van het voorbeeld
zal worden toegelicht hoe dit moet worden aangepakt.
Een docent gebruikt onder andere het overzicht zoals dat in guur
4.1 staat afgebeeld. Hierop houdt hij de cijfers van een klas bij,
tezamen met het vak waarvoor deze cijfers zijn behaald. De docent
geeft namelijk meerdere vakken, aan meerdere klassen.
Als we de gegevens van guur 4.1 normaliseren, zullen we uiteraard weer beginnen met het opstellen van de nulde normaalvorm,
dus het noteren van alle relevante, elementaire gegevens.
Er zijn twee manieren om dit voorbeeld te normaliseren. Beide
zullen uitgewerkt worden.

50

Figuur 4.1

Databaseontwikkeling 4 Access 2007

Cijferoverzicht
Vak:
INF10 Basiskennis Informatica
Klas:
3BA1
Toetsdatum
Leerlingnummer
12-05-2010
75564
74421
69642
.
18-06-2010
75564
80032
74421
69642
.

Naam
Piet Overloon
Klaas Dam
Gerrit Stram
.
Piet Overloon
Gerda Roever
Klaas Dam
Gerrit Stram
.

Cijfer
7,3
4,2
9,0
.
8,7
5,4
7,2
8,4
.

Uitwerking 1
We zien in de bovenkant van het overzicht eenmalig de aanduiding
van het vak en van de klas. Vervolgens zien we een aantal keer een
datum. Deze datum keert regelmatig terug en vormt dus een repeterende groep. Bij n datum zien we vervolgens een aantal keer
de gegevens van een leerling en het cijfer dat deze heeft behaald.
Deze gegevens vormen bij n datum opnieuw een repeterende
groep. Dit heeft tot gevolg dat de voorlopige nulde normaalvorm er
op de volgende wijze uitziet:
(vakcode, vakomschrijving, klas, RG (toetsdatum, RG
(leerlingnummer, naam, cijfer))
Als sleutel zal hier moeten gelden de combinatie van vakcode en
klas. Om namelijk precies het overzicht uit de stapel te halen, moet
de docent eerst weten van welk vak hij de resultaten wenst te zien.
Hij geeft tenslotte les in meerdere vakken. Omdat hij een vak aan
meer dan n klas geeft, moet hij ook nog weten van welke klas
hij de vakresultaten wenst te zien. De combinatie vakcode en klas
vormt dus de sleutel. We krijgen dan:
0 NV (vakcode, klas, vakomschrijving, RG (toetsdatum, RG
(leerlingnummer, naam, cijfer)))
We zien nu dat we twee maal een repeterende groep hebben, waarbij de tweede groep onderdeel van de eerste is. We zeggen wel dat
de tweede groep genest ligt binnen de eerste groep.

4 Normaliseren, verdieping

51

Bij de stap naar de eerste normaalvorm verwijderen we altijd de


repeterende groep. Nu hebben we er echter twee. Hoe pakken we
dit aan? Bedenk dat de ene groep opgesloten is in de andere. Dit is
te vergelijken met de sinterklaassurprise waarbij men een doos in
een doos in een doos in een doos... gedaan heeft, waarbij er uiteindelijk in de binnenste doos een heel klein presentje zit. Om bij het
presentje te komen zullen we eerst de buitenste doos moeten verwijderen, vervolgens de een na buitenste, vervolgens... We gaan net
zolang door met het verwijderen van dozen, van buiten naar binnen, totdat we uiteindelijk bij de binnenste doos zijn aangekomen.
Deze tactiek moeten we hier ook toepassen. Om bij de binnenste
repeterende groep te komen, zullen we eerst de buitenste groep, in
een tussenstap, moeten verwijderen. Daarbij nemen we de grootste
repeterende groep, nemen die apart, voegen de sleutelkenmerken
uit de oude groep toe en kiezen vervolgens in de nieuwe groep een
sleutel.
We nemen dus de repeterende groep (toetsdatum , RG (leerlingnummer, naam, cijfer)) apart en voegen daar de oorspronkelijke
sleutelkenmerken (vakcode, klas) van de originele groep aan toe.
We krijgen dan de volgende tussenstap:
(vakcode, klas, toetsdatum, RG (leerlingnummer, naam,
cijfer))
(vakcode, klas, vakomschrijving)
Nu gaan we in de nieuwe groep de sleutel bepalen. We krijgen dan:
(vakcode, klas, toetsdatum, RG (leerlingnummer, naam,
cijfer))
(vakcode, klas, vakomschrijving)
Let erop dat de sleutel in de nieuwe groep bestaat uit drie delen.
Om namelijk een groepje met cijfers aan te wijzen (de repeterende
groep) moeten we weten van welk vak, van welke klas en van welke datum we de gegevens willen zien. Dus een driedelige sleutel.
Aangenomen dat een docent aan n klas, op n dag, meerdere
vakken kan toetsen!

52

Databaseontwikkeling 4 Access 2007

We zien dat we nu n repeterende groep verwijderd hebben. Er


is er nog maar n overgebleven. Deze groep zullen we nu op dezelfde bekende wijze verwijderen. Dus we nemen de repeterende
groep apart en voegen de sleutelkenmerken uit de oude groep toe.
(vakcode, klas, toetsdatum, leerlingnummer, naam, cijfer)
(vakcode, klas, toetsdatum)
(vakcode, klas, vakomschrijving)
Ten slotte bepalen we de sleutel in de nieuwe groep. We krijgen
dan als eerste normaalvorm:
1 NV

(vakcode, klas, toetsdatum, leerlingnummer, naam, cijfer)


(vakcode, klas, toetsdatum)
(vakcode, klas, vakomschrijving)

De nieuwe sleutel bestaat hier uit de combinatie van vakcode, toetsdatum en leerlingnummer.
We hebben nu de eerste normaalvorm gevonden. Alle repeterende
groepen zijn verwijderd. Let erop dat bij het kiezen van de nieuwe
sleutel er iets speciaals aan de hand is. In de eerste groep van de
eerste normaalvorm wijzen we nu n cijfer aan van n leerling.
Immers, de repeterende groepen zijn verwijderd. Om een cijfer aan
te kunnen wijzen moeten we weten van welke leerling, van welk
vak en op welke datum de toets heeft plaatsgevonden. Het is niet
nodig om ook te weten in welke klas de leerling zit. De klasaanduiding is dus niet opgenomen in de sleutel!
Het zoeken naar de tweede en derde normaalvorm gaat op gelijke
wijze als in het vorige hoofdstuk is toegelicht.
De volgende stap is het bepalen van de tweede normaalvorm.
We moeten nu zoeken naar niet-sleutelkenmerken die slechts afhankelijk zijn van een deel van de sleutel. We moeten dus alleen
groepen onderzoeken die een samengestelde sleutel hebben. In ons
voorbeeld dus alle drie de gegevensgroepen. Verder moet in een
groep ten minste n niet-sleutelkenmerk (niet onderstreept kenmerk) zitten. In ons voorbeeld moeten we dus de eerste en laatste
gegevensgroep onderzoeken. We onderzoeken als eerste de eerste

4 Normaliseren, verdieping

53

groep. De sleutelkenmerken zijn daarin vakcode, toetsdatum en


leerlingnummer. Onderzoek dus of er niet-sleutelkenmerken zijn
die afhankelijk zijn van alleen de vakcode, of alleen de toetsdatum
of alleen het leerlingnummer. Als je een vakcode hebt, heb je dan
altijd precies n klas, of n naam of n cijfer? Op alle drie de
vragen is het antwoord neen. Een vak wordt aan meerdere klassen
gegeven, het vak wordt aan meerdere leerlingen gegeven en het levert uiteraard meerdere cijfers op. Dus, vakcode levert geen afhankelijkheden op. Vervolgens, als je een toetsdatum hebt, heb je dan
altijd precies n klas, of n naam of n cijfer? Ook hier geldt
drie keer het antwoord neen. Een toetsdatum kan meerdere klassen
opleveren, en uiteraard meerdere namen en cijfers. Dus toetsdatum levert geen afhankelijkheden op. Als laatste controleren we
leerlingnummer. Als je een leerlingnummer hebt, heb je dan altijd
precies n klas, of n naam of n cijfer? De antwoorden zijn nu:
ja, ja en neen. Een leerlingnummer levert precies n klas op en
precies n naam, maar meerdere cijfers. We hebben nu twee kenmerken (naam en klas) die afhankelijk zijn van leerlingnummer.
Van deze twee kenmerken maken we een aparte gegevensgroep,
samen met het sleutelkenmerk waarvan ze afhankelijk zijn, leerlingnummer. We krijgen dan:
(vakcode, toetsdatum, leerlingnummer, cijfer)
(leerlingnummer, naam, klas)
(vakcode, klas, toetsdatum)
(vakcode, klas, vakomschrijving)
Nu nog de laatste gegevensgroep uit de eerste normaalvorm onderzoeken. Vakcode en klas zijn de sleutelkenmerken en moeten
onderzocht worden. Als je een vakcode hebt, heb je dan altijd precies n vakomschrijving? Het antwoord is ja, dus er is een afhankelijkheid tussen vakcode en vakomschrijving. Hiervan maken we
een nieuwe gegevensgroep. We hoeven nu het sleutelkenmerk klas
niet meer te onderzoeken, omdat er nu geen niet-sleutelkenmerken
meer zijn. De twee normaalvorm wordt:
2NV

(vakcode, toetsdatum, leerlingnummer, cijfer)


(leerlingnummer, naam, klas)
(vakcode, klas, toetsdatum)
(vakcode, klas)
(vakcode, vakomschrijving)

54

Databaseontwikkeling 4 Access 2007

Opmerking drievoudige sleutel: bij een deel van de sleutel, hebben


wij naar de drie afzonderlijke kenmerken van de sleutel gekeken.
De combinaties vakcode + toetsdatum, vakcode + leerlingnummer
en toetsdatum + leerlingen zouden ook nog gecontroleerd moeten
worden op afhankelijkheden. Die leveren echter geen afhankelijkheden meer op.
Ten slotte rest ons nog het onderzoek naar de derde normaalvorm.
Daarbij zoeken we bij alle gegevensgroepen naar afhankelijkheden tussen niet-sleutelkenmerken (niet-onderstreepte kenmerken). We hoeven alleen de tweede gegevensgroep van de tweede
normaalvorm te onderzoeken, omdat die groep meerdere nietsleutelkenmerken heeft. De kenmerken naam en klas moeten we
onderzoeken op afhankelijkheid. We controleren eerst klas. Als je
een klas hebt, heb je dan altijd precies n naam? Neen, een klas
levert meerdere namen op, dus geen afhankelijkheid. Nu nog naam
onderzoeken. Als je een naam heb, hebt je dan altijd precies n
klas? Je zou misschien denken, ja, maar het is neen. Namen zijn
niet uniek, er kunnen meerdere Jansens zijn op school. Als je dan
Jansen hebt, kunnen meerdere klassen optreden, er zijn dan meerdere Jansens op school, bijvoorbeeld n in klas 3BA1 en n in
2CA1. Zelfs met voorletters erbij kan het nog fout gaan. Zie ook de
opmerkingen over het gebruik van namen als sleutel in paragraaf
4.3 Opmerkingen met betrekking tot normaliseren. Er is dus ook
hier geen afhankelijkheid. Er zijn dus geen afhankelijkheden gevonden in de tweede normaalvorm.
De derde normaalvorm is dus gelijk aan de tweede normaalvorm.
We krijgen dan:
3NV

(vakcode, toetsdatum, leerlingnummer, cijfer)


(leerlingnummer, naam, klas)
(vakcode, klas, toetsdatum)
(vakcode, klas)
(vakcode, vakomschrijving)

Om het normaliseren netjes af te ronden, geven we de groepen


eerst een naam.

55

4 Normaliseren, verdieping

3NV

RESULTAAT
LEERLING
TOETSDATUM
VAK-KLAS
VAK

(vakcode, toetsdatum, leerlingnummer, cijfer)


(leerlingnummer, naam, klas)
(vakcode, klas, toetsdatum)
(vakcode, klas)
(vakcode, vakomschrijving)

We zien dat we twee groepen hebben die alleen maar uit sleutelkenmerken bestaan. Van deze groepen moeten we ons altijd afvragen of we deze mogen weglaten zonder dat er informatie verloren
gaat. In de groep TOETSDATUM ligt vastgelegd welke klas, voor
welk vak op welke datum een toets heeft gehad. Die informatie
kunnen we echter ook terugvinden in de groepen RESULTAAT
(welk vak en welke datum) en LEERLING (welke klas). We kunnen bij ieder cijfer op basis van het leerlingnummer de klas erbij
zoeken. We mogen dus de groep TOETSDATUM weglaten. Voor
de groep VAK-KLAS kunnen we dezelfde redenering volgen. Ook
de informatie uit deze groep kunnen we aeiden uit de groepen
RESULTAAT en LEERLING. We laten daarom ook de groep
VAK-KLAS weg.
De uiteindelijke derde normaalvorm ziet er dus uit als:
3NV

RESULTAAT
LEERLING
VAK

(vakcode, toetsdatum, leerlingnummer, cijfer)


(leerlingnummer, naam, klas)
(vakcode, vakomschrijving)

Het bijbehorende ER-Diagram.


Figuur 4.2
RESULTAAT

VAK

obv. vakcode

LEERLING

o.b.v. leerlingnummer

In de groep LEERLING is leerlingnummer de sleutel (de n


kant). In de groep RESULTAAT komt het kenmerk leerlingnummer ook voor (vreemde sleutel), dus er is een relatie tussen beide
groepen op basis van leerlingnummer. In de groep VAK is vakcode de sleutel (de n kant). In de groep RESULTAAT komt ook
het kenmerk vakcode (vreemde sleutel) voor, dus er is een relatie
tussen beide groepen op basis van vakcode. De beide vreemde
sleutels zijn toevallig ook onderdeel van de sleutel, maar dat maakt
niet.

56

Databaseontwikkeling 4 Access 2007

Er is nog een tweede manier om dit voorbeeld te normaliseren. In


de eerste uitwerking is gebruik gemaakt van twee geneste repeterende groepen (een repeterende groep in een repeterende groep).
Bij n toetsdatum zien we meerdere leerlingen. Er wordt n
toetsdatum getoond en daaronder vallen meerdere leerlingen. De
gelijke toetsdatums worden in het overzicht niet getoond, maar
bestaan wel. Bij iedere resultaat hoort een toetsdatum. Als die
toetsdatums wel getoond worden, hebben we maar n repeterende
groep, zie guur 4.3.
Figuur 4.3

Cijferoverzicht
Vak:
INF10 Basiskennis Informatica
Klas:
3BA1
Toetsdatum
Leerlingnummer
12-05-2010
75564
12-05-2010
74421
12-05-2010
69642
.
.
18-06-2010
75564
18-06-2010
80032
18-06-2010
74421
18-06-2010
69642
.
.

Naam
Piet Overloon
Klaas Dam
Gerrit Stram
.
Piet Overloon
Gerda Roever
Klaas Dam
Gerrit Stram
.

Cijfer
7,3
4,2
9,0
.
8,7
5,4
7,2
8,4
.

Het overzicht is precies hetzelfde, alleen worden de dubbele datums getoond in het overzicht. Omdat we nu maar n repeterende
groep hebben verloopt het normaliseren iets anders. Het uiteindelijke resultaat de derde normaalvorm moet gelijk zijn. We gaan
dit voorbeeld op deze manier opnieuw (verkort) uitwerken.
Uitwerking 2
0NV
(vakcode, klas, vakomschrijving, RG (toetsdatum, leerlingnummer, naam, cijfer))
1NV

(vakcode, klas, vakomschrijving)


(vakcode, klas, toetsdatum, leerlingnummer, naam, cijfer)

De sleutel is niet zo eenvoudig. Maar een leerling kan meerdere


toetsen aeggen voor hetzelfde vak. Klas behoort niet tot de sleutel
omdat een leerling maar in n klas kan zitten. Een sleutel moet
minimaal zijn, dus het kenmerk klas is geen onderdeel van de sleutel. Dat was al zo in de eerste uitwerking.
Voor de tweede normaalvorm moeten we groepen onderzoeken
met een samengestelde sleutel. Dat geldt dus voor beide groepen.

57

4 Normaliseren, verdieping

Voor de eerste groep geldt, dat een vakcode altijd precies n vakomschrijving heeft. Dus een afhankelijkheid en deze kenmerken
apart nemen in een nieuwe groep. Voor de tweede groep geldt dat
een leerlingnummer altijd precies n klas en n naam heeft. Dus
een afhankelijkheid en deze kenmerken opnemen in een aparte
nieuwe groep. De tweede normaalvorm wordt:
2NV

(vakcode, klas)
(vakcode, vakomschrijving)
(vakcode, toetsdatum, leerlingnummer, cijfer)
(leerlingnummer, naam, klas)

Voor de derde normaalvorm hoeven we alleen de laatste groep te


onderzoeken, die heeft namelijk twee of meer niet-sleutelkenmerken. Als je een naam heb, hebt je dan altijd precies n klas? Je zou
misschien denken, ja, maar het is neen. Namen zijn namelijk niet
uniek, er kunnen meerdere Jansens zijn op school. Als je dan de
naam Jansen hebt, kunnen meerdere klassen optreden. Als je een
klas het, heb je dan altijd n naam? Neen, in een klas zitten meerdere leerlingen. Er is dus ook hier geen afhankelijkheid. Er zijn
dus geen afhankelijkheden gevonden in de tweede normaalvorm.
De derde normaalvorm is gelijk aan de twee normaalvorm. Met
namen erbij wordt het:
3NV

VAK-KLAS
VAK
RESULTAAT
LEERLING

(vakcode, klas)
(vakcode, vakomschrijving)
(vakcode, toetsdatum, leerlingnummer, cijfer)
(leerlingnummer, naam, klas)

Er is nu n groep die alleen maar uit sleutelkenmerken bestaat.


We moeten nog even controleren of we die kunnen weglaten, zonder dat er informatie verloren gaat. De combinatie vakcode en klas
is ook te achterhalen via de groepen RESULTAAT en LEERLING,
dus VAK-KLAS kan weggelaten worden.
De uiteindelijke derde normaalvorm wordt:
3NV

VAK
RESULTAAT
LEERLING

(vakcode, vakomschrijving)
(vakcode, toetsdatum, leerlingnummer, cijfer)
(leerlingnummer, naam, klas)

58

Databaseontwikkeling 4 Access 2007

We zien dat dit resultaat precies hetzelfde is als de eerste uitwerking. Je mag de opdrachten dus uitwerken door gebruik te maken
van een van beide manieren.
Maak opgave 4.1.

4.2

Dubbele (opeenvolgende) repeterende groepen

Een dubbele repeterende groep komen we ook wel eens tegen in de


vorm waarbij de groepen na elkaar komen in plaats dat ze in elkaar zijn opgenomen. Ook van deze vorm geven we een voorbeeld.
We gaan daarbij uit van een overzicht zoals dat bij een autodealer
wordt gebruikt, zie guur 4.4.
Figuur 4.4

Automobielbedrijf Mandarijntje
Groningen
Werkplaats factuur
Merk
Type
Kenteken
Km. Stand
Datum
Aantal
1
1
1
1
1
4
1
1
1
1
4,75

: Citroen
: C6
: 58-TK-TB
: 47320
: 2-1-2010
Nummer

Factuurnummer: 0300278

Omschrijving

Bedrag

93110000
56
52

Onderhoud 45000 km
4-gas meting uitvoeren
Afmeldkosten APK
Totaal werkzaamheden

119,63
29,79
10,84
160,26

997918LOS
621632
BNL51240198
031327
6426E0
1109N3
BNL9945916
00

Koelvloeistof los
Steeklamp 5 Watt
Bollamp Amber
Pakking
Wisserblad LV
Oliefilter
Ruitspr. Vl. 1 ltr
Ultraoil 10W40
Totaal onderdelen

3,81
1,25
11,80
2,06
45,00
12,98
5,06
67,74
149,60

BTW totaal 19%

58,89

Totaal te voldoen

368,85

Op de bekende manier bepalen we de nulde normaalvorm. Daarbij


laten we de procesgegevens (subtotalen, BTW-bedrag en totaalbedrag) achterwege.

4 Normaliseren, verdieping

0NV

59

(factuurnummer, merk, type, kenteken, kmstand, datum,


RG (aantal, werknummer, werkomschrijving, werk-prijs),
RG (aantal onderdelen, onderdeelnummer, onderdeelomschrijving, onderdeelprijs))

Uiteraard geldt dat het factuurnummer hier de sleutel is. We zien


hier twee maal een repeterende groep. De tweede groep, met de
onderdeelgegevens, komt echter pas nadat de eerste groep, met de
werkgegevens, is afgesloten. Deze groepen kunnen we bij de overgang naar de eerste normaalvorm in n keer verwijderen, onafhankelijk van elkaar. We krijgen dan:
1 NV

(factuurnummer, merk, type, kenteken, kmstand, datum)


(factuurnummer, werknummer, aantal, werkomschrijving, werkprijs)
(factuurnummer, onderdeelnummer, aantal onderdelen,
onderdeelomschrijving, onderdeelprijs)

De keuze van de sleutels zal voor zich spreken. Ieder nummer


komt immers hoogstens n keer op een factuur voor.
Als tweede normaalvorm krijgen we:
2 NV

(factuurnummer, merk, type, kenteken, kmstand, datum)


(factuurnummer, werknummer, aantal, werkprijs)
(factuurnummer, onderdeelnummer, aantal onderdelen,
onderdeelprijs)
(werknummer, werkomschrijving, adviesprijs)
(onderdeelnummer, onderdeelomschrijving, advies
onderdeelprijs)

Je ziet dat hier iets speciaals aan de hand is. De prijzen zijn gesplitst in de werkelijk gerekende prijzen en de standaard adviesprijzen. We hebben bij de factuurregelgegevens, de tweede en
derde groep in de tweede normaalvorm, de werkelijke prijzen van
de factuur staan. Bij de laatste twee groepen van de tweede normaalvorm, waar de gegevens van de algemene werkzaamheden en
algemene onderdelen staan vermeld, is de adviesprijs toegevoegd.
Dit heeft een simpele reden. Als je een werknummer hebt, heb je
dan altijd precies n werkprijs? Neen, prijzen kunnen veranderen
in de tijd. Stel dat we op 31 december een auto repareren. De auto

60

Databaseontwikkeling 4 Access 2007

wordt echter pas 4 januari opgehaald, omdat de eigenaar voor die


tijd geen kans zag om langs te komen. Op 1 januari heeft er echter
ook een algemene prijsverhoging plaats, waarbij alle werkzaamheden 2% in prijs stijgen en alle onderdelen 3,5%. Door de factuur
nu nog op 31 december in de computer in te voeren, worden de dan
geldende adviesprijzen overgenomen bij de diverse uitgevoerde
werkzaamheden en gebruikte onderdelen. Wordt op 4 januari de
factuur voor de klant afgedrukt, dan staan de prijzen van 31 december vermeld, het tijdstip van invoeren van de factuur. Bij het
afdrukken kijkt de computer niet meer naar de dan geldende, in
ons geval te hoge, adviesprijzen. Als we de prijzen niet hadden
gesplitst, zou de klant wel met de te hoge prijzen zijn geconfronteerd, niet echt klantvriendelijk! Tevens kan men nu eventueel
afwijken van de adviesprijs, bijvoorbeeld in het geval van garantie
of service.
Ten slotte rest ons nog slechts de derde normaalvorm.
3 NV

(factuurnummer, kenteken, kmstand, datum)


(factuurnummer, werknummer, aantal, werkprijs)
(factuurnummer, onderdeelnummer, aantal onderdelen,
onderdeelprijs)
(werknummer, werkomschrijving, adviesprijs)
(onderdeelnummer, onderdeelomschrijving, adviesonderdeelprijs)
(kenteken, merk, type)

Uiteindelijk ontstaan dus de volgende gegevensgroepen:


FACTUUR
FACTUURWERK
FACTUURONDERDEEL
WERK
ONDERDEEL
AUTO

(factuurnummer, kenteken, kmstand,


datum)
(factuurnummer, werknummer,
aantal,werkprijs)
(factuurnummer, onderdeelnummer,
aantal onderdelen, onderdeelprijs)
(werknummer, werkomschrijving,
adviesprijs)
(onderdeelnummer, onderdeelomschrijving, advies-onderdeelprijs)
(kenteken, merk, type)

61

4 Normaliseren, verdieping

Het bijbehorende ER-Diagram:


Figuur 4.5
AUTO

FACTUUR

FACTUURWERK

FACTUURONDERDEEL

WERK

ONDERDEEL

Maak nu opgave 4.2.

4.3

Opmerkingen met betrekking tot normaliseren

Bij alle stappen van het normalisatieproces is het steeds weer


nodig om sleutels te kiezen. Soms komt het voor dat in het gegeven
overzicht geen sleutels zijn aan te wijzen. Bijvoorbeeld als wel de
naam en het adres van een klant worden getoond, maar niet het
klantnummer. In dat soort gevallen kunnen we beter zelf een sleutel bedenken. Gebruik dan nooit een naam of een omschrijving
als sleutelkenmerk, omdat dat vraagt om moeilijkheden. Een paar
voorbeelden uit de praktijk, waarbij men niet heeft gewerkt met
nummers maar met namen.
 Er komt een telefoontje binnen: Met mevrouw Rox, ik wil graag
mijn openstaande saldo weten. Onze rma werkt niet met klantnummers, dus onze medewerker gaat zoeken op naam, maar komt
mevrouw Rox niet tegen. Logisch, want hij zocht waarschijnlijk
naar de naam Rocks, of Roks, of Rockx, of
 Even later gaat weer de telefoon: Met copyshop A3, weet u
Of was het misschien: Met kofeshop Adrie, weet u ..?
 Later op de dag belt mevrouw De Vries. Ook die kunnen we helaas
niet terugvinden in het systeem. Reden? Mevrouw De Vries is

62

Databaseontwikkeling 4 Access 2007

vorige week getrouwd met de heer De Vries. Tot dan ging zij als
Ada Donkersloot door het leven en onder die naam staat zij ook
genoteerd in ons systeem.
Om dit soort vervelende situaties te voorkomen is het verstandig
altijd te werken met nummers of codes als sleutel en nooit met
namen of omschrijvingen. Dit wil natuurlijk niet zeggen dat we
niet de mogelijkheid moeten bieden om in een database ook te
zoeken op naam. Maar dan is het wel verstandig om de zoekactie
intelligent te maken, zodat er niet alleen op exacte spelling wordt
gezocht, maar ook op klank. Zoeken we dan op Jansen, dan zal
ook Janssen, of Janssens of.. als zoekresultaat worden getoond.
Een tweede opmerking die we graag willen maken, heeft ook te
maken met namen van personen. In al onze voorbeelden hebben
we steeds de naam van een persoon als n geheel gezien. In de
praktijk is het echter verstandig om een naam te splitsen in voorletters, tussenvoegsel en achternaam. Eventueel kan ook nog apart
de voornaam en de titulatuur worden opgenomen. Dit maakt het
namelijk mogelijk om met de naam te spelen. Op een etiket voor
een brief kunnen we dan de tekst Drs. J.P. van der Hoeve plaatsen,
terwijl we in de aanhef van de brief kunnen beginnen met bijvoorbeeld Geachte heer Van der Hoeve of misschien met Beste Jan
Pieter. Bovendien kunnen we nu goed sorteren op naam, dat wil
zeggen op achternaam.
Het splitsen in elementaire gegevens geldt overigens ook voor
straatnaam, huisnummer en toevoegsel. In het toevoegsel kunnen
we bijvoorbeeld de letter c kwijt uit het adres Kerkweg 3c. Door
het adres in drie delen te scheiden kunnen we bijvoorbeeld later de
combinatie postcode + huisnummer gebruiken als (alternatieve)
zoeksleutel. Maar hoe gaan we in dat geval overigens om met het
adres:
Fam. Vlietstra
Woonboot Neeltje, tegenover Koelandenweg 1
9534 TB Westdorp
Als laatste merken we op dat de nulde normaalvorm zelf ook een
repeterende groep is. We tonen maar n factuur als informatiebehoefte voor het normaliseren, maar het is er natuurlijk n uit vele
facturen. Die repeterende groep wordt niet getoond. Als je dus een

4 Normaliseren, verdieping

63

nulde normaal hebt die meteen repeteert, mag je de repeterende


groep weglaten.
0NV

RG(rekeningnr, betaaldatum, naam, plaats, debiteurnr,


bedrag)

is gelijk aan:
0NV

(rekeningnr, betaaldatum, naam, plaats, debiteurnr,


bedrag)

Maak opgave 4.3.

4.4

Integreren

Tot nu toe hebben we steeds gekeken naar n overzicht tegelijkertijd. In de praktijk zal er binnen een bedrijf of organisatie echter
altijd sprake zijn van meerdere overzichten die gebruikt worden.
Al deze overzichten moeten dan gegenereerd kunnen worden vanuit dezelfde database. Hoe pakken we dat aan?

conceptueel en
functioneel datamodel

integreren

We beginnen dan gewoon met het apart normaliseren van alle


overzichten afzonderlijk. Voor ieder afzonderlijk overzicht levert
dit dan een derde normaalvorm op, een aantal gegevensgroepen.
We hebben dus meerdere derde normaalvormen. Deze derde
normaalvormen gaan we in elkaar schuiven, tot een grote derde
normaalvorm. We noemen het dan geen derde normaalvorm meer,
maar een conceptueel of functioneel datamodel. Een datamodel dat
op papier ontworpen is. Met het verkregen eindresultaat kunnen
dan alle afzonderlijke overzichten gegenereerd worden. Hoe weten
we nu welke groepen we tezamen kunnen nemen? Dat kunnen
we achterhalen aan de hand van de sleutels. Verschillende groepen, die dezelfde sleutel hebben, kunnen worden samengevoegd.
Groepen die verschillende sleutels hebben, kunnen niet worden
samengevoegd.
Het in elkaar schuiven van de groepen, we noemen dit integreren,
gaat eenvoudig. Stel we hebben twee overzichten genormaliseerd
en bij beide een klantengroep gevonden. Achtereenvolgens:

64

Databaseontwikkeling 4 Access 2007

KLANT-1
KLANT-2

(klantnr, naam, adres, postcode, plaats,


telefoonnr, faxnr)
(klantnr, aeveradres, aeverpostcode,
aeverplaats, contactpersoon, telefoonnr)

Deze twee groepen kunnen worden samengevoegd, want ze hebben beide dezelfde sleutel. We krijgen hieruit de gezamenlijke
gegevensgroep KLANT, waarin alle gegevens van de beide afzonderlijke groepen zijn opgenomen.
KLANT

(klantnr, naam, adres, postcode, plaats,


aeveradres, aeverpostcode, aeverplaats,
telefoonnr, faxnr, contactpersoon)

In deze groep zijn alle gegevens uit de afzonderlijke groepen opgenomen. Gegevens die in beide tabellen voorkwamen (bijvoorbeeld
het telefoonnummer), nemen we uiteraard slechts n keer op.
homoniemen
synoniemen

Bij het integreren kan er sprake zijn van homoniemen en synoniemen. Een homoniem is een term waarmee we de ene keer dit en
de andere keer dat bedoelen. In de Nederlandse taal is een bekend
homoniem de term bank. Bedoelen we daarmee een nancile
instelling of een zitmeubel? Meestal blijkt uit de zin waarin we het
woord gebruiken wel wat we precies bedoelen.
Ook bij het normaliseren kun je homoniemen tegenkomen.
Bijvoorbeeld:
LEERLING
VAK

(leerlingnummer, naam, adres, enzovoort)


(vakcode, naam, cordinator, enzovoort)

Hier is een homoniem aanwezig, te weten de term naam. De ene


keer bedoelen we hiermee de naam van een leerling, de andere
keer de naam van een vak. We moeten streven naar eenduidigheid,
zodat iedereen weet wat we bedoelen als we het hebben over de
naam. Bij homoniemen is er geen eenduidigheid. Homoniemen
zijn dus ongewenst en we moeten ze verwijderen. Dat doen we
door duidelijke namen te gebruiken, die precies aangeven wat we
ermee bedoelen. We vervangen hier dan ook de term naam door
achtereenvolgens naam leerling en vaknaam. We krijgen dan:

4 Normaliseren, verdieping

LEERLING
VAK

65

(leerlingnummer, naam leerling, adres,


enzovoort)
(vakcode, vaknaam, cordinator, enzovoort)

Bij het integreren kan ook sprake zijn van synoniemen. Hiermee
bedoelen we twee termen waarmee we eigenlijk hetzelfde bedoelen. In de Nederlandse taal zijn de woorden pils, bier, pint synoniemen. Ook dat is in het kader van de eenduidigheid ongewenst.
Bijvoorbeeld:
FACTUUR
KLANT

(factuurnummer, debiteurnummer,
factuurdatum, enzovoort)
(klantnummer, klantnaam, klantadres,
enzovoort)

In de voorgaande twee groepen is er sprake van een synoniem.


De term debiteurnummer is synoniem voor de term klantnummer. We bedoelen daarmee in beide gevallen het nummer van de
klant die bij ons iets heeft gekocht. Het is daarom verstandig om in
FACTUUR de term debiteurnummer te veranderen in klantnummer.
FACTUUR
KLANT

(factuurnummer, klantnummer, factuurdatum,


enzovoort)
(klantnummer, klantnaam, klantadres,
enzovoort)

Andersom had natuurlijk ook gekund. Alleen ligt het dan voor de
hand ook de andere gegevens uit de klantentabel een andere naam
te geven en alles te hernoemen naar DEBITEUR.
FACTUUR
DEBITEUR

(factuurnummer, debiteurnummer, factuurdatum,


enzovoort)
(debiteurnummer, debiteurnaam, debiteuradres,
enzovoort)

Homoniemen en synoniemen komen met name voor als het normaliseren zoveel werk met zich meebrengt dat dit wordt verdeeld
over meerdere personen. Ieder neemt dan een aantal overzichten
voor zijn rekening en na aoop worden alle uitkomsten in elkaar
geschoven, gentegreerd. Als er slechts n persoon bezig is met

66

Databaseontwikkeling 4 Access 2007

het normaliseren van alle overzichten, dan zullen homoniemen


en synoniemen meestal achterwege blijven omdat we automatisch
voor onszelf eenduidige termen gebruikt.
Maak opgave 4.4.

4.5

Datadictionary

Tijdens het normaliseren wordt achterhaald welke gegevens op


welke wijze in welke gegevensgroepen moeten worden opgeslagen.
Doel daarvan is om de gegevens op een eenvoudige manier te kunnen onderhouden, zonder dat gegevens veelvuldig worden opgeslagen (redundantie). Tevens wordt de kans op inconsistentie (foutieve
gegevens) aanzienlijk verkleind. Tot nu toe hebben we ons alleen
geconcentreerd op het uiteenrafelen, zodat we te weten kwamen
welke gegevens moesten worden opgenomen in de database.

tabellen
velden

Het ontwerp op papier dat ontstaat als resultaat van het normaliseren (datamodel) moet later worden omgezet in een echte database. In de database komen onze ontworpen gegevensgroepen,
tabellen genoemd in de database. In de tabellen moeten we onze
kenmerken, velden genoemd in de database, opgeven. Ook de relaties tussen de tabellen, het ER-Diagam, moet in de database worden aangegeven. De gegevensgroepen, kenmerken en de relaties
kunnen n-op-n worden overgenomen in de database. Er wordt
echter ook vastgelegd wat voor soort velden we willen vastleggen
en welke waarden daarbij zijn toegestaan. Zo kan een code bijvoorbeeld altijd opgebouwd zijn uit cijfers. We zouden er dan voor
kunnen kiezen om de code als een getal op te slaan. We kunnen
dan alleen cijfers invoeren. We kunnen er echter ook voor kiezen
om een code als tekst op te slaan. Hierdoor is het dan mogelijk om
ook letters op te nemen in de code.
In databasemanagementpakketten kunnen verschillende soorten
velden worden opgenomen. Bijvoorbeeld:
 Numeriek: Getal, al dan niet voorzien van decimalen. Vaak
kan dit weer worden onderverdeeld in een geheel
getal(integer) of een decimaal getal. Soms wordt er
nog een aparte onderverdeling valuta gehanteerd, die
automatisch voorzien zal worden van het geldsymbool
en worden afgerond op twee decimalen.

4 Normaliseren, verdieping

67

 Tekst:

Een tekst, die allerlei tekens kan bevatten, bijvoorbeeld een naam of postcode. De maximale lengte is
van tevoren vastgelegd.
 Kladblok: Een tekst waarvan de lengte meestal onbeperkt is, ook
wel memo genoemd.
 Datum:
Een datum, bijvoorbeeld een geboortedatum. Soms
maakt ook de tijd hier deel van uit.
 Logisch: Een logisch veld van het type Ja/Nee, Waar/Niet waar.
Hier kan meestal een vinkje geplaatst worden, bijvoorbeeld Diploma gehaald?
Afhankelijk van het pakket bestaan er nog meer soorten velden of
zijn er speciale mogelijkheden voorhanden. We zullen later zien
wat Access ons precies te bieden heeft.
Naast het feit dat we altijd zullen moeten aangeven wat voor soort
gegevens we gaan gebruiken, moeten we ook altijd zoveel mogelijk
de grenzen opgeven waarbinnen de waarden van het veld mogen
liggen. Dit maakt het mogelijk een hele globale, automatische, controle uit te voeren op de ingevoerde gegevens (consistentie).
Als we te maken hebben met een klantcode, moeten we dus eerst
opgeven of deze code bestaat uit alleen cijfers (numeriek) of ook
uit letters of andere symbolen. In het laatste geval moeten we namelijk kiezen voor het type tekst. Daarnaast moeten we opgeven
welke waarden mogen worden ingevoerd. Bestaat de klantcode bijvoorbeeld altijd uit zes cijfers die moeten liggen tussen de 100.000
en 499.999 of bestaat de klantcode uit een code van twee letters
gevolgd door een spatie gevolgd door een getal van minimaal n
en maximaal drie cijfers?
Tevens dient altijd te worden beschreven of een bepaald gegeven
wel of niet verplicht moet worden ingevuld. Zo zal de klantcode
en de naam van de klant altijd bekend moeten zijn, dus zal het verplicht zijn deze gegevens in te vullen. Het telefoonnummer hoeft
niet verplicht te worden ingevoerd, omdat we rekening willen houden met klanten die hun telefoonnummer geheim willen houden.
We kunnen dan niets invullen.
De persoon die de database echt gaat bouwen, kan de door ons opgegeven beperkingen standaard opnemen in de database. Daardoor

68

Databaseontwikkeling 4 Access 2007

wordt het onmogelijk om gegevens in te voeren die buiten het


opgegeven bereik vallen. Dat maakt de kans op fouten aanzienlijk
kleiner. En dat is mede het doel van een goed ontworpen database.

datadictionary

Figuur 4.6

Om de bouwer van de echte database te vertellen welke gegevens


van welk type zijn en welke beperkingen daarbij gelden, maken we
gebruik van een datadictionary. Deze kan er bijvoorbeeld uitzien
zoals in guur 4.6.
Gegeven

Type

Waardenbereik

Verplicht

Omschrijving

Klantcode

Geheel
getal

100.000-499.999

Ja

Identificeert een klant,


nummeriek, altijd zes
cijfers.

Telefoonnummer

Tekst

Precies 10 cijfers

Nee

Moet tekst zijn in


verband met voorlopende nul van het
kengetal

Klantnaam

Tekst

Maximaal
25 tekens

Ja

Achternaam van de
klant

Geboortedatum

Datum

1-1-1860
t/m vandaag

Nee

Geboortedatum van de
klant.

Gehuwd

Logisch

Ja / Nee

Nee

Is de klant gehuwd, mag


worden leeg gelaten.

Een datadictionary kan per gevonden gegevensgroep worden gemaakt. Er kan ook gekozen worden voor n grote datadictionary
waarin de gegevens van alle groepen gezamenlijk zijn opgenomen.
De laatste vorm heeft het voordeel dat we ieder gegeven slechts
n maal hoeven te beschrijven. Als we werken per gegevensgroep, hebben we te maken met gegevens die in meer dan n tabel
voorkomen. Die gegevens moeten we dan ook meerdere keren beschrijven.

metagegevens

In een datadictionary leggen we gegevens vast van de gegevens


die wij in onze database (willen gaan) bijhouden. We noemen de
gegevens in de datadictionary dan ook wel metagegevens, ofwel
gegevens over gegevens.
Maak opgave 4.5.

4 Normaliseren, verdieping

4.6

69

Samenvatting

In dit hoofdstuk hebben we moeilijker type overzichten genormaliseerd. Dit zijn overzichten waar meer dan n repeterende groep in
voorkomt. Dit zijn echter ook de overzichten zoals ze in de praktijk
veelvuldig voorkomen. Door de stappen van het normaliseren consequent toe te passen kunnen dergelijke overzichten op een bijna
routinematige manier worden uiteengerafeld.
In dit hoofdstuk hebben we ook gekeken naar een aantal problemen en eigenaardigheden zoals die in de praktijk blijken voor te
komen. We kunnen eventueel zelfstandig sleutels bedenken en
gegevens, vanuit praktisch oogpunt, verder opsplitsen in zinvolle
deelgegevens.
Vervolgens hebben we geleerd hoe we bij meer dan n overzicht
de gevonden derde normaalvormen kunnen integreren tot n
eindresultaat. Daarbij spelen homoniemen en synoniemen een rol.
Ten slotte hebben we gezien hoe we een datadictionary moeten
opstellen. Een datadictionary beschrijft de gegevens die we tijdens
het normaliseren hebben gevonden. Kenmerken als type, bereik,
verplicht en omschrijving spelen daarbij een rol.
Opgaven
4.1 Geneste repeterende groepen
a. Het overzicht van guur 4.7 is in gebruik op de verkoopafdeling van de rma ZEEP BV. Deze rma levert aan zelfstandige
winkelbedrijven en heeft daartoe een twintigtal vertegenwoordigers in dienst die de winkels langsgaan en orders opnemen.
Normaliseer dit overzicht tot en met de derde normaalvorm.
Ga er daarbij van uit dat een vertegenwoordiger een vast rayon
heeft en nooit buiten zijn rayon werkzaam is. Teken ook het
bijbehorende ER-Diagram.

70
70

Databaseontwikkeling 4 Access 2007

Figuur 4.7

Overzicht week: 12 2010


Rayon
Vertegenwoordiger
1 Midden West
31 Gerritsen
79 Klaassen
04 Yilmaz
2 Midden Oost

24 Verhoeven
.

Omzet

Rayonomzet
34400
19560
41450

95410

54200

Totale omzet

567463

b. Het overzicht van guur 4.8 is in gebruik bij een MBO-instituut. Dit instituut biedt zijn leerlingen buiten de reguliere lessen
de mogelijkheid om tegen zeer gereduceerd tarief extra cursussen te volgen. Daarbij maakt men onder andere gebruik van het
overzicht uit guur 4.8. Normaliseer dit overzicht tot en met
de derde normaalvorm. Ga ervan uit dat een leerling meerdere
extra cursussen kan volgen, maar niet op dezelfde dag. Op n
dag worden er meerdere cursussen gegeven. Ten slotte geldt nog
dat een leerling bij maximaal n afdeling staat ingeschreven.
Aan het hoofd van een afdeling staat slechts n persoon, het
afdelingshoofd. Teken ook het bijbehorende ER-Diagram.
Figuur 4.8

MBO t Hoge Zuiden


Cursus: IACC8 Inleiding Access
Cursusdatum
Leerling
12-05-2010
75583 P. Verhoef
74432 C.Vermaas
69893 L. Hoogeroede

17-6-2010
64837 H. Freiter
74432 C. Vermaas

Afdeling
BE
CE
BE

HB
CE

Afdelingshoofd
K.Nis
I.Parler
K. Nis

C. Hip
I. Parler

c. De rma e-Winkel verkoopt producten via het internet. Op een


order kunnen meerdere artikelen worden besteld, echter niet
twee dezelfde artikelen op n order. Een potentile klant kan
zich registreren door middel van zijn e-mailadres en een wachtwoord. Van een klant wordt onder andere zijn creditcardmaatschappij en het nummer van de creditcard geregistreerd (afgeschermd). Per week wordt een overzicht geproduceerd, die per
artikel aangeeft, op welke dag en door wie dat artikel is besteld,
zie guur 4.9.

71

4 Normaliseren, verdieping

Normaliseer dit overzicht tot en met de derde normaalvorm en


teken ook het ER-Diagram.
Figuur 4.9

Artikel: R7865E
Zilveren oorbellen
Datum
Klant
03-mei-2010
S.Vliet@planet.nl
S. Vliet
V Visa 901655****
Martin33@hetnet.nl
A.C. Martin
M MasterCard 95765****
04-mei-2010

Tijd Ordernr
10:30 200915432

Aantal
1

15:55 200915534

Totaal:
Moostburg@hotmail.com
8:32
M. Oostburg
A American Express 760912****

3
1

200915687

Totaal:

Etc.

4.2 Opeenvolgende repeterende groepen


Uitzendbureau t VolleVat fungeert als tussenpersoon tussen bedrijven die werknemers zoeken en werknemers die bedrijven zoeken.
Om iedereen zo goed mogelijk van dienst te kunnen zijn, houdt
het van de ingeschreven werknemers een aantal gegevens bij, zie
guur 4.10.
Normaliseer dit overzicht tot en met de derde normaal normaalvorm. Ga er daarbij van uit dat een werknemer hoogstens voor
n werkgever tegelijkertijd werkt. Iemand kan meerdere keren bij
Figuur 4.10

Werknemeroverzicht
Inschrijfnummer
Naam
Adres
Postcode
Plaats
Telefoonnummer

Uitgezonden naar:

Gevolgde cursussen

: 74493
: P. Reuvier
: Korte Kerkweg 3
: 3134 HT
: Spijkenisse
: 0181-638292
Naam bedrijf

Vanaf

Tot en met

Gem
Shell
Ladage
Pol Makelaardij
Makelaar Roer
Koopgoed

1-1-2001
1-7-2001
14-8-2004
1-1-2007
14-7-2007
1-1-2008

12-3-2001
31-12-2001
17-9-2004
15-6-2007
31-12-2007
30-4-2010

Cursuscode

Cursusnaam

Diploma gehaald?

ADM1
ADM2
LM
BM

Administratief medewerker 1
Administratief medewerker 2
Leerling makelaar
Bedigd makelaar

Ja
Ja
Ja
Nee

72
72

Databaseontwikkeling 4 Access 2007

hetzelfde bedrijf worden ingezet. Een werknemer volgt een cursus


slechts n keer.
Teken ook het bijbehorende ER-Diagram.
4.3 Opmerkingen over normaliseren
Computerbedrijf BestBuy verkoopt computers en computeronderdelen. Grote klanten kunnen op rekening kopen en mogen gespreid
betalen. Regelmatig worden er overzichten gemaakt van de binnengekomen betalingen, zie guur 4.11.
Normaliseer dit overzicht tot en met de derde normaalvorm en teken het ER-diagram.
Zie ook de laatste opmerking in paragraaf 4.3 Opmerkingen met
betrekking tot normaliseren.
Figuur 4.11

Computer BestBuy
Overzicht betalingen:
Factuurnr
Betaaldatum
10-0456
14-06-2010
10-0407
17-06-2010
10-0413
03-07-2010
10-0451
05-07-2010
10-0403
10-07-2010
10-0456
15-07-2010
Etc.

Klant
108 Putman, Gouda
167 Klipop, Utrecht
143 Yilmaz, Breda
113 Bakker, Best
113 Bakker, Best
108 Putman, Gouda

Bedrag
580,00
713,50
350,00
525,00
525,00
580,00

Betaald
290,00
713,50
180,00
200,00
200,00
290,00

Betaalmethode
B Bank
P Pinnen
B Bank
B Bank
B Bank
C Contant

4.4 Integreren
Gegeven is het overzicht zoals dat gebruikt wordt bij een camping,
zie guur 4.12. Daarbij is de volgende derde normaalvorm gevonden.
Figuur 4.12

Prijslijst camping Vreugdehill


Plaats

Maximum
aantal
tenten

Maximum
aantal
personen

Prijs voor- en
naseizoen per
week

Prijs
hoogseizoen
per week

BOS 1

BOS 2

75

125

85

145

PARK 8

120

170

100

150

WEIDE 9

Voorzieningen

G: Geen
E: Elektriciteit

WE: Water +
Elektriciteit

W: Water

73
73

4 Normaliseren, verdieping

3 NV

PLAATS

VOORZIENING

(plaats, max. aantal tenten,


max. aantal personen,
prijs laagseizoen,
prijs hoogseizoen,
voorzieningcode)
(voorzieningcode, omschrijving)

Bij dezelfde camping maakt men ook gebruik van het overzicht
zoals afgebeeld in guur 4.13. Daarbij is de volgende derde normaalvorm gevonden.
Figuur 4.13

Overzicht per reservering


Reservering:
Begindatum:
Einddatum:

75594
8-7-2010
20-7-2010

Plaatscode: BOS 7
Toelichting bij plaats:
- dicht bij speeltuin gelegen

Klantcode:
Klant:

GR45
Groothuizen P.
Dorpsplein 45
3021 RS Rotterdam
506423743
010-4483263

Factuurdatum: 13-1-2010
Betaaldatum:

Bank/giro:
Telefoon:
Volgnummer

Geslacht

Voorletters

Naam

Geboortedatum

K.L.

Drieklauw

23-06-1975

P.

Groothuizen

09-11-1973

A.A.

Groothuizen

05-03-1999

3 NV

PLEK
KLANT

RESERVERING

NACHTREGISTER

(plaatscode, toelichting plaats)


(klantcode, naam, adres,
postcode, plaats,
bank/gironummer,
telefoonnummer)
(reserveringcode, plaatscode,
datumbegin, datumeind,
klantcode, omschrijving,
factuurdatum, betaaldatum)
(reserveringscode, volgnummer, geslacht, voorletters,
naam, geboortedatum)

74
74

Databaseontwikkeling 4 Access 2007

Integreer de gevonden derde normaalvormen tot n derde normaalvorm (datamodel). Verwijder daarbij homoniemen en synoniemen. Teken tevens het bijbehorende ER-Diagram.
4.5 Datadictionary
a. In opgave 4.4 zijn twee normaalvormen gentegreerd tot n.
Maak voor deze gentegreerde normaalvorm n gezamenlijke
datadictionary.
b. In paragraaf 4.2 is als voorbeeld voor automobielbedrijf
Mandarijntje een overzicht genormaliseerd, zie guur 4.4.
Maak een data-dictionary van de gegevensgroepen zoals ontstaan uit de derde normaalvorm.

Eenvoudige
bewerkingen in Access

5.1

Inleiding

In dit hoofdstuk komt het werken met het pakket Access ter sprake.
Access is een databasepakket van Microsoft. Met een databasepakket zijn we in staat het functionele ontwerp (derde normaalvorm) zoals dat tijdens het normaliseren is ontstaan technisch te
implementeren. We kunnen vervolgens (grote hoeveelheden) gegevens invoeren, bijhouden, bewaren, manipuleren en opvragen. Het
pakket is toepasbaar in allerlei situaties. Zo kan een bibliotheek
bijhouden welke boeken aan welke personen zijn uitgeleend en een
magazijnmeester van een groot productiebedrijf kan bijhouden
welke goederen in voorraad zijn, in welke aantallen, wat het verbruik is en welke openstaande bestellingen er nog zijn.
Figuur 5.1

BOEKEN

Kolommen

Boeknummer

Titel

Schrijver

Aanschafdatum

Etc.

EC466-32

Boekhouden
geboekstaafd

Fuchs e.a.

23-5-2006

..

MM844-02

Marketing
Management

Kotler

06-7-2007

..

WK536-78

Basis wiskunde

Van den Hoek

23-5-2006

..

LO466-06

Inleiding logistiek

Schmidt e.a.

12-12-2008

..

Rijen

Om gegevens te kunnen bijhouden moeten deze gestructureerd


worden opgeslagen. Hoe gegevens gestructureerd kunnen worden,
door te normaliseren, is in de vorige hoofdstukken toegelicht. Het

76

tabel

records

velden

database

Databaseontwikkeling 4 Access 2007

resultaat van het structureren bestaat uit een verzameling gegevensgroepen die iets met elkaar te maken hebben die met elkaar
gerelateerd zijn. Een gegevensgroep kan ook gezien worden als een
tabel. In guur 5.1 is een tabel weergegeven waarin de gegevens
van de boeken van een schoolbibliotheek staan vermeld.
We kunnen een tabel opvatten als een verzameling rijen. En rij
bevat dan alle gegevens, alle van belang zijnde kenmerken, van
n boek. In plaats van rijen hebben we het in Access over records.
Een record bevat dan alle gegevens van n item uit de tabel, in dit
geval dus alle gegevens van steeds n boek. We kunnen een tabel
echter ook zien als een verzameling kolommen. In iedere kolom
wordt n gegeven bijgehouden: bijvoorbeeld de titel of de schrijver. In plaats van kolommen praten we in Access meestal over
velden. Om tabellen aan te kunnen duiden geven we ze een naam.
Deze naam dient een zo goed mogelijke beschrijving te zijn van de
gegevens zoals dat in de tabel wordt weergegeven. In dit voorbeeld
is als naam gekozen voor boeken.
Een aantal bij elkaar horende tabellen die tezamen een werkbaar
geheel vormen, wordt wel een database genoemd. De database
van de bibliotheek zou kunnen bestaan uit de tabellen boeken,
uitleningen, lezers en reserveringen. Hiermee kan worden vastgelegd wie welke boeken heeft geleend of wenst te lenen. We zullen in de rest van dit boek leren werken met tabellen en databases;
we laten zien hoe deze moeten worden gecreerd, gevuld, gemuteerd en geraadpleegd. Daartoe zal steeds eerst worden besproken
welke handelingen we moeten verrichten, waarna er een opdracht
volgt waarbij we de zojuist besproken handelingen gaan uitvoeren.

5.2

Het programma Access starten

Om te kunnen werken met Access moeten we eerst op de gebruikelijke manier de computer opstarten en eventueel inloggen op
een netwerk. Ga naar de Start-knop en kies achtereenvolgens
Programmas, Microsoft Ofce en Microsoft Access.
De praktijk in dit boek wordt gedaan met behulp van databases die
te vinden zijn bij de downloadbestanden bij dit boek (zie de pagina
bij dit boek op www.academicservice.nl). Als in het boek staat

5 Eenvoudige bewerkingen in Access

77

dat een bepaalde database geopend moet worden, bijvoorbeeld


Reisbureau, dan is deze te vinden bij deze downloadbestanden.

5.3
5.3.1

De database en de tabel creren


De database aanmaken

Na het starten van Access meldt het programma zich met het venster dat is afgebeeld in guur 5.2.
Figuur 5.2

In het openingsvenster kun je bepaalde standaarddatabases (sjablonen) openen, een nieuwe database maken of een onlangs geopende
database openen. Een database is een verzameling bij elkaar
behorende tabellen. Voordat we tabellen gaan maken of gebruiken, moet je eerst de bijbehorende database openen of selecteren.
Omdat er nog geen database gemaakt is, gaan we deze maken.

78

Databaseontwikkeling 4 Access 2007

 Klik op Lege database in het openingsvenster, er verschijnt een


nieuw deelvenster, zie guur 5.3.
Figuur 5.3

 Selecteer de gewenste map en naam van de database (in ons voorbeeld Oefening), zie guur 5.4. Klik op OK
 Klik vervolgens op de knop Maken in het venster van guur 5.3.
De database is nu gemaakt in de gewenste map. De database
bestaat uit een aantal tabellen die onderling verbonden zijn via
relaties. Er wordt standaard een eerste tabel, Tabel1, gemaakt, zie
guur 5.5.

5 Eenvoudige bewerkingen in Access

Figuur 5.4

Figuur 5.5

79

80

Databaseontwikkeling 4 Access 2007

Een tabel beschrijft een gegevensgroep, bijvoorbeeld een klant of


een boek. We moeten nu opgeven welke gegevens (kenmerken) we
in de tabel gaan opnemen. Die kenmerken worden in een database
velden genoemd. Bovendien moeten we bij ieder veld opgeven
welk soort gegeven daar mag worden ingevuld, een getal, een
tekst, een datum, enzovoort.
We gaan de tabel ontwerpen.
 Selecteer in het lint Start, groep Weergaven, Ontwerpweergave
of selecteer de tab Tabel1 en kies via de rechtermuisknop voor
Ontwerpweergave.
 Er verschijnt een venster waarin we de naam van de tabel kunnen
veranderen. Verander de naam in Boeken. Er verschijnt een venster, zie guur 5.6, waarin we de velden (kenmerken) en de soort
gegevens (gegevenstype) kunnen opgeven.
Figuur 5.6

5 Eenvoudige bewerkingen in Access

81

In het bovenste gedeelte van het venster, bij Veldnaam, geven we


van ieder veld allereerst de naam op, vervolgens bij Gegevenstype
het soort gegeven en ten slotte de beschrijving van het veld bij
Beschrijving. We maken voor het soort veld een keuze uit de keuzelijst (klik op de knop om de keuzelijst te krijgen):
Tekst Hier kunnen we tekst opnemen. De tekst mag uit iedere
combinatie van willekeurige tekens bestaan met een maximale
lengte van 255, dus ruim voldoende voor de meeste toepassingen
als namen, omschrijvingen, enzovoort.
Memo Een veld van het type memo kunnen we zien als een soort
kladblok. We kunnen hier tekst opnemen tot een maximum van
65.535 tekens.
Numeriek Dit veldtype is bedoeld voor het opnemen van getallen, al dan niet voorzien van decimalen.
Datum/tijd Een veld bedoeld voor het opnemen van datums en
tijdstippen. Er wordt automatisch gecontroleerd op juistheid. De
datum 29 februari 2010 zal dus niet geaccepteerd worden. De manier waarop Access datums accepteert en waarop we datums moeten invoeren, is afhankelijk van de instellingen zoals we die onder
Windows hebben opgegeven. Het kan zijn dat eerst de maand moet
worden ingevoerd, het kan zijn dat er punten in plaats van streepjes
gebruikt worden, het kan zijn dat we altijd twee cijfers moeten invoeren, het kan zijn dat...
Valuta Te vergelijken met een veld van het type numeriek, maar
nu voorzien van een valuta-aanduiding en met maximaal vier decimalen.
Autonummering Een veld waarvan de inhoud automatisch steeds
met n verhoogd wordt of een uniek willekeurig getal, bedoeld
om automatisch te nummeren. De startwaarde waarmee het nummeren begint, kan slechts moeizaam worden gewijzigd (zie bijlage
A).
Ja/Nee Is iets wel of niet waar?
OLE-object Hier kunnen we objecten uit andere Windows-programmas opnemen, bijvoorbeeld een Excel-werkblad, Word-document, graeken, afbeeldingen, geluiden, enzovoort.
Hyperlink Een adres dat verwijst naar een bestand ergens anders
op een computer of internetpagina. Het betreffende bestand kan
zelfs benaderd worden via een netwerk of internet.
Wizard Opzoeken Hiermee kunnen we ervoor zorgen dat de in
te voeren waarden ergens anders worden opgezocht. We kunnen
zo bijvoorbeeld boeken alleen laten uitlenen aan lezers van wie het
nummer in de lezertabel voorkomt.

82

Databaseontwikkeling 4 Access 2007

Bijlage In dit gegevenstype kun je allerlei bestanden toevoegen


als bijlage, zoals je bestanden in e-mailberichten bijvoegt. Zo kun
je bijvoorbeeld een hele reeks fotos als bijlage toevoegen aan n
record. Bijlagevelden zijn exibeler dan OLE-velden en bovendien
wordt de opslagruimte efcinter benut.
In het onderste deel van het scherm kunnen we voor ieder veld nadere beperkingen opgeven door deze in te voeren op de tabbladen
Algemeen en Opzoeken. We gebruiken hier voorlopig alleen het
gegeven Veldlengte. Bij tekstvelden kun je hiermee de maximale
lengte van de tekst beperken. Standaard krijgt ieder tekstveld de
maximale lengte van 255 tekens. Voor een naam van een persoon
kun je bijvoorbeeld kiezen voor maximaal 30 tekens.
Bij numerieke velden kun je de veldlengte gebruiken om het soort
getal op te geven, bijvoorbeeld gehele getallen (integers) of decimale getallen (getallen met een komma). Gehele getallen zijn Byte
(waarden tussen 0-255), Integer (waarden tussen -32.768 32.767)
of Lange integer ( waarden tussen -2.147.483.648 2.147.483.647).
Kies Enkele precisie als je getallen wilt opslaan met een komma.
Let op, getallen met een komma, bijvoorbeeld 4,8 of 17,9 worden
afgerond als je voor een integer gekozen hebt. Een uitgebreide bespreking van de veldeigenschappen staat in bijlage A.
In iedere tabel moet een sleutelveld (of een combinatie van sleutelvelden) worden aangewezen. Met behulp van dit sleutelveld
kunnen we later gegevens terugzoeken. Om dit te kunnen doen
dient een sleutelwaarde altijd uniek te zijn. Als in de tabel Boek
het veld Boeknummer de rol van sleutelveld speelt, dan dient ieder
boeknummer hooguit n keer voor te komen. Anders kunnen we
immers niet bepalen welk boek wordt bedoeld. In hoofdstuk 3 en 4
is hier nader op ingegaan.
Standaard heeft Access het eerste veld al ingevuld met de veldnaam Id, gegevenstype Autonummering en als sleutelveld aangewezen, zie guur 5.6. Vooraan de regel van het veld staat een
sleutelsymbool. Je kunt een veld als sleutel aanwijzen of verwijderen door in het lint Ontwerpen op de knop Primaire sleutel te
klikken. Access zal zelf zorgen dat alle waarden in het betreffende
veld uniek blijven. Vanzelfsprekend kunt je de veldnaam Id en het
gegevenstype wijzigen in een geschikte naam en het gewenste gegevenstype.

5 Eenvoudige bewerkingen in Access

83

Let op!
Als je een samengestelde sleutel hebt, een sleutel die uit meerdere
velden bestaat, selecteer dan de betreffende sleutelvelden tegelijk
(Ctrl-toets ingedrukt houden) door in de grijze vakjes voor de
veldnamen te klikken. Klik daarna op de knop Primaire sleutel in
het lint.
Nadat op bovenstaande wijze alle gewenste velden zijn aangemaakt, kun je het ontwerp van de tabel opslaan door met de rechtermuisknop de tab van de tabel te selecteren (Boeken) en te kiezen
voor Sluiten of op het bekende X-symbool klikken van het Accessvenster, niet het X-symbool van Access zelf. Je kunt het werken
met de geopende database beindigen door op de Ofce-knop
(linksboven) te klikken. In het getoonde menu kies je Database
sluiten.
5.3.2

Een nieuwe tabel aanmaken

Bij het maken van een nieuwe database wordt direct ook een eerste
tabel gemaakt. Omdat een database meestal uit meerdere tabellen
bestaat, moeten er ook nieuwe tabellen toegevoegd kunnen worden. Een nieuwe tabel maken gaat als volgt:
 Selecteer in het lint Maken, groep Tabellen, de knop Tabelontwerp.
Je komt dan in het bekende scherm, zoals guur 5.6. Voeg de gewenste velden en de sleutel toe.
 Als het ontwerp klaar is, kun je het opslaan met de X-knop van
het Access-venster of de rechtermuisknop op de tab van de tabel.
Tijdens het opslaan wordt om een naam van de tabel gevraagd.
Opgave
5.1 a. Start Access en creer de database Oefening, zoals is beschreven.
b. Ontwerp een tabel Boeken met de indeling die hieronder staat
weergegeven. Zorg ervoor dat het veld Volgnummer sleutelveld
wordt.
c. Beindig het aanmaken van de tabel, sla daarbij de tabel op en
sluit de database af.

84
84

Databaseontwikkeling 4 Access 2007

Veldnaam

Gegevenstype

Volgnummer
Boeknummer
Titel
Schrijver
Aanschafdatum
Aanschafprijs
Afgeschreven

Autonummering
Numeriek
Tekst
Tekst
Datum/tijd
Valuta
Ja/Nee

5.4
5.4.1

Veldlengte

Integer
50
30

Een bestaande database openen


Een bestaande database selecteren

Om te werken met een tabel moeten we eerst de database waar die


tabel toe behoort activeren. Start allereerst Access, het venster van
guur 5.2 eerder in dit hoofdstuk wordt getoond. In het rechtergedeelte van het venster zijn alle onlangs gebruikte databases te
openen. Je kunt ook op de Ofce-knop klikken en Openen selecteren, zie guur 5.7. Eventueel moet je eerst de juiste schijf en/of
map selecteren. Hierna kunt je de database selecteren en openen.
Vervolgens kun je alle opgenomen onderdelen (objecten) in de database benaderen, ook de tabellen.
Figuur 5.7

5 Eenvoudige bewerkingen in Access

85

Afhankelijk van het beveiligingsniveau dat is ingesteld in


Windows krijg je een regel te zien met een beveiligingswaarschuwing. Dit is bedoeld om te voorkomen dat je onbewust onveilige
code activeert die mogelijk in het te openen bestand is opgenomen.
Bepaalde inhoud in de database is dan uitgeschakeld. Als je de eigenaar van de database vertrouwt, klik dan op de knop Opties van
de beveiligingsregel en kies in het beveiligingsvenster voor Deze
inhoud inschakelen, zie guur 5.8. Ook als je zelf de database hebt
gemaakt, blijft deze waarschuwing iedere keer komen bij het openen van de database. In bijlage B (Categorie Vertrouwenscentrum)
staat beschreven hoe je eenvoudig vertrouwde mappen kunt maken
om dit op te lossen.
Figuur 5.8

5.4.2

Een bestaande tabel selecteren

Na het openen van de database staat aan de linkerkant het navigatiegedeelte, zie guur 5.9.
Hierin vind je onder andere de namen van alle tabellen uit de
database. Ook alle andere objecten (onderdelen) in de database,
zoals querys, formulieren en rapporten, worden hierin getoond.
Aangezien een database uit vele objecten kan bestaan, kun je in
het navigatiegedeelte snel het gewenste object selecteren door bijvoorbeeld te lteren op Tabellen. Alleen de tabellen uit de database

86

Databaseontwikkeling 4 Access 2007

Figuur 5.9

worden dan getoond. Je kunt ook per objecttype categorie navigeren (zoals in voorgaande versies van Access). Alle tabellen staan
dan bij elkaar, evenals de querys, formulieren, enzovoort. Om te
lteren of een categorie te selecteren, klik je op de bovenste regel
van het navigatiegedeelte, zie guur 5.10.
Figuur 5.10

5 Eenvoudige bewerkingen in Access

87

Opmerkingen navigatiegedeelte
In het vervolg van het boek wordt gebruik gemaakt van de selecties zoals getoond in guur 5.10. De categorie is Objecttype en we
tonen Alle Access objecten. Categorien zijn in- en uit te vouwen
door erop te klikken
Het navigatiegedeelte is te sluiten door te klikken op de <<-knop.
Gebruik de >>-knop om het navigatiegedeelte weer te openen.
Hiermee kun je extra ruimte creren voor het Access-venster.
Door met de rechtermuisknop op de bovenste regel van het navigatiegedeelte te klikken krijg je een venster waarin allerlei instellingen van het navigatiegedeelte zijn te wijzigen.
Om een tabel te openen moet je dubbelklikken op de tabel of de
tabel met de rechtermuisknop selecteren en vervolgens kiezen voor
Openen. De tabel wordt zo getoond dat we direct gegevens kunnen
toevoegen of bestaande gegevens kunnen wijzigen (guur 5.11).
Figuur 5.11

De eerder ingevoerde records zijn zichtbaar. Verder wordt er een


lege regel getoond waarin we de gegevens van een nieuw record
kunnen invoeren. Op het moment dat we met het invoeren van een
nieuw record beginnen, verschijnt aan het begin van de regel een

88

Databaseontwikkeling 4 Access 2007

pennetje. Dit geeft aan dat de ingevoerde gegevens nog moeten


worden weggeschreven naar de tabel. Het record is dus nog niet
echt aan de tabel toegevoegd: dat gebeurt pas op het moment dat
we de recordwijzer naar een ander record verplaatsen.
Als laatste is een kolom toegevoegd, Nieuw veld toevoegen, waarin
eventueel een nieuw veld (kolom) aan de database kan worden
toegevoegd. Van deze optie wordt geen gebruik gemaakt. Voor het
wijzigen van de tabelstructuur wordt gebruik gemaakt van de ontwerpweergave van de tabel, zie paragraaf 5.4.3.
Als er veel records in de tabel staan, kan snel een nieuw record
worden ingevoerd met de knop Nieuw in het lint Start, groep
Records. De tabel kun je sluiten door met de rechtermuisknop de
tab te selecteren en te kiezen voor Sluiten of te klikken op de Xknop van het Access-venster (niet de X-knop van Access zelf).
5.4.3

Het ontwerp van de tabel aanpassen

Het kan zijn dat er bij het ontwerpen van de tabel fouten zijn
gemaakt. We kunnen dan het ontwerp aanpassen:
 Selecteer met de rechtermuisknop de tabel in het navigatiegedeelte en kies voor Ontwerpweergave. Je kunt de tabel ook
eerst openen en vervolgens in het lint Start, groep Weergaven,
Ontwerpweergave kiezen of de tab van de tabel, in het Accessvenster, met de rechtermuisknop selecteren.
 Selecteer het betreffende veld en breng de gewenste wijziging aan.
Het kan gebeuren dat we de melding krijgen dat er gegevens verloren (kunnen) gaan. Dat gebeurt bijvoorbeeld wanneer we de lengte
van een veld verkleinen. De tekens die niet meer in het verkleinde
veld passen, raken we in dat geval kwijt.
 Voeg zonodig velden toe door deze er op de bekende manier onder
aan de lijst bij te plaatsen of met de knop Rijen invoegen in het lint
Ontwerpen, groep Extra.
 Het kan ook zijn dat we een veld willen verwijderen. Markeer
daartoe het betreffende veld door links van de veldnaam te klikken. We markeren daarmee de hele regel. Verwijder nu met behulp
van de toets Delete het veld. We kunnen ook gebruikmaken van de
knop Rijen verwijderen in het lint Ontwerpen, groep Extra.

5 Eenvoudige bewerkingen in Access

89

 Op soortgelijke wijze passen we de volgorde van de velden onderling aan. Markeer een te verplaatsen veld en sleep het vervolgens
naar de nieuwe plaats.
 Sluit na het aanbrengen van alle wijzigingen op de bekende manier
het ontwerpen af door het tabblad te sluiten.
Het is verstandig eerst een kopie te maken van een tabel voordat
we overgaan tot het aanbrengen van wijzigingen in het ontwerp
dit om te voorkomen dat we belangrijke informatie kwijtraken
doordat we bijvoorbeeld per ongeluk een veel te kleine veldlengte
opgeven. Het maken van een kopie van een tabel is eenvoudig:
 Selecteer na het openen van de database de betreffende tabel in het
navigatiegedeelte met de rechtermuisknop. Kies voor de bekende
kopieer- en plakoptie (Ctrl-C / Ctrl-V) of gebruik de overeenkomstige knoppen in het lint Start. Na het plakken wordt het venster
Plakopties voor tabel getoond, zie guur 5.12.
 We kunnen de naam voor de kopietabel opgeven, maar we kunnen ook opgeven wat er precies moet worden gekopieerd, alleen de
structuur, zowel de structuur als de gegevens, of dat de gegevens
van de tabel moeten worden toegevoegd aan een reeds bestaande
tabel.
Figuur 5.12

5.5
5.5.1

Records manipuleren
Records toevoegen

We voegen records toe door de cursor te plaatsen in de nieuwe,


lege regel. Deze regel is gemarkeerd met een asterisk (*). Als er
veel records zijn kun je ook op de knop Nieuw klikken in het lint
Start, groep Records. We hoeven nu alleen nog maar de nieuwe gegevens in te toetsen. In een datumveld kun je een datum intoetsen
of selecteren via de kalenderknop.

90

Databaseontwikkeling 4 Access 2007

Tip: Als je wat meer ruimte wilt hebben op het scherm, kun je het
lint verkleinen door op een tab van het lint te dubbelklikken. Bij
een enkele klik wordt het volledige lint weer getoond. Opnieuw
dubbelklikken op de tab van het lint, toont het lint weer permanent.
5.5.2

Records wijzigen

Records wijzigen doen we door het betreffende record te zoeken en


de cursor in het betreffende record te plaatsen. Vervolgens kunnen
we de nieuwe gegevens intoetsen.
5.5.3

Records verwijderen

We kunnen records verwijderen door het record te selecteren (klikken op de linkerbalk van het record) met de rechtermuisknop en
te kiezen voor Record verwijderen. Een andere optie is via het lint
Start, groep Records, Verwijderen, Record verwijderen. Willen we
meerdere records tegelijk verwijderen, dan kunnen we deze markeren door met de muis in de linkerbalk te slepen of door het eerste
record in de linkerbalk te markeren, naar het laatste record van de
te verwijderen reeks te gaan en dit te markeren met de Shift-toets
ingedrukt. Hierna kunnen we met de rechtermuisknop de selectie
verwijderen. Gemarkeerde records kunnen we ook verwijderen
door op de toets Delete te drukken. Voordat de records denitief
verwijderd worden, waarschuwt Access nog even voor de gevolgen. Verwijderde records kunnen we niet meer terugroepen. We
moeten dan opnieuw de gegevens invoeren!
5.5.4

Records sorteren

Records worden standaard getoond in volgorde van sleutelwaarde.


Om de volgorde te wijzigen plaatsen we de muiswijzer in de kolom
waarop de volgorde gebaseerd moet zijn. Vervolgens kies je de
gewenste sortering door in het lint Start, groep Sorteren en lteren
te kiezen voor Oplopend (AZr) of Aopend (ZAr). Je kunt ook met
de rechtermuisknop voor Sorteren kiezen. Hierbij wordt tevens de
sorteervolgorde in gewone taal weergegeven. Bij tekstvelden van A
naar Z (of Z naar A), bij numerieke waarden van laag naar hoog
(of hoog naar laag) of bij datums van oud naar nieuw (of nieuw
naar oud). Een derde optie is klikken op het driehoekje () naast
de kolomkop. De sortering is op te heffen via het lint Start, groep
Sorteren en lteren, Alle sorteringen wissen.

5 Eenvoudige bewerkingen in Access

5.5.5

91

Records filteren

Normaal gesproken worden alle rijen getoond die in de tabel zijn


opgenomen. Het is echter mogelijk om alleen records te tonen die
voldoen aan een door ons op te geven criterium. We lteren daarmee deze records eruit. De overige records worden niet getoond.
Een (selectie)lter maak je door met de rechtermuisknop het veld
te selecteren waarop je wilt lteren. Hierna kunt je direct uit een
aantal veelvoorkomende opties kiezen waarop gelterd kan worden, zoals Is gelijk aan of Is niet gelijk aan, zie guur 5.13.
Figuur 5.13

De lteropties zijn gegevenstype afhankelijk. Tekstvelden, numerieke velden of datumvelden geven andere opties. Als de veelvoorkomende opties niet voldoen, selecteer dan Tekstlters (of
Getallters of Datumlters afhankelijk van het geselecteerde veld),
zie guur 5.13. Je krijgt dan veel lteropties waaruit je kunt selecteren. In de kolomkop wordt een ltersymbool getoond. Door te
klikken op het -symbool naast de kolomkop kun je op meerdere
gegevens tegelijk lteren, in dezelfde kolom, door vinkjes te plaatsen, zie guur 5.14.
Bovendien is het mogelijk om op meerdere kolommen tegelijk te
lteren. Het lter is op te heffen via het lint Start, groep Sorteren
en lters, Filter in-/uitschakelen. Het is ook mogelijk om op de
knop Filter te klikken in het lint Start, groep Sorteren en lteren.
Die toont dan bovendien een lijst met alle mogelijke waarden.
Door het plaatsen van vinkjes kun je dan snel op meerdere waarden lteren.

92

Databaseontwikkeling 4 Access 2007

Figuur 5.14

5.5.6

Records zoeken

In grote tabellen is het vaak een hele klus om een speciek record
te selecteren omdat het handmatig opzoeken hiervan veel tijd in
beslag neemt. Met Access is het mogelijk records te zoeken aan de
hand van een door ons op te geven zoekwaarde:
 Zet de cursor eerst in de kolom waarin we willen laten zoeken en
kies in het lint Start, groep Zoeken, de knop Zoeken. Het venster
uit guur 5.15 wordt actief.
Figuur 5.15

 Geef in het veld Zoeken naar de waarde op die gezocht moet worden.
 Het veld Zoeken in gebruiken we om op te geven of alleen in het
geselecteerde veld moet worden gezocht of in de gehele tabel.
 Geef in het veld Waar op hoe precies er gezocht moet worden. De
keuze Gedeelte van veld heeft tot gevolg dat er gekeken wordt of

5 Eenvoudige bewerkingen in Access

93

de zoekwaarde ergens in het veld voorkomt. De keuze Heel veld


zoekt naar records waarvan de veldwaarde precies gelijk is aan de
opgegeven zoekwaarde. Met de keuze Begin van veld kijken we of
het veld begint met de opgegeven waarde.
 Het veld Zoeken geeft de mogelijkheid om op te geven in welke
richting gezocht moet worden. Met de keuze Alles doorzoeken we
alle records, Omhoog zoekt vanaf het actieve record naar boven en
Omlaag zoekt vanaf het geselecteerde record naar beneden.
Geef ten slotte ook nog op, door middel van afvinken, of er verschil gemaakt moet worden tussen hoofd- en kleine letters en of er
ook op de opmaak gelet moet worden. Let erop dat een computer
in het algemeen verschil maakt tussen hoofd- en kleine letters.
De tekst Popmuziek is voor een computer niet gelijk aan de tekst
POPMUZIEK. Het is dus vaak zinvol om de optie Identieke hoofdletters/kleine letters NIET af te vinken. In dat geval zal er namelijk
geen verschil gemaakt worden tussen beide teksten omdat Access
dan geen onderscheid maakt tussen hoofdletters en kleine letters.
 De knop Volgende zoeken zoekt steeds naar het eerstvolgende
record dat voldoet.
 Bij het opgeven van de te zoeken waarde kunnen we gebruikmaken van jokers (wildcards). Dit zijn tekens die voor een of meer
letters of cijfers staan. Er zijn drie tekens die veel gebruikt worden.
Het teken * geeft aan dat een willekeurig aantal tekens voldoet.
Het teken ? staat voor n teken. Het teken # komt overeen met n
cijfer. Dus bij b*s voldoen bijvoorbeeld: bas, bos, baas, buitenhuis,
zolang het woord maar begint met de letter b en eindigt op de letter
s. Bij b?s voldoen bas, bos, bis, enzovoort. Tussen de letters b en s
mag nu slechts n ander teken voorkomen. Aan het zoekcriterium
19#5 voldoen onder meer 1905, 1915, 1925. Het derde teken moet
wel een cijfer zijn.
5.5.7

Records zoeken (en vervangen)

Op soortgelijke wijze als bij het zoeken naar records kunnen we


ook de inhoud van velden automatisch laten wijzigen. We laten
dan zoeken naar een door ons op te geven veldwaarde en deze laten we vervolgens vervangen door een ook door ons op te geven
waarde. Om het zoeken en vervangen uit te laten voeren kiezen we
in het lint Start, groep Zoeken, Vervangen. Je kunt ook op de knop
Zoeken klikken en vervolgens het tabblad Vervangen selecteren.
De verdere afhandeling lijkt sterk op wat in de vorige paragraaf is
besproken.

94

Databaseontwikkeling 4 Access 2007

5.5.8

Totalen bepalen

Je kunt een extra rij aan een geopende tabel toevoegen waarin totalen getoond kunnen worden. Hiermee kun je bijvoorbeeld bepalen hoeveel volwassen op reis gaan, wat het totale betaalde bedrag
is dat is ontvangen, enz.
 Open een tabel en klik in het lint Start, groep Records, op de knop
8 Totalen. Er wordt onder de gegevens een regel Totaal toegevoegd.
 Door in een numerieke kolom te gaan staan in de regel Totaal
kun je kiezen uit Geen, Som, Gemiddelde, Aantal, Maximum,
Minimum, Standaarddeviatie of Variantie, zie guur 5.16. Als een
lter is ingesteld, hebben de totalen betrekking op de gelterde
records.
Figuur 5.16

De regel Totaal is gegevenstype afhankelijk, dus bij tekstvelden


krijg je bijvoorbeeld alleen de optie Aantal te zien en bij datumvelden Gemiddelde, Aantal, Maximum en Minimum.
Door opnieuw op de knop 8 Totalen te klikken wordt de regel
Totaal verwijderd. De gekozen opties blijven wel bestaan, als je de
totaalregel weer activeert, worden de totalen weer getoond. Als je
die wilt verwijderen, kies dan in alle velden voor de optie Geen.

5 Eenvoudige bewerkingen in Access

95
95

Opgaven
5.2 a. Selecteer de database Oefening en open de tabel Boeken.
b. Voer vijf records in. In het veld Afgeschreven kunnen we een
vinkje plaatsen om hier de waarde Ja op te nemen. Een vinkje
plaatsen we met behulp van de spatiebalk of door erop te klikken.
c. Let op de manier waarop een datum moet worden ingevoerd.
Deze is afhankelijk van de instellingen van Windows. Probeer
de datum 28 januari 2010 eens in te voeren. Het kan zijn dat we
moeten invoeren: 28-1-2010, 28-01-2010, 1-28-2010 of
01-28-2010. Het kan zelfs zijn dat we het jaartal 2010 moeten
invoeren als 10. Let ook op het formaat waarin Access de
datum vervolgens in de tabel weergeeft. Deze kan weer afwijkend zijn van het formaat zoals we dat hebben ingevoerd.
d. Sorteer de gegevens op basis van de aanschafprijs.
e. Zoek alle records waarbij de naam van de schrijver begint met
de letter W. (Als die er niet is, kies dan een andere beginletter).
f. Toon alle boeken met een aanschafprijs kleiner dan 10 euro.
Hef hierna het lter op.
g. Toon alle boeken van J.K.Rowling met een prijs die hoger is
dan 15 euro. Tip: gebruik twee lters. Hef hierna het lter op.
h. Verwijder het derde record.
i. Voor vrijwel iedere besproken handeling is er ook een pictogram opgenomen in het lint. Zoek de knoppen voor
achtereenvolgens Record verwijderen, Nieuw record, Zoeken,
Selectielter en Oplopend sorteren.
j. Wat is de totale aanschafprijs van alle boeken? Wat is de aanschafprijs van alle boeken van J.K.Rowling?
k. Sluit de tabel en de database af.
5.3 a. Selecteer de database Reisbureau en open de tabel Bestemming.
b. In verband met de politieke situatie worden er geen reizen meer
georganiseerd naar Irak. Verwijder op een zo gemakkelijk mogelijke manier alle bestemmingen gelegen in dit land. (Zorg er
dus voor dat ze direct onder elkaar komen te liggen!)
c. Iemand wenst een vakantie te boeken ergens in Zuid-Amerika.
Welke bestemmingen kunnen wij aanbieden? Laat alleen deze
bestemmingen zien. (Gebruik dus een lter!)
d. Hef het lter weer op.
e. Een wat slordige medewerker heeft de naam van Spanje onjuist
in de tabellen opgenomen. Verbeter deze foute naam (Spagne)
op de meest efcinte manier.

96
96

Databaseontwikkeling 4 Access 2007

f. Open de tabel Reis.


g. Toon alle reizen die langer dan 14 dagen duren. Hef hierna het
lter op.
h. Toon alle reizen die goedkoper zijn of gelijk aan 1000 euro en
bovendien een vertrekdatum hebben in juni 2010. Hef hierna
het lter weer op.
Tip: bij datumlters hebben de opties Morgen, Vandaag,
Gisteren, etc. betrekking op de dag van vandaag. Voor, Na,
Tussen en Alle datums in periode zijn onafhankelijk van de
huidige datum.
i. Open de tabel Boeking. Laat het totaal ontvangen bedrag weergeven van alle reizen die maart 2010 zijn geboekt. Toon tevens
het aantal reizen en het totale aantal volwassen die op reis gaan
in die periode.
j. Sluit alle tabbladen.

5.6

Met meerdere tabellen tegelijkertijd werken

5.6.1

Verbanden leggen

Veelal zullen de tabellen die binnen n database zijn opgenomen


verband houden met elkaar, met andere woorden: er bestaan relaties tussen de tabellen. Zo zullen we bij een klant op basis van het
klantnummer alle boekingen van de klant kunnen (en willen) zoeken. Op basis van de reiscode kunnen we de reis erbij zoeken en
op basis van de bestemmingcode kunnen we de gegevens van de
bestemming erbij zoeken. De database Reisbureau bevat meerdere
tabellen tezamen met de onderlinge relaties.
De indeling van de tabellen:
KLANT

BOEKING

REIS

BESTEMMING

Klantnummer

Boekingnummer

Reisnummer

Bestemmingcode

Naam

Klantnummer

Bestemmingcode

Plaats

Adres

Reisnummer

Vertrekdatum

Land

Postcode

Boekdatum

Aantal dagen

Werelddeel

Woonplaats

Aantal volwassenen

Prijs per persoon

Telefoonnummer

Aantal kinderen
Betaald bedrag

97

5 Eenvoudige bewerkingen in Access

De bestaande relaties staan weergegeven in het volgende ERD


(Entiteit Relatie Diagram):
KLANT

BOEKING

o.b.v. klantnummer

REIS

o.b.v. reisnummer

BESTEMMING

o.b.v. bestemmingcode

Ook binnen Access kunnen we de relaties bekend maken.


Bovendien kunnen we opgeven dat we de bijbehorende referentile
integriteit (referential integrity) willen afdwingen. Access zal dan
automatisch hierop controleren. Daardoor wordt het onmogelijk
een boeking te registreren op een (nog) niet bestaande reis of naar
een bestemming die (nog) niet in de bestemmingtabel voorkomt.
Om relaties op te geven moeten we op de volgende manier te werk
gaan:
 Open de database waarbinnen de relaties bekendgemaakt moeten
worden.
 Klik in het lint Hulpmiddelen voor databases, groep Weergeven/
verbergen, op de knop Relaties. Het relatiescherm verschijnt, zie
guur 5.17.
Figuur 5.17

98

Databaseontwikkeling 4 Access 2007

We zien de relatie die er bestaat tussen Bestemming en Reis, op


basis van de bestemmingcode. Dit is een n-op-veel relatie. Iedere
bestemmingcode kan in Bestemming hooguit n keer voorkomen
maar in Reis nul, n of meer keer. We kunnen de nog niet gedenieerde relaties hier nu opgeven.
 Plaats eerst de betreffende tabellen op het scherm. Klik hiervoor
op Tabel weergeven op het lint Ontwerpen, groep Relaties.
 Selecteer in het venster dat verschijnt (guur 5.18) de ontbrekende
tabellen (Boeking en Klant) en voeg deze toe aan het relatiescherm
door op de knop Toevoegen te klikken.
 Sluit het toevoegvenster weer af.
Figuur 5.18

De nieuwe tabellen zijn nu opgenomen in het relatiescherm, maar


ze zijn nog niet verbonden.
 Sleep het sleutelveld (Reisnummer in Reis) naar het overeenkomstige veld in de gerelateerde tabel (Reisnummer in Boeking). Zo
verbind je de primaire sleutel aan de vreemde sleutel (foreign key).
 Access toont nu het scherm waarin de relatie nauwkeurig kan
worden ingesteld (guur 5.19). Hier wordt de relatie tussen Reis en
Boeking bekendgemaakt. Let op dat Reisnummer uit Reis is gekoppeld aan Reisnummer uit Boeking. Je kunt dat hier eventueel nog
corrigeren.
 Zet een vinkje voor de optie Referentile integriteit afdwingen.
Access zal nu de referentile integriteit verzorgen. Dat betekent dat
we bijvoorbeeld geen reis kunnen boeken voor een klant van wie
het klantnummer niet in het klantenbestand voorkomt.

5 Eenvoudige bewerkingen in Access

99

Figuur 5.19

 Als we de keuze Gerelateerde velden trapsgewijs bijwerken afvinken, wordt het mogelijk om in de primaire tabel (de tabel waar het
veld de sleutel is) wijzigingen aan te brengen in de sleutelwaarde.
Deze wijzigingen worden dan automatisch doorgevoerd in het
gerelateerde veld. Bijvoorbeeld: een wijziging in het klantnummer
in de klantentabel wordt automatisch ook doorgevoerd bij de overeenkomstige boeking(en). Let op: vinken we deze mogelijkheid
niet af, dan kunnen we de sleutelwaarden in de primaire tabel niet
wijzigen als deze waarde ook nog in een van de gerelateerde tabellen voorkomt! We kunnen dus bijvoorbeeld in de klantentabel geen
klantnummer wijzigen van een klant waarvan nog een boeking
bestaat!
 Geef met de keuze Gerelateerde records trapsgewijs verwijderen
op dat we records uit de primaire tabel willen kunnen verwijderen;
gerelateerde records worden hierbij automatisch uit de gerelateerde
tabellen verwijderd. Hierdoor wordt er bijvoorbeeld door het verwijderen van een bestemming automatisch voor gezorgd dat ook
alle bijbehorende reizen worden verwijderd. Let op: vinken we
deze mogelijkheid niet af, dan kunnen we geen record verwijderen
in de primaire tabel als er nog verwijzingen naar dit record
bestaan! We kunnen dus bijvoorbeeld in de klantentabel geen
klant verwijderen als er voor die klant nog een boeking bestaat!
 Nadat alles goed is ingesteld, kunnen we met de knop Maken de
relatie laten opnemen. In het scherm Relaties kunnen we de tekening overzichtelijker maken door de tabellen op het scherm zodanig te verslepen dat er nette, rechte lijnen ontstaan (guur 5.20).

100

Databaseontwikkeling 4 Access 2007

Figuur 5.20

Opmerkingen
Het kan voorkomen dat we een relatie tussen twee tabellen willen
deniren waarbij de relatie is gebaseerd op een meervoudige sleutel. In dat geval selecteren we alle betreffende velden in de tabel
waar deze tezamen de gehele sleutel vormen (de primaire tabel).
Daartoe houden we tijdens het selecteren de Ctrl-toets ingedrukt.
Hierna slepen we de geselecteerde sleutelvelden naar de andere,
gerelateerde, tabel en laten ze daar los. In het dan getoonde scherm
geven we voor ieder afzonderlijk sleutelveld aan met welk veld het
in de gerelateerde tabel moet worden verbonden. We kunnen ook
weer aangeven of we de referentile integriteit wensen af te dwingen. Met de knop Maken wordt de relatie daadwerkelijk gelegd.
Access toont hierna meerdere verbindingslijnen tussen de beide
tabellen. Dit is echter slechts n, meervoudige, relatie. Proberen
we een van de verbindingslijnen te verwijderen, dan zal Access
alle betrokken lijnen verwijderen en daarmee de gehele relatie.
Het is verstandig om direct na het ontwerpen van de tabellen de
relaties tussen de tabellen te leggen. Bij het vullen van de database
wordt dan direct op referentile integriteit gecontroleerd. Je kunt
dan bijvoorbeeld in de tabel Boeking geen klantnummer invoeren
dat niet voorkomt in de tabel Klant. Als je eerst de tabellen vult
met gegevens en dan de relatie legt tussen de tabellen met referentile integriteit, treedt vaak een foutmelding op. Er is dan bijvoorbeeld een klantnummer ingevuld in Boeking die niet bestaat in de
tabel Klant. Het vullen van de tabellen vindt niet vaak plaats in de
tabel zelf (Gegevensbladweergave), wel om snel een testset te maken. Het vullen vindt meestal plaats via formulieren. Die worden
verderop in dit hoofdstuk besproken en in hoofdstuk 6.

5 Eenvoudige bewerkingen in Access

101

Zorg dat het gegevenstype hetzelfde is van de velden die worden


gekoppeld. Je kunt uiteraard geen tekstveld aan een numeriekveld
koppelen. Het gegevenstype Autonummer moet gekoppeld worden
aan Numeriek, Lange integer.
Na het leggen van de relaties zal Access in de gegevensbladweergave van de tabellen een +-teken tonen bij de records. Daarmee
kun je een subgegevensblad tonen door erop te klikken (uitvouwen), zie bijvoorbeeld tabel Klant. Na het uitvouwen worden de
boekingen van die klant getoond. Als je die subgegevensbladen
niet wilt zien, klik dan in het lint Start, groep Records, op de knop
Meer, Subgegevensblad, Verwijderen. Omdat onder andere bij het
maken van formulieren een subgegevensblad ongewenste resultaten kan hebben, zijn ze verwijderd. Je moet dat voor alle tabellen
afzonderlijk doen!
5.6.2

Relaties verwijderen of bewerken

We kunnen bestaande relaties verwijderen door in het scherm


van guur 5.20 de lijn die de relatie weergeeft aan te klikken met
de rechtermuisknop. In het opgeroepen snelmenu kunnen we nu
kiezen voor Verwijderen of Relaties bewerken. Sluit het onderdeel
relaties af door het betreffende scherm te sluiten.

Terzijde
De relatie kan ook verwijderd worden door aanklikken met de
linkermuisknop, gevolgd door het indrukken van de Deletetoets.

Opgave
5.4 a. Open de database Reisbureau. Open het scherm waarin de relaties worden opgegeven. Voeg de tabellen Boeking en Klant toe
aan het relatiescherm.
b. Leg de relatie tussen Reis en Boeking en de relatie tussen
Boeking en Klant.
c. Zorg ervoor dat de referentile integriteit wordt afgedwongen.
Het is niet nodig trapsgewijs wijzigen en trapsgewijs verwijderen te activeren.

102
102

Databaseontwikkeling 4 Access 2007

d. Probeer eens een boeking in te voeren voor een niet-bestaande


klant op een niet-bestaande reis. Neem hiervoor klantnummer
52 en reisnummer 47. Als dit niet lukt, beindig dan het invoeren van de boeking door op de toets Esc te drukken.
e. Open de tabel Klant en probeer eens de klant met het nummer
14 (Brugman) te verwijderen uit de klantentabel. Verklaar zelf
waarom dit nu wel of niet lukt.

5.7
5.7.1

Gegevens selecteren en manipuleren


Gegevens selecteren, selectiequery

Om gegevens te selecteren uit de database kunnen we gebruikmaken van een query (een vraag opgemaakt in een speciale vraagtaal). Met een query kunnen we uit n of meerdere tabellen gegevens selecteren die voor de gewenste informatie zorgt. Met lters
kun je alleen gegevens selecteren uit n tabel, zoals in de vorige
paragraaf is besproken.
Om een query te kunnen maken moeten we eerst een informatiebehoefte een vraag naar informatie hebben. Stel je wilt weten
wie een reis op 5 april 2010 hebben geboekt. Van de betreffende
personen wil je de naam, woonplaats en telefoonnummer weten,
zodat je even contact kunt opnemen. We gaan deze query maken.
 Open de database Reisbureau.
 Selecteer uit het lint Maken, groep Overige, Query ontwerp. Er
volgt een venster waaruit de tabellen zijn te selecteren die nodig
zijn voor de gewenste informatie, zie guur 5.21.
 Naam, plaats en telefoonnummer komen uit de tabel Klant en de
boekingsdatum komt uit de tabel Boeking. Selecteer beide tabellen
door erop te dubbelklikken (of via Toevoegen) en sluit vervolgens
het venster. De twee tabellen worden nu getoond. Dubbelklik
vervolgens op de velden Naam, Woonplaats, Telefoonnummer en
Boekdatum (je kunt de gewenste gegevens ook slepen naar het onderste deel van het venster), zie guur 5.22.

5 Eenvoudige bewerkingen in Access

103

Figuur 5.21

Figuur 5.22

 In het queryvenster heb je bovenin de benodigde tabellen staan en


in het onderste deel de velden die van belang zijn voor de query.
 In de regel Criteria vullen we het criterium (voorwaarde) in, dus
bij Boekdatum vul je in 5-4-10. Access zal dit vervolgens in het
ingestelde Windows-formaat tonen en de datum wordt tussen het

104

Databaseontwikkeling 4 Access 2007

symbool # geplaatst. Hierdoor wordt het als datum herkend in


Access.
 Het veld Boekdatum hoeft niet te worden weergegeven in de uitvoer, het is hier alleen nodig als selectiecriterium. Om dit aan te
geven verwijderen we bij het veld Boekdatum het vinkje in de regel
Weergeven.
 Om de uitvoer zinvoller te maken willen we deze op volgorde van
naam tonen. Klik in het veld Naam op de regel Sorteervolgorde en
kies vervolgens Oplopend. Het scherm ziet er nu ongeveer uit als
guur 5.23.
Figuur 5.23

 We kunnen de query uitvoeren (runnen) door in lint Ontwerpen,


groep Resultaten, op de knop Uitvoeren te kikken. Je keert terug
naar het ontwerp van de query via de knop Weergave in het lint
Start.
Een query waarin informatie wordt getoond op basis van een
bepaalde selectie (geboekt 5 april 2010) wordt een selectiequery
genoemd.

5 Eenvoudige bewerkingen in Access

105

 Sla de query op door het venster van de query te sluiten. Na het


invullen van een naam voor de query wordt deze opgenomen in het
navigatiegedeelte van Access, onder het kopje Querys. Je kunt de
query opnieuw openen door in het navigatiegedeelte te dubbelklikken op de query of via de rechtermuisknop (ook om de query in
ontwerpweergave te tonen).
De voorgaande query was vrij eenvoudig, omdat er slechts n
voorwaarde bij betrokken was. We kunnen querys echter aanzienlijk ingewikkelder maken. Bijvoorbeeld een query waarin
naam, woonplaats en telefoonnummer van klanten worden getoond
die naar Azi gaan, of die in West-Europa blijven maar niet in
Rotterdam wonen, of reizen waarvan de prijs ligt tussen de
500,00 en 800,00 ligt en waarvan de vertrekdatum in mei 2010
ligt.
We gaan dan op dezelfde wijze te werk als hiervoor beschreven is.
We moeten eerst onderzoeken welke tabellen we nodig hebben
voor de query. Tabel Klant voor de klantgegevens, Bestemming
voor het werelddeel en Reis voor de prijs per persoon en vertrekdatum. De tabel Boeking hebben we ook nodig, want hierin wordt
vastgelegd wie op reis gaan naar welke bestemming. Dus alle bestanden hebben we deze keer nodig.
 Maak een nieuwe query via het lint Maken, groep Overige,
Queryontwerp. Voeg alle tabellen toe aan de query en sluit het
venster voor het toevoegen van tabellen.
 Selecteer alle velden die nodig zijn voor de query. Het queryvenster ziet er nu ongeveer uit als guur 5.24.
Opmerkingen
Open alleen bestanden die nodig zijn voor een query. Dus niet altijd alle bestanden openen! Als je bijvoorbeeld een lijst wilt hebben
van alle klanten, open dan alleen de tabel Klant. Als je bijvoorbeeld ook de tabel Boeking opent voor hetzelfde overzicht, krijg je
alle klanten te zien die geboekt hebben. Klanten die niet geboekt
hebben krijg je nu niet te zien en van klanten die meerdere keren
geboekt hebben, ook meerdere keren hun adresgegevens.
Zorg dat altijd alle tabellen gekoppeld zijn. Dus als informatie nodig is uit Klant en Reis, dan moet ook de tabel Boeking geopend
worden, ook al toon je geen gegevens uit de tabel Boeking. De tabellen Klant en Reis moeten gekoppeld zijn, via Boeking.

106

Databaseontwikkeling 4 Access 2007

Figuur 5.24

 We willen alleen de velden Naam, Woonplaats en Telefoonnummer


zien. Verwijder de vinkjes bij de overige velden in de regel
Weergeven van de query.
 Sorteer het overzicht op naam door bij de regel Sorteervolgorde,
onder Naam, Oplopend te selecteren.
Ten slotte moeten we de voorwaarden opgeven. We hebben te maken met drie (meervoudige) voorwaarden, te weten:
 bestemming is Azi, of
 bestemming is West-Europa en de woonplaats is niet Rotterdam,
of
 de prijs van de reis ligt tussen de 500,00 en 800,00 en bovendien begint de reis in mei 2010.
We geven deze voorwaarden in drie, afzonderlijke, onder elkaar
gelegen Criteria-regels. Voorwaarden die we op dezelfde criteriaregel opnemen, moeten tegelijkertijd waar zijn om te voldoen, de
zogenaamde EN-constructie. Voorwaarden die we onder elkaar, in
afzonderlijke regels opnemen, vormen een OF-constructie: als er
aan de (gecombineerde) voorwaarden op n regel wordt voldaan
is het goed.
 Voeg deze drie voorwaarden toe in de regel Criteria, zoals afgebeeld in guur 5.25. Let op de regelindeling van de voorwaarden.

107

5 Eenvoudige bewerkingen in Access

Figuur 5.25

Bij de voorwaarde kunnen we gebruikmaken van:


Teken

Betekenis

Invoeren als

gelijk aan (standaard)

= 250

>

groter dan

> 250

<

kleiner dan

< 250

>=

groter dan of gelijk aan

>= 250

<=

kleiner dan of gelijk aan

<= 250

<>

ongelijk

<> 250

Between

tussen, inclusief de grenzen

Between 250 And 750

In

komt voor in een verzameling

In ( 30, 345, 715, 890 )

Is Null

veld heeft geen waarde, niet ingevuld

Is Null

Is Not Null

veld is niet leeg

Is Not Null

Like

ziet eruit als

Like Rot*

And

allebei waar

>250 And <500

Or

een van beide of beide waar

<250 Or >500

Not

niet

Not In (3,45,214)

Deze bewerkingen werken op alle veldsoorten, dus op getallen en


teksten, maar ook op datums. Ook de eerdergenoemde jokers kunnen we gebruiken.
Ook in de Nederlandse versie van Access moet je de voorwaarden
en functies in het Engels invoeren. Between wordt veel toegepast
om een maand, kwartaal, halfjaar of jaar te selecteren, zie het
voorbeeld van guur 5.25. Is Null wordt toegepast om lege velden
te selecteren. Bijvoorbeeld, van welke klanten is het telefoonnummer niet bekend?

108

Databaseontwikkeling 4 Access 2007

Bij datum en tijd kunnen we nog een aantal extra functies gebruiken. Let er daarbij op dat het veld waarop de functie wordt uitgevoerd tussen rechte haken moet staan en dat het argument van
de functie zelf tussen ronde haken staat.
Functie

Betekenis

Invoeren als

Day

selecteert de dagaanduiding

Day ([Boekdatum]) = 27

Month

selecteert de maandaanduiding

Month([Boekdatum]) = 12

Year

selecteert het jaartal

Year([Boekdatum]) = 1999

Weekday

selecteert de dag van de week,

Weekday([Boekdatum])=7

Hour

selecteert de uuraanduiding

Datepart

selecteert het weeknummer (ww)

Datepart(q;[Boekdatum])=2

of het kwartaalnummer (q)

Datepart(ww;[Boekdatum])=30

uit een datum

zondag=1, maandag=2, ...


Hour([Vertrektijd])=15

bij een datum


DateSerial

Selecteert een datum op basis van

DateSerial(Year([Vertrekdatum]);

jaar, maand en dag. Datum die

Month([Vertrekdatum])-3;

precies 3 maanden voor de

Day([Vertrekdatum]))

vertrekdatum ligt.

Opmerkingen met betrekking tot querys:


Soms wordt een voorwaarde erg lang en hebben we eigenlijk te
weinig ruimte om het criterium goed in te voeren. Klik in dat
geval met de rechtermuisknop bij het betreffende veld in de criteriumregel. We kunnen dan inzoomen. Er verschijnt een venster
waarin we het criterium kunnen plaatsen.
Hebben we niet alle benodigde velden geselecteerd, dan kunnen
we later nog velden toevoegen door ze van het bovenste deel (aanklikken in de betreffende tabel) te slepen naar het onderste deel en
ze daar neer te zetten.
Een veld dat we achteraf toch niet nodig hebben bij de query,
selecteren we door in het dunne balkje direct boven de veldnaam te
klikken (de hele kolom wordt nu gemarkeerd). Vervolgens verwijderen we het door op de toets Delete te drukken of door in het lint
Ontwerpen, groep Querys instellen, op de knop Kolommen verwijderen te klikken.
Hebben we een veld nodig uit een tabel die niet in het bovenste deel wordt getoond, voeg de tabel dan toe door in het lint
Ontwerpen, groep Querys instellen, te klikken op Tabel weergeven. Hierna kun we de gewenste velden in de query slepen.

5 Eenvoudige bewerkingen in Access

109

Als de query veel uitvoer oplevert en je bent alleen genteresseerd


in de top 10 of 25 of een percentage van de uitvoer, kies dan in het
lint Ontwerpen, groep Querys instellen, voor Resultaat. Als je op
het -symbool klikt, kun je uit een aantal voorgeprogrammeerde
opties kiezen of toets handmatig een waarde in het vakje, bijvoorbeeld 10 of 10%. De eerste 10 records of de eerste 10% van het
totale aantal records is dan te zien. Selecteer je Alles, dan worden
alle records weer getoond.
We kunnen de betekenis van de relaties tussen de tabellen aanpassen. Standaard wordt een relatie alleen getoond als de waarde in
beide tabellen voorkomt. Een overzicht van alle klanten, met de
door hen geboekte reizen, zal alleen klanten tonen die daadwerkelijk een reis geboekt hebben. Klanten zonder boeking worden niet
getoond, omdat hun klantnummer niet in beide tabellen voorkomt.
Als we die klanten toch wensen te zien, klikken we met de rechtermuisknop op de betreffende relatie tussen Klant en Boeking
(op de lijn) en kiezen voor Joineigenschappen. Vervolgens kunnen we de relatie speciceren: voorkomen in beide tabellen, of in
slechts n van beide. In het laatste geval moeten we nog opgeven
in welke van de twee tabellen de waarde alleen mag voorkomen
(guur 5.26). We kunnen de eigenschappen van de relatie op twee
plaatsen aanpassen: in het algemene relatiescherm (guur 5.20) en
tijdens het opbouwen van een query (guur 5.22). Wijzigen we de
relatie in het relatiescherm, dan geldt vanaf dat moment de nieuwe
instelling bij alle opvragingen en querys die we nog gaan maken.
Wijzigen we een relatie tijdens het opbouwen van een query, dan
geldt deze gewijzigde instelling alleen voor die betreffende query.
Buiten deze query blijft de algemeen ingestelde relatie gehandhaafd.
Figuur 5.26

Als in guur 5.26 de tweede optie wordt geselecteerd Alle records


uit Klant worden alle klanten getoond, ook de klanten die niet

110

Databaseontwikkeling 4 Access 2007

geboekt hebben. Als je dan bijvoorbeeld ook het boekingnummer toont, zal deze leeg zijn bij klanten die niet geboekt hebben.
Deze kunnen we vervolgens met de voorwaarde Is Null selecteren.
Klanten die (nog) niet geboekt hebben, worden dan getoond. Deze
joineigenschap wordt in de praktijk veel gebruikt. Bijvoorbeeld:
welke artikelen zijn het afgelopen jaar niet verkocht? Of welke
klanten hebben de afgelopen drie maanden geen order geplaatst?
Opgave
Tip: Sla iedere query op onder een andere naam. Het is handig om
de opgaven een naam te geven waarmee ze eenvoudig zijn op te
zoeken. Kies bijvoorbeeld als naam voor de komende opgaven 55b, 5-5c, enzovoort. Een punt in een querynaam is niet toegestaan,
dus 5.5.b levert een foutmelding op.
5.5 a. Open de database Reisbureau.
b. Verzorg een overzicht met alle gegevens van de bestemmingen
in Noord- of Zuid-Amerika.
c. Geef de nummers en de prijzen van de reizen waarvan de prijs
meer dan 2000, bedraagt.
d. Geef ook de plaats van bestemming van de reizen uit onderdeel
c, op volgorde van plaats. Maak hiervoor een nieuwe query.
e. Geef de namen en telefoonnummers van de klanten die op 23
of 24 maart 2010 een reis hebben geboekt. De datum mag niet
worden getoond.
f. Wie heeft in maart 2010 een reis van twee weken (14 dagen)
geboekt? Laat de naam, woonplaats en boekingsdatum afdrukken. Het overzicht moet liggen op volgorde van naam.
g. Naar welke plaatsen in Azi zijn er in de periode van
5 t/m 12 mei 2010 reizen georganiseerd? Laat plaats en land
zien, op volgorde van land.
h. Welke klant heeft geen boeking? Laat naam en woonplaats
weergeven. Aanwijzing: pas eventueel tijdens het opbouwen
van de query de relatie tussen klant en boeking zo aan dat klanten zonder boeking ook worden getoond (via joineigenschappen) en geef bij de query zelf als criterium dat er in het veld
boekingnummer niets mag zijn ingevuld. Zie ook het laatste
punt bij Opmerkingen met betrekking tot querys. We vinden
als het goed is twee klanten, te weten Ramaker en Brigman.

5 Eenvoudige bewerkingen in Access

5.7.2

111

Gegevens opvragen, rekenkundige bewerkingen

We kunnen querys ook gebruiken om samengevatte gegevens op


te vragen, zoals het aantal klanten dat een reis naar Spanje heeft
geboekt of het gemiddelde reisbedrag van de boekingen gedaan
in de afgelopen maand. Daarbij kunnen we gebruikmaken van de
volgende functies:
Functie

Berekent

Som

het totaal van het veld

Gem

de gemiddelde waarde van het veld

Min

de kleinste waarde in het veld

Max

de grootste waarde in het veld

Aantal

het aantal keren dat er in het veld iets is ingevuld (niet leeg)

Eerste

de waarde in het eerste record

Laatste

de waarde in het laatste record

Een rekenkundige query stellen we als volgt op:


 Open het queryvenster om een nieuwe query te maken via het lint
Maken, groep Overige, knop Queryontwerp.
 Voeg op de bekende manier alle betrokken tabellen weer toe. We
bepalen als eerste voorbeeld de gemiddelde prijs van de door ons
aangeboden reizen, dus selecteer alleen de tabel Reis.
 Plaats het veld waarop de rekenkundige bewerking moet worden
uitgevoerd, in ons geval Prijs per persoon. Druk hierna op de knop
8 totalen in het lint Ontwerpen. Er wordt nu een regel toegevoegd
aan het query-ontwerpscherm, de regel Totaal. In de regel Totaal
wordt de tekst Group By weergegeven. Klik met de muiscursor
eenmaal op de tekst Group By en gebruik het driehoekje om het
bijbehorende menu te tonen. Kies in het getoonde menu de gewenste functie, in ons geval de functie Gem, zie guur 5.27.
De uitvoer wordt nu in slechts n regel getoond. De prijzen per
persoon worden niet meer getoond, alleen het gemiddelde van die
prijzen. Er wordt automatisch een nieuwe kopregel gemaakt, zie
guur 5.28.

112

Databaseontwikkeling 4 Access 2007

Figuur 5.27

Figuur 5.28

Eigenlijk willen we bij de uitvoer netjes het kopje Gemiddelde bedrag zien. Dat kunnen we bereiken door in het ontwerpscherm van
de query in de regel Veld de tekst Prijs per persoon te vervangen
door de door ons gewenste tekst Gemiddelde bedrag: Prijs per
persoon. Vergeet daarbij niet om de dubbele punt te plaatsen, zie
guur 5.29.

5 Eenvoudige bewerkingen in Access

113

Figuur 5.29

De uitvoer ziet er nu netter uit, zie guur 5.30.


Figuur 5.30

We hebben in het voorgaande voorbeeld alle bestemmingen bij


het gemiddelde betrokken. Stel dat we het gemiddelde willen zien
van alleen de reizen naar Spanje. Dan moeten we ook de tabel
Bestemming bij de query betrekken en het veld Land in de query
opnemen. Bij dit veld plaatsen we dan de betreffende voorwaarde.
In een query met alleen totalen wordt slechts n regel getoond.
Hierdoor moet voor iedere veld in die query een optie in de regel
Totaal gebruikt worden! We hebben de keuze uit Group By (wordt
in een volgende paragraaf toegelicht), de rekenkundige opties en
de optie Waar. Die laatste optie wordt toegepast als het veld gebruikt wordt voor een voorwaarde (Waarvoor geldt dat). Het
vinkje bij de optie Waar wordt automatisch weggehaald, zie guur
5.31.

114

Databaseontwikkeling 4 Access 2007

Figuur 5.31

Het veld Land kan niet meer worden getoond. De eerste kolom levert altijd n waarde op, als er acht reizen naar Spanje zijn, zou de
tweede kolom acht keer Spanje tonen. Dat kan niet, alle kolommen
moeten gelijke rijen tonen. Zelfs als er slechts n reis naar Spanje
is, is het niet toegestaan. In een volgende paragraaf leren we een
manier om naast het gemiddelde ook het land te tonen.
Opgave
5.6 Maak gebruik van de database Reisbureau. Zorg ervoor dat alle
uitvoer netjes wordt getoond.
a. Wat is de gemiddelde duur van alle door het reisbureau aangeboden reizen? We vinden als het goed is 14,72.
b. Hoeveel klanten heeft het reisbureau? We vinden als het goed is
27.
c. Hoeveel reizen zijn er geboekt naar Frankrijk? We vinden er
drie.
d. Wat is het totale aantal kinderen dat via het reisbureau op reis
gaat of is gegaan? We vinden er als het goed is 28. Let op: het
antwoord 33 is dus echt fout!
e. Wat is het hoogste bedrag dat inmiddels betaald is voor een reis
door een klant die langer dan 14 dagen op reis gaat? We vinden
als het goed is 4000.

5 Eenvoudige bewerkingen in Access

5.7.3

115

Gegevens opvragen, geavanceerde selectiequery

De querys zoals we die tot nu toe hebben gemaakt, zijn vaste


querys. Ze geven altijd antwoord op dezelfde vragen, bijvoorbeeld
welke klanten een reis naar Azi hebben geboekt. Om een soortgelijk overzicht te krijgen van de klanten die een reis naar NoordAmerika hebben geboekt, moeten we een nieuwe query aanmaken,
met een iets andere voorwaarde. Op deze manier ontstaan er echter
erg veel querys die eigenlijk in niets van elkaar verschillen, alleen
een kleine wijziging in een voorwaarde.
Het is mogelijk om querys exibeler te maken en bij het uitvoeren
van de query te laten vragen om de waarde van het selectiecriterium. Voordat de query wordt uitgevoerd, wordt dan eerst het
gewenste werelddeel gevraagd, waarna op basis van het gegeven
antwoord de uitvoer wordt gegenereerd.
Om een exibele query te maken moeten we bij de betreffende
voorwaarde (het criterium) een vraag opgeven. Tijdens het uitvoeren van de query zal de vraag vervangen worden door een door de
gebruiker ingetoetste waarde. De vraag dient tussen rechte haken
te worden geplaatst. In guur 5.32 staat aangegeven hoe we het
criterium moeten invullen om ervoor te zorgen dat Access eerst
zal vragen om het gewenste werelddeel en pas daarna de query
uitvoert.
Figuur 5.32

116

Databaseontwikkeling 4 Access 2007

Na uitvoering van de query verschijnt eerst het scherm uit guur


5.33, waarin om het gewenste werelddeel wordt gevraagd.
Figuur 5.33

Het is ook mogelijk om in een query een rekenveld op te nemen.


Een rekenveld is een veld dat niet daadwerkelijk bestaat, een
virtueel veld. Het is dus geen onderdeel van een van de tabellen,
maar een (tijdelijk) veld dat we een naam kunnen geven en kunnen
voorzien van een inhoud. Omdat we de inhoud meestal krijgen via
het laten uitvoeren van een berekening, heet een dergelijk veld een
rekenveld.
Stel dat we bij het reisbureau de regel hanteren dat een reis binnen
30 dagen na de boekdatum moet zijn betaald. We willen deze uiterste betaaldatum opnemen in de query die naam, woonplaats, telefoonnummer en uiterste betaaldatum toont. Dit doen we als volgt:
 Open het queryvenster om een nieuwe query te maken en selecteer
de tabellen, zie guur 5.34. Plaats de velden naam, woonplaats en
telefoonnummer.
 Zet in een lege kolom, op de regel Veld de naam van het nieuwe
veld, bijvoorbeeld Uiterste datum:. Let erop dat we ook de dubbele
punt moeten opnemen.
 Plaats achter deze dubbele punt de berekening zelf [Boekdatum] +
30. Denk eraan dat bij gebruik van veldnamen in de berekening de
veldnaam tussen rechte haken geplaatst moet worden, zie de vierde
kolom guur 5.34.
 Behandel het veld verder alsof het een normaal, bestaand veld is;
we kunnen dus sorteren, voorwaarden opgeven, enzovoort.
 Komt de betreffende veldnaam in meer dan n tabel voor, geef
dan ook op uit welke tabel het veld afkomstig is, bijvoorbeeld
[Boeking].[Boekdatum] + 30. Dus de naam van het veld vooraf laten gaan door de naam van de tabel (tussen rechte haken), gevolgd
door een punt.

5 Eenvoudige bewerkingen in Access

117

Figuur 5.34

In het zojuist besproken voorbeeld geldt voor iedere reis dat er uiterlijk binnen dertig dagen na de boekdatum moet zijn betaald. Stel
dat we dit alleen willen hanteren bij reizen waarvan de prijs minder dan 1000, bedraagt. Voor alle andere reizen willen we een
periode van 45 dagen hanteren. Dan geldt dat de uiterste datum afhankelijk is van de prijs. We kunnen dan twee querys maken, een
met de voorwaarde prijs per persoon kleiner dan 1500. De tweede
met de voorwaarde groter of gelijk aan 1500. Uiteraard beide met
de juiste berekening. Het kan ook met n query door gebruik te
maken van de functie IIf.
Deze functie zijn we misschien eerder als IF (als) tegengekomen
bij Excel. De functie luidt:
IIf ( [Prijs per persoon] < 1000 ; [Boekdatum] + 30;
[Boekdatum]+45 )
De functie kent drie argumenten. Het eerste argument bevat de
voorwaarde: is de inhoud van het veld Prijs per persoon minder
dan 1000? Het tweede argument bevat de uitkomst van de functie
indien aan de voorwaarde is voldaan. In het voorbeeld wordt dan
dus de inhoud van het veld Boekdatum verhoogd met 30. Het derde
argument bevat de uitkomst van de functie indien niet aan de voorwaarde wordt voldaan. Er geldt dan dus een periode van 45 dagen.
Let erop dat alle veldnamen tussen rechte haken staan vermeld en
dat de argumenten van de functie van elkaar worden gescheiden
door een puntkomma. Het kan zijn dat bij de gebruikte versie van
Access een ander scheidingsteken, bijvoorbeeld de komma,

118

Databaseontwikkeling 4 Access 2007

gebruikt moet worden. Dat is mede afhankelijk van de instellingen


van Windows.
De volledige inhoud van het rekenveld wordt nu:
Uiterste datum : IIf ( [Prijs per persoon] < 1000 ; [Boekdatum] +
30 ; [Boekdatum] + 45 ).
Opmerkingen
Als je tekstvelden of datumvelden opneemt, dan moet de
tekst tussen staan en datums tussen ##. Bijvoorbeeld
IIf([Werelddeel]=West-Europa ) of IIf([Vertrekdatum] >
#1-4-2010# ). Access zal in de meeste gevallen zelf de of ##
plaatsen, maar soms gaat het mis en dan moeten we dat handmatig
corrigeren.
Een rekenveld kan wel eens complex zijn. Bijvoorbeeld het totale bedrag van de reis, aangenomen dat kinderen voor half
geld meegaan, Te betalen: [Aantal volwassenen]*[Prijs per
persoon]+[Aantal kinderen]*[Prijs per persoon]*0,5. Ga dan
als volgt te werk. Plaats alle benodigde velden. Sla vervolgens de
query op. Verplaats de muiswijzer in de lege kolom waarin het
rekenveld moet komen. Selecteer hierna via de rechtermuisknop
Opbouwen. Er volgt nu een venster waarin de benodigde velden
voor het rekenveld eenvoudig te plakken zijn.
In het algemeen geldt dat wanneer we werken met querys de kans
bestaat dat er in de uitvoer dubbele rijen voorkomen. Een query die
de namen en adressen oplevert van alle klanten die ooit een reis
naar Spanje hebben geboekt, zal ongetwijfeld klanten tonen die
meer dan eens aan een dergelijke reis hebben deelgenomen. Willen
we elke klant toch maar n keer zien, dan kunnen we daarvoor
zorgen. Klik in de ontwerpweergave van de query in het lint
Ontwerpen op de knop Eigenschappenvenster of druk op de F4toets. Het eigenschappenvenster wordt geopend. Klik met de muis
ergens in het lege gedeelte van het queryvenster (dus niet in de
tabellen of kolommen). De queryeigenschappen worden getoond in
het eigenschappenvenster. We kunnen nu een aantal eigenschappen
opgeven, zie guur 5.35.
Met de eigenschappen Unieke waarden en Unieke records kunnen
we dubbele rijen onderdrukken. Kiezen we voor unieke waarden,

5 Eenvoudige bewerkingen in Access

119

dan wordt er alleen gekeken of de getoonde velden (tezamen) uniek


zijn. Kiezen we voor unieke records, dan wordt naar alle velden
van de betrokken records (rijen) gekeken, ook als deze velden
niet op het scherm worden getoond. Daardoor kan het lijken of er
wel degelijk sprake is van dubbele waarden in de uitvoer. Op het
scherm is dat dan ook zo, maar zouden we alle velden van de
betrokken records laten tonen, dan blijken ze wel degelijk uniek
te zijn. Voor unieke uitvoer op het scherm kiezen we dus voor
unieke waarden.
Figuur 5.35

Opgave
5.7 a. Maak gebruik van de database Reisbureau. Verzorg een overzicht met alle gegevens van de klanten uit een door de gebruiker
in te toetsen woonplaats.
b. Toon de klantgegevens van de klanten die vertrekken op een
door de gebruiker in te voeren vertrekdatum. Toon naam,
woonplaats, telefoonnummer en de vertrekdatum.
c. Men denkt eraan de prijs per persoon voor reizen die langer dan
15 dagen duren, een korting van 5% te geven. Laat een overzicht afdrukken met daarin de volgende gegevens: plaatsnaam,
land, vertrekdatum, standaardprijs en prijs inclusief 5% korting.
Sorteer het overzicht op plaatsnaam.
Aanwijzing: gebruik voor de prijs inclusief korting een rekenveld.

120
120

Databaseontwikkeling 4 Access 2007

d. Men denkt eraan om voor de periode mei 2010 (vertrekdatum)


de prijzen per persoon met 5% te verlagen. Verzorg een overzicht met reisnummer, vertrekdatum, prijs per persoon, kortingbedrag en het nieuwe bedrag.
Aanwijzing: gebruik rekenvelden voor korting en nieuw bedrag.
Bij nieuw bedrag kun je gebruik maken van het rekenveld korting.
e. Ten gevolge van milieueisen is besloten dat op reizen een extra
brandstoftoeslag wordt geheven. Buiten West-Europa bedraagt
de toeslag 45, per reis per persoon, binnen West-Europa
geldt een opslag van 11,25. Verzorg een overzicht met daarin
het reisnummer, de plaats van bestemming, het werelddeel en
de te heffen toeslag. Aanwijzing: denieer de toeslag als rekenveld en maak gebruik van de functie IIf

5.7.4

Gegevens groeperen, group-by-query

Tot nu zijn querys aan bod geweest waar gegevens per record
werden gepresenteerd. Soms hebben we echter de behoefte om
per groep records iets te bepalen; bijvoorbeeld per woonplaats het
aantal klanten, of per reis het aantal boekingen, of per land van
bestemming de hoogste reisprijs. We groeperen daarbij een aantal
gegevens en bepalen van de groep de som, het aantal, het maximum, enzovoort. Per groepje gegevens laten we dit vervolgens op
het scherm tonen. De optie Group By wordt veel toegepast voor
management informatie. Bijvoorbeeld, geef over het afgelopen
kwartaal de totale afzet per artikel of per klant de totale omzet
over het afgelopen jaar. Een dergelijke query maken we als volgt:
 Zorg dat het query-ontwerpvenster actief is.
 Plaats de benodigde tabellen voor de query.
 Selecteer de gewenste velden en klik vervolgens op de knop
8 Totalen in het lint Ontwerpen. Deze optie hebben we in een vorige paragraaf ook al toegepast om rekenkundige berekeningen uit
te voeren.
In guur 5.36 is gebruikgemaakt van de tabellen Bestemming en
Reis. Per land van bestemming is hier de maximumprijs, de gemiddelde prijs en het aantal reizen bepaald. Er is twee keer Prijs per
persoon gebruikt, een keer voor het maximum en een keer voor

5 Eenvoudige bewerkingen in Access

121

het gemiddelde. Reisnummer is toegevoegd om het aantal reizen


te tellen. Door de keuze Group By voor het veld Land zal nu van
ieder land een groep worden gemaakt, dat maar n keer wordt
getoond. Een rekenkundige functie op dezelfde regel werkt nu op
de groepen. Nu wordt per land, het land zelf, de maximale prijs per
persoon, de gemiddelde prijs per persoon en het aantal reizen naar
dat land getoond.
Figuur 5.36

We kunnen bij het groeperen onder andere de volgende functies


gebruiken:
Functie

Berekent (per groep)

Som

het totaal van het veld

Gem

de gemiddelde waarde van het veld

Min

de kleinste waarde in het veld

Max

de grootste waarde in het veld

Aantal

het aantal keren dat er in het veld iets is ingevuld

Eerste

de waarde in het eerste record

Laatste

de waarde in het laatste record

(niet leeg)

Als we gegevens groeperen (Group By) en een voorwaarde in


een rekenkundige kolom plaatsen (Aantal, Som, etc.), dan geldt
die voorwaarde voor de groep. Dat wil zeggen dat er eerst wordt
gegroepeerd en dat er pas op het moment van afdrukken wordt
gekeken naar het opgegeven criterium. Alleen groepen die voldoen
aan het criterium worden opgenomen in het overzicht. In de query

122

Databaseontwikkeling 4 Access 2007

die in guur 5.37 is afgebeeld wordt per land van bestemming het
aantal georganiseerde reizen getoond, als de gemiddelde prijs van
die reizen hoger is dan 1500. Hierbij wordt dus niet gekeken naar
de afzonderlijke reizen, maar alleen naar de reizen als groep.
Figuur 5.37

Wat nu als we per afzonderlijke reis ook nog een beperking willen
opleggen? Bijvoorbeeld dat we alleen naar de reizen willen kijken
die precies drie weken duren? In dat geval plaatsen we een extra
kolom, met daarin opgenomen het veld waarop de beperking van
toepassing moet zijn. In de regel Totaal selecteren we de optie
Waar. Ten slotte plaatsen we het criterium 21. We krijgen dan de
query zoals deze in guur 5.38 staat weergegeven.
Figuur 5.38

5 Eenvoudige bewerkingen in Access

123

Allereerst worden nu de reizen geselecteerd die voldoen aan de


voorwaarde dat deze 21 dagen duren. Vervolgens worden deze reizen per land van bestemming gegroepeerd en worden de gegevens
per groepje weergegeven. Tenminste als voor de groep als geheel
geldt dat de gemiddelde prijs hoger is dan 1500! Let erop dat de
kolom waar de optie Waar gebruikt wordt, nooit getoond wordt in
het overzicht. Het gaat hier namelijk niet om een groepsgegeven,
maar om een gegeven van de individuele records! Access verwijdert daarom automatisch het vinkje in de weergaveregel.
Je kunt op meerdere velden tegelijk groeperen. Als je naast het
land ook het werelddeel wilt tonen, dan voeg je ook werelddeel toe
aan de velden, zie guur 5.39.
Figuur 5.39

Er worden nu groepen gemaakt van Land + Werelddeel. Aangezien


een land maar n werelddeel heeft zal het aantal groepen gelijk
zijn aan groeperen op uitsluitend Land. In de uitvoer zal dan naast
het land ook het werelddeel worden getoond, zie guur 5.40 voor
een gedeeltelijke uitvoer.
Figuur 5.40

124

Databaseontwikkeling 4 Access 2007

Zouden we echter de plaats van het land willen weergeven, dan


wordt er gegroepeerd op Land + Plaats, zie guur 5.41.
Figuur 5.41

Omdat een land meerdere plaatsen heeft, zal nu per land meerdere
rijen optreden. Je hebt nu niet meer het aantal reizen per land,
maar het aantal reizen per plaats (binnen het land), zie guur 5.42
voor een gedeeltelijke uitvoer.
Figuur 5.42

Opgave
5.8 a. Maak gebruik van de database Reisbureau. Bepaal per land van
bestemming het aantal reizen naar dat land. Toon per land het
gevonden aantal. (Je vindt 15 landen en voor Frankrijk 3 reizen).
b. Bepaal per plaats het aantal boekingen, toon de plaats van bestemming en de gevonden aantallen in volgorde van oplopende
aantallen. (Je vindt 21 plaatsen en voor Shanghai 2 boekingen).

5 Eenvoudige bewerkingen in Access

125
125

c. Bepaal per woonplaats het totale aantal volwassen personen


voor wie een reis is geboekt. (Als het goed is vind je 19 plaatsen
met bijbehorende aantallen, bijvoorbeeld bij Rotterdam 12, niet
16).
d. Bepaal per reis het aantal boekingen. Toon reisnummer, plaats
van bestemming en aantal boekingen. Alleen reizen die in mei
2010 vertrekken mogen in het overzicht voorkomen. (Je vindt
20 reizen en voor Bangkok 3 boekingen).
e. Bepaal voor reizen binnen West-Europa per land het aantal
reizen naar dat land. Alleen landen waar meer dan twee reizen
naartoe gaan mogen worden getoond, op volgorde van dalend
aantal reizen. (Je vindt drie landen).
f. Bepaal per land de laagste en hoogste prijs voor een reis, gesorteerd op laagste prijs. (Je vindt 15 landen en voor Duitsland
89,00 en 465,00)

5.7.5

Gegevens wijzigen, bijwerkquery

Het is mogelijk om grote hoeveelheden gegevens in de database


door een query te laten wijzigen. Per 1 januari een prijsstijging van
3% doorvoeren voor alle artikelen of een aeverdatum met een
dag vervroegen voor alle orders geplaatst in juli 2010. We kunnen
hiervoor een bijwerkquery (update query) gebruiken. Een dergelijke query toont dus niets op het scherm, maar zal waarden in de
database automatisch aanpassen. Bijvoorbeeld: door het teruglopen
van het aantal boekingen geef je voor alle reizen die vertrekken in
mei 2010 een korting van 75,00 op de prijs per persoon.
 Maak een nieuwe query (lint Maken, Queryontwerp) en selecteer
de tabel Reis.
 Standaard wordt een selectiequery getoond, dat moet nu gewijzigd worden in een bijwerkquery (update query). Klik in het lint
Ontwerpen, groep Querytype op de knop Querytype: bijwerken.
 In het onderste deel van het queryvenster staat nu een regel
Wijzigen in. Hierin moeten we de nieuwe waarde opgeven met de
formule [Prijs per persoon] 75. Niet alleen 75, want alle prijzen
zouden dan 75,00 worden!
 Maak nog een voorwaarde omdat de korting alleen voor de maand
mei geldt, zie guur 5.43.

126

Databaseontwikkeling 4 Access 2007

Figuur 5.43

 Voer de query uit (lint Ontwerpen, knop Uitvoeren). Er zal een


waarschuwing volgen. Er worden immers direct in de database
waarden veranderd. Als je de waarschuwing accepteert zullen
de records gewijzigd worden. Er verschijnen geen records op het
scherm, dus je moet de query niet nog een keer uitvoeren. De prijs
zou dan met 150,00 verlaagd zijn! Je kunt de wijzigingen alleen
in de tabel zelf bekijken.
Opmerking
Het kan zijn dat door een beveiligingswaarschuwing van Access
deze query niet wordt uitgevoerd. Je kunt de beveiligingswaarschuwing een keer uitschakelen, maar beter is het om de gehele
database aan een vertrouwde map toe te kennen. In bijlage B
(Categorie Vertrouwenscentrum) staat beschreven hoe je eenvoudig vertrouwde mappen maakt om dit op te lossen.
In guur 5.44 staat nog een voorbeeld getoond. De prijs per persoon wordt voor reizen duurder dan 1000,00 met 100,00 verlaagd, in plaats van 75,00. Dit kan natuurlijk ook met twee afzonderlijke querys.
5.7.6

Gegevens verwijderen, verwijderquery

Het is mogelijk om volledige records in de database in n keer


automatisch te laten verwijderen. Bijvoorbeeld alle verkooporders
vr 2008. Of alle artikelen verwijderen die uit het assortiment zijn
genomen. Er kunnen wel problemen optreden. Als we artikelen uit
het assortiment wilt verwijderen, hoe zit het dan met (oude) orders

5 Eenvoudige bewerkingen in Access

127

Figuur 5.44

waar die artikelen nog op staan? Of we willen een klant verwijderen, maar die klant heeft nog (oude) orders.
Het verwijderen van records is denitief, het is niet terug te draaien. Maak daarom eerst een selectiequery die de records toont die
verwijderd moeten worden. Daarna kun je de query direct omzetten naar een verwijderquery. Voordat je dat doet is het verstandig
om eerst een back-up van je database te maken Microsoft Ofceknop, Beheren, Back-up maken van de database. Verder is het van
belang dat gerelateerde records standaard niet verwijderd worden.
Als we een klant proberen te verwijderen en die klant heeft een
reis geboekt, zal Access deze verwijdering niet accepteren. Om dat
toch mogelijk te maken moet een eigenschap van de relatie tussen
de tabel Klant en Boeking aangepast worden. Het is verstandig bij
het verwijderen van records een stappenplan te volgen.
Bijvoorbeeld: verwijder alle reizen met een vertrekdatum vr
1-1-2009.
1. Open de tabellen in de query.
Maak een query en selecteer de tabel waaruit records verwijderd
moeten worden, eventueel aangevuld met tabellen die nodig zijn
voor het selectiecriterium.
 In ons voorbeeld alleen de tabel Reis, via het lint Maken, groep
Overige, Queryontwerp.
2. Controleer n-op-veel-relaties.
Als de tabel waaruit records worden verwijderd naar een andere
tabel een veel-relatie heeft, zal uit die andere tabel ook records
verwijderd moeten worden. De relatie tussen die tabellen zal dan
aangepast moeten worden.

128

Databaseontwikkeling 4 Access 2007

 Klik in het lint Hulpmiddelen voor databases, groep Weergeven/


verbergen, op de knop Relaties. In ons voorbeeld zien we dat de
tabel Reis een n relatie heeft naar de tabel Bestemming en een
veel relatie naar de tabel Boeking, zie guur 5.20. De relatie tussen
Reis en Boeking moet aangepast worden. De relatie tussen Reis en
Bestemming hoeft niet aangepast te worden, omdat de tabel Reis
een n relatie heeft met Bestemming. Alleen veel-relaties moeten
aangepast worden.
 Klik met de rechtermuisknop op de relatie tussen Reis en Boeking
(de lijn) en selecteer Relatie bewerken, zie guur 5.19. Plaats een
vinkje bij Gerelateerde records trapsgewijs verwijderen. Het is
verstandig deze optie na het verwijderen van de records weer ongedaan te maken! Het kan anders voorkomen dat je ongewenst
records trapsgewijs gaat verwijderen.
 Sluit het relatievenster.
3. Selecteer de records die verwijderd worden.
 Dubbelklik op het *-symbool in de tabel Reis. Hierdoor worden
alle velden geselecteerd uit de tabel Reis. Bij verwijderen van records verwijder je immers alle velden.
 Selecteer vervolgens de velden die nodig zijn voor de voorwaarde.
In ons voorbeeld Vertrekdatum. Plaats hieronder de gewenste voorwaarde, zie guur 5.45.
Figuur 5.45

5 Eenvoudige bewerkingen in Access

129

 Voer de query nu uit (runnen) via het lint Ontwerpen, groep


Resultaten, knop Uitvoeren. De records die verwijderd worden,
verschijnen in het venster. Hiermee kun je controleren of dit correct is. In onze database hebben we geen records met een vertrekdatum voor 2009. Om deze query te proberen moet je eerst een reis
toevoegen met een vertrekdatum in 2008 en deze reis ook eventueel boeken.
4. Verwijder de geselecteerde records
 Zet de query weer in de ontwerpweergave, via het lint Start, groep
Weergaven, knop Ontwerpweergave.
 Klik in het lint Ontwerpen, groep Querytype, op de knop
Querytype: verwijderen. De selectiequery is gewijzigd in een verwijderquery. In de verwijderquery is nu een rij Verwijderen waarin
nu Van en Waar is geplaatst, zie guur 5.46.
Figuur 5.46

 Voer de query opnieuw uit. Er volgt een waarschuwing dat er records denitief verwijderd worden, accepteer dit. Als de query niet
wordt uitgevoerd, zie dan de opmerking in de vorige paragraaf.
Denk eraan om de gewijzigde relatie-eigenschap weer te herstellen
uit stap 2.
Opmerking
Het kan voorkomen dat je in stap 3 dubbele records te zien krijgt.
Dat is niet toegestaan bij een verwijderquery. Dit treedt bijvoor-

130

Databaseontwikkeling 4 Access 2007

beeld op als je ook de tabel Boeking opent in verband met een


voorwaarde. Als de reis nu meerdere keren is geboekt, zal ook
meerdere keren dezelfde reis worden getoond. De verwijderquery
zal dan niet uitgevoerd worden. We kunnen dit oplossen door
het eigenschappenvenster van de query te openen en eigenschap
Unieke records op Ja in te stellen, zie guur 5.35.
Opgave
5.9 a. Maak gebruik van de database Reisbureau. Verlaag voor de
periode mei 2010 (vertrekdatum) alle prijzen per persoon met
75,00. (Maak eerst een kopie van je database via Microsoft
Ofce-knop, Opslaan als of Beheren, Back-up maken van de
database.
b. Verhoog alle prijzen. De prijs moet worden verhoogd met 3%,
mits de huidige prijs ligt tussen 1000, en 1500,. Ligt de
prijs buiten dit bereik (dus onder de 1000, of boven de
1500,) verhoog dan de prijs met 4,5 %. Aanwijzing: gebruik
hier de functie IIf.
c. Maak een kopie van de database en voer de volgende acties in
deze kopie uit! Bepaal het totale aantal boekingen. Bepaal ook
het totale aantal boekingen dat door klanten uit Rotterdam is
gemaakt. Maak een query waarbij alle Rotterdamse klanten
worden verwijderd, volg hierbij het stappenplan. Controleer of
inderdaad alle Rotterdammers zijn verwijderd. Bepaal nu opnieuw het aantal boeking en controleer of dit aantal klopt.

5.7.7

Overige querys

Naast de hiervoor besproken querys (selectie, bijwerk en verwijder) kunnen we ook querys deniren om een nieuwe tabel aan
te maken of een bestaande tabel uit te breiden. Hiertoe ontwerpen
we eerst een normale selectiequery. Gewoonlijk wordt hiervan de
uitvoer op het scherm getoond. We kunnen echter de uitvoer ook
gebruiken om een nieuwe tabel aan te maken. Alle uitvoer wordt
dan in de nieuwe tabel opgenomen. De velden van de nieuwe tabel
worden bepaald door de velden zoals die in de uitvoer voorkomen. Na het testen van de normale query selecteren we in het lint
Ontwerpen, groep Querytype, de knop Querytype: tabel maken.

5 Eenvoudige bewerkingen in Access

131

Er volgt een venster waarin om een naam van de nieuwe tabel


wordt gevraagd. Hierna kunnen we de query uitvoeren. Er wordt
een nieuwe tabel gemaakt met hierin de geselecteerde velden en
records.
Op soortgelijke wijze kunnen we de uitvoer van een normale query
laten toevoegen aan een reeds bestaande tabel. Daartoe selecteren we, nadat de query is getest, via het lint Ontwerpen, groep
Querytype, de knop Querytype: toevoegen. We moeten nu een
tabelnaam selecteren waaraan de records worden toegevoegd. Als
alle veldnamen hetzelfde zijn, kunnen we direct de query uitvoeren. Als veldnamen verschillend zijn in de tabellen, selecteren we
in de regel Toevoegen aan, de juiste veldnaam of laat deze leeg als
we die niet willen invullen. Laat daarna de query uitvoeren.
Er bestaan nog drie handige mogelijkheden met querys. Er bestaat een mogelijkheid om naar dubbele records te zoeken. Daarbij
kunnen we in een tabel laten zoeken naar records waarvoor geldt
dat in de door ons opgegeven velden, waarden meer dan n keer
voorkomen. Records die daaraan voldoen worden opgenomen in de
uitvoer. Het tweede type biedt de mogelijkheid om te zoeken naar
Niet-gerelateerde records. Daarbij laten we Access zoeken naar
records in een tabel waarvoor geen bijbehorende records in een
andere tabel worden aangetroffen. We kunnen zelf opgeven hoe
op basis van een gemeenschappelijk veld de relatie tussen de
beide tabellen wordt gelegd. Hiermee kunnen we bijvoorbeeld snel
een overzicht maken van de klanten zonder boeking, of van bestemmingen zonder reizen. De laatste optie biedt de mogelijkheid
kruistabellen (draaitabellen) te maken, zoals in Excel, zie ook paragraaf 6.7. Selecteer in het lint Maken, voor Wizard query. Kies nu
voor Wizard dubbele records, Wizard niet-gerelateerde records of
Wizard kruistabelquery. Volg hierna de instructies van de wizard.
5.7.8

Toepassing van relaties, referentile integriteit

Het begrip referentile integriteit is direct verbonden met de relaties die bestaan tussen de diverse tabellen. Tussen de tabellen
Boeking en Klant ligt een relatie op basis van Klantnummer, het is
niet toegestaan om een boeking in te voeren voor een klant die nog
niet bestaat. We kunnen ook zeggen dat het alleen mogelijk is om
boekingen in te voeren voor klanten die al bestaan, die dus eerder
zijn ingevoerd.

132

Databaseontwikkeling 4 Access 2007

Als we in de tabel een boeking moet invoeren, dan moet o.a. het
klantnummer worden ingevuld. Als de klant voor je zit, weet je
waarschijnlijk wel de naam van de klant, maar niet het klantnummer. Hetzelfde geldt voor het reisnummer. Je weet dat de klant
voor 15 dagen naar Alanya gaat, op 5 juni 2010, maar je kent het
reisnummer niet uit je hoofd.
In Access is het mogelijk om tijdens het invoeren van gegevens
keuzelijsten te tonen. Bij alle vreemde sleutels (veeltakken in het
relatieschema tussen twee tabellen) is een keuzelijst te maken.
Bijvoorbeeld Klantnummer in Boeking (veeltak in het relatieschema) verwijst naar Klantnummer in Klant (1-tak in het relatieschema). Bij Klantnummer in Boeking is dus een keuzelijst te maken
met daarin de gegevens van alle klanten gesorteerd op naam klant.
Alleen uit deze gegevens kan dan gekozen worden, zie guur 5.47.
Figuur 5.47

Hierdoor wordt het voor de persoon die de gegevens moet invoeren


eenvoudig om de juiste klant op te zoeken en in te voeren. Na het
selecteren wordt het bijbehorende klantnummer ingevoerd. Voor
reisnummer is ook een keuzelijst te tonen met daarin een lijst van
alle voorkomende reizen met relevante informatie.
Om te zorgen dat bij een boeking gekozen kan worden uit bestaande klanten, ga je op de volgende wijze te werk.

5 Eenvoudige bewerkingen in Access

133

 Open de tabel Boeking in de ontwerpweergave.


 Plaats de cursor in het veld Klantnummer en selecteer, onderin het
scherm, tabblad Opzoeken. Een aantal velden van dit tabblad moet
ingevuld worden.
 Selecteer uit de eerste rij Weergave besturingselement de optie
Keuzelijst met invoervak, zie guur 5.48. Het verschil tussen een
keuzelijst met invoervak ten opzichte van een keuzelijst is dat met
de eerste keuzelijst je ook de waarde kan invoeren via het toetsenbord, als je de waarde weet. In de praktijk komt die optie het meest
voor, omdat nummers en codes vaak bekend zijn.
Figuur 5.48

 We willen de gegevens laten opzoeken vanuit een andere tabel, dus


bij Type rijbron kiezen we Tabel/query.
 Plaats de cursor in het veld Rijbron.
 We kunnen nu een opdracht (query) opstellen waarmee de gewenste klantgegevens wordt bepaald. Klik op de knop met de drie
puntjes. Het bekende queryvenster wordt getoond.
 We willen klantgegevens tonen, dus selecteer alleen de tabel Klant.
 We zijn alleen genteresseerd in klantnummer (moet immers bepaald worden), naam, adres en woonplaats en sorteer op naam om
snel de klant te kunnen zoeken in de lijst, zie guur 5.49.

134

Databaseontwikkeling 4 Access 2007

Figuur 5.49

 Sluit vervolgens het queryvenster af waarbij je accepteert dat de


query wordt opgeslagen.
We keren nu weer automatisch terug in het tabelontwerp scherm.
Als we nu de keuzelijst zouden oproepen, wordt helaas van de
zojuist ontworpen query slechts n kolom getoond. We willen
er echter vier zien (klantnummer, naam, adres en woonplaats).
Daartoe moeten we nog een aantal velden van het tabblad invullen.
We moeten de volgende details over het uiterlijk van de keuzelijst
opgeven:
Afhankelijke kolom. Welke kolom uit de keuzelijst willen we
overnemen in het veld Klantnummer van de tabel Boeking? In ons
voorbeeld de eerste kolom uit de query, namelijk Klantnummer,
dus 1. Zet altijd het nummer of code dat je zoekt als eerste in de
query, dan hoeft je dit veld niet te wijzigen. Als we Klantnummer
op de vierde plaats zetten in de query, dan een 4 invullen.
Aantal kolommen. Hoeveel kolommen moeten in de keuzelijst
worden getoond? We hebben er vier geselecteerd (klantnummer,
naam, adres en plaats), dus 4.
Kolomkoppen. Moeten boven de kolommen in de opzoeklijst kopjes worden getoond of niet? We willen dit niet, dus Nee.
Kolombreedten. Hoe breed moeten de afzonderlijke kolommen
worden getoond? De afzonderlijke waarden van elkaar scheiden
door een puntkomma. Wij kiezen hier voor 3;4;4;4. Kies als vuistregel voor nummers/codes 3 cm en de overige velden 4 cm. Na het
invullen wordt automatisch cm geplaatst.

5 Eenvoudige bewerkingen in Access

135

Aantal rijen. Hoeveel rijen, records, moeten tegelijkertijd in de


opzoeklijst worden getoond? Standaard zijn dit er 16. Deze waarde
accepteren we.
Lijstbreedte. Wat moet de totale breedte van de opzoeklijst worden? Standaard staat er Automatisch. Dat is helaas niet bruikbaar.
Onze totale lijstbreedte is 15 cm. Onze individuele kolommen zijn
namelijk 3 cm, 4 cm, 4 cm en 4 cm.
Alleen lijst. Mag de invoer alleen worden geaccepteerd als deze
ook in de lijst voorkomt? In ons geval is dat zo, anders zouden we
een reis boeken voor klant die niet bestaat, dus Ja.
De overige argumenten laten we nog buiten beschouwing. In guur 5.50 staat het ingevulde tabblad weergeven.
Figuur 5.50

 Sluit de tabel, waarbij je de wijzigingen laat opslaan.


 Open nu de tabel Boeking en bekijk het resultaat door de cursor in
het veld Klantnummer te plaatsen.
Het resultaat is alleen zinvol bij het invoeren van een nieuwe klant.
Bij voorgaande boekingen kan zelfs per ongeluk een nieuw klantnummer worden geselecteerd met alle gevolgen van dien. Het is

136

Databaseontwikkeling 4 Access 2007

vanzelfsprekend mogelijk om wijzigingen alleen in nieuwe records


toe te staan. Dat wordt in het volgende hoofdstuk toegelicht.
Opmerkingen
1. We mogen in het queryvenster alleen de tabel Klant opnemen. We
kunnen dan beschikken over alle klantgegevens. Nemen we echter
(ten onrechte) ook de tabel Boeking op, dan zal Access direct zien
dat een relatie tussen deze twee tabellen bestaat en nu alleen nog
maar de klanten tonen die zowel in de tabel Klant als in de tabel
Boeking voorkomen. Klanten die nog nooit geboekt hebben, kun
je dan niet selecteren. Die komen immers niet voor in de tabel
Boeking.
2. Direct nadat de tabellen ontworpen zijn en nog geen relaties zijn
gelegd tussen de tabellen, kunnen we ook gebruik maken van
gegevenstype Wizard opzoeken. Open de tabel Boeking in de ontwerpweergave en selecteer Wizard opzoeken als gegevenstype voor
Klantnummer. Er nu een wizard die de keuzelijst voor je maakt en
de waarden in het tabblad Opzoeken automatisch invult. Ook de
relatie tussen de tabellen Boeking en Klant wordt gelegd (helaas
zonder referentile integriteit, dus handmatig later aanpassen).
Bovendien geeft de wizard geen optie om de query te sorteren, dus
sortering later handmatig aanpassen. Ook de optie Alleen lijst blijft
op Nee staan. In paragraaf 6.3 wordt de wizard verder toegelicht.
3. Ook is het mogelijk om keuzelijsten te maken waarin meerdere
waarden geselecteerd kunnen worden, zie paragraaf 6.3 voor een
voorbeeld.
Opgave
5.10 a. Maak gebruik van de database Reisbureau. Open de tabel
Boeking in de ontwerpweergave en zorg dat bij het veld
Klantnummer een keuzelijst met invoervak wordt getoond,
zoals in de paragraaf is toegelicht.
b. Plaats de tabel Boeking in de ontwerpweergave en zorg dat
bij het veld Reisnummer een keuzelijst met invoervak getoond
wordt.
Laat in de keuzelijst relevante gegevens tonen, dus niet alleen
het reisnummer uit de tabel Reis, maar ook de vertrekdatum en
aantal dagen uit de tabel Reis, en de plaatsnaam en het land van
bestemming uit de tabel Bestemming. Bedenk zelf een handige
sorteervolgorde.

5 Eenvoudige bewerkingen in Access

137
137

Let op! We kunnen in de keuzelijst het veld Reisnummer opnemen uit twee tabellen, de tabel Reis of de tabel Boeking. We
moeten kiezen voor het reisnummer uit de tabel Reis. In die
tabel zitten namelijk alle reizen die er bestaan. Kiezen we het
Reisnummer uit de tabel Boeking, dan komen we alleen reisnummers tegen waarvoor al een boeking bestaat!
c. Open de tabel Reis in de ontwerpweergave en zorg dat bij het
veld Bestemmingcode een keuzelijst wordt getoond. Hierin moet
weergegeven worden bestemmingcode, plaats en land, op volgorde van plaats.
d. Boek voor de familie Ruigrok uit Amsterdam een reis naar
Tanger op 24 mei 2010 voor twee volwassenen en twee kinderen. Er wordt niets aanbetaald.

5.8

Rapporten

Tot nu toe zijn alle overzichten op het scherm getoond. We hebben


ons daarbij voornamelijk beperkt tot de uitvoer van querys. Het
is mogelijk om de uitvoer op papier te verkrijgen. Daarbij kunnen
de gegevens op vele manieren worden gepresenteerd. We kunnen
lange lijsten laten genereren, maar ook gedetailleerde overzichten,
waarbij de gegevens gegroepeerd worden getoond, voorzien van
allerlei extra informatie, zoals tussentotalen en eindtotalen. De
informatie kan als afdrukvoorbeeld weergegeven worden, of direct
naar de printer gestuurd worden. We maken dan gebruik van rapporten
Er zijn drie manieren om een rapport te ontwerpen. We kunnen
gebruikmaken van een standaardrapport ofwel Rapport. Hiermee
kunnen we snel een rapport maken voor een tabel of query.
Daarnaast kunnen we gebruikmaken van de Wizard Rapport. We
worden dan aan de hand meegenomen tijdens het ontwerpen. We
kunnen de rapporten grotendeels naar eigen inzicht opmaken.
Ten slotte is het ook mogelijk rapporten handmatig te ontwerpen.
Daarbij moeten we alle handelingen zelf uitvoeren, maar in dat
geval kunnen we alles tot op detailniveau instellen. We kunnen het
handmatig ontwerpen ook gebruiken om een via een wizard gegenereerd rapport later met de hand te vervolmaken. Het zelf aanpassen en ontwerpen van rapporten wordt in hoofdstuk 7 besproken.

138

Databaseontwikkeling 4 Access 2007

5.8.1

Rapport ontwerpen (snelle methode)

Er is een snelle methode om een rapport te ontwerpen:


 Selecteer de tabel of query in het navigatiegedeelte van Access
waarvan je een rapport wilt maken. Selecteer als voorbeeld de tabel Reis.
 Klik in het lint Maken, groep Rapporten, op de knop Rapport. Het
rapport van de tabel wordt direct getoond in tabelindeling (rijen en
kolommen), zie guur 5.51. Je kunt eventueel het navigatiegedeelte
sluiten om wat meer ruimte op het scherm te creren.
Figuur 5.51

Het rapport wordt (nog) niet getoond als afdrukvoorbeeld, maar in


de indelingsweergave. In deze weergave kunnen we allerlei wijzigingen doorvoeren in het rapport. Wijzigingen die je doorvoert
worden direct getoond. Daarom wordt deze weergave veel gebruikt
bij het ontwerpen of aanpassen van rapporten. We kunnen bijvoorbeeld een kolom selecteren en deze naar een andere plaats slepen.
 Sleep bijvoorbeeld de kolom Reisnummer achter de kolom Prijs
per persoon. Je ziet dat alle kolommen direct worden herschikt.
 Ook kunnen we eenvoudig een kolom smaller of breder maken
door de rand te selecteren en die te slepen tot de juiste breedte.

5 Eenvoudige bewerkingen in Access

139

We kunnen de rijen een afwisselende achtergrondkleur geven, zoals tabellen of querys standaard worden weergegeven.
 Selecteer een rij door links van een rij te klikken, in het margegebied.
 Klik in de groep Lettertype op de knop Afwisselende opvulling/
achtergrondkleur.
 We kunnen nu een themakleur kiezen of een standaardkleur of
geen afwisselende kleur meer tonen. Selecteer Automatisch.
 Om het rapport te sorteren klik u, in de groep Groepering en totalen, op de knop Groeperen en sorteren. Er verschijnt een extra
groepeer- en sorteervenster onderaan het scherm, zie guur 5.51.
Het kan ook zijn dat dit extra venster er al staat, eventueel opnieuw
op de knop klikken.
 Klik op de knop Sortering toevoegen om te sorteren.
 Sorteer op Vertrekdatum.
 In het extra venster staat nu waarop gesorteerd is. Hierin kun
je ook selecteren van oud naar nieuw of van nieuw naar oud.
Selecteer van nieuw naar oud.
Als we naar de laatste regel van het rapport gaat (even naar beneden scrollen), staat onder de kolom Prijs per persoon de som van
alle prijzen weergegeven, echter niet met het valutasymbool.
 Selecteer het veld waarin de som van Prijs per persoon staat.
 Klik in het lint Opmaak, groep Opmaak, op de knop Valutanotatie
toepassen.
 Selecteer met de rechtermuisknop de kolom Reisnummer en kies
Totaal Reisnummer, Records tellen. Hierdoor wordt ook het aantal
reizen geteld.
 Selecteer met de rechtermuisknop de kolom Vertrekdatum en selecteer Datumlters, Alle datums in periode, juni.
Het rapport moet er nu ongeveer uitzien zoals getoond in guur
5.52.
Via het lint Opmaak kunnen we nog rasterlijnen laten weergeven, groep Rasterlijnen, of een andere opmaak selecteren,
groep AutoOpmaak. Verder kan op het lint Opmaak de weergave
veranderd worden, groep Weergaven. Er zijn vier weergaven:
Rapportweergave, Afdrukvoorbeeld, Indelingsweergave en
Ontwerpweergave.

140

Databaseontwikkeling 4 Access 2007

Figuur 5.52

 In de rapportweergave wordt het rapport nauwkeurig getoond,


waarin niet meer valt te wijzigen, maar nog wel te lteren (rechtermuisklik in een kolom) of te zoeken.
 In de weergave Afdrukvoorbeeld wordt het rapport getoond zoals
het afgedrukt wordt op papier. In het lint Afdrukvoorbeeld kunnen we nog instellingen veranderen of het rapport daadwerkelijk
afdrukken op papier. Sluit het afdrukvenster door te klikken op de
knop Afdrukvoorbeeld sluiten.
 In de indelingsweergave (of ontwerpweergave) kunnen we het lint
Pagina-instelling nog marges veranderen of het rapport liggend
afdrukken.
 In de ontwerpweergave kan het rapport tot in detail aangepast worden, bijvoorbeeld een kolomlabel afkorten.
Als we het venster van het rapport sluiten wordt om een naam van
het rapport gevraagd. Hierna wordt het in het navigatiegedeelte onder Rapporten getoond. Als je het rapport in het navigatiegedeelte
met de rechtermuisknop selecteert, kun je het rapport openen, in
een bepaalde weergave tonen of direct naar de printer sturen. In
hoofdstuk 7 wordt uitgebreid ingegaan op rapporten.

5 Eenvoudige bewerkingen in Access

141

Opmerkingen
1. Standaard wordt het rapport getoond met een tabelindeling (rijen
en kolommen). We kunnen ook kiezen voor een gestapelde weergave. Hierin worden de gegevens onder elkaar (gestapeld) weergegeven, in plaats van naast elkaar. Selecteer de gehele tabel via het
 -symbool (verplaatssymbool) of door op alle kolommen te klikken met de Shift-toets ingedrukt. Klik hierna in het lint Schikken,
groep Indeling bepalen, op de knop Gestapeld. We kunnen de
oude indeling weer herstellen via Ongedaan maken (op de werkbalk van Access of Ctrl-Z) of via de knop Tabelvorm). We kunnen
ook een gedeelte stapelen, door alleen de kolommen te selecteren
die we onder elkaar willen tonen.
2. Door een rapport te maken van een tabel of query ligt de uitvoer
in principe vast; bijvoorbeeld een overzicht van alle reizen binnen
West-Europa. Willen we de toepassingsmogelijkheden van een
rapport vergroten, dan is het verstandig deze te baseren op exibele querys. Doordat de gebruiker hier zelf (exibel) kan opgeven
welke selectiecriteria gelden, kan het rapport aan waarde winnen.
Met n rapport kan dan zowel een overzicht worden verkregen
van de reizen in West-Europa, maar ook van ieder ander werelddeel. Als je het nog professioneler wilt, bijvoorbeeld met keuzelijsten, zie dan paragraaf 8.2.
3. Als je wat meer ruimte wilt hebben bij het ontwerpen van formulieren, dubbelklik dan op een tab van het lint. Het lint wordt geminimaliseerd. Opnieuw dubbelklikken op de tab en het lint wordt
weer permanent getoond.
5.8.2

Rapport ontwerpen met de wizard

Als je een rapport wilt ontwerpen met meer opties, zoals groeperen
en sorteren, maak dan gebruik van de Wizard Rapport.
 Klik in het lint Maken, groep Rapporten, op de knop Wizard
Rapport. Het eerste scherm van de wizard verschijnt, zie guur
5.53.
In dit scherm kun je opgeven welke tabellen en/of querys en vooral welke velden er in het rapport worden opgenomen. We kunnen
meerdere tabellen of querys na elkaar selecteren en hiervan velden
op laten nemen in het rapport door ze naar het deel Geselecteerde
velden te verplaatsen.

142

Databaseontwikkeling 4 Access 2007

Figuur 5.53

 Selecteer uit Bestemming de velden Bestemmingcode, Plaats en


Land. Uit de tabel Reis alleen het veld Vertrekdatum. Kies vervolgens uit de tabel Boeking de velden Boekingnummer, Klantnummer
en Boekdatum. Als laatste uit de tabel Klant alleen het veld Naam,
zie guur 5.54. Klik hierna op de knop Volgende.
Figuur 5.54

We kunnen nu opgeven hoe de gegevens weergegeven moet worden, zie guur 5.55.
Access zal zelf, op basis van de gebruikte tabellen en de volgorde
bij het selecteren van de velden, een voorstel doen voor de weergave. We kunnen dit eventueel aanpassen door een van de getoonde
tabellen te selecteren. De bijbehorende indeling verschijnt in het
rechterdeel.

5 Eenvoudige bewerkingen in Access

143

Figuur 5.55

 Kies de indeling volgens Bestemming en klik op Volgende.


In het nu getoonde scherm (zie guur 5.56) kunnen we eventueel
nog extra groepeerniveaus opgeven door n van de velden waarop
kan worden gegroepeerd over te zetten naar het rechterdeel van het
scherm. De plaats waar de groep moet worden ondergebracht, kan
met de Prioriteit-knoppen worden aangepast. Met de knop Opties
voor groeperen kun je bijvoorbeeld de gegevens in groepjes van
tien stuks tonen.
Figuur 5.56

 Er zijn geen extra groepeerniveaus nodig, dus ga naar het volgende


scherm met de knop Volgende.

144

Databaseontwikkeling 4 Access 2007

 Sorteer het overzicht vervolgens op Naam en bij gelijke naam op


Boekdatum, zie guur 5.57. Ga hierna naar het volgende scherm
met de knop Volgende.
Figuur 5.57

Het volgende scherm (zie guur 5.58) biedt de mogelijkheid om


de lay-out (opmaak) voor het rapport op te geven. We hebben de
keuze uit drie verschillende mogelijkheden. Van de gekozen opmaak wordt het voorbeeld getoond. We kunnen hier ook opgeven
of het rapport staand of liggend moet worden afgedrukt. De optie
Veldbreedte aanpassen... kunnen we gebruiken om aan te geven
dat Access eventueel de breedte van de velden mag aanpassen,
zodat alle velden getoond kunnen worden.
Figuur 5.58

5 Eenvoudige bewerkingen in Access

145

 Kies als opmaak de indeling Blok en ga naar het volgende scherm


van de wizard.
We komen nu terecht in het voorlaatste scherm van de wizard, zie
guur 5.59. Hierin kunnen we de stijl van het rapport opgeven,
hierbij hebben we de keuze uit vele verschillende stijlen. Van iedere stijl wordt een voorbeeld getoond.
Figuur 5.59

 Selecteer de stijl Gieterij en ga naar het laatste scherm van de wizard.


In het laatste scherm van de wizard, guur 5.60, geven we het rapport een naam. Alle gemaakte keuzes van de wizard worden onder
de opgegeven naam bewaard voor later gebruik.
Ook kunnen we aangeven of we een afdrukvoorbeeld willen bekijken of dat we het zojuist ontworpen rapport direct handmatig willen aanpassen.
 Geef het rapport de naam Bestemming.
 Kies Afdrukvoorbeeld weergeven.
 Voltooi het rapport.
In het afdrukvoorbeeld van het rapport zien we dat niet alle kolommen volledig worden getoond. We kunnen dat eenvoudig aanpassen. In hoofdstuk 7 wordt verder ingegaan op het aanpassen van
rapporten.

146

Databaseontwikkeling 4 Access 2007

Figuur 5.60

 Sluit het afdrukvoorbeeld.


 Plaats het rapport in de indelingsweergave, via het lint Ontwerpen,
groep Weergaven, Indelingsweergave. Als het deelvenster Lijst met
velden wordt weergegeven, sluit dit dan.
 Maak de kolommen Boekingnummer en Klantnummer iets smaller,
zodat alle kolommen binnen de kantlijnen vallen. Dat is belangrijk,
anders wordt het rapport bij het afdrukken op papier niet volledig
afgedrukt.
 Verplaats enkele kolommen, zoals weergegeven in guur 5.61.
 Enkele kolomlabels (kopteksten) zijn niet goed leesbaar.
Dubbelklik op het koptekst Vertrekdatum. Verander het label in
Vertrek.
 Verander op dezelfde manier de labels Boekingnummer in
Boekingnr en Klantnummer in Klantnr.
 Toon het overzicht opnieuw als afdrukvoorbeeld (lint Ontwerpen,
groep Weergaven). Het overzicht moet er ongeveer uitzien zoals
guur 5.61.

5 Eenvoudige bewerkingen in Access

147

Figuur 5.61

5.8.3

Etiketten ontwerpen

Een etiket is feitelijk niets anders dan een speciaal opgemaakt rapport, afgedrukt op een afwijkend papierformaat. Een etiket ontwerpen gaat als volgt:
 Selecteer in het navigatiegedeelte van Access de tabel of query
waarvan je het etiketontwerp wilt maken. Kies als voorbeeld de
tabel Klant.
 Klik in het lint Maken, groep Rapporten op de knop Etiketten. Er
wordt een wizard gestart.
 De wizard zal als eerste vragen welk type etiketten gebruikt moet
worden (zie guur 5.62). De meest voorkomende formaten zijn
voorgeprogrammeerd. De fabrikant (Avery) maken we bekend
door op de naam van de fabrikant te laten lteren. Hierna kunnen
we het juiste productnummer (J8359) selecteren (dit nummer is te
vinden op de doos van de etiketten). Let erop dat ook de maateenheid (inches, Engels of cm, metrisch) opgegeven kan worden. Geef
ook op of er gebruikgemaakt moet worden van losse etiketvellen

148

Databaseontwikkeling 4 Access 2007

(laserprinter, sheetfeeder) of van kettingformulieren (matrixprinter). Denieer eventueel een nieuw, afwijkend formaat met behulp
van de knop Aanpassen.
Figuur 5.62

 Klik op de knop Volgende om door te gaan. Geef in het scherm


(guur 5.63) de tekenopmaak op, dus het lettertype, de puntgrootte, zwarting, tekengewicht en tekenkleur. Geef eventueel ook op of
de gegevens cursief en/of onderstreept afgedrukt moet worden.
Figuur 5.63

 Klik op de knop Volgende. Geef op welke gegevens op het etiket


opgenomen moeten worden, zie guur 5.64. Selecteer een regel
in het rechterdeel van het scherm, het Modeletiket. Hierin selecteren we de beschikbare velden door dubbelklikken of de knop >.

5 Eenvoudige bewerkingen in Access

149

Bovendien kunnen we in het modeletiket een begeleidende tekst


plaatsten om zo het etiket op te bouwen, zie in guur 5.64 de toevoeging Nr bij het klantnummer.
Figuur 5.64

 Klik op de knop Volgende; we komen in het voorlaatste scherm


van de wizard. Geef op wat de gewenste sorteervolgorde is (guur
5.65). We kunnen op meer dan n veld laten sorteren. Geven we
meer dan n veld op, dan wordt eerst gesorteerd op de waarden
van het eerste veld. Bij gelijke waarden in dit veld worden deze
onderling verder gesorteerd op het veld dat we als tweede hebben
opgegeven. Sorteer alleen op Postcode.
Figuur 5.65

150

Databaseontwikkeling 4 Access 2007

 Klik op de knop Volgende, zie guur 5.66. Geef in het laatste


scherm van de wizard het etiket de naam Adresetiketten Klant.
Figuur 5.66

Opgave
5.10 a. Maak gebruik van de database Reisbureau. Ontwerp snel een
rapport met daarin in tabelvorm de gegevens van alle bestemmingen.
b. Ontwerp met behulp van de wizard het voorgaande rapport
nogmaals. Laat nu echter de gegevens per land groeperen. Het
overzicht moet (per land) liggen op volgorde van plaats.
c. Ontwerp met behulp van de wizard een rapport waarin per
plaats van bestemming wordt getoond: de plaats van bestemming, het land en per geplande reis naar deze bestemming de
datum van vertrek en de namen en woonplaatsen van de klanten die voor de betreffende reis hebben geboekt. De klanten die
op dezelfde reis hebben geboekt moeten op volgorde van naam
worden getoond. Maak gebruik van de indeling Blok en stijl
Gieterij. Pas vervolgens, in de indelingsweergave, de kolombreedte aan, zodat de kolommen duidelijk worden getoond, zie
guur 5.67.
d. Bij onderdeel a. van opgave 5.7 hebben we een query opgesteld
voor het afdrukken van de gegevens van de klanten uit een nader op te geven woonplaats. Gebruik deze query om etiketten te
verzorgen. Kies een standaardformaat en laat de gebruikelijke
gegevens op het etiket tonen, begin met T.a.v.:.

5 Eenvoudige bewerkingen in Access

151
151

Figuur 5.67

5.9

Formulieren

Bij het toevoegen van gegevens aan een tabel hebben we tot nu toe
gebruikgemaakt van de standaardtabelweergave, waarbij we onder
aan de tabel rijen kunnen toevoegen. Dat is een handige methode
om snel een testset aan gegevens te maken, maar voor het invoeren
van gegevens worden formulieren toegepast. Zo worden rapporten gebruikt om gegevens te tonen of af te drukken. Formulieren
gebruiken we om gegevens in te voeren, te muteren of voor interactie met de gebruiker, bijvoorbeeld even snel de factuurgegevens
van een klant oproepen. Bij het werken met een formulier bepalen
we zelf hoe de lay-out van de gegevens op het scherm moet zijn.
Bovendien hebben we nu de mogelijkheid om steeds slechts n
record tegelijkertijd op het scherm te laten tonen. We kunnen bij
het ontwerpen van formulieren weer hulp krijgen van Access. Er
zijn vele manieren om een formulier te ontwerpen. De drie meest
gebruikte zijn een standaardformulier ofwel Formulier. Hiermee
kunnen we snel een formulier maken van een tabel of query.
Daarnaast kunnen we gebruikmaken van de formulierwizard. We
worden dan aan de hand meegenomen tijdens het ontwerpen. We

152

Databaseontwikkeling 4 Access 2007

kunnen de formulieren grotendeels naar eigen inzicht opmaken.


Als laatste kunnen we een formulier ook handmatig ontwerpen.
Daarbij moeten we alle handelingen zelf uitvoeren, maar in dat
geval kunnen we alles tot in detailniveau instellen. We kunnen het
handmatig ontwerpen ook gebruiken om een met de wizard gegenereerd formulier later met de hand te vervolmaken. In deze paragraaf geven we slechts een korte inleiding. In hoofdstuk 6 komen
formulieren uitgebreid ter sprake.
5.9.1

Formulier ontwerpen (snelle methode)

Opmerking
In de gegevensbladweergave van tabellen mogen geen subgegevensbladen getoond worden. Dat is te zien als aan de linkerkant,
voor de records, een +-teken staat; open bijvoorbeeld de tabel
Klant. Als hierin het +-teken wordt getoond, kunnen we records
aan de veelkant van de relatie uitvouwen. Dit heeft ongewenste
consequenties bij het maken van formulieren. Subgegevensbladen
kunnen we verwijderen door in het lint Start, groep Records, op de
knop Meer, Subgegevensblad, Verwijderen te klikken. We moeten
dit voor alle tabellen controleren en eventueel verwijderen.
We gaan als voorbeeld snel een formulier maken van de tabel
Klant.
 Selecteer een tabel of query in het navigatiegedeelte van Access
waarvan snel een formulier van gemaakt moet worden. Selecteer
voor ons voorbeeld de tabel Klant
 Klik in het lint Maken, groep Formulieren, op de knop Formulier.
Het formulier van de tabel wordt direct getoond in de indelingsweergave, zie guur 5.68. Je kunt eventueel het navigatiegedeelte
sluiten om wat meer ruimte op het scherm te creren.
De afzonderlijke gegevens van n klant staan in gestapelde weergegeven (onder elkaar) in de indelingsweergave. We kunnen de
weergave veranderen via het lint Opmaak, groep Weergaven. Er
zijn drie weergaven: Formulierweergave, Indelingsweergave en
Ontwerpweergave.
Formulierweergave is de weergave zoals een gebruiker het scherm
zal zien. In de ontwerpweergave kunnen we het formulier tot in
detail aanpassen. De indelingsweergave hebben we al eerder toe-

5 Eenvoudige bewerkingen in Access

153

Figuur 5.68

gepast bij het ontwerpen van rapporten. Wijzigingen in deze weergave worden direct getoond.
In het onderste deel van het scherm kunnen we met de navigatieknoppen de records selecteren (grasduinen) of toevoegen. Ook
kunnen we in dat deel van het scherm snel records zoeken.
 Klik eerst in het veld Naam en toets daarna de naam in die je wilt
zoeken bij Zoeken in het onderste deel van het scherm.
 Sluit het formulier en geef het formulier de naam Klant.
Het formulier wordt in het navigatiegedeelte getoond onder
Formulieren. Als je het formulier in het navigatiegedeelte met de
rechtermuisknop selecteert, kunnen we het formulier openen of in
een bepaalde weergave tonen. In hoofdstuk 6 wordt uitgebreid ingegaan op formulieren.
5.9.2

Formulier ontwerpen via de wizard

Als we een formulier willen ontwerpen met meer opties, zoals


subformulieren of een bepaalde opmaak, maak dan gebruik van de
Wizard Formulier. We gaan een voorbeeld uitwerken waarbij we

154

Databaseontwikkeling 4 Access 2007

van een bepaalde bestemming alle reizen tonen die er zijn naar die
bestemming.
 Klik in het lint Maken, groep Formulieren, op de knop Meer formulieren, Wizard Formulier. Het eerste scherm van de wizard verschijnt, zie guur 5.69
Figuur 5.69

In dit scherm kunnen we opgeven welke tabellen en/of querys en


vooral welke velden in het formulier worden opgenomen. We kunnen meerdere tabellen of querys na elkaar selecteren en hiervan
velden laten opnemen in het formulier door ze van het gedeelte
Beschikbare velden naar het deel Geselecteerde velden te verplaatsen.
 Selecteer uit de tabel Bestemming alle velden en uit de tabel Reis
alle velden, behalve Bestemmingcode (hebben we al staan via de
tabel Bestemming). Nadat alle velden voor het formulier zijn geselecteerd, zie guur 5.70, gaan we naar het volgende venster van de
wizard.
 Toon de gegevens volgens bestemming, zie guur 5.71 De bestemminggegevens komen bovenin het scherm te staan en de bijbehorende reizen onderin. Ga naar het volgende venster.
 We moeten nu kiezen hoe het subformulier getoond moet worden.
We hebben een subformulier, aangezien een bestemming meerdere reizen kan bezitten en die worden hierin getoond. Kies voor
de optie Als gegevensblad, zie guur 5.72 en ga naar het volgende
venster.

5 Eenvoudige bewerkingen in Access

Figuur 5.70

Figuur 5.71

Figuur 5.72

155

156

Databaseontwikkeling 4 Access 2007

 Voor de stijl kiezen we Gieterij en gaan door naar het laatste venster van de wizard, zie guur 5.73.
Figuur 5.73

 In dit laatste scherm moeten we het hoofdformulier en het bijbehorende subformulier een naam geven. Kies de namen zoals getoond
in guur 5.73. Klik vervolgens op Voltooien. Het formulier wordt
getoond in de formulierweergave, zie guur 5.74.
Figuur 5.74

5 Eenvoudige bewerkingen in Access

157

Het formulier moeten we nog wat aanpassen aan onze wensen. Het
subformulier staat niet recht onder het hoofdformulier en bovendien zijn daarin niet alle velden te zien.
 Plaats het formulier in de indelingsweergave via de groep
Weegaven.
 Pas de kolombreedten van de kolommen aan zodat alle kolommen
duidelijk zichtbaar zijn.
 Verder willen we het label Reis van het subformulier verwijderen.
Selecteer het label Reis.
Als we nu op de Delete-knop van het tussenbord drukken zal het
label Reis worden verwijderd, maar ook het hele subformulier
(eventueel herstellen, met Ongedaan maken in de werkbalk van
Access of Ctrl-Z). Het label en de subformulier zijn gekoppeld, dat
moet eerst ongedaan gemaakt worden.
 Selecteer het label Reis opnieuw en klik in het lint Schikken, groep
Indeling bepalen, op de knop Verwijderen. De koppeling is nu verwijderd.
 Selecteer alleen het label Reis en druk op de Delete-knop van het
toetsenbord. Nu is het label verwijderd.
 Sleep het subformulier precies onder het hoofdformulier.
 Via het lint Start of Opmaak kunnen we het formulier in de formulierweergave tonen. Het resultaat staat afgebeeld in guur 5.75.
 Sluit het formulier. Hierna wordt gevraagd of we de wijzigingen
accepteren. Het subformulier wordt apart opgeslagen, dus twee formulieren, die bij elkaar horen.
In hoofdstuk 6 wordt verder ingegaan op het aanpassen van formulieren.
Tip: Door het werken met de database blijkt de ruimte die het bestand op schijf in beslag neemt almaar toe te nemen. Access neemt
het niet zo nauw met het weer vrijgeven van ruimte die niet meer
nodig is, met als gevolg dat de database veel ongebruikte ruimte
in beslag neemt. We kunnen de omvang van de database aanzienlijk terugbrengen (soms tot wel 80%) door de database eerst
te openen en daarna via de Microsoft Ofce-knop kiezen voor
Beheer, Database comprimeren en herstellen. De data binnen de
database wordt nu geoptimaliseerd en aaneengesloten weggeschreven waardoor de omvang op de schijf sterk afneemt. Het verdient
aanbeveling deze activiteit met enige regelmaat te laten uitvoeren.

158

Databaseontwikkeling 4 Access 2007

Figuur 5.75

Opgave
5.11 a. Maak gebruik van de database Reisbureau. Gebruik de mogelijkheid om snel een formulier te ontwerpen waarmee we gegevens kunnen toevoegen aan de tabel Bestemming.
b. Maak het formulier uit deze paragraaf met de Wizard
Formulier.
Herhalingsopgaven
5.12 Creren database en bestand
a. Ontwerp de database Telefoon. Neem hierin de tabel Telefoon
op met daarin de velden: telefoonnummer, naam, adres, postcode en plaats. Zorg ervoor dat het telefoonnummer sleutelveld
wordt. Neem voor naam, adres en plaats een lengte van
25 tekens; voor de postcode 7 tekens. Het telefoonnummer
moet 10 cijfers kunnen bevatten.

5 Eenvoudige bewerkingen in Access

159
159

b. Voer een aantal personen in.


c. Sluit de database weer af.
5.13 Manipuleren/tonen gegevens
a. Selecteer de database Reisbureau. Activeer de tabel Klant.
b. Gebruik een lter om alleen de klanten uit Rotterdam te laten
zien.
c. Hef het lter op.
d. Geef een overzicht van de klanten, gesorteerd op postcode.
e. Open de tabel Bestemming en toon alleen reizen naar Azi, gesorteerd op land en bij gelijke land op plaats.
f. Open de tabel Reis en toon alleen reizen goedkoper dan
1000,00 gesorteerd op prijs. Toon ook in een extra regel de
som van alle prijzen per persoon en het aantal reizen.
5.14 Meerdere tabellen
a. Selecteer de database Reisbureau.
b. Verwijder de relatie tussen Reis en Bestemming.
c. Leg de relatie weer aan. Zorg ervoor dat referentile integriteit
wordt afgedwongen. Zorg ervoor dat ook stapsgewijs wijzigen
en stapsgewijs verwijderen wordt geactiveerd.
d. Controleer of de reizen 4 en 28 naar Corsica gaan.
e. Wijzig in de tabel Bestemming de code CORSI in CRSCA.
f. Controleer wat de gevolgen van de wijziging is bij de reizen uit
onderdeel d.
g. Maak de wijziging van onderdeel e. weer ongedaan.
h. Zorg ervoor dat de relatie tussen Reis en Bestemming weer zonder stapsgewijs wijzigen en verwijderen wordt.
5.15 Querys
a. Selecteer de database Reisbureau.
b. Geef de namen van de personen die geboekt hebben voor een
bestemming in Frankrijk.
c. Wat is de gemiddelde duur van de reizen?
d. Welke bestemmingen zijn bezocht door Rotterdammers? Laat
ook de naam van de klant en de vertrekdatum afdrukken, in
volgorde van datum.
e. Wijzig de voorgaande query zodanig dat de woonplaats
gevraagd wordt voordat de gegevens van de in die plaats
wonende klanten worden getoond.

160
160

Databaseontwikkeling 4 Access 2007

f. Alle reizen die geboekt zijn in maart 2010 krijgen een korting
van 25,00. Maak eerst een query, waarin de nieuwe prijs per
persoon wordt getoond, naast de oude. Maak daarna een nieuwe
query waarin de prijs ook daadwerkelijk wordt gewijzigd in de
database.
g. Wat is het totaal aantal kinderen en totaal aantal volwassenen
dat in de eerste week van april 2010 heeft geboekt?
5.16 Rapport / etiket / formulier
a. Selecteer de database Reisbureau.
b. Ontwerp snel een rapport met de gegevens van de klanten
c. Ontwerp een rapport (gebruik een wizard) om een overzicht te
krijgen met daarin per klant de gemaakte reizen. Laat naast de
NAW-gegevens, de vertrekdatum en de plaats van bestemming
afdrukken.
d. Laat voor alle klanten die ooit een reis naar Frankrijk geboekt
hebben een etiket afdrukken. Maak daartoe eerst de query die
een tabel oplevert met de gegevens van de betreffende klanten
en ontwerp hierbij vervolgens een etiket.
e. Ontwerp een formulier om gegevens toe te voegen aan de tabel
Telefoon uit de database Telefoon.
5.17 Rapport
a. Selecteer de database Reisbureau.
b. Ontwerp een rapport om per bestemming een overzicht te krijgen van alle reizen. Laat alle relevante gegevens tonen.
c. Ontwerp een rapport om per klant een overzicht te krijgen van
alle gemaakt boekingen. Toon alle relevante gegevens.

Uitgebreide
formulieren

In dit hoofdstuk gaan we de mogelijkheden van een formulier


verder toelichten. Zo wordt het plaatsen van keuzerondjes, selectievakjes en groepsvakken besproken. De keuzelijsten worden verder
toegelicht. Ook het opnemen van afbeeldingen in het formulier
wordt behandeld. Ten slotte worden subformulieren, tabbladen,
opdrachtknoppen en draaitabellen besproken.

6.1

Keuzemogelijkheden

In veel databases komt het gegevenstype Ja/nee een logisch veld


genoemd veelvuldig voor. Denk aan zaken als: gehuwd?, in bezit
van rijbewijs?, zwembad aanwezig?, bevorderd?, bezit mobiele
telefoon? Wanneer met de Wizard een formulier is ontworpen,
zal het logische veld automatisch een selectievakje zijn. Dat is een
vakje waarin we met de muis kunnen klikken om het vakje al of
niet af te vinken.
Naast het selectievakje kunnen we voor zon veld ook een keuzerondje of wisselknop gebruiken. Om het een en ander toe te lichten
gaan we in de tabel Boeking een logisch veld toevoegen. Het moet
mogelijk worden om bij een boeking op te geven of men een annuleringsverzekering wenst:
 Open de database Reisbureau.
 Open de tabel Boeking in de ontwerpweergave. De structuur van
de tabel wordt getoond.
 Maak een nieuw veld aan onder Betaald bedrag en noem dit Annuleringsverzekering. Het gegevenstype dient Ja/nee te worden.
 Sla op de bekende manier het nieuwe ontwerp op en sluit de tabel.

162

Databaseontwikkeling 4 Access 2007

We gaan met de wizard een nieuw formulier voor de tabel Boeking


ontwerpen:
 Selecteer in het lint Maken, groep Formulieren, Meer formulieren,
Wizard Formulier.
 Selecteer de tabel Boeking.
 Selecteer alle velden. Het formulier dient In kolomvorm getoond te
worden.
 Kies de stijl Gieterij en wijzig de titel (naam) van het formulier in
Boeking voorbeeld. Het formulier wordt nu getoond, zie guur 6.1.
Figuur 6.1

We zien dat bij het besturingselement Annuleringsverzekering een


selectievakje staat. We zien ook dat de lay-out niet optimaal is: de
tekst Annuleringsverzekering is niet helemaal leesbaar.
 Plaats het formulier in de indelingsweergave.
 Selecteer een van de velden (niet het label) en sleep de linkerkant
van het veld naar rechts totdat de tekst Annuleringsverzekering
volledig leesbaar is. Alle andere kolommen schuiven direct mee.

6 Uitgebreide formulieren

163

Dat komt omdat ze gekoppeld zijn. Je had ook de rechterkant van


het label kunnen selecteren en dan naar rechts slepen.
Merk op dat records die al waren ingevoerd geen vinkje bevatten,
want het veld Annuleringsverzekering bestond toen nog niet. De
records kunnen nu wel afgevinkt worden. Voor nieuwe records
wordt wel standaard een waarde ingevoerd. Als detail kunnen we
nog melden dat Access in het veld Annuleringsverzekering niet de
waarde Ja of Nee wegschrijft in de tabel, maar voor Ja het getal 1
en voor Nee het getal 0. Op het scherm toont Access dit echter als
Ja en Nee.
We kunnen het selectievakje ook vervangen door een keuzerondje
of wisselknop. In dit geval kiezen we een keuzerondje:
 Plaats het formulier in de ontwerpweergave.
 Selecteer het selectievakje (niet de tekst), met de rechtermuisknop.
 Kies voor Wijzigen in, Keuzerondje, zie guur 6.2. We hadden ook
kunnen kiezen voor een Wisselknop.
Figuur 6.2

Naast de informatie of de klant bij een boeking een annuleringsverzekering wenst, zullen we nog een aanpassing maken. Men wil

164

Databaseontwikkeling 4 Access 2007

informatie over de betaalwijze. Er zijn drie manieren van betalen,


te weten: contant bij boeking, elektronisch pinnen of na ontvangst
van een acceptgiro. We gaan gebruikmaken van een groepsvak. In
een groepsvak kan een selectie gemaakt worden uit een aantal
mogelijkheden. In ons voorbeeld: Contant, Pinnen, Acceptgiro.
Om deze wijziging door te voeren moeten we eerst de structuur
van de tabel Boeking aanpassen.
 Open de tabel Boeking in de ontwerpweergave.
 Voeg een nieuw veld toe met als veldnaam Betaalwijze en het gegevenstype moet Numeriek zijn. De gekozen opties krijgen namelijk de waarden 1, 2 en 3 toegekend.
 Kies bij Veldlente Byte, gehele getallen tot maximaal de waarde
255. Zie eventueel extra informatie over de verschillende numerieke opties in bijlage A
 Sluit het tabblad om de nieuwe structuur op te slaan.
We gaan nu ons formulier Boeking voorbeeld aanpassen om een
groepsvak te plaatsen voor het nieuwe veld Betaalwijze.
 Open het formulier Boeking voorbeeld in de ontwerpweergave.
 Onder het veld Annuleringsverzekering gaan we het nieuwe veld
toevoegen. Als daar geen ruimte voor is, moet je de formuliervoettekst iets naar beneden slepen.
We kunnen via het lint Ontwerpen, Bestaande velden toevoegen
een venster openen waarin alle velden worden getoond. We zouden
dan het veld Betaalwijze eenvoudig in het venster kunnen slepen
onder het veld Annuleringsverzekering. Het veld is dan ook direct
gekoppeld aan de bestaande velden. Dat is nu geen goede keuze. Je
zou dan in het veld Betaalwijze getallen kunnen invoeren en niet
een van de opties kunnen selecteren uit een groepsvak.
 Klik in het lint Ontwerpen, groep Besturingselementen, op de
knop Groepsvak. Zorg dat in dezelfde groep de knop Wizards
geactiveerd is.
 Verplaats nu de muis naar het formulier en markeer het gebied
waar het groepsvak moet komen (onder Annuleringsverzekering).
 De wizard gaat van start. Er wordt gevraagd om de namen (labelnamen) van onze opties; zie guur 6.3.

6 Uitgebreide formulieren

165

Figuur 6.3

 Kies als eerste label Contant. Druk op de Tab-toets en voer vervolgens Pinnen en Acceptgiro in.
 Ga naar het volgende scherm via de knop Volgende.
 Het scherm dat verschijnt (zie guur 6.4), biedt de mogelijkheid
om voor nieuwe records een standaardoptie te activeren. De optie
die het meest voorkomt, kan dan automatisch voor gezet worden.
Wij willen dat. Selecteer Pinnen als standaard optie en klik op
Volgende.
Figuur 6.4

 De optie die we kiezen, krijgt een numerieke waarde toegekend,


die aan het veld Betaalwijze in onze tabel Boeking wordt opgeslagen. De waarden zijn, zoals reeds eerder opgemerkt, standaard op
1, 2 en 3 gezet, zie guur 6.5. Eventueel kunnen we die waarden
veranderen. We doen dat niet. Kies voor de standaardwaarden en
klik op de knop Volgende.

166

Databaseontwikkeling 4 Access 2007

Figuur 6.5

 In het scherm dat verschijnt (guur 6.6) wordt gevraagd of we de


geselecteerde waarde willen gebruiken voor later gebruik of willen opslaan in de database. Wij willen het geselecteerde opslaan
in het veld Betaalwijze uit de tabel Boeking. Klik op het keuzerondje Opslaan in dit veld en selecteer uit de keuzelijst het veld
Betaalwijze. Klik weer op de knop Volgende.
Figuur 6.6

 In het volgende scherm van de Wizard hebben we de keuze uit verschillende opmaakmogelijkheden van het groepsvak; zie guur 6.7.
We kunnen kiezen uit Selectievakjes, Keuzerondjes of Wisselknoppen. Nadat we een keuze hebben gemaakt, wordt direct
een voorbeeld getoond. Verder kunnen we opgeven hoe het kader getoond moet worden. We hebben de keuze uit Omkaderd,
Normaal, Verhoogd, Schaduw en Verlaagd. Na een keuze wordt
ook hier direct een voorbeeld getoond. Kies voor Selectievakjes en
Omkaderd. Klik nadat het voorbeeld is goedgekeurd op de knop
Volgende.

6 Uitgebreide formulieren

167

Figuur 6.7

 In het laatste scherm van de Wizard gaan we weer door de nishvlag. Hier kunnen we het groepsvak nog van een bijschrift voorzien. Kies als bijschrift Betaalwijze en klik op de knop Voltooien.
 Bekijk vervolgens het nieuwe formulier in de formulierweergave.
Merk op dat de vinkjes bij bestaande records nog niet aanwezig zijn. Toen die records werden ingevoerd, bestond het veld
Betaalwijze nog niet. Aangezien die standaard de waarde 0 hebben
en dus niet 1, 2 of 3 wordt het vinkje niet getoond. We kunnen ze
nu wel van een vinkje voorzien. Bij nieuwe records wordt de
opgegeven standaardwaarde, Pinnen, afgevinkt.
Als we later de instellingen en teksten willen veranderen, kan dat
door de eigenschappen van het groepsvak en de selectievakjes te
wijzigen. De teksten kunnen we in het formulier eenvoudig aanpassen. Overigens is een groepsvak niet bedoeld om later vaak
gewijzigd te worden. Als gegevens wel kunnen veranderen, is het
verstandiger om een keuzelijst te maken, zie onder andere paragraaf 6.3, Keuzelijsten.
Opgave
6.1 a. Open het formulier Boeking voorbeeld in de formulierweergave. Vul bij iedere boeking in of een annuleringsverzekering
gewenst is en de gewenste betaalwijze.
b. Wijzig in het formulier Boeking voorbeeld het veld Annuleringsverzekering zodanig dat het getoond wordt als wisselknop.
c. Het groepsvak Betaalwijze dient in hetzelfde formulier weergegeven te worden als een verzameling keuzerondjes. Tip: selecteren via de rechtermuisknop en kies Wijzigen in.

168

Databaseontwikkeling 4 Access 2007

6.2

Bijlagen

In Access is het mogelijk om een veld te maken waarin verschillende type bestanden opgeslagen kunnen worden. Het gegevenstype hiervan is Bijlage (Attachment). In e-mailberichten wordt ook
veelvuldig gebruik gemaakt van bijlagen. Zo kun je aan een e-mail
een Word-document toevoegen, een Excel-bestand of enkele fotos. In Access kunnen we in n bijlageveld ook n of meerdere
bestanden opslaan. Hierdoor kunnen aan de records in de database
allerlei bestanden gekoppeld worden. Hierbij kunnen we denken
aan een makelaar, die naast gegevens van de woning ook diverse
fotos en een video van het huis wil opslaan, zodat het direct aan
een potentile klant getoond kan worden. Een ander voorbeeld is
een kunsthandelaar die fotos van de kunstvoorwerpen wil opslaan. In onze Reisbureau-database zouden we nog hotels kunnen
opnemen met hotelgegevens en enkele fotos en videos van het
hotel. Aan de hand van een voorbeeld zullen we het gegevenstype
Bijlage toelichten.
 Open de database Oefening die we eerder hebben gemaakt. Is dat
nog niet gedaan, creer dan eerst deze database. Ontwerp een
nieuwe tabel met de volgende structuur.
Veldnaam

Gegevenstype

Veldlengte

Kenteken

Tekst

Bouwjaar

Numeriek

Integer

Status

Tekst

Accessoires

Tekst

25

Bijlagen

Bijlage

 Kies het veld Kenteken als sleutel.


 Sla de tabel op onder de naam Auto.
 Open de tabel Auto en voer een willekeurig record in, zie guur
6.8. In de kolom Bijlagen wordt een paperclipje getoond in plaats
van de veldnaam. In het veld zelf is ook een paperclipje te zien met
het aantal bijlagen, bij een nieuw record is de waarde 0, zie guur
6.8.
 Dubbelklik op het veld Bijlagen en het bijlagenvenster wordt actief,
zie guur 6.8.

6 Uitgebreide formulieren

169

Figuur 6.8

In dit venster kunnen we een bijlage toevoegen, verwijderen, openen, opslaan als of alle bijlagen opslaan in een map.Klikken we
op Toevoegen, dan komen we in het bekende Windows-venster
waarin we een bestand kunnen selecteren. Op deze manier kunnen
we meerdere bestanden selecteren, die in het veld Bijlagen worden
opgeslagen; na het klikken op OK. Het aantal bijlagen wordt zichtbaar in het veld.
In het bijlagenvenster kunnen we een bijlage openen met de knop
Openen. Het bijbehorende programma zal automatisch geopend
worden. We kunnen eventueel direct wijzigen doorvoeren in het
bestand. Als we een Word-document als bijlage hebben opgenomen en het bestand openen, zal automatisch het programma Word
starten en het bestand tonen. We kunnen nu wijzigen doorvoeren
en het vervolgens opslaan en Word afsluiten. Na het klikken op OK
volgt een venster die vraagt of de wijzigingen die gemaakt zijn ook
in de database opgeslagen moet worden, zie guur 6.9.
Figuur 6.9

 Voeg in het bijlageveld een foto van de auto toe. De gebruikte afbeeldingen in het voorbeeld zijn te vinden in de bestanden die je

170

Databaseontwikkeling 4 Access 2007

via de pagina bij dit boek op www.academicservice.nl kunt downloaden.


We kunnen een formulier maken met daarin een bijlageveld, dan
wordt de eerste bijlage direct getoond als het een afbeelding is.
Van andere bestandstypen wordt het pictogram getoond, bijvoorbeeld het Word-pictogram. Op deze manier kunnen we direct een
foto tonen, als de foto als eerste in de bijlagen is opgeslagen. We
gaan dit aan de hand van een voorbeeld toelichten. De gebruikte
afbeeldingen in het voorbeeld zijn te vinden bij de downloadbestanden.





Selecteer de tabel Auto in het navigatiegedeelte.


Selecteer in het lint Maken, Meer formulieren, Wizard Formulier.
Selecteer Kenteken, Bouwjaar, Status en Bijlagen.
Kies in de volgende schermen voor Kolomvorm en de stijl Gieterij.
Accepteer ten slotte de titel Auto. Het formulier wordt vervolgens
getoond, zie Figuur 6.10.

Figuur 6.10

De foto wordt onder de overige gegevens getoond. Als we de foto


naast de gegevens willen en bovendien groter afgebeeld, moeten
we de bijlage loskoppelen van de overige gegevens. Standaard

6 Uitgebreide formulieren

171

worden de gegevens gegroepeerd. Als je dan n veld breder


maakt, wijzigen de gekoppelde velden mee. Nu moeten we het veld
Bijlagen loskoppelen.
 Plaats het formulier in de ontwerpweergave.
 Selecteer het veld Bijlagen (niet het label) en kies het lint Schikken.
 Klik, in de groep Indeling bepalen, op de knop Verwijderen. Het
veld Bijlagen is nu niet meer gekoppeld aan het label.
 Verwijder hierna het label Bijlagen.
 Sleep het veld Bijlagen naast de andere velden en maak het bovendien groter.
 Toon het formulier weer in de formulierweergave, zie guur 6.11.
Figuur 6.11

De fotos worden zo goed mogelijk in het vak geplaatst dat je


zojuist vergroot hebt. Als alle fotos hetzelfde formaat hebben
kun je de afmetingen van het veld in de ontwerpweergave of
indelingsweergave precies passend maken. Door de foto te selecteren verschijnt een mininavigatievenster met twee pijlen en een
paperclipje, zie guur 6.12. Hiermee kun je door de fotos bladeren
(of andere bijlagen). Met het paperclipje wordt het bijlagenvenster
geopend.

172

Databaseontwikkeling 4 Access 2007

Figuur 6.12

Zoals te zien in guur 6.12 hebben we nog twee wijzigingen doorgevoerd in de titel van het formulier. We hebben de tekst aangepast
en een logo geplaatst.
 Selecteer in de indelingsweergave de titel Auto en maak dat
tekstvak eerst breder om de langere tekst te kunnen invoeren.
Vervolgens kunnen we in het tekstvak de tekst veranderen, zie guur 6.12.
 Klik in het lint Opmaak, groep Besturingselementen, op de knop
Logo om een logo te selecteren in de titel van het formulier. In
diezelfde groep had je ook een nieuwe titel kunnen plaatsen met de
knop Titel.
 Sleep het logo en de tekst op de gewenste plaats.
 Sluit het formulier.
 Verander de naam van het formulier in Auto voorbeeld, via de
rechtermuisknop in het navigatiegedeelte.
Opmerkingen
De bijlagen worden automatisch gecomprimeerd opgeslagen in
de database. We kunnen eventueel de oorspronkelijke bestanden
verwijderen. Mochten we een bestand later nodig hebben, dan kunt
we, via Opslaan als in het bijlagenvenster, het bestand weer terugzetten.
We kunnen van een Bijlage in een formulier of rapport, naast het
veld zelf, drie kenmerken tonen: FileData, FileName en FileType.
FileData toont de afbeelding of het pictogram van het bestandstype (bijvoorbeeld het Word pictogram). FileName toont de bestandsnaam van de bijlage en FileType de extensie van het bestand,
bijvoorbeeld van een Word-bestand is dit doc of docx. We kunnen

6 Uitgebreide formulieren

173

deze in de ontwerpweergave van het formulier of rapport selecteren. Klik daarvoor in het lint Ontwerpen op de knop Bestaande
velden toevoegen. De genoemde kenmerken van een bijlage zijn
nu in het formulier of rapport te slepen. In hoofdstuk 7 wordt dit
verder toegelicht. Ook in querys kunnen we de velden FileData,
FileName en FileType selecteren.
Het maximum aan data in een bijlageveld is 2 GB (256 MB/bestand maximaal).
Het gegevenstype Bijlage is later niet meer te veranderen. We kunnen er bijvoorbeeld geen tekstveld meer van maken.
De afmetingen van het bijlagenkader kunnen gevolgen hebben
voor afbeeldingen. Wat gebeurt er als een foto niet in het kader
past of te klein is? Er zijn drie mogelijkheden: Kader niet vullen,
Kader vullen en Uitsnede. Bij Kader niet vullen wordt het kader
zo goed mogelijk gevuld. De beeldverhoudingen blijven gelijk.
Dit is de standaardoptie. De optie Kader vullen zal het volledige
kader vullen. De beeldverhoudingen worden hierbij aangepast. Bij
Uitsnede wordt de foto linksboven in het kader geplaatst. De beeldverhoudingen blijven gelijk. Als de afbeelding niet in het kader
past, wordt alleen de linkerbovenhoek van de afbeelding getoond.
De opties zijn te selecteren in het eigenschappenvenster van het kader, tabblad Opmaak, bij de eigenschap Afbeeldingsformaatmodus.
Opgave 3.2
a. Ontwerp het formulier zoals weergegeven in guur 6.12.
b. Voeg in de tabel Auto nog twee records toe. Bekijk vervolgens
in het formulier van opgave a. de nieuw toegevoegde records.

6.3

Keuzelijsten

Er zijn twee typen keuzelijsten:


met invoervak;
zonder invoervak.
Een keuzelijst met invoervak biedt de mogelijkheid om een waarde
te typen of op de knop te klikken, waardoor een lijst met mogelijke waarden wordt getoond waaruit een keuze gemaakt kan

174

Databaseontwikkeling 4 Access 2007

worden. De keuzelijst zonder invoervak toont een lijst met opties


waaruit gekozen kan worden, zonder dat een waarde ingevoerd
kan worden.
We gaan drie veelvoorkomende keuzelijsten toelichten.
6.3.1

Keuzelijst met getypte invoer

De tabel Auto, die we eerder in de database Oefening hebben


gemaakt, heeft het veld Status. Hierin kan vermeld worden of de
auto te koop staat, of er een optie door een klant is genomen of dat
de auto al is verkocht. Het veld Status is te vullen met Te koop,
Optie of Verkocht. We zullen bij dit veld een keuzelijst met
invoerveld gaan maken.
 Open de database en selecteer de tabel Auto in de
Ontwerpweergave.
 Het gegevenstype van Status is Tekst. Klik met de muis in het
vakje gegevenstype van Status. We zien nu overigens direct een
voorbeeld van een keuzelijst met invoervak.
 Open de keuzelijst en kies Wizard Opzoeken.
Het venster Wizard Opzoeken biedt nu twee mogelijkheden om
gegevens in te voeren:
de waarden van de opzoekkolom moeten worden opgezocht in een
tabel of
de waarden zullen worden getypt.
Met de eerste optie kunnen we bijvoorbeeld een artiestnummer
opzoeken bij het toevoegen van een nieuwe cd in een cd-database,
of het artikelnummer opzoeken van een snowboard in een sportzaak. In voorgaande hoofdstukken hebben we van deze mogelijkheid gebruikgemaakt in de Reisbureau-database. Bij de tabel
Boeking hebben we toen een keuzelijst met invoervak gemaakt
voor het invoeren van een klantnummer. Verderop in deze paragraaf komen we hierop terug. We gebruiken de eerste optie als de
waarden uit de keuzelijst kunnen veranderen. Dit geldt bijvoorbeeld voor klant- en artikelgegevens: er kunnen immers klanten of
artikelen zijn toegevoegd of verwijderd. Met de tweede optie dienen we de waarden uit de keuzelijst te typen. Zon lijst kiezen we
als de waarden uit de lijst niet aan verandering onderhevig zijn.

6 Uitgebreide formulieren

175

 Kies voor De waarden zullen worden getypt. De opties Te koop,


Optie en Verkocht zullen immers niet veranderen. Kies
Volgende.
 Het venster dat verschijnt (guur 6.13) biedt ons de mogelijkheid
om in te voeren hoeveel kolommen weergegeven dienen te worden
en welke waarden we in die kolommen willen zien.
Figuur 6.13

 We hebben maar n kolom met drie items, voer dus bij Aantal
kolommen het getal 1 in (standaardwaarde) en klik onder Kol1 om
de waarden van de items te typen. Druk na het intoetsen van een
waarde steeds op de Tab-toets.
 Het is tevens mogelijk om de kolombreedte aan te passen. In dit
voorbeeld hebben we de breedte iets kleiner gemaakt. Het verkleinen of vergroten kan door met de muis op de rechterrand van de
cel Kol1 te staan en daarna naar links of rechts te slepen.
We hadden in dit voorbeeld ook kunnen kiezen voor een iets efcintere methode van invoer door het veld Status een lengte te
geven van n teken. Hierin hadden we dan de letter T (Te koop),
O (Optie) of V (Verkocht) kunnen plaatsen. We hadden hier dan
voor twee kolommen moeten kiezen. In de eerste hadden we
de drie letters gezet en in de tweede kolom de daarbij horende
omschrijvingen.
 Het volgende scherm vraagt nog om het label (tekst) dat bij het
veld geplaatst moet worden. Accepteer de standaard Status en voltooi de Wizard.

176

Databaseontwikkeling 4 Access 2007

 Klik vervolgens op het tabblad Opzoeken; dit bevat onze


keuzemogelijkheden bij Rijbron.
 De eigenschap Alleen lijst staat standaard op Nee, wat betekent:
andere waarden mogen ook ingevoerd worden. Als we dat niet
wensen en alleen de genoemde opties willen accepteren, moet
de eigenschap Alleen lijst op Ja gezet worden. Zet de eigenschap
Alleen lijst op Ja, we accepteren geen andere waarden.
 Naast de eigenschap wordt de knop Bijwerkopties voor eigenschap zichtbaar. Door hierop te klikken kunt u de gewijzigde
eigenschap van het veld Status automatisch doorvoeren in formulieren en rapporten. Er verschijnt dan een extra venster met alle
formulieren en rapporten die u kunt bewerken waarop het veld
Status voorkomt. Wanneer u dat nu zou uitvoeren krijgt u de mededeling dat geen objecten bijgewerkt te hoeven worden. Omdat in
de formulieren die we hebben het veld Status nog als Tekstveld is
gedenieerd en niet als Keuzelijst. Een tekstveld heeft geen opzoekeigenschappen.
 Sla de nieuwe structuur op en sluit af.
Als we nu querys of formulieren maken, zal het statusveld automatisch een keuzelijst met invoervak zijn.
Als we het formulier Auto voorbeeld in de formulierweergave openen, zien we bij het veld Status geen keuzelijst met invoervak. In
de formulieren die al gemaakt zijn, is de keuzelijst voor het veld
Status niet beken. Als we daar een keuzelijst van willen maken,
moet het formulier aangepast worden.
 Open het formulier Autovoorbeeld in de indelingsweergave.
 Selecteer het veld Status en verwijder deze. Zowel het label als het
veld worden verwijderd.
 Klik in het lint Opmaak, groep Besturingselementen, op de knop
Bestaande velden toevoegen. Sleep nu het veld Status naar zijn
plaats in het formulier. We zien dat Status direct weer tot de groep
wordt toegevoegd.
We hebben nu een veld Status met keuzelijst. Controleer de werking in de formulierweergave.

6 Uitgebreide formulieren

6.3.2

177

Keuzelijst met meerdere waarden

Het is ook mogelijk om in n veld meerdere waarden op te nemen.


 Open de tabel Auto in de ontwerpweergave.
 Klik met de muis in de kolom gegevenstype van het veld
Accessoires en kies de optie Wizard Opzoeken.
 Kies in de wizard De waarden zullen worden getypt.
 Voeg vervolgens de waarden in zoals in guur 6.14.
Figuur 6.14

 In het laatste venster van de wizard vink je Meerdere waarden toestaan aan, zie guur 6.15. Hierdoor is het mogelijk om in n veld
(Accessoires) meerdere waarden (accessoireopties) te selecteren.
Figuur 6.15

178

Databaseontwikkeling 4 Access 2007

 Voltooi de wizard en accepteer de opmerking over velden met


meerdere waarden. Velden met meerdere waarden kunnen later
niet meer veranderd worden in een ander gegevenstype, bijvoorbeeld een tekstveld of een gewone keuzelijst.
 Verander in tabblad Opzoeken de eigenschap Alleen lijst in Ja en
sluit vervolgens het venster van de tabel.
 Open het formulier Auto voorbeeld in de indelingsweergave.
 Klik in het lint Opmaak op de knop Bestaande velden toevoegen.
 Sleep het veld Accessoires, uit het venster Lijst met velden, naar
zijn plaats op het formulier. Controleer de werking in de formulierweergave, zie guur 6.16.
Figuur 6.16

Het is mogelijk om de opties in de keuzelijst te muteren. Standaard


is die optie uitgeschakeld, maar je kunt het activeren.
 Open de tabel Auto, in de ontwerpweergave, selecteer het veld
Accessoires en vervolgens het tabblad Opzoeken.
 Verander de eigenschap Bewerken lijst met waarden in Ja.
 Naast de eigenschap wordt de knop Bijwerkopties voor eigenschappen zichtbaar. Selecteer die knop en laat onze wijziging ook
automatisch in het formulier Auto voorbeeld doorvoeren.

6 Uitgebreide formulieren

179

Tip: Toen je de keuzelijst opende, zag je een horizontale schuifbalk onderaan de keuzelijst. Die is niet te zien in guur 6.16.
Door in het eigenschappenvenster de breedte van de eigenschap
Lijstbreedte met 5 mm te vergroten, verdwijnt de horizontale
schuifbalk. Laat de wijziging ook direct in het formulier doorvoeren.
 Sluit de tabel Auto en open het formulier Auto voorbeeld in de formulierweergave.
 Open de keuzelijst Accessoires. Eronder wordt nu een knop zichtbaar waarmee we de accessoireopties kunnen aanpassen, zie guur
6.17.
Figuur 6.17

Opmerking
Velden waarin meerdere waarden te selecteren zijn, kunnen
ook toegepast worden in een query. Bij het veld wordt naast de
veldnaam ook Veldnaam.Value getoond. In ons voorbeeld hebben we dan de keuze uit Accessoires en Accessoires.Value. Het
veld Accessoires laat n veld zien met meerdere waarden en
Accessoires.Value laat alle afgevinkte accessoires afzonderlijk
zien, zie guur 6.18.
Figuur 6.18

180

Databaseontwikkeling 4 Access 2007

6.3.3

Keuzelijst met gerelateerde tabellen

Keuzelijsten met invoervak worden in databases vaak gebruikt om


de referentile integriteit te waarborgen. Stel we zijn een nieuwe cd
aan het invoeren in een cd-database, en na het nummer van de cd
wordt om het artiestnummer gevraagd. Het artiestnummer dat
ingevoerd moet worden, moet in de tabel Artiest bestaan (referentile integriteit). Als we het nummer niet kennen, is het met een
keuzelijst met invoervak eenvoudig op te roepen. Ideaal zou zijn
wanneer we een alfabetische artiestenlijst te zien krijgen waaruit
we de naam kunnen selecteren, terwijl de computer automatisch
het daarbij behorende artiestnummer invoert. Dit lijkt misschien
ingewikkeld, maar is in Access eenvoudig te verwezenlijken.
Eigenlijk zouden we op iedere vreemde sleutel zon keuzelijst
moeten realiseren. In voorgaande opdrachten hebben we in de
tabel Boeking uit de database Reisbureau een dergelijke keuzelijst
gemaakt. Toen is echter niet gebruikgemaakt van de Wizard. We
zullen aan de hand van de database Reisbureau een voorbeeld uitwerken door gebruik te maken van de wizard. (Waar zouden we
zijn zonder die wizard?)
In de tabel Reis is het veld Bestemmingcode een vreemde sleutel.
Het veld is immers niet de sleutel, maar wijst naar de sleutel in de
tabel Bestemming. De waarden van het veld Bestemmingcode, in
de tabel Reis, mogen alleen die waarden aannemen die in de tabel
Bestemming liggen opgeslagen. We hebben dit afgedwongen bij het
leggen van de relaties. We hebben toen aangegeven: referentile
integriteit afdwingen. Als dus in de tabel Reis een bestemmingcode wordt ingevoerd die niet in de tabel Bestemming staat, krijgen
we een boodschap dat die waarde niet wordt geaccepteerd. Via de
keuzelijst kunnen we dan de correcte waarde invoeren.
Pas op: We gaan de Wizard Opzoeken toepassen op velden die
gebruikt worden in relaties. Dat is een situatie die het meest wordt
toegepast. De wizard kan alleen toegepast worden als de relatie
tussen de tabellen nog niet bestaat. De wizard legt meteen de relatie tussen de tabellen, helaas zonder referentile integriteit. De wizard functioneert dus optimaal bij het ontwerpen van de tabellen.
Aangezien wij de relatie al gelegd hebben, moeten we die eerst in
het relatievenster verbreken. Vervolgens moeten we de wizard toepassen en ten slotte de referentile integriteit herstellen.

6 Uitgebreide formulieren

181

 Sluit alle tabellen en formulieren in de database Reisbureau.


 Klik in het lint Hulpmiddelen voor database, groep Weergeven/
verbergen op de knop Relaties. Verwijder de relatie tussen de tabellen Reis en Bestemming en sluit het venster.
 Open vervolgens de tabel Reis in de ontwerpweergave.
 Klik met de muis in de kolom Gegevenstype van het veld
Bestemmingcode.
 Kies Wizard Opzoeken als gegevenstype.
 Klik op de optie De waarden voor de opzoekkolom moeten... We
typen de waarden nu niet zelf, maar gaan deze halen uit de tabel
Bestemming.
 Geef in het volgende venster aan of in een tabel gezocht moet
worden of in een eerder gemaakte query. Selecteer Tabellen en
Bestemming.
 Geef op welke velden getoond moeten worden in de keuzelijst; zie
guur 6.19. In dit voorbeeld selecteren we ze allemaal.
Figuur 6.19

 In het volgende venster kunnen we de sorteervolgorde opgeven;


zie guur 6.20. We kunnen op maximaal vier velden sorteren.
Een klantenlijst op volgorde van klantnummer is niet zinvol, op
klantnaam wel. Een lijst op volgorde van bestemmingcode is minder handig dan een lijst op volgorde van plaats. Selecteer Land en
vervolgend Plaats en laat deze beide oplopend sorteren (standaard
waarde). Er wordt nu gesorteerd op land en daarbinnen op plaats.
 In het venster dat verschijnt, wordt de opmaak van de keuzelijst
getoond; zie guur 6.21. We kunnen eventueel de kolommen verkleinen of vergroten. Tevens staat Sleutelkolom verbergen (aan-

182

Databaseontwikkeling 4 Access 2007

bevolen) afgevinkt. Hierdoor wordt het in te voeren sleutelveld


verborgen. Negeer die aanbeveling, maak de sleutelkolom wel
zichtbaar.
Figuur 6.20

Figuur 6.21

 Het volgende scherm geeft de mogelijkheid om het veld te selecteren dat we willen invoeren in de tabel Reis, in ons geval het veld
Bestemmingcode. Selecteer dit en ga naar het volgende venster.
 Ga vervolgens door de nish door de labelnaam Bestemmingcode
te accepteren.
 Sla de nieuwe structuur op en dwing in het relatiescherm de
referentile integriteit tussen de tabellen Reis en Bestemming weer
af. Relatie selecteren met de rechtermuisknop en voor Bewerken
kiezen. Controleer de werking van de keuzelijst met invoervak in
de gegevensbladweergave.

6 Uitgebreide formulieren

183

We moeten nog een aanpassing maken. Het is namelijk mogelijk


een waarde in te voeren die niet in de lijst staat en dit willen we
voorkomen.
 Plaats de tabel opnieuw in de ontwerpweergave.
 Selecteer het veld Bestemmingcode, en vervolgens de tab
Opzoeken. Hierin bevindt zich de eigenschap Alleen lijst. Zet die
op Ja. Nu worden alleen waarden uit de keuzelijst geaccepteerd.
In dit venster kunt u ook de eigenschappen van de keuzelijst veranderen. Bijvoorbeeld de sorteervolgorde. Klik daartoe op de eigenschap Rijbron en vervolgens op de drie puntjes. De query van de
keuzelijst wordt zichtbaar; zie guur 6.22. Let hierbij eens op de
manier hoe eerst wordt gesorteerd op land en vervolgens op plaats.
Figuur 6.22

Opgave
6.3 a. Maak in de tabel Auto uit de database Oefening een nieuw veld
Kleur (Tekst). Zorg dat het veld als keuzelijst met invoervak
wordt getoond. De toegestane kleuren moeten getypt worden.
Kies zelf enkele kleuren. Andere kleuren worden bij het selecteren niet toegestaan. Controleer de werking door in het formulier
Auto voorbeeld het veld Kleur toe te voegen.
b. Maak in de tabel Auto, uit de database Oefening, een nieuw veld
Klantwensen. Hierin moeten meerdere waarden geselecteerd
kunnen worden. Die waarden zijn: Garantie, Financiering en

184
184

Databaseontwikkeling 4 Access 2007

Verzekering. Deze waarden moeten gemuteerd kunnen worden.


Voeg dit veld toe aan het formulier Auto voorbeeld.
c. In voorgaande opdrachten hebben we in de tabel Boeking de
velden Klantnummer en Reisnummer gewijzigd in keuzelijsten
met invoervak. Controleer of deze keuzelijsten voldoen aan de
volgende criteria.
De klantnummers komen uit de tabel Klant en de reisnummers
uit de tabel Reis. Zorg dat de keuzelijst van klantnummer
gesorteerd ligt op naam van de klant, en de keuzelijst van het
reisnummer op volgorde van plaats en bij gelijke plaats op aopende vertrekdatum.

6.4

Hoofd- en subformulieren

In hoofdstuk 5 hebben we eenvoudige formulieren gemaakt met een


snelle methode en met behulp van een wizard. Er worden nu twee
voorbeelden getoond waarin veel gegevens uit verschillende tabellen zijn opgenomen. Hierbij kan het voorkomen dat de gegevens
op n formulier geplaatst kunnen worden, maar ook dat er n of
meer subformulieren nodig zijn. We zullen beide mogelijkheden
aan de hand van een voorbeeld toelichten. In het eerste voorbeeld
worden gegevens uit meerdere tabellen op n formulier geplaatst.
We gaan de gegevens van een boeking op een formulier plaatsen. Hierbij maken we gebruik van onze database Reisbureau.
Alvorens het formulier te ontwerpen moeten we eerst weten
welke gegevens op het beeldscherm getoond moeten worden, zie
guur 6.23.
Figuur 6.23
Tabel
Boeking

Klant

Reis
Bestemming

Veld
Boekingsnummer
Klantnummer
Reisnummer
Boekdatum
Aantal Volwassenen
Aantal Kinderen
Naam
Adres
Postcode
Woonplaats
Vertrekdatum
Prijs per persoon
Plaats
Land

6 Uitgebreide formulieren

185

 Open de database Reisbureau en maak een nieuw formulier met


Wizard Formulier. In het eerste scherm (guur 6.24) kunnen we
opgeven welke tabellen en welke velden we op het scherm wensen
te plaatsen.
Figuur 6.24

 Selecteer onder Tabellen/querys de gewenste tabel, gevolgd door


de velden die uit die tabel op het scherm moeten komen.
 Selecteer de volgende tabel waaruit velden nodig zijn en kies uit
die tabel de benodigde velden, zie guur 6.23. Op deze manier
kunnen we alle benodigde velden uit de verschillende tabellen
benaderen. We hadden ook eerst een query kunnen maken met alle
benodigde velden. Bij Tabellen/querys selecteren we dan de query
en kiezen vervolgens in n keer alle velden.
 Klik nadat alle velden geselecteerd zijn op Volgende. Er verschijnt
een venster (guur 6.25) waarin we kunnen opgeven hoe we de
gegevens willen zien: volgens Klant, volgens Boeking, volgens Reis
of volgens Bestemming.
Access zal zelf als dat nodig mocht zijn de gegevens op de juiste wijze groeperen. Bij volgens Boeking wordt gekeken vanuit de
tabel Boeking. Een boeking is gekoppeld aan n klant en aan n
reis. Een reis is weer gekoppeld aan n bestemming. Dit is ook in
het gegevensmodel (ER-diagram) te zien. Uitgaande van de tabel
Klant zouden we bij n klant meerdere boekingen kunnen hebben
(een n-op-veel relatie). Een boeking zit verder gekoppeld aan
n reis, die op zijn beurt weer gekoppeld is aan n bestemming.
Voor de andere zienswijzen geldt iets dergelijks.

186

Databaseontwikkeling 4 Access 2007

Figuur 6.25

 In onze situatie kiezen we volgens Boeking. We gaan immers een


boeking tonen.
 In de volgende vensters kiezen we als opmaak In kolomvorm, stijl
Gieterij en de titel Boeking gegevens. In guur 6.26 wordt het resultaat getoond.
Figuur 6.26

6 Uitgebreide formulieren

187

Alle gegevens worden nu op het scherm getoond. Een wijziging in


bijvoorbeeld het veld Reisnummer wordt direct doorgevoerd in de
gegevens van de bestemming. We kunnen ook een nieuwe boeking
invoeren via de navigatieknoppen of via de knop Nieuw in het lint
Start, groep Records. De gegevens op het formulier worden door
de Wizard niet in de door ons gewenste volgorde in het venster
getoond. Uiteraard kunnen we de gegevens naar onze hand zetten
door ze te verplaatsen, te vergroten, te verkleinen,
enzovoort.
Om te voorkomen dat de basisgegevens per ongeluk gemuteerd
worden en om sneller de noodzakelijke gegevens te kunnen invoeren, gaan we van enkele besturingselementen de eigenschappen
veranderen. We willen dat de gegevens Naam, Adres, Postcode en
Plaats uit de tabel Klant niet gewijzigd kunnen worden. Ze worden
alleen nog maar getoond. Hetzelfde geldt voor Vertrekdatum en
Prijs per persoon uit de tabel Reis, en Plaats en Land uit de tabel
Bestemming. Hiertoe dienen we de eigenschappen van die besturingselementen te veranderen.
 Plaats het formulier in de indelingsweergave.
 Selecteer de genoemde besturingselementen (niet de labels) met de
Shift-toets ingedrukt, zodat ze allemaal geselecteerd zijn.
 Selecteer vervolgens met de rechtermuisknop Eigenschappen of
druk op de F4-toets. Het eigenschappenvenster wordt zichtbaar, zie
guur 6.27. De eigenschappen van de geselecteerde besturingselementen worden zichtbaar.
 Selecteer het tabblad Gegevens.
We gaan de eigenschappen Ingeschakeld en Vergrendeld gebruiken:
Ingeschakeld: Ja of Nee. Als deze eigenschap op Ja staat, kan dit
besturingselement de focus krijgen. Het besturingselement is dan
via de muis of de Tab-toets te selecteren. Als we Ingeschakeld op
Nee zetten, is het besturingselement niet te selecteren en bovendien wordt het lichter gekleurd.
Vergrendeld: Ja of Nee. De besturingstoets functioneert normaal,
kan de focus krijgen. Echter het bewerken, toevoegen of verwijderen van gegevens kan niet (Ja) of wel (Nee).

188

Databaseontwikkeling 4 Access 2007

Figuur 6.27

 Selecteer de eigenschap Ingeschakeld en kies Nee. Bekijk het resultaat in de formulierweergave.


Met de eigenschappen Ingeschakeld en Vergrendeld kunnen we
voorkomen dat besturingselementen worden gewijzigd. Het is ook
mogelijk om het gehele formulier van eigenschappen te voorzien,
zodanig dat toevoegen, verwijderen of wijzigen wel of niet zijn
toegestaan.
 Plaats het gemaakte formulier Boeking gegevens in de indelingsweergave op het scherm.
 Maak het eigenschappenvenster actief, via de toets F4 of de rechtermuisknop.
 Kies in de bovenste regel van het eigenschappenvenster Formulier,
zie guur 6.28. De eigenschappen van het formulier worden dan
getoond. Via die keuzelijst kunnen we het formulier zelf of alle onderdelen van het formulier selecteren waarvan we de eigenschappen willen veranderen.
 Selecteer het tabblad Gegevens.

6 Uitgebreide formulieren

189

Figuur 6.28

Het tabblad Gegevens, van een formulier, bevat de eigenschappen


Bewerken toestaan, Verwijderingen toestaan, Toevoegingen toestaan. Hiermee kunnen mutaties, verwijderingen of toevoegingen
wel of niet worden toegestaan, zie guur 6.28.
In het zojuist behandelde voorbeeld hebben we de gegevens
getoond gezien vanuit de tabel Boeking. Als we dezelfde gegevens
willen zien vanaf de tabel Klant, krijgen we een geheel ander overzicht. Een klant kan immers meerdere boekingen hebben, zoals
blijkt uit het gegevensmodel. We gaan dit als voorbeeld uitwerken.
 Maak een nieuw formulier via lint Maken, Meer Formulieren,
Wizard Formulier,
 Selecteer vervolgens dezelfde velden als in het vorige voorbeeld,
zie guur 6.23.
 Na de selectie komen we in het scherm waarin we kunnen opgeven
hoe we de gegevens willen zien. Kies voor volgens Klant, zie
guur 6.29.

190

Databaseontwikkeling 4 Access 2007

Figuur 6.29

Aangezien een klant meerdere boekingen kan hebben, worden nu


twee formulieren aangemaakt: een hoofdformulier met daarop de
klantgegevens en een subformulier met daarop de boekingsgegevens. De optie Gekoppelde formulieren laten we vooralsnog buiten
beschouwing. Het subformulier wordt zodanig getoond dat meerdere boekingen (records) getoond kunnen worden.
 Geef in het volgende scherm aan hoe het subformulier weergegeven moet worden: Als gegevensblad of In tabelvorm. Kies
voor Als gegevensblad.
 Ga naar het volgende scherm en kies voor de stijl Gieterij.
 In het laatste scherm, zie guur 6.30, wordt gevraagd om de formulieren een titel (naam) te geven. Het hoofdformulier en subformulier zijn als twee aparte formulieren gemaakt, die door de
onderlinge relatie (op basis van het veld Klantnummer) aan elkaar
zijn gekoppeld. Geef het hoofdformulier de titel (naam) Klant boekingen en het subformulier de titel (naam) Subklant boekingen.
 Bekijk het resultaat.
Als we door de klanten navigeren, zien we de boekingen van die
klanten in het subformulier. Het subformulier heeft ook navigatieknoppen, die we kunnen gebruiken als het aantal boekingen
groter wordt dan in het venster kan worden afgebeeld. Het kader
waarin het subformulier, de boekingen, wordt getoond is krap bemeten. Dat is te verbeteren.

6 Uitgebreide formulieren

191

Figuur 6.30

 Plaats het formulier in de ontwerpweergave.


 Het hoofdformulier en het subformulier wordt in de ontwerpweergave getoond.
 Vergroot het kader van het subformulier aan de rechterkant.
 Bekijk het resultaat in de formulierweergave.
Het subformulier is nog te klein en bovendien neemt het label van
het subformulier veel ruimte in. We gaan het label verwijderen en
het subformulier verder verbreden.
 Plaats het formulier in de indelingsweergave.
 Selecteer het label en klik op de knop Verwijderen uit het lint
Schikken. Hierdoor wordt de koppeling tussen het label het subformulier verwijderd.
 Verwijder nu het label. Zou je de koppeling tussen het label en het
subformulier niet eerst verwijderen, dan wordt automatisch ook het
subformulier verwijderd.
 Sleep het subformulier naar links en maak het aan de rechterkant
breder; verklein eventueel het navigatiegedeelte.
 Bekijk het resultaat in de formulierweergave.
Nog steeds passen niet alle velden, ook niet als je de kolommen
smaller maakt. De kolomkoppen zijn dan onleesbaar. We gaan het
verder aanpassen.
 Plaats het formulier opnieuw in de indelingsweergave.
 Selecteer alle kolommen in het subformulier, klikken en Shift-toets
ingedrukt houden.

192

Databaseontwikkeling 4 Access 2007

 Kies via de rechtermuisknop vervolgens voor Kolombreedte en


kies Best passend.
 Bekijk het resultaat in de formulierweergave.
Helaas past het nog niet goed. We kunnen nu de kolomkopjes nog
aanpassen.
 Plaats het formulier in de ontwerpweergave.
 Maak de labels van het subformulier kleiner, bijvoorbeeld
Boekingnr, Klantnr, Volw., Kind., etc. Merk op dat in het subformulier de gegevens in de ontwerpweergave onder elkaar staan,
maar in de indelings- of formulierweergave naast elkaar.
 Vervolgens kun je opnieuw de kolommen Best passend maken in
de formulierweergave. Je kunt de breedte van de kolommen eventueel handmatig nog iets aanpassen.
Tip 1: Je kunt het subformulier ook in een afzonderlijk venster
openen. Selecteer in de ontwerpweergave met de rechtermuisknop
het subformulier. Kies vervolgens met de rechtermuisknop de optie
Subformulier in nieuw venster.
Tip 2: De formulieren die je hebt gemaakt, bevatten keuzelijsten.
Wat doe je als een boeking wordt ingevoerd en de adresgegevens
van de klant zijn gewijzigd, of het betreft een nieuwe klant die
nog niet bestaat? Dan moet je eerst de adresgegevens in een ander
formulier wijzigen. Het kan ook efcinter. Open bijvoorbeeld de
tabel Boeking in de ontwerpweergave. Selecteer Klantnummer
en kies het tabblad Opzoeken. Selecteer in de eigenschap
Bewerkingsformulier lijstitems het formulier Klant (of maak deze
eerst). Laat die wijziging direct in alle formulieren doorvoeren.
Als je nu de keuzelijst opent, verschijnt onderaan een doorschijnende knop. Als je daarop klikt, verschijnt het formulier Klant.
Hierin kun je de klant opzoeken en muteren of een nieuwe klant
invoeren. Na het verlaten van het venster wordt helaas niet de geselecteerde klant direct voorgezet, maar met de keuzelijst kan snel
de juiste klant worden gezocht.

6 Uitgebreide formulieren

193
193

Opgave
6.4 a. Maak een nieuw formulier waarop de reizen per bestemming
worden getoond. Per reis bestaan vervolgens meerdere boekingen. Selecteer dezelfde velden als in guur 6.23 zijn vermeld.
Bij deze opgave komen dus twee subformulieren voor: n voor
de reizen en n voor de boekingen.
b. Verander in het formulier van opgave a. de eigenschap van het
veld Land zodanig dat dit niet meer geselecteerd (gefocust)
kan worden.
c. Zorg dat in de beide subformulieren die bij opgave a. zijn gemaakt het onmogelijk wordt om te wijzigen en te verwijderen.
Toevoegen moet wel mogelijk blijven.
d. Wijzig hoofdformulier Klant boekingen en subformulier
Subklant boekingen zodanig dat alle gegevens op een scherm
passen en dat de kopteksten in het subformulier toch duidelijk
zijn.

6.5

Tabbladen

Binnen het programma Access (en vele andere toepassingsprogrammas) wordt veel gebruikgemaakt van tabbladen. Denk maar
aan de tabbladen Opmaak, Gegevens, Gebeurtenis, enzovoort uit
het eigenschappenvenster van Access, zie guur 6.28. Het is mogelijk om zelf tabbladen te maken op formulieren. We maken daarbij
gebruik van het tabbesturingselement. We gaan het volgende voorbeeld uitwerken in onze database Reisbureau.
Regelmatig bellen klanten of er nog leuke reizen in de aanbieding
zijn. We willen die klanten zo goed mogelijk adviseren en daarbij
informatie over de klant op het scherm hebben. Daarin moeten
behalve de adresgegevens ook de reizen staan die de klant bij ons
reisbureau heeft geboekt. Bij het zoeken naar leuke reizen kunnen
we daar rekening mee houden. Iemand die vorig jaar naar Kreta is
geweest, gaan we dit jaar, in eerste instantie, niet weer naar Kreta
sturen. Tevens willen we snel een overzicht hebben van alle reizen
die we kunnen aanbieden.

194

Databaseontwikkeling 4 Access 2007

 Selecteer in het navigatiegedeelte de tabel Klant.


 Ontwerp vervolgens op een snelle manier een formulier (knop
Formulier op het lint Maken).
 Zet het formulier in de ontwerpweergave.
 Vergroot het werkgebied van het formulier door de Formuliervoettekst naar beneden te slepen en de rechterkant van het raster naar
rechts te slepen en verklein eventueel het navigatiegedeelte op extra ruimte te maken.
 Onder de klantgegevens kunnen we nu de tabbladen plaatsen.
Kies uit de groep Besturingselementen het Tabbesturingselement.
De knop Wizard voor besturingselementen moet geactiveerd zijn.
Hierdoor wordt bij het plaatsen van een besturingselement een wizard gestart.
 Verplaats de muiswijzer naar het werkgebied.
 In het werkgebied verandert de muiswijzer. Geef door te klikken
en te slepen de plaats en de grootte van het tabbesturingselement
op het formulier aan. Er verschijnen standaard twee tabbladen. De
tabs krijgen automatisch een doorgenummerde naam.
 Ga met de muis op de naam van de eerste tab staan en dubbelklik.
We komen dan in het eigenschappenvenster van de geselecteerde
tab.
 Kies hierin het tabblad Overige en verander de eigenschap Naam
in Vorige boekingen.
 Doe hetzelfde met het tweede tabblad en kies hierin als naam
Aanbod. Figuur 6.31 toont het voorlopige resultaat.
Vervolgens moeten de gegevens op de beide tabbladen aangebracht
worden. Op de tab Vorige boekingen gaan we een subformulier
plaatsen met daarop de boekingen van de klant.
 Klik op de tab Vorige boekingen. Klik in de groep Besturingselementen op de knop Subformulier/subrapport en verplaats de
muiswijzer naar het werkgebied.
 In het werkgebied verandert de muisaanwijzer. Geef door te klikken en te slepen de plaats en de grootte van het subformulier op de
tab Vorige boekingen aan.
 De wizard wordt actief en vraagt of op het subformulier een
bestaand formulier moet worden getoond of dat we op basis van
de tabellen/querys het subformulier gaan ontwerpen. Kies voor
Tabel/query en ga naar het volgende scherm.

6 Uitgebreide formulieren

195

Figuur 6.31

 Hier kunnen we een bestaande query selecteren of uit de verschillende tabellen onze gewenste gegevens kiezen. Kies uit de
tabel Boeking het veld Boekdatum, uit de tabel Reis de velden
Vertrekdatum en Aantal dagen en tenslotte uit de tabel Bestemming
de velden Plaats en Land.
 Ga na de veldselecties naar het volgende scherm van de wizard.
Hierin wordt gevraagd hoe het hoofdformulier, onze klantgegevens, gekoppeld moet worden aan ons subformulier, de boekingsgegevens.
Daarbij hebben we twee mogelijkheden. De wizard geeft een lijst
met mogelijke koppelingen waaruit we een koppeling kunnen
selecteren of we bepalen de koppeling zelf, zie guur 6.32. Bij zelf
bepalen kunnen we opgeven welk veld van het hoofdformulier gekoppeld moet worden aan het veld uit het subformulier. Die
mogelijkheid kunnen we gebruiken als een uitzonderlijke koppeling gewenst is die niet door de wizard wordt geselecteerd.
 Selecteer uit de lijst: Boeking weergeven voor elke record in
Klant... .
 Geef het subformulier de titel (naam) Boekingen van klant.

196

Databaseontwikkeling 4 Access 2007

Figuur 6.32

 Bekijk het voorlopige resultaat van het formulier in de formulierweergave; eerst het hoofdformulier selecteren.
 De lay-out van het subformulier is nog niet goed verzorgd. Pas in
de indelingsweergave de grootte van het gebied aan (eventueel in
de ontwerpweergave) en maak de kolommen passend binnen het
subformulier, zie guur 6.33.
Figuur 6.33

6 Uitgebreide formulieren

197

 Plaats het formulier weer in de ontwerpweergave om het tweede


tabblad te ontwerpen.
 Klik op de tab Aanbod.
 Hierop gaan we ook een subformulier aanbrengen. Klik in de
groep Besturingselementen op de knop Subformulier/subrapport
in de groep Besturingselementen en verplaats de muiswijzer naar
het werkgebied en klik en sleep tot weer de gewenste plaats en
grootte is bereikt.
 De wizard wordt weer actief; kies voor Tabel/query.
 Ga naar het volgende scherm. Selecteer uit de tabel Reis de velden
Vertrekdatum, Aantal dagen en Prijs per persoon. Kies uit de tabel
Bestemming de velden Plaats en Land.
In het volgende scherm van de Wizard is automatisch gekozen
voor het zelf bepalen van de koppeling tussen het hoofdformulier,
onze klantgegevens, en het subformulier, de aanbodgegevens. Er
is geconstateerd dat er geen directe relatie bestaat tussen de klantgegevens en de aanbodgegevens, immers bij iedere klant worden
dezelfde aanbodgegevens getoond.
 Aangezien er geen koppeling is, kunnen we direct naar het volgende scherm gaan.
 Geef dit subformulier de titel (naam) Reisaanbod.
 Controleer het formulier in de formulierweergave; eerst het hoofdformulier selecteren.
 De lay-out van het subformulier is nog niet goed verzorgd. Pas in
de indelingsweergave de grootte van het gebied aan (eventueel in
de ontwerpweergave) en maak de kolommen passend binnen het
subformulier, zie guur 6.34.
Om snel aanbiedingen te vinden zijn alle reizen goedkoper dan
750,00 felgroen gekleurd.





Selecteer in de indelingsweergave de kolom Prijs per persoon.


Kies in de groep Lettertype voor de knop Voorwaardelijk.
Kies Veldwaarde is; Kleiner dan; 750.
Selecteer vervolgens een felgroene letterkleur via de knop
Lettertype-/voorgrondkleur.
 De titel van het formulier is ook aangepast in de indelingsweergave. Klik op de knop Titel in het lint Opmaak. Verander de titel in
Boeking informatie.

198

Databaseontwikkeling 4 Access 2007

Figuur 6.34

 Sluit het hoofdformulier en geef dit de titel (naam) Klant met tabbladen.
Sorteren en Filteren
Het is handig als de reizen gesorteerd liggen op vertrekdatum (van
nieuwe naar oud).
 In het tabblad is dat eenvoudig te realiseren door in de kolomkop
van het veld Vertrekdatum het -symbool te selecteren.
Als de klant daarna aangeeft in een bepaalde periode op vakantie
te willen, kun je in het tabblad Aanbod bovendien nog lteren op
het veld Vertrekdatum.
 Selecteer opnieuw het -symbool en kies nu voor Datumlters,
Alle datums in periode of Tussen.
Toevoegen/verwijderen tabblad
Zoals we gezien hebben, geeft het tabbesturingselement standaard
twee tabbladen. In ons voorbeeld is dit precies voldoende, maar
wat als we meer tabbladen nodig hebben? Op eenvoudige wijze
kunnen we het aantal tabbladen vergroten.

6 Uitgebreide formulieren

199

 Plaats het formulier in de ontwerpweergave.


 Selecteer het tabbesturingselement en kies vervolgens via de rechtermuisknop voor Pagina invoegen. In ditzelfde menu kun je ook
een pagina verwijderen, Pagina verwijderen.
Volgorde van de tabbladen wijzigen
 Selecteer het tabbesturingselement in de ontwerpweergave).
 Druk op de rechtermuisknop om het snelmenu te activeren. Kies in
het snelmenu Paginavolgorde.
 Kies een tabblad en klik op de knop Omhoog of Omlaag om het
tabblad te verplaatsen.
 We kunnen ook het tabblad selecteren en de eigenschap Paginaindex wijzigen. Het eerste tabblad heeft indexwaarde 0, het tweede
heeft indexwaarde 1, enzovoort.
Opgave
6.5 a. Verander de volgorde van de tabbladen en hernoem het tabblad
Aanbod in Volledig aanbod.
b. De gegevens in de subformulieren mogen niet gewijzigd worden. Verander de eigenschappen zodanig dat dit niet kan gebeuren
c. Bij de subformulieren zijn begeleidende teksten afgedrukt,
Boekingen van klant en Reisaanbod. Verwijder die teksten.

6.6

Opdrachtknoppen

Een opdrachtknop op een formulier start een actie (opdracht) of een


reeks van acties. Zon actie kan zijn: het afdrukken van een rapport,
het openen van een formulier, het ongedaan maken van een zojuist
ingevoerde klant of het sluiten van een venster. Met de wizard kunnen we een kleine dertig verschillende acties aan een opdrachtknop
koppelen. Als we nog meer mogelijkheden met een opdrachtknop
wensen uit te voeren, zal een macro gemaakt moeten worden. Een
macro bestaat uit een aantal acties die na elkaar uitgevoerd worden;
bijvoorbeeld een formulier openen, vervolgens een bericht op het
scherm tonen en ten slotte een lter op het formulier plaatsen. Het
maken van macros wordt in hoofdstuk 8 besproken. In deze paragraaf maken we opdrachtknoppen met behulp van de wizard.

200

Databaseontwikkeling 4 Access 2007

We zullen enige voorbeelden voor opdrachtknoppen maken. We


tonen de klantgegevens op een formulier en plaatsen daar drie
opdrachtknoppen op: een opdrachtknop om wijzigingen in de
klantgegevens te annuleren, een opdrachtknop om een eerder
gemaakt rapport af te drukken en een opdrachtknop om een ander
formulier te openen.
 Maak op een snelle manier een formulier van de tabel Klant (tabel
Klant selecteren en klik in het lint Maken op Formulier).
 Plaats het formulier in de ontwerpweergave en maak het venster en
gebied van de klantgegevens groter (formuliervoettekst naar beneden slepen), zodat we de opdrachtknoppen kunnen toevoegen.
 Zorg dat in de groep Besturingselementen de knop Wizards voor
besturingselementen geactiveerd is.
 Klik met de muis op de knop Knop en plaats de muis onder de
tekst Telefoonnummer; de vorm van de muis is veranderd in een
opdrachtknop.
 Klik en sleep de opdrachtknop op het formulier. De wizard wordt
actief en toont het eerste venster, zie guur 6.35.
Figuur 6.35

Er wordt gevraagd welke actie uitgevoerd moet worden bij het


klikken op de opdrachtknop. Er zijn zes categorien waaruit gekozen kan worden, van Recordnavigatie tot en met Overige. Per categorie zijn verschillende acties mogelijk.
 Selecteer uit de categorie Recordbewerkingen de actie Record
ongedaan maken.

6 Uitgebreide formulieren

201

In het volgende venster kunnen we de opdrachtknop voorzien van


een afbeelding (pictogram) of van tekst, zie guur 6.36.
Figuur 6.36

Kiezen we voor Tekst, dan kunnen we in het vakje tekst invoeren


of de standaardtekst accepteren. Kiezen we Afbeelding, dan worden standaard n of meer afbeeldingen (pictogrammen) getoond
die bij die actie horen. Willen we echter alle mogelijke pictogrammen zien, zet dan een vinkje bij Alle afbeeldingen weergeven.
Hebben we zelf pictogrammen gemaakt, dan klikken we op de
knop Bladeren... om naar de map te gaan waaruit we een afbeelding willen selecteren.
 Kies voor Afbeelding, Ongedaan maken. Het bekende pictogrammetje van Ofce wordt op de opdrachtknop geplaatst.
 Geef in het laatste venster de knop nog een naam. Dit is niet een
naam die op de knop komt te staan we hebben immers een plaatje maar een naam die aan de knop wordt toegekend, zodat later
naar die opdrachtknop verwezen kan worden. Kies voor Klant
ongedaan maken. Merk op dat de opdrachtknop standaardafmetingen krijgt, pas deze desgewenst aan.
 Bekijk het resultaat in de formulierweergave.
 Wijzig enkele gegevens van een klant en klik vervolgens op de
zojuist gemaakte opdrachtknop.
Deze opdrachtknop heeft standaard een tabstop. Als we met de
Enter-toets door het formulier lopen, komen we automatisch op de
opdrachtknop terecht. Het zojuist ingevoerde wordt dan (per ongeluk) direct weer gewist! Om vergissingen te voorkomen krijgt de
opdrachtknop geen tabstop.

202

Databaseontwikkeling 4 Access 2007

 Plaats het formulier in de ontwerpweergave en selecteer de


opdrachtknop. Plaats via de rechtermuisknop het eigenschappenvenster op het scherm. De eigenschappen van de opdrachtknop
worden nu getoond.
 Kies voor de tab Overige en verander de eigenschap Tabstop in
Nee.
 Controleer de uitwerking van deze eigenschap in de formulierweergave.
 Sla het formulier op onder de titel (naam) Klant met opdrachtknoppen.
We gaan een nieuwe opdrachtknop maken die een bestaand rapport gaat afdrukken.
 Open het formulier Klant met opdrachtknoppen in de ontwerpweergave.
 Plaats rechts naast de bestaande opdrachtknop een nieuwe
opdrachtknop.
 Kies in het eerste venster van de wizard voor categorie
Rapportbewerkingen en uit de acties Afdrukvoorbeeld rapport. De
actie Rapport afdrukken zou het rapport direct naar de printer sturen. Alle gemaakte rapporten en etiketten worden getoond.
 Selecteer een van de eerder gemaakte rapporten uit hoofdstuk 5,
bijvoorbeeld Adresetiketten Klant. Ga vervolgens naar het volgende
venster.
 Kies voor Tekst en verander de tekst in Etiketten. De naam van de
opdrachtknop wordt ook Etiketten.
We gaan ten slotte nog een opdrachtknop op het formulier plaatsen
die een bestaand formulier opent.
 Zet rechts van de bestaande opdrachtknoppen een nieuwe opdrachtknop op het formulier.
 Selecteer de categorie Formulierbewerkingen en kies uit de acties
Formulier openen.
 Kies uit de gemaakte formulieren Boeking gegevens. We krijgen
nu de mogelijkheid om specieke gegevens van het nieuwe formulier te tonen of aan te geven dat alle gegevens op het nieuwe formulier getoond moeten worden, zie guur 6.37.

6 Uitgebreide formulieren

203

Figuur 6.37

 Kies voor Formulier openen en specieke gegevens zoeken, zodat


we de boekingen te zien krijgen van de klant waar we mee bezig
zijn.
 Hierna wordt gevraagd welke velden aan elkaar gekoppeld moeten worden; zie guur 6.38. Kies uit Klant met opdrachtknoppen het veld Klantnummer en uit Boeking gegevens eveneens
Klantnummer.
Figuur 6.38

 Klik vervolgens op de knop <-->, waardoor de koppeling plaatsvindt.


 Zet Boekingen als tekst op de opdrachtnop. Ook de naam van de
opdrachtknop wordt Boekingen.
 Bekijk en onderzoek het resultaat van het formulier in de formulierweergave.

204

Databaseontwikkeling 4 Access 2007








Schikken van besturingselementen op een formulier


De drie knoppen hebben andere afmetingen en staan waarschijnlijk niet allemaal mooi uitgelijnd (geschikt). Er zijn een aantal
knoppen waarmee je dat snel kunt oplossen.
Plaats het formulier in de ontwerpweergave en selecteer de drie
knoppen; met de Shift-toets ingedrukt of met de muis een kader
om de knoppen trekken.
Kies het lint Schikken. Kies uit de groep Grootte voor de knop
Grootte aanpassen aan breedste en daarna op Grootte aanpassen
aan langste. Alle knoppen zijn nu even groot.
Selecteer uit de groep Uitlijning bepalen voor Onder uitlijnen. De
knoppen staan nu op n lijn.
Klik ten slotte in de groep Positie een paar keer op Horizontale
afstand vergroten. De knoppen staan nu netjes geschikt.
Nog een laatste verjning. Wanneer we met de muis op de knop
Ongedaan maken gaan staan, komt automatisch de melding
Record ongedaan maken tevoorschijn. Bij de opdrachtknoppen
met tekst wordt die melding niet getoond. We kunnen die eenvoudig aanbrengen door, in de ontwerpweergave, de eigenschappen
van de opdrachtknop te wijzigen: in het tabblad Overige bij de eigenschap Knopinfo.
Opgave

6.6 a. Maak op het formulier Klant met opdrachtknoppen nog een


opdrachtknop. Deze moet ervoor zorgen dat het formulier wordt
gesloten. Kies voor de afbeelding stoppen.
b. Maak ook in het formulier Boeking gegevens een opdrachtknop
om het formulier af te sluiten.
c. Zorg dat de opdrachtknoppen Etiketten en Boekingen in het
formulier Klant met opdrachtknoppen van een melding worden
voorzien als we met de muis boven de opdrachtknop komen.
De melding moet respectievelijk zijn: Postcode klantenlijst en
Boekingen van de klant.

6 Uitgebreide formulieren

6.7

205

Draaitabellen/Draaigrafieken

Een draaitabel, ook wel kruistabel genoemd, is een speciaal soort


tabel waarin een samenvatting wordt getoond van de opgegeven
velden uit de database. Als we een query hebben gemaakt waarin
op meerdere velden gegroepeerd kan worden, kan die informatie
overzichtelijker worden weergegeven in een draaitabel. Het overzicht wordt in rijen en kolommen getoond, zoals in een werkblad
van Excel. Met een draaigraek kunnen de gegevens uit een query
of formulier grasch worden weergegeven. We gaan eerst een
draaitabel maken en vervolgens hiervan een draaigraek.
We zullen een voorbeeld uitwerken. We willen weten hoeveel
volwassenen, kinderen en welk totale aantal personen per dag per
bestemming vertrekken. We willen dit ook nog uitgesplitst hebben
per land. Hiertoe maken we eerst een query waarin de gegevens
staan.
 Maak een nieuwe query in de ontwerpweergave; lint Maken, knop
Queryontwerp.
 Selecteer de tabellen Bestemming, Reis en Boeking.
 Kies de velden Plaats, Land, Vertrekdatum, Aantal volwassenen en
Aantal kinderen.
 Maak een rekenveld waarin staat: Totaal: [Aantal volwassenen] +
[Aantal kinderen].
 Bekijk de query in de gegevensbladweergave.
 Sla de query op onder de naam Draaitabel voorbeeld.
 Selecteer de zojuist gemaakte query in het navigatiegedeelte en
klik vervolgens in het lint Maken, groep Formulieren op de knop
Meer formulieren, Draaitabel.
 Er verschijnt een formulier waarin we de velden kunnen plaatsen,
zie guur 6.39.
 Klik in het formulier om de draaitabelvelden te zien. Mocht dat
niet verschijnen, klik dan in de groep Weergeven/verbergen op de
knop Lijst met velden.
 Verklein eventueel het navigatiegedeelte om meer ruimte om het
scherm te maken.

206

Databaseontwikkeling 4 Access 2007

Figuur 6.39

De gegevens worden nog niet getoond zoals wij dat willen. Access
weet niet welke gegevens waar moeten staan en de wizard helpt
ons niet verder. Er bestaan vier gebieden, namelijk rij-, kolom-,
lter- en detailgebied. De velden die we geselecteerd hebben in de
query worden getoond in de Lijst met draaitabelvelden, zie guur
6.39. In deze lijst zijn voor het veld Vertrekdatum twee extra opties
toegevoegd, namelijk Vertrekdatum per week en Vertrekdatum per
maand. Voor elk veld van het type Datum zal dat toegevoegd worden. Hiermee kun je samengevatte informatie van het veld tonen.
Als je bijvoorbeeld vertrekdatum per week uitvouwt door op het
+-teken te klikken, kun je onder andere kiezen voor Jaren, Weken
en Dagen, zie guur 6.40.
Kies je bijvoorbeeld Jaren dan kun je nadat het geplaatst is in de
draaitabel eerst een jaar selecteren, bijvoorbeeld 2010. Indien de
vertrekdatums over verschillende jaren ingevoerd zijn, zal hierna
alleen het jaar 2010 worden weergegeven. Het jaar is vervolgens
verder uit te vouwen door op het +-teken te klikken, naar weken
inclusief een extra totaaltelling. De weken zijn weer uit te vouwen
naar dagen (zondag, maandag, enzovoort). Hetzelfde geldt voor
Vertrekdatum per maand. Je kunt dan onder andere samengevatte
informatie krijgen per jaar, kwartaal en maand inclusief extra
totaaltellingen. De gegevens kunnen vanzelfsprekend ook weer
samengevouwen worden door op het minteken te klikken.

6 Uitgebreide formulieren

207

Figuur 6.40

We gaan nu onze draaitabel afmaken.


 Sleep het veld Plaats naar het rijgebied en Weken uit Vertrekdatum
per week naar het kolomgebied. We willen immers de gegevens per
week hebben.
 Sleep de velden Aantal volwassenen, Aantal kinderen en Totaal
naar het detailgebied.
De kolommen en rijen zijn nu bepaald. De gegevens die we op de
kruispunten van de rijen en kolommen willen zien in een spreadsheet cellen genaamd zijn in het detailgebied geplaatst. We laten
het ltergebied nog even voor wat het is; we komen hier later op
terug. Het aantal volwassenen, kinderen en totaal aantal personen
per plaats per week wordt getoond, zie guur 6.41.
Als in een bepaalde week verschillende reizen zijn geboekt naar
een bepaalde plaats, worden alle gegevens in de rij/kolom getoond. Zie bijvoorbeeld de plaatsen Bangkok en Gites in week 20
van guur 6.41. Wij zijn niet genteresseerd in de detailgegevens
maar in de totalen daarvan. We willen namelijk per plaats, per
week het totaal aantal volwassenen, kinderen en totaal aantal personen weten dat op vakantie gaat.

208

Databaseontwikkeling 4 Access 2007

Figuur 6.41

 Klik op Aantal volwassenen. Alle rij/kolomcombinaties waarin een


waarde staat, worden lichtblauw gekleurd.
 Klik in het lint Ontwerpen, groep Extra, op de knop (8)
AutoBerekenen en selecteer Som of selecteer die in het snelmenu
(rechtermuisknop). Er komt per plaats een extra rij bij met hierin
het gesommeerde aantal volwassenen.
 Voer hetzelfde uit voor de velden Aantal kinderen en Totaal.
We kunnen nu de detailgegevens verbergen, zodat alleen de totalen
overblijven. Dit kan per plaats door op de uitvouw/opvouw (+/-)
knopjes te klikken van een plaats. Het kan ook voor alle plaatsen
tegelijk. We kiezen voor die laatste optie.
 Selecteer de kolom Plaats en klik vervolgens in de groep
Weergeven/verbergen op Details verbergen of via de rechtermuisknop. In diezelfde groep kun je de details weer zichtbaar maken
met de knop Details weergeven, zie guur 6.42.
Merk op dat voor de veldnamen Som van is toegevoegd en dat de
veldenlijst is uitgebreid met Totalen. Hierin zitten onze drie nieuwe
veldnamen, zie guur 6.42. Verder is te zien dat per kolom en per
rij een Eindtotaal wordt weergegeven.

6 Uitgebreide formulieren

209

Figuur 6.42

Als laatste gaan we het ltergebied gebruiken. Indien we gegevens


in de draaitabel willen lteren, kunnen we het veld waarmee we
willen lteren naar het ltergebied slepen.
 Sleep uit de veldenlijst het veld Land naar het ltergebied. Er verandert in eerste instantie niets. Na het slepen wordt namelijk nog
niet gelterd, alles wordt getoond.
 Klik op het pijltje naast het veld Land, verwijder het vinkje bij
Alles en plaats vervolgens een vinkje bij Spanje. Hierdoor wordt er
gelterd op het land Spanje en worden alleen de reizen naar Spanje
getoond.
Door verschillende vinkjes te zetten kunnen meer landen getoond
worden of juist alle door het vinkje bij Alles te zetten. Merk op
dat indien gelterd wordt op bijvoorbeeld Spanje, alleen de weken
worden getoond waarin er reizen naar Spanje zijn. De draaitabel
wordt hierdoor zo compact mogelijk gehouden. Als je toch alle
rij/kolomcombinaties wilt zien, dan kun je een eigenschap van de
draaitabel aanpassen. Dit wordt later toegelicht. Verder kun je nog
de eigenschappen van een draaitabel veranderen.

210

Databaseontwikkeling 4 Access 2007

 Kies in de draaitabel de kolom Som van Aantal volwassenen en


activeer het eigenschappenvenster door op de knop Eigenschappenvenster in de groep Extra te klikken of met de F4-toets.
 Verander in het tabblad Bijschriften het bijschrift Som van Aantal
volwassenen in Tot. volwassenen. Klik vervolgens in de draaitabel
op de kolom Som van Aantal kinderen en verander het bijschrift
hiervan in Tot. kinderen.
 Voer dit ook uit voor Som van Totaal en maak het bijschrift Totaal.
Er zijn nog meer mogelijkheden, zo kun je bijvoorbeeld in het
tabblad Opmaak het geselecteerde veld laten sorteren of vet weergeven.
 Sluit het eigenschappenvenster. Het eindresultaat wordt getoond,
zie guur 6.43.
 Sla het formulier op onder de naam Draaitabel voorbeeld.
Figuur 6.43

Enige opmerkingen over draaitabellen:


We kunnen ook van een formulier een draaitabel maken. Selecteer
het formulier en maak vervolgens een draaitabel. De gegevens uit
het formulier worden dan opgenomen in de veldenlijst. Als een
formulier een subformulier heeft, worden alleen de gegevens uit
het hoofdformulier opgenomen. Hetzelfde geldt voor rapporten.

6 Uitgebreide formulieren

211

De gegevens in een draaitabel zijn dynamisch: wijzigingen in de


tabellen worden direct doorgevoerd in de draaitabel. Boekingen
naar Spanje zullen in onze draaitabel dus direct zichtbaar zijn.
Als een draaitabel in ontwerpgave wordt geplaatst, toont Access
een standaardformulier met hierin alle velden. De basis van een
draaitabel is namelijk een formulier.
De velden die al geselecteerd zijn in de draaitabel worden in de
Lijst met draaitabelvelden vet weergegeven. Uit de veldenlijst kun
je ook velden verwijderen (rechtermuisknop) of toevoegen aan de
draaitabel zonder te slepen. Selecteer een veld en kies onder in het
venster naar welk gebied het veld verplaatst moet worden. Klik
vervolgens op Toevoegen.
Je kunt de geselecteerde velden in de draaitabel eenvoudig verslepen om een andere lay-out te krijgen, bijvoorbeeld door de rijen en
kolommen te wisselen. Ook kun je verschillende velden in het rijof kolomgebied plaatsen. Zo kun je bijvoorbeeld het veld Land verplaatsen van het ltergebied naar het rijgebied. Indien je het sleept
vr het veld Plaats, worden automatisch de plaatsen bij de landen
geplaatst. Hiermee kunnen ook weer allerlei subtotalen en totalen
worden getoond.
Naast de eigenschappen van het detailgebied kun je ook de eigenschappen van de overige gebieden aanpassen. Je kunt bijvoorbeeld
het bijschrift Plaats veranderen in Plaatsnaam. Ook de draaitabel
zelf heeft eigenschappen die aangepast kunnen worden. Klik daartoe in een leeg gebied van de draaitabel. Zo kun je bijvoorbeeld de
bijschriften van de gebieden veranderen. Ook kun je ervoor zorgen
in het tabblad Rapport dat lege rijen en kolommen toch getoond worden.
Het ltergebied in een draaitabel is optioneel. Stel je maakt een
draaitabel waarin een ltergebied niet gewenst is. Dan blijft
in het ltergebied altijd de tekst Filter hier neerzetten weergegeven. Je kunt die tekst verwijderen door te klikken op de knop
Neerzetgebieden in de groep Weergaven/verbergen.
Draaigrafieken
Hiermee kunnen we op eenvoudige wijze graeken van de gegevens uit een query maken. De verschillende gegevens moeten weer
in gebieden geplaatst worden. Je kunt ook snel wisselen tussen een
draaitabel en een draaigraek. Hierdoor kunnen gegevens in tabelof graekvorm worden weergegeven. We zullen twee voorbeelden
uitwerken, een draaigraek maken op basis van een query en een

212

Databaseontwikkeling 4 Access 2007

bestaande draaitabel als draaigraek tonen. We beginnen met een


draaigraek vanuit een query op te bouwen, zodat de verschillende
gebieden van een draaigraek toegelicht kunnen worden.
We willen per land, per week het aantal boekingen in graekvorm
weergeven. Dit moet ook nog per werelddeel uitgesplitst kunnen
worden.
 Maak een nieuwe query zoals in guur 6.44 is weergegeven en sla
deze op onder de naam Draaigraek voorbeeld.
Figuur 6.44

 Selecteer de zojuist gemaakte query in het navigatiegedeelte


en klik in het lint Maken, groep Formulieren, op de knop
Draaigraek.
 Er verschijnt een formulier waarin we de velden kunnen plaatsen,
zie guur 6.45. Klik in het formulier om de draaigraekvelden te
zien. Mocht dat niet verschijnen, klik dan op de knop Lijst met velden, in de groep Weergeven/verbergen.
 Verklein eventueel het navigatiegedeelte om meer ruimte om het
scherm te maken.
Er zijn vier gebieden waarin de geselecteerde velden geplaatst kunnen worden: categorie-, reeks-, gegevens- en ltergebied. Er kunnen verschillende graektypen gepresenteerd worden. Standaard
wordt een kolomdiagram getoond.

6 Uitgebreide formulieren

213

Figuur 6.45

 Sleep het veld Land naar het categoriegebied.


 Sleep het veld Boekingnummer naar het gegevensgebied.
Direct wordt daar getoond Som van Boekingnummer. In het gegevensgebied wordt samengevatte informatie getoond. Standaard
wordt op numerieke velden de functie Som toegepast en op tekstof datumvelden de functie Aantal. Aangezien Boekingnummer
een numeriek veld is, wordt hiervan de som getoond. Wij moeten
de boekingnummers tellen om het aantal boekingen per land te
bepalen. De nummers moeten dus niet gesommeerd worden, maar
geteld.
 Selecteer Som van Boekingnummer en klik in de groep Extra op de
knop Autoberekenen, Aantal of selecteer die optie via de rechtermuisknop. Het voorlopige resultaat het totaal aantal boekingen
per land wordt getoond in guur 6.46, zonder veldenlijst.
Merk bovendien op dat niet alle gebieden noodzakelijk zijn. Indien
het aantal boekingen per land gewenst is, is deze graek voldoende. Wij gaan nu de graek verder volmaken. Zorg dat de veldenlijst
zichtbaar is.

214

Databaseontwikkeling 4 Access 2007

Figuur 6.46

 Sleep uit de veldenlijst de optie Weken, uit Vertrekdatum per week,


naar het reeksgebied.
 Klik in de groep Weergeven/verbergen op de knop Legenda.
Zonder legenda is het heel onduidelijk wat het reeksgebied heeft
toegevoegd. In een kolomdiagram wordt het reeksgebied weergegeven door de kleur van kolommen en de namen van de weken. Nu is
duidelijk te zien dat per land, per week het totaal aantal boekingen
wordt getoond.
 Sleep uit de veldenlijst het veld Werelddeel naar het ltergebied.
 Vouw het werelddeel open, verwijder het vinkje bij Alles en plaats
een vinkje bij West-Europa. We hebben nu een lter geplaatst op
het werelddeel.
Merk op dat als naar bepaalde landen geen boekingen zijn, deze
ook niet getoond worden. Hetzelfde geldt voor de weken. Indien
er in een bepaalde week geen boekingen zijn, wordt die week ook
niet getoond. In de eigenschappen van de draaigraek kunnen we
dat eventueel ongedaan maken, zoals toegelicht bij draaitabellen.
We gaan de assen van de graek een passend bijschrift geven.
 Selecteer de horizontale-astitel en plaats het eigenschappenvenster
(F4).
 Verander in het tabblad Opmaak het bijschrift in Landen.
 Maak van de verticale-astitel Aantal boekingen.

6 Uitgebreide formulieren

215

 Klik in het witte gebied van de graek en maak het eigenschappenvenster actief. We gaan daar een titel boven de graek plaatsen.
 Klik op de knop Titel toevoegen, tabblad Algemeen.
 Selecteer het titelgebied in de draaigraek en verander in het tabblad Opmaak het bijschrift in Aantal boekingen per land en maak
die tekst vervolgens vet. Het eindresultaat wordt getoond in guur
6.47.
 Sla het formulier op onder de naam Draaigraek voorbeeld.
Figuur 6.47

In het tweede voorbeeld van een draaigraek gaan we de eerder


gemaakte draaitabel weergeven als draaigraek.
 Open het formulier Draaitabel voorbeeld. Deze moet getoond worden zoals weergegeven in guur 6.43.
 We kunnen het formulier nu niet in draaigraekweergave tonen.
Die weergaveoptie is niet te selecteren. Plaats het formulier in de
ontwerpweergave en toon de eigenschappen van het formulier, zie
guur 6.48.
 Zet de eigenschap Draaigraekweergave toestaan op Ja. Nu kun
je ook de draaigraekweergave selecteren in het lint Weergave, zie
guur 6.49.
 Zorg ervoor dat de legenda zichtbaar wordt en verander de astitels
in Plaatsen en Aantal personen, zie guur 6.49.

216

Databaseontwikkeling 4 Access 2007

Figuur 6.48

Figuur 6.49

De legenda van het reeksgebied is niet duidelijk. Nu hebben we


nog gelterd op Spanje, maar als je alle landen laat zien dan is het
overzicht niet echt overzichtelijk. We kunnen dit verbeteren door
een graek per week te laten zien.

6 Uitgebreide formulieren

217

 Open het eigenschappenvenster (F4) en selecteer in het tabblad


Algemeen de keuze Meerdere graeken. Er komt nu boven de graek een extra gebied, waarin we per selectie verschillende graeken krijgen.
 Verplaatst de veldknop Weken naar het nieuwe gebied. We krijgen
nu per week een graek te zien, zie guur 6.50.
Figuur 6.50

De instellingen van de draaigraek worden automatisch opgeslagen bij het formulier van de draaitabel. Als je later de draaitabel
opent en je toont vervolgens de draaigraek hiervan, dan worden
de zojuist gemaakte instellingen weergegeven.
Enige opmerkingen over draaigraeken:
Je kunt ook van een formulier een draaigraek maken. Selecteer
het formulier en maak vervolgens een draaigraek. De gegevens
uit het formulier worden dan opgenomen in de veldenlijst. Als een
formulier een subformulier heeft, worden alleen de gegevens uit
het hoofdformulier opgenomen. Hetzelfde geldt voor rapporten.
Je kunt verschillende typen graeken selecteren. Klik in het lint
Ontwerpen, groep Type op de knop Graektype wijzigen. Hierdoor
wordt automatisch het eigenschappenvenster geopend van de draaigraek en het tabblad Type geselecteerd. Hierbij dient opgemerkt

218

Databaseontwikkeling 4 Access 2007

te worden dat per type graek niet alle gebieden voorkomen. Zo is


bijvoorbeeld bij een cirkeldiagram het reeksgebied niet aanwezig.
De reeksgegevens wisselen met de categoriegegevens kan via het
eigenschappenvenster in het tabblad Gegevensdetails.
Naast het ltergebied kun je ook in het categorie- en reeksgebied
selecties maken. Zo is het mogelijk om bijvoorbeeld een beperkt
aantal landen of weken te selecteren in ons voorbeeld.
Verder geldt dat de eigenschappen van de draaigraek en de diverse
gebieden aangepast kunnen worden, zoals toegelicht bij draaitabellen.
Opgave
6.7 a. Maak de draaitabel zoals weergegeven in guur 6.51. Er is gebruik gemaakt van een query met hierin de volgende gegevens:
Vertrekdatum, Plaats, Land, Naam en Woonplaats. In het ltergebied is week 19 geselecteerd.
b. Maak de draaigraek zoals weergegeven in guur 6.52. Er is
gebruik gemaakt van een query met hierin de volgende velden:
Boekingnummer, Vertrekdatum, Werelddeel en Land.
c. Verander de graek van onderdeel b. zodanig dat per werelddeel een aparte graek wordt getoond.
Figuur 6.51

6 Uitgebreide formulieren

Figuur 6.52

219
219

Uitgebreide rapporten

In hoofdstuk 5 heb je kennis gemaakt met rapporten. In dit hoofdstuk gaan we uitgebreider in op het ontwerpen van rapporten. Een
rapport kunnen we geheel vanaf het begin met de hand ontwerpen.
Verstandiger is het echter om met de wizard een eerste opzet te
laten genereren en het gegenereerde rapport met de hand verder
aan te passen en te detailleren. In dit hoofdstuk werken we hiervan
een aantal voorbeelden uit. In de voorbeelden zijn de overzichten
afgedrukt op een HP Laserjet 1018. Als een andere printer is aangesloten en ingesteld, kan de lay-out van de overzichten iets afwijken van de getoonde overzichten in dit boek.

7.1

Rapport zonder duplicaten

We gaan een eenvoudig voorbeeld uitwerken waarbij een bestemminglijst wordt getoond op volgorde van werelddeel, bij gelijk werelddeel op land en bij gelijk land op volgorde van plaats, zie guur
7.1.
 Klik in het lint Maken, groep Rapporten, op de knop Wizard
Rapport. Selecteer in het eerste venster de tabel Bestelling.
 Selecteer de velden in de volgorde zoals in guur 7.1 is afgebeeld, dus eerst Werelddeel, dan Land, Plaats en vervolgens
Bestemmingcode.
 In het volgende scherm wordt gevraagd of er groepeerniveaus
gewenst zijn. Dat is niet noodzakelijk, ga direct naar het volgende
scherm.

222

Databaseontwikkeling 4 Access 2007

Figuur 7.1

 In dit scherm kunnen we de sorteervolgorde opgeven. Kies eerst


een volgorde op Werelddeel, vervolgens op Land en ten slotte op
het veld Plaats. Hierdoor wordt eerst gesorteerd op werelddeel, bij
gelijk werelddeel op volgorde van land en bij gelijk land op volgorde van plaats.
 Geef in het scherm dat hierna verschijnt op hoe het rapport opgemaakt moet worden. Kies voor de indeling In tabelvorm en Staand.
 Geef in het volgende scherm een stijl van het rapport op. Van iedere stijl wordt een voorbeeld getoond. Selecteer de stijl Gieterij.
 Kies in het volgende scherm de titel Bestemming per werelddeel en
voltooi het rapport. Er wordt direct een voorbeeld van het rapport
op het scherm getoond, zie guur 7.2.

7 Uitgebreide rapporten

223

Figuur 7.2

We zien dat het rapport de informatie toont, echter niet in de


vorm zoals weergegeven in guur 7.1. Als er tien bestemmingen
in Afrika zijn, wordt ook tien keer onder elkaar het woord Afrika
afgedrukt. We willen dat de duplicaten (dubbelen) niet worden getoond. Hiervoor zullen we het rapport handmatig gaan aanpassen.
 Sluit het afdrukvoorbeeld met de knop Afdrukvoorbeeld sluiten en
plaats het rapport in de ontwerpweergave. Het wordt nu getoond
zoals getoond in guur 7.3.

224

Databaseontwikkeling 4 Access 2007

Figuur 7.3

We zien dat het rapport in een aantal secties is onderverdeeld. Een


overzicht van de gebieden:
Rapportkoptekst De hier getoonde gegevens worden eenmalig
aan het begin van het rapport afgedrukt. De tekst Bestemming per
werelddeel wordt dus eenmalig afgedrukt, ook als meerdere paginas weergegeven worden.
Paginakoptekst Deze gegevens worden boven aan iedere bladzijde afgedrukt, de zogenoemde koptekst.
Details Hier worden de echte gegevens afgedrukt. Dit zijn de
velden uit de database. Voor Werelddeel wordt dus bijvoorbeeld
Afrika afgedrukt, dit in tegenstelling tot het label Werelddeel in de
Paginakoptekst.
Paginavoettekst Deze voettekst wordt onder aan iedere pagina
getoond. Now() is een functie en toont de huidige datum. [Page]
en [Pages] zijn speciale velden die respectievelijk de huidige pagina en het totaal aantal paginas afdrukt.

7 Uitgebreide rapporten

225

Rapportvoettekst De eenmalige afsluiting van het rapport, vaak


gebruikt om eindtotalen op te nemen. Merk op dat in dit voorbeeld
de rapportvoettekst niet gebruikt is. Er wordt dus niets afgedrukt
nadat het gehele rapport is getoond.
De aanpassingen die in het rapport uitgevoerd moet worden, is het
niet tonen van de duplicaten.
 De velden Werelddeel en Land hebben beide duplicaten. Selecteer
beide velden Shift-toets en klikken of een denkbeeldig kader om
beide velden slepen in de sectie Details!
 Plaats vervolgens het eigenschappenvenster, via de groep Extra of
via de F4-toets, zie guur 7.4.
Figuur 7.4

Hiermee kunnen we de eigenschappen van een geselecteerd object


aanpassen. We kunnen onder andere de opmaak bijvoorbeeld het
lettertype of de kleur van de tekst, kader of achtergrond aanpassen.

226

Databaseontwikkeling 4 Access 2007

 Selecteer het tabblad Opmaak en verander vervolgens Duplicaten


verbergen in Ja. Hierdoor worden duplicaten van de velden
Werelddeel en Land niet meer getoond.
 Controleer de werking in de rapportweergave of als afdrukvoorbeeld.
We gaan nog een kleine wijziging doorvoeren. Niet alle werelddelen worden volledig weergegeven, zie bijvoorbeeld NoordAmerika.
 Plaats het rapport in de indelingsweergave. Selecteer n werelddeel, vervolgens wordt de gehele kolom geselecteerd, zie guur 7.5.
Figuur 7.5

7 Uitgebreide rapporten

227

 Maak nu de rechterkant van de kolom Werelddeel breder zodat de


werelddelen volledig worden getoond.
De kolommen zijn gegroepeerd. Een wijziging in n veld wordt
direct in de gehele kolom doorgevoerd in deze indeling. Zou je
de opmaak veranderen, bijvoorbeeld vet afdrukken, dan geldt dat
direct voor de gehele kolom. Zo is ook een rij te selecteren in deze
indeling; in de linkermarge klikken. Een wijziging op de geselecteerde rij geldt ook voor alle velden in de rij. Ook kun je eenvoudig
een kolom verplaatsen. Selecteer een kolom en sleep die eenvoudig
naar een andere plaats. Je kunt hetzelfde realiseren in de ontwerpweergave, maar het voordeel van de indelingsweergave is dat je
direct het resultaat ziet.
In veel rapporten komen duplicaten voor, die meestal niet worden
getoond. We hebben nu geleerd om die duplicaten op eenvoudige
wijze te verwijderen.








Opmerkingen rapporten
In de ontwerpweergave kan linksboven een groen waarschuwingsdriehoekje verschijnen. Als je daarop klikt, wordt een knop met
een uitroepteken zichtbaar. Klik je op die knop dan wordt de waarschuwing getoond, bijvoorbeeld: De breedte van het rapport overschrijdt de breedte van de pagina. Er worden direct een paar opties
geboden om het probleem op te lossen, bijvoorbeeld: Extra ruimte
in het rapport verwijderen.
Het veranderen van eigenschappen kan ook in de indelingsweergave. Het eigenschappenvenster is dan te selecteren via de rechtermuisknop of via de F4-toets. De wijzigingen worden direct
getoond.
In veel rapporten zorgt de wizard automatisch voor het niet weergeven van duplicaten.
Een rapport als afdrukvoorbeeld wordt getoond zoals het wordt
afgedrukt op de printer. In een rapport in de rapportweergave kunnen we de gegevens nog lteren of opzoeken.

7.2

Rapport met groepen

Het komt vaak voor dat we in rapporten groepen willen onderscheiden. Een groep is een verzameling gegevens met een gemeen-

228

Databaseontwikkeling 4 Access 2007

schappelijk kenmerk. Veel managementinformatie wordt op die


manier gemaakt. Het is compacte, gegroepeerde informatie die
vaak wordt toegepast in managementinformatiesystemen (MIS).
We zullen dit aan de hand van een voorbeeld toelichten.
Figuur 7.6 toont de reizigers, met hun bestemming, per vertrekdatum.
Figuur 7.6

We zien dat per vertrekdatum een groep reizigers wordt weergegeven. Het gemeenschappelijke kenmerk van die groep is dus
de vertrekdatum. Voor elke vertrekdatum wordt een nieuwe groep
gestart. Je kunt eenvoudig in de rapportweergave een lter plaatsen om een bepaalde periode te lteren of een vertrekdatum zoeken. Binnen de groep is gesorteerd op land en bij gelijke land op
bestemming en bij gelijke bestemming op naam.

7 Uitgebreide rapporten

229

Voor de groepen zijn enkele berekeningen gemaakt. Zo is het aantal klanten per vertrekdatum bepaald. Ook is de totale reissom bepaald per vertrekdatum en het percentage hiervan ten opzichte van
de totale reissom van alle getoonde reizen. Ook is het mogelijke
om berekeningen uit te voeren over alle groepen samen, zodat je
bijvoorbeeld het totaal aantal klanten kunt tonen van alle getoonde
vertrekdatums, zie guur 7.6.
We gaan beschrijven hoe je het getoonde voorbeeld kunt maken.
We maken een eerste opzet van het rapport met de wizard. Daarna
gaan we handmatig enige cosmetische aanpassingen maken om het
naar onze smaak aan te passen. Het is gebruikelijk om eerst een
query te maken met daarin de gegevens die in het rapport moeten
komen.
 Maak de query en sla die op onder de naam rptReizigers per vertrekdatum, zie guur 7.7. Het is handig om een query die voor een
rapport wordt gebruikt, dezelfde naam te geven als het rapport,
voorafgegaan door de letters rpt (rapport). Je kunt dan snel zien
welke query bij welk rapport hoort.
Figuur 7.7

230

Databaseontwikkeling 4 Access 2007

Merk op dat een rekenveld is gemaakt voor het totale bedrag dat
voor een reis betaald moet worden. Alle kinderen voor alle reizen
krijgen een korting van 50%.
 Klik in het lint Maken op Wizard Rapport. Selecteer de zojuist
gemaakte query en selecteer alle velden.
 In het volgende venster kunnen we een groepeerniveau aanbrengen. We willen op Vertrekdatum groeperen, dus selecteer
Vertrekdatum. Hierdoor komt het veld bovenin te staan met als
toevoeging volgens Maand, zie guur 7.8. Standaard wordt bij
datumvelden per maand gegroepeerd.
 Wij willen echter niet maand maar per dag groeperen, bij elke
vertrekdatum willen we de klanten zien. Klik daarvoor op de knop
Opties voor groeperen en verander in de keuzelijst de groepeeroptie Maand in Normaal, zie guur 7.8. Zie daarbij bovendien de
groepeeropties voor datumvelden.
Figuur 7.8

 In het volgende venster van de wizard kunnen we voor de detailsectie van het rapport opgeven wat de sorteervolgorde moet zijn,

7 Uitgebreide rapporten

231

zie guur 7.9. Sorteer op Land, Plaats en Naam. Hierdoor wordt


per vertrekdatum eerst gesorteerd op land, bij gelijke land op de
plaats van het land en bij gelijke plaats op de naam van de klant.
Via de knop Opties voor totalen kunnen we opgeven of onze numerieke velden bijvoorbeeld geteld of gesommeerd moeten worden. Hier maken we geen gebruik van, dat passen we later in het
rapport eenvoudig aan.
Figuur 7.9

 In het volgende scherm van de wizard kunnen we de gewenste opmaak van het rapport aangeven. Kies Met interval en Staand.
 In het voorlaatste scherm kun je de stijl opgeven, kies Gieterij.
 In het laatste scherm geven we het rapport de titel Reizigers per
vertrekdatum. Vervolgens wordt het rapport als afdrukvoorbeeld
op het scherm getoond, zie guur 7.10.
Het rapport voldoet niet volledig aan onze wensen, zie guur 7.6.
We moeten het rapport, dat door de wizard is gemaakt, wijzigen.
We voeren enige cosmetische aanpassingen door, bijvoorbeeld de
kolom Totaal wordt niet in euros getoond. Verder moeten we onze
totalen per groep nog doorvoeren.

232

Databaseontwikkeling 4 Access 2007

Figuur 7.10

 Plaats het rapport in de indelingsweergave.


 Selecteer de kolom Totaal en kies met de rechtermuisknop de eigenschappen van de kolom Totaal. Wijzig in het tabblad Opmaak
de eigenschap Notatie in Euro (of Valuta), zie guur 7.11. Direct
wordt de kolom in euro-opmaak getoond. Je kunt ook direct op de
knop Valutanotatie toepassen klikken op het lint Opmaak, groep
Opmaak.
 Het toevoegen van totalen per groep gaat via de knop Groeperen
en sorteren op het lint Opmaak, groep Groepering en totalen.
Onder het venster komt een deelvenster waarin we kunnen groeperen, sorteren en totalen berekenen. Hierin is te zien waarop
gegroepeerd en gesorteerd wordt. Door het klikken op Meer in
Groeperen op Vertrekdatum, krijgen we extra opties te zien van
die groep, zie guur 7.12.

7 Uitgebreide rapporten

Figuur 7.11

Figuur 7.12

233

234

Databaseontwikkeling 4 Access 2007

De verschillende opties zijn:


Sorteervolgorde groep, bijvoorbeeld van oud naar nieuw.
De tweede optie geeft de mogelijkheid om te groeperen op gehele
waarden of op een andere manier. Afhankelijk van het gegevenstype worden verschillende mogelijkheden geboden. Bij tekstvelden
bijvoorbeeld op de eerste drie letters van het veld. Bij datumvelden
kun je bijvoorbeeld groeperen per week, maand of jaar. Deze opties zijn ook in de wizard te kiezen.
Welke totalen er per groep getoond moeten worden. Van ieder veld
kan een totaal berekend worden. Afhankelijk van het gegevenstype worden verschillende opties geboden. Om numerieke velden
bijvoorbeeld Som of Gemiddelde en op tekstvelden bijvoorbeeld
Aantal records of Aantal waarden. Bij Aantal waarden worden de
lege velden niet meegeteld. Ook kun je aangeven of van de totalen
een Eindtotaal gewenst is. Bovendien kun je opgeven of een percentage van het eindtotaal is gewenst en of de groepstotalen in de
koptekst of voettekst van de groep geplaatst moet worden.
De titel of koptekst van de groep kan gewijzigd worden of voorzien
van een ander lettertype.
Een koptekstsectie wel of niet weergeven. In deze sectie kun je
opgeven wat er bij het begin van een groep getoond wordt, zie bijvoorbeeld guur 7.13.
Een voettekstsectie wel of niet weergeven. In deze sectie kun je
opgeven wat er aan het eind van een groep getoond wordt, zie bijvoorbeeld guur 7.13.
Aangeven welke delen van de groep bijeengehouden moet worden
tijdens het afdrukken. Standaard wordt alle tekst achterelkaar afgedrukt. Er kunnen dan wezen ontstaan, een koptekst op de laatste
regel van een bladzijde en op de volgende bladzijde de regels. Je
kunt de koptekst afdrukken en ten minste n regel op n pagina
of de gehele groep inclusief koptekst en voettekst op n pagina
bijeenhouden.
De opties bij Groeperen op vertrekdatum zijn onder andere van
oud naar nieuw, op hele waarden (gekozen in de wizard), met
groepen zonder totalen, etc. Door te klikken op het -symbool
naast een optie kunnen we een keuze maken of wijzigen.
 Toon de opties van met groepen zonder totalen, we willen namelijk bij onze groepen totalen hebben. Kies bij Totalen van het veld
Totaal en bij Type kies je Som.

7 Uitgebreide rapporten

235

Figuur 7.13

 Plaats vervolgens een vinkje bij Eindtotaal, Groepstotalen weergeven als % van eindtotaal en Weergeven in groepsvoettekst.
In de indelingsweergave wordt direct het resultaat getoond. Op de
laatste regel wordt in het rapport ook het eindtotaal weergegeven.
Als daar #-tekens staan, past het eindtotaal niet in de breedte van
het besturingselement.
 Maak de kolom Totaal iets breder om alle bedragen volledig te
zien.
De groepstotalen worden hierna niet meer recht onder de regeltotalen getoond. Dat gaan we later aanpassen in de ontwerpweergave.
We willen nog een totaalwaarde van de groep tonen, namelijk het
aantal klanten binnen de groep.
 De keuze met groepen zonder totalen is veranderd in met totaal
van Totaal. Selecteer die optie opnieuw, maar kies in Totaal van
voor Klantnummer, bij Type kies je Records tellen en plaats vinkjes
bij Eindtotaal en Weergeven in groepsvoettekst. De tellingen worden direct getoond in de indelingsweergave.

236

Databaseontwikkeling 4 Access 2007

 Kies als laatste de opties bij groep niet bijeenhouden op n pagina. Kies hierin de optie koptekst en eerste record bijeenhouden op
n pagina. Hierdoor kunnen er geen wezen ontstaan. Dat is een
koptekst als laatste op een pagina en de records op een nieuwe pagina. Je kunt ook kiezen voor groep bijeenhouden op n pagina.
Als groepen kleiner zijn dan n pagina wordt de volledige groep,
inclusief koptekst, op n pagina getoond.
In de ontwerpweergave gaan we nog enige verjningen aanbrengen.
 Plaats het rapport in de ontwerpweergave, zie guur 7.13.
Zoals eerder aangegeven, groepstotalen van de kolom Totaal staan
niet meer recht onder elkaar staan. In de ontwerpweergave is dat
goed te zien. De besturingselementen in de kolom Totaal zijn niet
alle vier even breed.
 Selecteer, met de Shift-toets ingedrukt, alle vier de besturingselementen van de kolom Totaal (eventueel ook de koptekst).
 Ga naar het lint Schikken. Klik in de groep Uitlijning bepalen voor
Links.
 Kies vervolgens in de groep Grootte voor Grootte aanpassen aan
breedste. De besturingselementen hebben nu allemaal dezelfde
afmetingen en staan op n lijn.
Als laatste gaan we bij onze totalen labels plaatsen, zodat duidelijk
wordt wat de totalen betekenen. Links van de totalen gaan we die
labels plaatsen.
 Selecteer het lint Ontwerpen en klik in de groep
Besturingselementen op de knop Label. Verplaats de muiswijzer
naar de plaats waar het label gewenst is, in de sectie Voettekst
(Vertrekdatum) onder Woonplaats. Markeer het labelgebied en zet
hierin de tekst % van eindtotaal:, zie guur 7.14.
 Zet op dezelfde manier labels bij groepstotaal (Subtotaal:) en aantal records (Aantal reizigers:), zie guur 7.14.

7 Uitgebreide rapporten

237

Figuur 7.14

Via het lint Schikken kun je de labels uitlijnen aan de bovenliggende velden en de hoogte gelijk maken aan de besturingselementen
van de subtotalen. Verder is de tekst in de labels rechts uitgelijnd,
via het lint Ontwerpen, groep Type, Tekst rechts uitlijnen. Verder
staan er groene waarschuwingsdriehoekjes in de labels. Als je een
label selecteert verschijn er een waarschuwingsknop met keuzelijst. In de keuzelijst wordt de waarschuwing getoond en kun je een
keuze maken uit de suggesties. De labels (bijschriften) zijn niet
gekoppeld aan een besturingselement. We kunnen het negeren of
koppelen aan het bijbehorende besturingselement. Er is gekozen
voor koppelen.
Opmerkingen rapporten
In de rapportweergave (of indelingsweergave) kun je eenvoudig
lteren. Selecteer met de rechtermuisknop een veld waarop je wilt
lteren. Kies direct de voorbeeldlters of selecteer tekst-, datumof getallters.
Groepstotalen plaatsen kan ook met de knop 8 Totalen, na het selecteren van een kolom, maar met Groeperen en sorteren zijn er
meer mogelijkheden.

238

Databaseontwikkeling 4 Access 2007

In het deelvenster Groeperen, sorteren en totaal berekenen wordt


per groepering of sortering aan de rechterkant pijlen en het verwijdersymbool getoond, zie bijvoorbeeld guur 7.14. Hiermee kun
je bijvoorbeeld een sortering omhoogschuiven, zodat eerst wordt
gesorteerd op naam en daarna op land en plaats. Klik je op het
verwijdersymbool, dan wordt de sortering of groep verwijderd.
De volgorde bij het selecteren van de groepstotalen maakt
uit. Selecteer je eerst Weergeven in groepsvoettekst en daarna
Groepstotalen weergeven als % van eindtotaal, dan wordt eerst het
groepstotaal weergegeven en daarna het percentage van het eindtotaal. Door de vinkje weg te halen en weer in de juiste volgorde te
plaatsen kun je dat corrigeren.
In het voorbeeld is het aantal reizigers bepaald via het veld
Klantnummer. Merk op dat ieder ander veld gekozen had kunnen
worden.
Bij de sub- en eindtotalen staan lijnen in het rapport. Deze kunnen geplaatst worden door de eigenschappen van het veld te
veranderen, zie guur 7.15. Selecteer in de indelingsweergave of
ontwerpweergave een groepstotaal of eindtotaal en toon het eigenschappenvenster (rechtermuisknop of op het lint). In guur
7.15 is groepstotaal van Klantnummer genomen (aantal reizigers).
In het eigenschappenvenster is de eigenschap Rasterlijnstijl boven in Gesloten veranderd. De overige staan op Transparant, dus
onzichtbaar. De dikte van de rasterlijn is bepaald via de eigenschap Rasterlijnbreedte boven op 1 pt. Bij de eindtotalen is dat 2
pt. De kleur van het raster is nog te veranderen via de eigenschap
Rasterlijnkleur. Er kan uit standaardkleuren gekozen worden of via
uit iedere andere kleur.
Je kunt de groepstotalen ook in de koptekst van de groep plaatsen. Het rapport wordt voor het afdrukken twee keer doorlopen.
De eerste keer worden de groeps- en eindtotalen bepaald en het
aantal paginas van het rapport. De tweede keer wordt het rapport
getoond met de groepstotalen. Hierdoor is het dus mogelijk om
voordat de groep begint al de totalen te tonen. Ook de percentages
kunnen dan berekend worden op basis van de eindtotalen.
Bij land en plaats worden duplicaten getoond. Deze zijn eventueel
te onderdrukken, zie paragraaf 7.1.
Bij de eindtotalen worden geen percentages geplaatst, die zijn namelijk altijd 100%.

7 Uitgebreide rapporten

239

Figuur 7.15

7.3

Rapport met meerdere groepen

In dit hoofdstuk bespreken we een rapport waarin meerdere groepen zijn opgenomen. Hierin wordt het aantal reizigers geteld per
land en binnen een land per bestemming, uitgesplitst naar aantal
volwassenen, aantal kinderen en totaal. Verder wordt het percentage reizigers naar die bestemmingen afgedrukt ten opzichte van
de andere bestemmingen in het reisprogramma van het reisbureau,
zie guur 7.16.

240

Databaseontwikkeling 4 Access 2007

Figuur 7.16

 Maak eerst een query waarin de betreffende velden worden geselecteerd, zie guur 7.17.
 Het vijfde veld is een rekenveld. Klik met de muis in het vijfde
kolom van de rij Veld en vul in: Aantal reizigers: [Aantal volwassenen] + [Aantal kinderen].
 Sla de query op met de naam rptLandtotalen. Merk op dat uit de
tabel Reis geen gegevens nodig zijn, maar deze is wel noodzakelijk om de gegevens uit de tabel Boeking (Aantal volwassenen en
Aantal kinderen) te kunnen benaderen.
 Start in het lint maken, groep Rapporten de Wizard Rapport.
 Kies in het eerste venster van de wizard de zojuist gemaakte query
rptLandtotalen.
 Selecteer alle velden uit de query en ga naar het volgende scherm
van de wizard. De gegevens moeten weergegeven worden volgens
Bestemming. Er moet immers gegroepeerd worden op de velden
Land en Plaats, die moeten dus boven in het rapport komen.

7 Uitgebreide rapporten

241

Figuur 7.17

 In het volgende scherm kunnen we in het groeperen een verdere


verjning aanbrengen. Aangezien we moeten groeperen op het
veld Land en daarbinnen op het veld Plaats moet een extra groepeerniveau worden geselecteerd. Markeer het veld Land en klik op
de knop >. Aan de rechterzijde van het scherm wordt dan een voorbeeld van de groepeerniveaus aangegeven. Eerst wordt gegroepeerd op het veld Land en daarbinnen op het veld Plaats, zie guur
7.18.
Figuur 7.18

242

Databaseontwikkeling 4 Access 2007

 In het volgende scherm kan voor de detailsectie een sorteervolgorde worden aangegeven. Dat is voor ons rapport niet noodzakelijk.
 In het volgende venster kiezen we voor Met interval en Staand.
 De stijl in het volgende scherm wordt Gieterij.
 In het laatste scherm kiezen we als titel (naam) voor het rapport
Landtotalen. Het rapport wordt getoond als afdrukvoorbeeld, zie
guur 7.19.
Figuur 7.19

Het rapport lijkt niet op het gewenste rapport zoals getoond in


guur 7.16. Er moeten enige cosmetische aanpassingen plaatsvinden.
 Plaats het rapport in de indelingsweergave.
 Als eerste maken we de kolom Land breder zodat alle landen volledig getoond worden. De kolom Plaats is bovendien iets smaller
gemaakt.

7 Uitgebreide rapporten

243

 Klik op de knop Groeperen en sorteren in het lint Opmaak. Het


deelvenster Groeperen, sorteren en totaal berekenen wordt zichtbaar, zie guur 7.20. Er staan nu twee groepen. Er wordt eerst gegroepeerd op land en daarbinnen op plaats.
Figuur 7.20

 We gaan eerst de totalen van de landen bepalen. Klik op Meer in


de groep Land. We gaan totalen aanbrengen voor Aantal volwassenen, aantal kinderen en Totaal.
 Selecteer de optie bij met groepen zonder totalen. Selecteer
Aantal volwassenen en kies Som. Plaatst vervolgens, in deze
volgorde, vinkjes bij Eindtotaal, Weergeven in groepskoptekst en
Groepstotalen weergeven als % van eindtotaal. Als je de volgorde
wisselt, wordt het percentage verwisseld met de groepstotalen, zie
eventueel de eindopmerkingen van de vorige paragraaf.
 Herhaal deze acties voor Aantal kinderen en Totaal in de groep
Land.
 Herhaal deze drie acties ook voor de groep Plaats. Zie het voorlopige resultaat in guur 7.21.

244

Databaseontwikkeling 4 Access 2007

Figuur 7.21

 De lijnen bij de totalen zijn niet nodig. Selecteer de drie percentages (Shift + klikken) en klik in het lint Opmaak op Rasterlijnen,
Geen.
 Verwijder op dezelfde manier de lijnen bij de andere drie percentages.
De volgende wijzigingen voeren we uit in de ontwerpweergave.
 Plaats het overzicht in de ontwerpweergave, zie guur 7.22.
We merken op dat de percentages niet in de koptekst zijn geplaatst. Zo staat bij het land China wel het landtotaal in de koptekst (Totaal:11), maar niet het percentage van het eindtotaal. Dat
percentage staat in de voettekst van het land (Totaal: 16,18%), zie
guur 7.21. Ook in de ontwerpweergave is dat te zien, zie guur
7.22. We moeten die besturingselementen gaan verplaatsen.

7 Uitgebreide rapporten

245

Figuur 7.22

 Maak de sectie Koptekst (Land) groter, door de sectie Koptekst


(Plaats) naar beneden te slepen.
 Selecteer de drie besturingselementen in Voettekst (Plaats). Deze
zijn gekoppeld, je kunt dit zien door een gestippeld kader, en daardoor niet direct te verplaatsen.
 Kies in het lint Schikken, in de groep Indeling bepalen, voor
Verwijderen. Hierdoor is de koppeling verwijderd. Nu kun je de
groep verplaatsen naar de koptekst.
 Verklein daarna weer de sectie koptekst, zie guur 7.23.
 Doe precies hetzelfde met de drie besturingselementen in de
Voettekst (Plaats) en verplaats die naar de sectie Koptekst (Plaats),
zie guur 7.23.
 De beide voettekst secties kunnen nu dicht geschoven worden, er
staat niets meer in.
We zijn niet genteresseerd in de details, alleen in de totalen.
 Klik in het lint Ontwerpen, groep Groepering en totalen op de
knop Details verbergen. Hierdoor worden de details niet meer getoond. De eigenschap Zichtbaar van de sectie Details is hierdoor
automatisch op Nee gezet. Je kunt dit controleren door de sectie
Details te selecteren met de rechtermuisknop en de eigenschappen
te tonen, tabblad Opmaak.

246

Databaseontwikkeling 4 Access 2007

Figuur 7.23

Als laatste gaan we nog twee lijnen in het rapport opnemen. Om


het onderscheid tussen landtotalen en plaatstotalen te accentueren
gaan we twee lijnen plaatsen in de sectie Koptekst (Land).
 Klik in het lint Ontwerpen, groep Besturingselementen, op de
knop Lijn.
 Verplaats de muiswijzer naar de plaats waar een lijn gewenst is,
onder de besturingselementen en markeer de lengte van de lijn.
Maak eventueel de sectie iets groter om de lijn te kunnen plaatsen.
De lijn is nu geplaatst. De lengte is via de randen nog eenvoudig
aan te passen. Aangezien je ook schuine lijnen kunt trekken, kan
de lijn een beetje schuin staan. Dat is op het oog vaak niet te zien.
We kunnen dat controleren via de eigenschappen van de lijn.
 Selecteer de lijn en plaats de eigenschappen hiervan op het
scherm. De eigenschap Hoogte in het tabblad Opmaak moet 0 zijn.
Controleer tevens of de eigenschap Randstijl de waarde Gesloten
heeft, anders wordt de lijn niet getoond!
 We kunnen nu eenvoudig een tweede identieke lijn maken, door
middel van kopiren en plakken (rechtermuisknop of Ctrl-C en
Ctrl-V).

7 Uitgebreide rapporten

247

 Verplaatst die tweede lijn boven de besturingselementen, zodat de


besturingselementen in de sectie Koptekst (Land) tussen de twee
lijnen liggen.
 Het rapport is klaar, zie guur 7.23. Controleer de werking in de
rapportweergave of als afdrukvoorbeeld. In de rapportweergave
kun je nog eenvoudig lteren om een selectie van landen te maken.

7.4

Rapport met veel rekenvelden

Het kan voorkomen dat een rapport veel rekenvelden heeft. Er


moeten dan veel berekeningen gemaakt worden. We gaan hiervan
een voorbeeld uitwerken, zie guur 7.24.
Figuur 7.24

Het is een rapport van een gemaakte boeking. Hierop staan alle
relevante gegevens. Veel gegevens moeten echter berekend worden, het zijn de procesgegevens uit de normalisatie. Het gaat om
de volgende gegevens: prijs per kind (50% korting), totaalbedrag
volwassenen, totaalbedrag kinderen, subtotaal, annuleringskosten
(4%), totaal, nog te betalen en betaalwijze. We maken eerst een

248

Databaseontwikkeling 4 Access 2007

query waarin alle gewenste gegevens voorkomen. Daarna wordt


met behulp van de query het rapport gemaakt. Dat rapport moet
vervolgens aangepast worden aan onze wensen.
 Maak een query met daarin alle tabellen uit de database. Hierna
selecteer je de velden die in guur 7.25 zijn aangegeven.
Figuur 7.25

Tabel

Veld

Boeking

Alle velden, behalve Betaalwijze

Klant

Naam
Adres
Postcode
Woonplaats

Reis

Vertrekdatum
Aantal dagen
Prijs per persoon

Bestemming

Plaats
Land
Werelddeel

 Sla de query op zonder het queryvenster te verlaten; Opslaan via


de rechtermuisknop op de tab van de query of Ctrl-S. Kies als
naam rptBoeking.
 Nu gaan we het eerste rekenveld maken. Selecteer de eerste vrije
kolom in het queryvenster. Hierin bepalen we de prijs per kind,
50% korting voor alle kinderen voor alle reizen. Het rekenveld
moet worden: Prijs per kind: [Prijs per persoon]*0,5. Dat kun je
zo invoeren, maar het kan handiger.
 Selecteer in het lint Ontwerpen, groep Querys instellen, de knop
Opbouwfunctie, of selecteer Opbouwen via de rechtermuisknop
in de kolom van het queryvenster. Er wordt een venster geopend
waarin je rekenvelden eenvoudig kunt maken, zie guur 7.26.
 Je typt: Prijs per Kind:, daarna kies je uit de tweedekolom van
het opbouwvenster Prijs per persoon en klik op Plakken. Bij het
veld wordt Expr getoond. Dat kun je verwijderen. Daarna vul je
het aan met *0,5, zie guur 7.26. Klik vervolgens op OK. Aan het
einde van deze paragraaf staat meer informatie over dit opbouwvenster.
 Het eerste rekenveld is gemaakt. Om de werking van het rekenveld
te controleren kun je de query uitvoeren.

7 Uitgebreide rapporten

249

Figuur 7.26

 Sla in de ontwerpweergave de query weer op door te het klikken


met de rechtermuisknop op de tab van de query. Hierdoor wordt
ons nieuwe rekenveld ook in de tweede kolom van het opbouwscherm getoond (velden van de query rptBoeking).
 Maak de overige rekenvelden, zoals getoond in guur 7.27. Sla de
query steeds op na het maken van een rekenveld. Het kan voorkomen dat er geen lege kolommen meer zijn. Voeg dan een kolom toe
via de knop Kolom invoegen op het lint.
Figuur 7.27

Totaal volw: [Aantal volwassenen]*[Prijs per persoon]


Totaal kind: [Aantal kinderen]*[Prijs per kind]
Subtotaal: [Totaal volw]+[Totaal kind]
Annuleerkosten: IIf([Annuleringsverzekering];[Subtotaal]*0,04;0)
Totaal: [Subtotaal]+[Annuleerkosten]
Nog te betalen: [Totaal]-[Betaald bedrag]
Tekst betaalwijze: Choose([Betaalwijze];"Contant";"Pinnen";"Acceptgiro")

Merk op dat de velden Annuleringsverzekering en Betaalwijze in


hoofdstuk 6 zijn toegevoegd aan de tabel Boeking. Hierdoor is het
mogelijk dat je in de tabel Boeking die kolommen niet hebt gemaakt of daarvoor geen waarden hebt ingevuld. Annuleerkosten is
dan altijd 0 en bij Tekst betaalwijze krijg je een foutmelding. Vul
dan in de tabel Boeking deze kolommen met waarden (Betaalwijze
alleen de waarde 1, 2 of 3) of open het formulier Boeking voorbeeld uit paragraaf 6.1.

250

Databaseontwikkeling 4 Access 2007

Bij de annuleringskosten is gebruikt gemaakt van de functie IIf().


Als een annuleringsverzekering is afgesloten, betaald men 4%
over het subtotaal en anders niets. Betaalwijze kan de waarden 1,
2 of 3 aannemen. Dat wordt vastgelegd via een groepsvak, zie paragraaf 6.1. Omdat 1 staat voor Contant, 2 voor Pinnen en 3 voor
Acceptgiro is de functie Choose() gebruikt om de tekst te tonen in
plaats van de getallen. De eerste parameter is een getal, afhankelijke van dat getal wordt de eerste, tweede of derde optie bepaald.
Vanzelfsprekend is deze functie met meer waarden uit te breiden.
Aan het einde van deze paragraaf wordt nog een soortgelijke functie besproken.
De velden Prijs per kind, Totaal kind en Annuleerkosten worden
niet als valuta weergegeven. Je kunt dat in de query veranderen of
later in het rapport. Wij veranderen het nu in de query.
 Selecteer in de ontwerpweergave met de rechtermuisknop een van
deze velden en plaats het eigenschappenvenster.
 Kies bij de eigenschap Notatie de waarde Euro. Voer deze handeling ook uit voor de andere twee genoemde velden.
 Sluit de query.
Nu gaan we het rapport maken.
 Start de Wizard Rapport, kies de zojuist gemaakte query en selecteer alle velden.
 In het volgende venster wordt een groepeerniveau getoond op
Klantnummer. Dat is niet gewenst, klik op de <-knop om dat ongedaan te maken. We hebben nu geen groepeerniveau.
 In het volgende venster sorteren we op aopende boekingsnummers, de laatste boekingen staan dan als eerste in het rapport.
 Selecteer in het volgende venster voor Kolomvorm en Staand.
 Daarna kiezen we voor de stijl Gieterij en in het laatste scherm
kiezen we de titel Boeking. Het rapport wordt hierna als afdrukvoorbeeld getoond, zie guur 7.28.
Het rapport lijkt nog niet op het rapport dat we willen. Alle velden
zijn onder elkaar gezet. We gaan eerst wijzigingen aanbrengen in
de indelingsweergave en daarna gaan we verder verjnen in de
ontwerpweergave.

7 Uitgebreide rapporten

251

Figuur 7.28

 Plaats het rapport in de indelingsweergave.


 Maak de labels iets breder zodat ook het label Annuleringsverzekering volledig zichtbaar wordt. Maak daarna de velden
smaller.
 We gaan de gegevens op de juiste plaatst zetten. Sleep Naam,
Adres en Postcode onder Boekingnummer.
 Verander het label van Postcode in Woonplaats, je hebt nu twee
keer een label met woonplaats.

252

Databaseontwikkeling 4 Access 2007

Het veld Klantnummer staat achter de naam en het veld


Woonplaats moet achter de postcode komen te staan, maar dat kan
niet zomaar. Alle velden zijn gekoppeld, daardoor kun je de velden
zo eenvoudig verplaatsen. De koppeling van het veld Klantnummer
moet verwijderd worden.
 Selecteer het veld Klantnummer en klik in het lint Schikken, groep
Indeling bepalen op de knop Verwijderen. Klantnummer wordt uit
de groep gehaald.
 Verwijder het label Klantnummer en verplaats het besturingselement Klantnummer achter de naam.
 Voer dezelfde acties uit voor het veld Woonplaats, zie guur 7.29.
 Hetzelfde geldt voor Boekdatum, alleen moet dat naar de rechterkant van het rapport worden versleept. Dus, eerst loskoppelen en
dan slepen naar de gewenste plaats.
 Je kunt eventueel op het lint Opmaak, groep Lettertype, het label
Boekdatum rechts uitlijnen en veranderen in Boekingsdatum.
 Zet vervolgens alle andere velden op de juiste plaats, zie guur
7.29.
 Verander de labels Aantal volwassenen, Aantal kinderen en
Tekst betaalwijze in achtereenvolgens Volwassenen, Kinderen en
Betaalwijze.
 De geldbedragen staan allemaal links uitgelijnd. Dat moet rechts
uitgelijnd worden. Selecteer alle betreffende velden en kies in het
lint Opmaak, groep Lettertype, voor Tekst rechts uitlijnen, zie guur 7.29.
Als meerdere boekingen getoond worden, moeten die op een aparte pagina staan. Bovendien moet de tekst Boeking op elke pagina
komen. Verder zijn tussen de subtotalen drie lijnen getrokken. Dit
gaan we nog realiseren.
 Plaats het rapport in de ontwerpweergave.
 De tekst Boeking staat in de sectie Rapportkoptekst. Die sectie
wordt maar n keer afgedrukt als het rapport meerdere paginas
heeft. Het moet verplaatst worden naar de sectie Paginakoptekst.
Bij iedere nieuwe pagina wordt die sectie getoond. Maak ruimte
in de sectie Paginakoptekst door de sectie Details naar beneden te
slepen.

7 Uitgebreide rapporten

253

Figuur 7.29

 Knip en plak de tekst Boeking naar de gewenste sectie. Hierna kun


je de sectie Rapportkoptekst sluiten (dichtslepen), zie guur 7.30.
 Nadat een boeking is getoond, moet een nieuwe pagina worden
geselecteerd. Selecteer de sectie Details en plaats het eigenschappenvenster.
 Verander de eigenschap Nieuwe pagina van de sectie Details in
Na sectie. Hierdoor wordt na die sectie (de boekinggegevens) een
nieuwe pagina gemaakt.
 Als laatste zijn nog drie lijnen getrokken tussen de subtotalen.
Selecteer in het lint Ontwerpen de knop Lijn.
 Plaats de eerste lijn en verander een aantal eigenschappen van de
lijn. In het tabblad Opmaak van het eigenschappenvenster moet de
eigenschap Hoogte de waarde 0 krijgen, hierdoor is de lijn volledig
horizontaal. De eigenschap Randstijl moet Gesloten worden.
 De eigenschap Randkleur is veranderd in standaard zwart. In de
keuzelijst kun je kiezen uit de kleuren van de stijl Gieterij, maar
door te klikken op de knop kun je kiezen uit andere themas of
een standaard kleur. De code van die kleur wordt ingevuld in de
eigenschap.

254

Databaseontwikkeling 4 Access 2007

 Als laatste is de lijn dikker gemaakt via de eigenschap


Randbreedte, deze is op 2 pt gezet.
 Hierna kan de lijn via kopiren / plakken op de twee andere plaatsen worden gezet. Het rapport is af, zie guur 7.30.
Figuur 7.30

Opmerkingen rapporten
In de indelingsweergave of rapportweergave van het rapport kun je
lteren. Dat kan handig zijn bij het ontwerpen in de indelingsweergave. Het tweede rapport van de volgende boeking wordt ook al
getoond. Als je een lter op het eerste boekingnummer plaatst, heb
je maar n boeking op je scherm.
In het opbouwvenster kun je in de eerste kolom kiezen uit alle tabellen, querys, formulieren, etc. Alle velden die daarin staan worden dan in de tweede kolom getoond. Standaard worden de velden

7 Uitgebreide rapporten

255

uit de actieve query, formulier of rapport getoond. In de eerste


kolom kun je ook kiezen voor Functies, Ingebouwde functies. In de
tweede kolom verschijnen dan alle functiegroepen, zoals datum/
tijd-, statistische- of rekenkundige functies.
In het voorbeeld is de functie Choose() toegepast. We hadden ook
de functie Switch() kunnen gebruiken. Hierin kun je paren van
expressies opgeven. Bijvoorbeeld:
Switch([Soort relatie]= D;Debiteur;[Soort relatie]=C;
Crediteur), of Switch([Betaalwijze]=1;Contant; [Betaalwijze]
=2;Pinnen; [Betaalwijze]=3;Acceptgiro);
Om het schikken van de besturingselementen te vereenvoudigen
kun je de besturingselementen laten uitlijnen op het raster. Klik in
de ontwerpweergave in het lint Schikken, groep Indeling bepalen,
op Uitlijnen op raster, tenzij het al is ingeschakeld. Ook in de indelingsweergave is het daarna actief.
Er is gekozen om een query te maken met daarin alle rekenvelden.
Je had de rekenvelden ook in de ontwerpweergave kunnen invoeren. Selecteer daartoe uit de besturingselementen een tekstvak
en markeer deze op de gewenste plaatst op het rapport. Er wordt
direct een label bij geplaatst. Plaats vervolgens het eigenschappenvenster van het tekstvak en verander de eigenschap Naam,
tabblad Overige, in Prijs per kind. Klik vervolgens op het tabblad
Gegevens en type in de eigenschap Besturingselementbron, de formule =[Prijs per persoon]*0,5. De formule is ook via het opbouwvenster te maken.
Om de besturingselementen is een kader getrokken. Dit kun je
verwijderen via de eigenschap Randstijl. Zet deze eigenschap op
Transparant.
Opgaven

7.1 In guur 7.31 wordt per vertrekdatum de bestemmingen getoond


die worden aangedaan inclusief het reisnummer en de prijs per
persoon. In het rapport van guur 7.31 worden de duplicaten niet
getoond. De gebruikte stijl is Gieterij. Maak dit rapport.

256
256

Databaseontwikkeling 4 Access 2007

Figuur 7.31

7.2 Figuur 7.32 toont een rapport dat per vertrekdatum de reizen laat
zien en de vertrekkende klanten. Vervaardig het getoonde rapport
in de opmaak Met interval met de stijl Gieterij.

7 Uitgebreide rapporten

257
257

Figuur 7.32

7.3 In guur 7.33 wordt een omzetlijst getoond. Hierin is per reis de
omzet berekend. De kinderen betalen voor alle reizen 50% minder
dan de volwassenen. Voor de opmaak is gekozen voor Met interval
met de stijl Gieterij. Maak dit rapport.

258
258

Databaseontwikkeling 4 Access 2007

Figuur 7.33

7.4 In het overzicht van opgave 7.3 worden alleen reizen getoond
die een omzet hebben. Maar er zijn ook veel reizen die nog niet
geboekt zijn en zodoende geen omzet hebben. Verander de query
uit opgave 7.3 zodanig dat alle reizen worden getoond, ook die nog
niet geboekt zijn.
Tip: verander de joineigenschappen van de gemaakte query zodanig dat alle reizen worden getoond, ook de reizen die dus nog niet
geboekt zijn.

Macros

In Access kunnen we macros maken voor het automatisch laten


uitvoeren van opdrachten die we anders met de muis of het toetsenbord zouden uitvoeren. In een macro kunnen verschillende
opdrachten zijn opgenomen, die in de opgegeven volgorde worden
uitgevoerd. Een macro kan bijvoorbeeld gestart worden door het
klikken op een opdrachtknop, waarna de opdrachten in de macro
automatisch voor ons worden uitgevoerd. In paragraaf 6.6 hebben we opdrachtknoppen gemaakt die ook een actie uitvoeren,
maar in dat geval gaat het slechts om n actie. Met een macro
kunnen we meerdere opeenvolgende acties laten uitvoeren door
n opdrachtknop. Het starten van een macro kan ook door een
gebeurtenis plaatsvinden. Die gebeurtenis kan het openen van een
formulier zijn, het sluiten van een tabel of het verlaten van een besturingselement. Binnen een macro kunnen we voorwaarden opnemen, zodat de waarden in het formulier of rapport bepalen welke
opdrachten uitgevoerd worden.
Er zijn twee soorten macros. We kunnen een macro maken en
die opslaan als object. Een dergelijke macro wordt getoond met
zijn naam in het navigatiegedeelte. Een tweede type macro wordt
een Ingesloten macro (embedded macro) genoemd. Die macros
worden opgeslagen (ingesloten) in het formulier, rapport of besturingselement. Een ingesloten macro is niet zichtbaar in het navigatiegedeelte en wordt een onderdeel van het formulier, rapport of
besturingselement waarin het is gemaakt. Dit kan het beheer van
je database vereenvoudigen, omdat je geen administratie hoeft bij
te houden waar de macros voor dienen. Als we een kopie maken
van een formulier, rapport of besturingselement waarin ingesloten
macros voorkomen, zijn de macros ook in de kopie aanwezig. In

260

Databaseontwikkeling 4 Access 2007

paragraaf 6.6 hebben we met de wizard opdrachtknoppen gemaakt


die een actie uitvoeren. Die acties worden ook door ingesloten macros uitgevoerd. In dit hoofdstuk worden voorbeelden van beide
soorten macros toegelicht. Met behulp van macros kunnen opdrachten voor bepaalde taken geautomatiseerd worden. Het is zelfs
mogelijk om alle taken die nodig zijn om een database te onderhouden en te raadplegen door macros uit te laten voeren. Hierdoor
kunnen we zonder enige kennis van Access de database gebruiken.
We spreken dan over een toepassing; een uitwerking van zon toepassing staat in hoofdstuk 9.
In dit hoofdstuk worden drie voorbeelden van macros gegeven.
Het eerste voorbeeld is een eenvoudige macro, die toont wat een
macro inhoudt. Het tweede voorbeeld is een eenvoudige ingesloten
macro. In het derde voorbeeld worden geavanceerde macros toegepast om de mogelijkheden van macros aanschouwelijk te maken.
Bedenk dat die geavanceerde macros niet altijd nodig zijn voor het
maken van een applicatie, maar het kan helpen om een probleem
binnen een toepassing op te lossen.

8.1

Een eenvoudige macro

De opdrachten die een macro kan uitvoeren, worden acties


genoemd. Alle opdrachten die we met de muis of het toetsenbord kunnen uitvoeren, zijn via acties in een macro uit te voeren.
Ook acties die je niet met de muis kunt uitvoeren, bijvoorbeeld
voorwaardelijke acties. Op basis van een bepaalde voorwaarde
(bijvoorbeeld Bedrag kleiner dan 1000 euro) worden acties x uitgevoerd en anders acties y. Een macro wordt eerst eenmalig ingevoerd; vervolgens wordt de macro gestart en worden alle acties van
de macro in de aangegeven volgorde uitgevoerd. (We spreken wel
van het runnen van de macro). We gaan een macro maken die uit
de database Reisbureau alle klanten uit Eindhoven toont.
 Open de database Reisbureau.
 Klik in het lint Maken, groep Overige, op de knop Macro. Het macrovenster wordt getoond, zie guur 8.1.
In de eerste kolom, Actie, kunnen de acties die de macro gaat
uitvoeren, worden opgegeven. In de tweede kolom Argumenten

8 Macros

261

worden de argumenten getoond. Een argument is een waarde die


informatie voor een actie bevat, zoals de tekst die in een berichtvenster moet worden weergegeven, welk besturingselement moet
worden gebruikt, enzovoort. Argumenten zijn zichtbaar in het
deelvenster Actieargumenten onderaan het venster. In de derde
kolom, Beschrijving kan eventueel een toelichting worden gegeven
bij de actie. Die toelichting heeft geen invloed op de macro. Merk
op dat het macrovenster nog twee extra kolommen kan tonen:
Macronaam en Voorwaarde. Deze kolommen worden in paragraaf
8.2 toegelicht; voor dit voorbeeld zijn ze niet noodzakelijk.
 Klikken we in de actiekolom, dan kunnen we uit een keuzelijst een
van de vele acties selecteren. De eerste actie die de macro moet
gaan uitvoeren, is het openen van de tabel Klant. Selecteer de actie
TabelOpenen.
 In het onderste gedeelte van het macrovenster worden de argumenten getoond van die actie, alsmede een korte toelichting van de
actie. Druk voor meer informatie over een actie op de F1-toets.
De meeste acties vereisen bepaalde instellingen argumenten
zodat de actie weet welke tabel, welk formulier of welk rapport
geopend moet worden. Met de F6-toets kunnen we wisselen tussen
het bovenste en onderste gedeelte van het macrovenster, of selecteer een argument met de muiswijzer.
 Klik met de muis in het argument Tabelnaam.
 Selecteer in de keuzelijst de tabel Klant.
 Het argument Beeld bied vijf mogelijkheden, te weten
Gegevensblad, Ontwerp, Afdrukvoorbeeld, Draaitabel en
Draaigraek. Kies de instelling Gegevensblad.
 In het laatste argument, Gegevensmodus, kunnen we opgeven dat
alleen toevoegingen zijn toegestaan: modus Toevoegen. In de
modus Bewerken geven we aan dat alle bewerkingen zijn toegestaan. Of dat de gegevens alleen gelezen mogen worden: modus
Alleen-lezen. Selecteer de instelling Alleen-lezen.
De eerste actie van de macro is opgenomen. Hiermee wordt de
tabel Klant geopend als gegevensblad en de gegevens mogen niet
gemuteerd worden (alleen-lezen). De gekozen argumenten worden
ook weergegeven in de tweede kolom. Merk op dat de tabel Klant
niet direct wordt geopend tijdens het invoeren van de macro. Het
vindt pas plaats nadat de macro is gestart.

262

Databaseontwikkeling 4 Access 2007

De tweede actie die we de macro laten uitvoeren, is een bericht op


het scherm tonen.
 Selecteer in de tweede regel de actie Berichtvenster.
Hiermee kunnen we een bericht op het scherm plaatsen. De actie
Berichtvenster heeft vier argumenten. In het argument Bericht
kunnen we de boodschap invullen die op het scherm getoond moet
worden. Het tweede argument, Pieptoon, kunnen we gebruiken om
een geluidssignaal te laten klinken. In het derde argument, Type,
kunnen vijf verschillende pictogrammen worden afgebeeld bij het
bericht, zoals een vraagteken of een uitroepteken. In het laatste
argument, Titel, kunnen we bij het bericht een titel plaatsen. Deze
wordt in de bovenste balk van het berichtenvenster getoond.
 Selecteer achtereenvolgens de volgende instellingen: We tonen
hierna alleen klanten uit Eindhoven., Ja, Informatie, Berichtje.
De volgende actie is het lteren van de klantentabel om alleen de
klanten uit Eindhoven te tonen.
 Selecteer de actie FilterToepassen.
Deze actie heeft drie argumenten. Het eerste argument is Filternaam; hierin kunnen we de naam opgeven van een lter of query
waarmee de records in de tabel beperkt worden. Aangezien we
geen lter gemaakt hebben, kiezen we voor het tweede argument:
WHERE-voorwaarde. Hierin kunnen we een voorwaarde invoeren
die de records beperkt tot de klanten uit Eindhoven.
 Voer bij het argument WHERE-voorwaarde in:
[Woonplaats] = Eindhoven.
Hierna worden alleen klanten uit Eindhoven getoond. De vierkante
haakjes om Woonplaats worden door Access toegevoegd. Het is
niet noodzakelijk deze zelf in te voeren. Als een veldnaam met
spaties is gebruikt, moeten we wel zelf de vierkante haakjes om
de naam van het veld plaatsen. Je kunt ook de -knop aanklikken
om de voorwaarde op te bouwen. Het derde argument Naam van
besturingselement is alleen van toepassing als je wilt lteren in
subformulieren of subrapporten.

8 Macros

263

 Nadat de klanten uit Eindhoven getoond zijn, in de macro, wordt


een melding op het scherm geplaatst dat het klantenbestand wordt
gesloten. Deze actie, Berichtvenster, is eerder toegelicht. De argumenten zijn achtereenvolgens: We gaan de tabel Klant afsluiten.,
Ja, Informatie en Berichtje.
De laatste actie die we de macro laten uitvoeren, is het sluiten van
de tabel Klant.
 Selecteer uit de keuzelijst met alle mogelijke acties Sluiten.
Deze actie heeft drie argumenten. In het argument Objecttype
kunnen we aangeven welk object gesloten moet worden; bijvoorbeeld een tabel, formulier of query. Bij het tweede argument,
Objectnaam, moeten we de naam van de tabel, het formulier of
de query opgeven. In het derde argument kunnen we aangeven of
de gegevens tijdens het afsluiten wel of niet opgeslagen moeten
worden. Als geen argumenten worden ingevoerd, wordt het actieve
object afgesloten. Aangezien bij ons alleen het klantenformulier
actief is, vullen we bij de argumenten niets in, de tabel wordt
gesloten. De eerste macro is klaar, in guur 8.1 staat deze volledig
afgebeeld.
 Sluit het macrovenster en geef de macro de naam Macro voorbeeld.
De macro wordt zichtbaar in het navigatiegedeelte, in de groep
Macros. We gaan de macro uitvoeren.
 Selecteer in het navigatiegedeelte de macro met de rechtermuisknop en klik op Uitvoeren of dubbelklikken op de naam va de
macro. De macro wordt dan uitgevoerd en de acties worden in de
opgegeven volgorde doorlopen.
Een bestaande macro kunnen we aanpassen door met de rechtermuisknop de macro te selecteren en te kiezen voor Ontwerpweergave. De macro wordt in het macrovenster getoond. Het
macrovenster bevat een lint, waarin we bijvoorbeeld een knop
vinden om rijen te verwijderen of toe te voegen.

264

Databaseontwikkeling 4 Access 2007

Figuur 8.1

Testen van een macro


Als we veel acties in een macro opnemen, kan het voorkomen dat
we een fout maken waardoor de macro niet functioneert. Het kan
lastig zijn die fout op te sporen. Om ons daarbij te helpen heeft
Access een mogelijkheid om de macro stap voor stap uit te voeren.
Na iedere actie wordt gestopt, zodat we het resultaat van de vorige
actie kunnen bekijken. Is deze foutloos, dan kunnen we een
opdracht geven om de volgende actie uit te voeren. Het opsporen
van fouten gaat hierdoor gemakkelijker. We gaan de zojuist
gemaakte macro (Macro voorbeeld) stap voor stap laten uitvoeren.
 Plaats de macro in het macrovenster (selecteer met de rechtermuisknop de macro en kies voor Ontwerpweergave).
 Klik in het lint Ontwerpen, groep Extra, op de knop Macrostap.
Starten we hierna de macro, dan worden de acties n voor n
uitgevoerd in een dialoogvenster, zie guur 8.2. Je kunt de macro
ook uitvoeren via het lint.

8 Macros

265

 Voer de macro uit. In het dialoogvenster zien we de actie en de


argumenten.
 Klik op de knop Stap om de volgende actie van de macro uit te
voeren. Op deze manier stappen we door de macro om een fout
op te sporen. Je kunt het stapsgewijs uitvoeren van de macros uitschakelen door in de ontwerpfase opnieuw op de knop Macrostap
te klikken.
Figuur 8.2

Opmerking macros
 Wanneer in het macrovenster, lint Ontwerpen, groep Weergeven/
verbergen, de knop Alle acties weergeven niet is gemarkeerd, zijn
alleen betrouwbare acties te selecteren. Ook worden bepaalde argumenten bij bepaalde acties niet getoond. Hierdoor zijn er geen
problemen met de beveiligingswaarschuwing. Het zijn vertrouwde
acties, er is geen vertrouwensstatus nodig om ze uit te voeren.
Een macro waarin alleen deze acties zijn opgenomen, wordt zelfs
uitgevoerd wanneer de database niet in een vertrouwde map staat
of van een vertrouwde uitgever is. Aan databases die macroacties
bevatten die niet in de vertrouwenslijst voorkomen (of databases
waarin VBA-code voorkomt) moet expliciet een vertrouwensstatus
worden verleend, zie bijlage B (Categorie Vertrouwenscentrum)
voor extra informatie over vertrouwde mappen.
 Er zijn twee bijzondere macronamen, AutoExec en AutoKeys. Een
macro met de naam AutoExec wordt direct uitgevoerd zodra de
database wordt opgestart. Hierdoor kunnen we bijvoorbeeld direct
een openingsformulier tonen. Zie ook paragraaf 9.5.2 voor het automatisch opstarten van een toepassing.
De macro met de naam AutoKeys wordt ook direct gestart als we
de database openen, hierin kunnen we aan toetsen of toetscombinaties een macroactie toekennen. Bijvoorbeeld het drukken op

266

Databaseontwikkeling 4 Access 2007

F3 of Ctrl-Q voert macroacties uit. Activeer in het macrovenster


de kolom Macronaam en plaats daarin de naam van de toets of
toetscombinatie, bijvoorbeeld {F3} of ^Q. De macroacties kunnen we nu toekennen aan de F3-toets of Ctrl-Q toetscombinatie.
Als de macro uit meerdere acties bestaat hoef je maar n keer de
macronaam op te geven. De acties van de macro eindigen zodra
een nieuwe macronaam wordt ingevoerd. De macronaam van de
functietoetsen, de Delete-knop en de Insert-knop moet tussen {}
staan. Verder geldt het ^-teken voor de Ctrl-toets en het +-teken
voor de Shift-toets. Enkele voorbeelden van een macronaam voor
een toetscombinatie: ^5, +Q, ^{F3}, {F10}, {Insert} of ^{Delete}
betekenen achtereenvolgens Ctrl-5, Shift-Q, Ctrl-F3, F10, Ins(ert),
Ctrl-Del(ete).
Als we standaardtoetscombinatie gebruiken, wordt de oude toetscombinatie vervangen. Gebruik je bijvoorbeeld Ctrl-C, dan vervalt
de standaard kopieerfunctie van Ctrl-C.
Opgave






8.1 Maak een macro die de volgende acties uitvoert:


 openen van de tabel Klant in gegevensbladweergave en alleen
lezen;
 het laatste record uit de tabel (actie NaarRecordGaan) selecteren;
 een melding op het scherm plaatsen dat dit het laatste record is;
 vervolgens het eerste record selecteren;
 ook dit op het scherm melden;
 de tabel met klantgegevens sluiten.

8.2

Een eenvoudige ingesloten macro

We gaan een eenvoudig formulier maken waarin een keuzelijst


wordt getoond van alle boekingen die er zijn gemaakt. Na het selecteren van een boeking, kunnen we op een knop klikken die het
rapport van de boeking toont. Dit is een veelvoorkomende situatie.
We kunnen ook een exibele query maken, maar daarin kunnen
we geen keuzelijst tonen.

8 Macros

267

 Maak een leeg formulier in de database Reisbureau, via het lint


Maken, groep Formulieren, Formulierontwerp.
 Plaats een label op het formulier, uit de groep Besturingselementen
en zet hierin de tekst Boekingen tonen, zie guur 8.3. Het label is
via de groep Lettertype, groter en vet afgedrukt.
 Plaats vervolgens een keuzelijst met invoervak op het formulier,
die een wizard zal starten.
 Selecteer in de wizard voor de optie waarin de waarden via een
tabel of query worden opgezocht (opties 1).
 Kies in het volgende venster voor een bestaande query rptBoeking
(heb je die query niet, maak dan een query met dezelfde gegevens
als in de volgende stap).
 Selecteer in het volgende venster de gegevens Boekingnummer,
Naam, Woonplaats, Vertrekdatum, Plaats en Land.
 Sorteer in het volgende venster op Naam en daarna op
Boekingnummer (aopend).
 Pas eventueel de kolombreedtes in het volgende venster aan.
 In het volgende venster kiezen we Boekingnummer. Dat nummer
kunnen we gebruiken om het bijbehorende rapport te tonen.
 Accepteer in het laatste venster de labelnaam Boekingnummer,
guur 8.3.
 Selecteer de keuzelijst (niet het label) en plaats het eigenschappenvenster (F4).
 Verander in het tabblad Overige de eigenschap Naam in
KeuzelijstBoeking.
 Zet als laatste een opdrachtknop op het formulier. Druk daarna direct op Annuleren om de wizard van de knop te stoppen, we gaan
zelf acties onder de knop plaatsen.
 Selecteer de opdrachtknop en verander de eigenschap Naam in
KnopBoeking en verander bovendien in het tabblad Opmaak, de
eigenschap Bijschrift in Toon boeking.
Het voorlopige resultaat staat in guur 8.3. Sla het formulier op
met de naam Macro ingesloten.

268

Databaseontwikkeling 4 Access 2007

Figuur 8.3

Nu gaan we een ingesloten macro maken die uitgevoerd wordt na


het klikken op de opdrachtknop.
 Open het formulier in de ontwerpweergave en plaats het eigenschappenvenster van de opdrachtknop.
 Selecteer het tabblad Gebeurtenis. Klik in de eigenschap Bij klikken op de -knop en selecteer Opbouwfunctie voor macros. We
komen in het bekende scherm van macros terecht.
 Selecteer als eerste actie Rapport openen.
 Selecteer bij de argumenten het eerder gemaakte rapport Boeking.
Bij Beeld selecteerr je Afdrukvoorbeeld. Het derde argument gebruiken we niet. Klik in het argument WHERE-voorwaarde op de
-knop. Het opbouwvenster wordt getoond, zie guur 8.4. Typ
[Boekingnummer]=. Klik daarna op Forms, Geladen formulieren,
Macro ingesloten. De gegevens van het openstaande formulier
worden getoond, zie guur 8.4. Selecteer onze keuzelijst uit het
formulier en klik op Plakken. De voorwaarde hoort bij het te openen rapport. Het boekingnummer uit het rapport is gelijk aan het
geselecteerde nummer in de keuzelijst van het formulier. Merk op
dat ook in de Nederlandse versie van Access het Engelse Forms
wordt gebruikt.

8 Macros

269

Figuur 8.4

 Sluit het macrovenster met de knop Sluiten, niet via Opslaan als.
De macro is nu niet te zien in het navigatiegedeelte. Hij is ingesloten (embedded) bij de knop van het formulier. In het eigenschappenvenster staan nu bij de eigenschap Bij klikken de tekst
[Ingesloten macro]. We kunnen daar de macro ook weer wijzigen
via de -knop. Met Opslaan als kun je een ingesloten macro opslaan als een gewone macro.
 Open het formulier in de formulierweergave, selecteer een boeking
en klik op de knop Toon boeking, zie guur 8.5.
Figuur 8.5

270
270

Databaseontwikkeling 4 Access 2007

Opgave
8.2 a. Maak het formulier uit deze paragraaf.
b. Voeg aan het formulier nog een extra knop toe die het rapport
direct naar de printer stuurt.

8.3

Geavanceerde macros

In de vorige paragrafen hebben we macros gemaakt die vanuit


het navigatiegedeelte worden uitgevoerd of na het klikken op een
knop. Het voorbeeld in paragraaf 8.1 is een algemene macro en
het voorbeeld in paragraag 8.2 is een ingesloten macro. Ingesloten
macros komen het meest voor. Je hoeft hierdoor geen administratie bij te houden welke macro bij welke actie in een formulier of
rapport hoort. Als je een macro hebt die door veel formulieren of
rapporten wordt gebruikt, kun je ook een algemene macro maken
en die dan oproepen uit een formulier of rapport. Het uitvoeren
van een macro kan op vele manieren, zoals het klikken op een
opdrachtknop. Een andere veelgebruikte methode om een macro
te starten is een bepaalde gebeurtenis, bijvoorbeeld de gebeurtenis
het openen van een formulier, het verlaten van een besturingselement of na bijwerken van een besturingselement.
We gaan twee formulieren maken waarin we de mogelijkheden
van macros zullen demonstreren. Tevens tonen we hoe we op
basis van waarden in het formulier verschillende acties kunnen
uitvoeren. Het betreft een demonstratie van de mogelijkheden van
macros en niet echt een praktische toepassing. In hoofdstuk 9,
Het bouwen van een toepassing, worden macros gebruikt die wel
nuttig zijn in een praktijksituatie. In dat hoofdstuk maken we een
professioneel ogende toepassing, die gebruikt kan worden door
mensen die geen kennis van Access hebben. Alle handelingen worden door macros uitgevoerd. Maar voordat we die macros kunnen
maken, moeten we eerst de mogelijkheden leren kennen vandaar
dit demonstratievoorbeeld.
We gaan twee formulieren maken, genaamd Groenformulier en
Roodformulier. In het groene formulier worden boodschappen af-

8 Macros

271

gedrukt en het rode formulier laat, via opdrachtknoppen, de boodschap verdwijnen en terugkomen, zie guur 8.6. We maken eerst
de formulieren en vervolgens de macros.
Figuur 8.6

Omdat dit een demonstratie van macros is, gebruiken we de eerdergemaakte database Oefening. Als deze database niet meer aanwezig is, creer deze dan (Windows-knop) of maak gebruik van
een andere testdatabase.
 Selecteer in het lint Maken, groep Formulieren, de knop
Formulierontwerp.
 Plaats hierop een tekstvak uit de groep Besturingselementen. Dit
tekstvak wordt gebruikt om een tekst (boodschap) te tonen.
 Selecteer het besturingselement, niet het label, en toon het eigenschappenvenster (via het lint of F4).
 Verander de eigenschap Naam in Boodschap.
 Selecteer het label van het tekstvak en verander de eigenschap
Bijschrift in de tab Opmaak in Boodschap.
 Om dit formulier goed te kunnen onderscheiden van het andere
gaan we een gifgroene kleur aan het formulier geven. Klik met
de muis op de Detailbalk van het formulier en klik hierna in het
eigenschappenvenster op het tabblad Opmaak. Klik op de eigenschap Achtergrondkleur en klik vervolgens op de drie puntjes in

272

Databaseontwikkeling 4 Access 2007

deze eigenschap. Er wordt een kleurenpalet getoond. Kies de gifgroene kleur en klik op de knop OK.
 Ten slotte moeten enkele eigenschappen van het formulier worden
gewijzigd. Zet de eigenschappen van het formulier op het scherm;
je kunt Formulier selecteren uit de keuzelijst van het eigenschappenvenster. Verander de eigenschappen, tab Opmaak, zoals in guur 8.7 wordt getoond.
Figuur 8.7

Eigenschap

Instelling

Schuifbalken

Geen

Recordkiezers

Nee

Navigatieknoppen

Nee

 Er moet nog een extra eigenschap gewijzigd worden. Het groene


formulier moet een zogenaamd pop-up formulier worden. Een
formulier dat bovenop een ander formulier (of rapport) geplaatst
kan worden, zie guur 8.6. Verander de eigenschap Pop-up, tab
Overige, in Ja.
 Bekijk het formulier in de formulierweergave.
 Verander eventueel de lay-out van het formulier, zodat het ongeveer de lay-out krijgt van het groene formulier uit guur 8.6.
 Sla vervolgens het formulier op en geef het de naam Groenformulier.
We gaan nu het rode formulier maken.
 Klik in het lint Maken op Formulierontwerp.
Dit nieuwe formulier krijgt drie knoppen. Hieronder gaan we zelf
macros plaatsen, dus de wizard is niet nodig. Je kunt deze (tijdelijk) uitschakelen of na het starten van de wizard op Annuleren
klikken.
 Selecteer Knop uit de besturingselementen en verplaats de muiswijzer naar het formulier.
 Klik en sleep de nieuwe opdrachtknop in het formulier.
 Verander de eigenschap Bijschrift, tabblad Opmaak, van de
opdrachtknop in Kom terug en de eigenschap Naam, in tabblad
Overige, ook in Kom terug.

8 Macros

273

 Plaats op dezelfde manier nog twee opdrachtenknoppen in het


formulier. Verander de eigenschappen Bijschrift en Naam van de
tweede opdrachtknop beide in Verdwijn en voor de derde opdrachtknop beide in Einde
 De opdrachtknop Kom terug moet in eerste instantie uitgeschakeld
zijn, wat betekent dat de opdrachtknop niet te selecteren is. Kies
daartoe in het eigenschappenvenster, van de opdrachtknop Kom
terug, het tabblad Gegevens en verander de eigenschap Ingeschakeld in Nee.
 Zorg dat de opdrachtknoppen rechts onderin staan, netjes verdeeld
staan en dezelfde grootte hebben, zie guur 8.6. Je kunt daarvoor
het lint Schikken gebruiken.
Om dit formulier goed te kunnen onderscheiden van het groene
formulier gaan we het een knalrode kleur geven.
 Klik met de muis op de Detailbalk van het formulier en klik in het
eigenschappenvenster op het tabblad Opmaak.
 Klik op de eigenschap Achtergrondkleur en klik vervolgens op de
drie puntjes in deze eigenschap. Kies uit het kleurenpalet de knalrode kleur en klik op de knop OK.
Ten slotte moeten enige eigenschappen van het formulier gewijzigd
worden.
 Plaats de eigenschappen van het formulier op het scherm (je kunt
Formulier selecteren uit de keuzelijst van het eigenschappenvenster).
 Verander de eigenschappen zoals in guur 8.7 wordt getoond.
 Bekijk het formulier in de formulierweergave. We kunnen op
de opdrachtknoppen klikken, er gebeurt niets. De acties die uitgevoerd moeten worden, de macros, moeten immers nog gemaakt
worden.
 Sla vervolgens het formulier op en geef het de naam Roodformulier.
De formulieren waarvoor we de macros gaan maken zijn klaar,
dus we gaan nu beginnen met de macros. Er zijn in dit voorbeeld
vier macros nodig, die we alle vier apart kunnen opslaan, maar we
gaan gebruik maken van ingesloten macros. De eerste macro moet
uitgevoerd worden na het openen van het rode formulier.

274

Databaseontwikkeling 4 Access 2007

 Plaats het rode formulier in de ontwerpweergave en toon het eigenschappenvenster (F4) van het formulier.
 Kies in het tabblad Gebeurtenis de eigenschap Bij Openen. Klik op
de -knop en kies Opbouwfunctie voor macros. Je komt terecht
in het macrovenster. Hierin kunnen we de acties invoeren zoals
getoond in guur 8.8, argumenten die niet nodig zijn, worden in de
tabel niet getoond.
Figuur 8.8
Actie
FormulierOpenen

Argument
Formuliernaam
Beeld
Venstermodus
Item
Expressie

WaardeInstellen

TijdelijkeVariabeleInstellen

Naam
Expressie

Instelling
Groenformulier
Formulier
Standaard
[Forms]![Groenformulier]![Boodschap]
"Hallo, hier ben ik voor de eerste keer.
Klik op Verdwijn."
Teller
1

 Klik met de muis in de kolom met acties en selecteer de actie FormulierOpenen.


 Vul de argumenten in zoals beschreven in guur 8.8. Via de F6toets kunnen we snel wisselen tussen acties en argumenten. Deze
macroactie opent het groene formulier in formulierweergave.
Let op!
De tweede macroactie WaardeInstellen is alleen te selecteren als
in het lint van het macrovenster, groep Ontwerpen, de knop Alle
acties weergeven is gemarkeerd. Standaard is de knop niet gemarkeerd, zodat alleen betrouwbare acties zijn uit te voeren. Hierdoor
zijn er geen problemen met de beveiligingswaarschuwing. Het zijn
vertrouwde acties, er is geen vertrouwensstatus nodig om ze uit te
voeren. Wij gaan die macro zelf maken en hebben alle acties nodig. Klik op de knop Alle acties weergeven om alle acties te tonen.
Bij het starten van de macro kunnen we een melding krijgen dat de
macro niet uitgevoerd kan worden. Dat heeft te maken met de beveiligingsstatus. Het wel of niet verschijnen van de waarschuwing
heeft te maken de vertrouwensstatus. Je moet vertrouwde mappen
hebben of vertouwde uitgevers (ook al heb je de database zelf gemaakt). In bijlage B vind je hierover extra informatie (Categorie
Vertrouwenscentrum). Verderop in deze paragraaf, bij het uitvoeren van de macro, komen we hierop terug.

8 Macros

275

De tweede actie is WaardeInstellen, een actie die veelvuldig


voorkomt in macros. Hiermee kun we aan een eigenschap een
waarde toekennen. In de tweede actie krijgt het besturingselement
Boodschap, dat zich in het groene formulier bevindt, de waarde
Hallo, hier ben ik voor de eerste keer. Klik op Verdwijn..
Voordat we uitleggen dat deze instelling op een eenvoudige manier
is in te voeren, geven we enige regels met betrekking tot het verwijzen naar formulieren.
Verwijzingen naar formulieren
Om te verwijzen naar het formulier Groenformulier moeten we het
volgende invoeren: [Forms]![Groenformulier]. Hiermee maken
we aan Access kenbaar dat we naar het formulier Groenformulier
verwijzen. Als we moeten verwijzen naar een besturingselement
op een formulier, wordt de verwijzing nog een element langer.
Willen we bijvoorbeeld verwijzen naar het besturingselement
Einde op het rode formulier, dan moeten we invoeren: [Forms]!
[Roodformulier]![Einde]. Om het nog erger te maken: stel we
willen verwijzen naar de eigenschap Visible van het besturingselement Boodschap in het groene formulier. De verwijzing hiernaar
luidt: [Forms]![Groenformulier]![Boodschap].[Visible]. Merk op
dat de verwijzing naar een eigenschap niet wordt gescheiden door
een uitroepteken, maar door een punt.
Opmerkingen over verwijzingen
 Verwijzingen naar formulieren zijn ook in de Nederlandse versie
van Access in het Engels. Via [Forms]![Groenformulier].[Visible]
kunnen we het formulier Groenformulier zichtbaar of onzichtbaar
maken. De eigenschappen zijn in de Nederlandse versie soms in
het Engels en soms in het Nederlands, zie bijvoorbeeld guur 8.11.
Dat is een verbeterpunt voor een volgende versie van Access.
 Denk erom dat je [Forms] intoetst en niet [Form], dat heeft namelijk een heel andere betekenis. Je kunt ermee verwijzen naar subformulieren.
 Als een formulier de focus heeft, is het niet noodzakelijk om de
volledige verwijzing in te voeren. Heeft het groene formulier de focus, dan kun je volstaan met de verwijzing: [Boodschap].[Visible]
in plaats van [Forms]![Groenformulier]![Boodschap][.Visible]
om alleen de boodschap zichtbaar / onzichtbaar te maken.
 De verwijzing naar rapporten is hetzelfde; vervangt alleen de uitdrukking [Forms] door [Reports].

276

Databaseontwikkeling 4 Access 2007

 Zoals eerder opgemerkt heeft Access een voorziening gemaakt om


het typen van lange verwijzingen te vereenvoudigen. We kunnen
gebruikmaken van het dialoogvenster Opbouwfunctie voor expressies. Deze is eerder in het boek al gebruikt, maar we zullen hier
nog een extra toelichting geven, omdat dit onmisbaar is voor het
bouwen van ingewikkelde macros.
 Selecteer het argument Item van de tweede actie, WaardeInstellen,
uit de macro.
 Klik op de drie puntjes van dit argument, waarna het venster
Opbouwfunctie voor expressies actief wordt, zie guur 8.9.
Figuur 8.9

In de eerste kolom van dit venster kunnen we het object selecteren


waarnaar we een verwijzing moeten maken. We kunnen tabellen,
querys, formulieren of rapporten selecteren. Selecteren we in de
eerste kolom een formulier (eerst dubbelklikken op Forms), dan
verschijnen in de middelste kolom alle besturingselementen uit dat
formulier. In de middelste kolom kiezen we het gewenste besturingselement. In de derde kolom kunnen we voor de <Waarde>
van het besturingselement kiezen of een keuze maken uit de eigenschappen ervan.
Naast het verwijzen naar de genoemde objecten kunnen we in dit
venster tevens een van de vele functies van Access selecteren. Kies
in de eerste kolom Functies, Ingebouwde functies. In de middelste kolom verschijnen dan alle functiegroepen van Access, zoals
datum/tijd-, statistische en rekenkundige functies. Selecteren we
bijvoorbeeld de statistische functies, dan verschijnen in de derde
kolom alle statistische functies van Access. Nadat we de juiste
expressie hebben geselecteerd, kunnen we op de knop Plakken

8 Macros

277

klikken. De expressie verschijnt in het bovenste gedeelte van het


venster. Als berekeningen of vergelijkingen met de selectie uitgevoerd moeten worden, hebben we de keuze uit de knoppen onder
het venster. Hierna kan eventueel een functie opgeroepen worden
of opnieuw een besturingselement. Nadat de volledige expressie in
het venster is geplaatst, kan op de knop OK worden geklikt.
In de eerste kolom van het dialoogvenster Opbouwfunctie voor
expressies zijn nog enkele handige elementen die geselecteerd
kunnen worden, zoals Gangbare expressies. Hiermee kunnen we
bijvoorbeeld een besturingselement selecteren dat het huidige paginanummer bevat of de huidige datum.
 Selecteer in de eerste kolom Forms het formulier Groenformulier.
Hierbij hebben we de mogelijkheid om alle formulieren te selecteren of alleen de geladen formulieren.
 In de tweede kolom worden alle besturingselementen getoond die
op het formulier staan. Selecteer in de tweede kolom het besturingselement Boodschap.
 In de derde kolom worden alle eigenschappen van dat besturingselement getoond. Selecteer de standaardwaarde van de derde
kolom <Waarde>. Hiermee kunnen we aan het besturingselement
een waarde toekennen.
 Klik op de knop Plakken. Hiermee plakken we de gemaakte keuze
in het bovenste scherm van de Opbouwfunctie voor expressies.
 Klik vervolgens op de knop OK. Dit heeft tot gevolg dat het venster wordt gesloten en de gemaakte verwijzing in het argument
wordt geplaatst.
 Verplaats de cursor naar het argument Expressie van de tweede
actie. Typ hier de tekst die in het besturingselement komt te staan;
deze dient tussen aanhalingstekens geplaatst te worden. De tekst
wordt in de formulierweergave van het formulier in het besturingselement Boodschap getoond.
 De derde en laatste actie is TijdelijkeVariabeleInstellen. Kies bij
het argument Naam voor Teller en bij Expressie de waarde 1.
Met de macroactie TijdelijkeVariabeleInstellen kunnen we een
tijdelijke variabele (Teller) maken en deze een bepaalde waarde
geven. Deze variabele kunnen we vervolgens als voorwaarde of
argument gebruiken in verdere acties of we kunnen de variabele
gebruiken in een andere macro, in een gebeurtenisprocedure of
in een formulier of rapport. Wij gebruiken de tijdelijke variabele

278

Databaseontwikkeling 4 Access 2007

als voorwaarde. In dit voorbeeld laten we het groene formulier


verdwijnen en terugkomen. Iedere keer dat het terugkomt, laten
we een andere boodschap zien. De tijdelijke variabele begint bij de
waarde 1. Daarna verhogen we de waarde telkens met 1, bij iedere
druk op de knop Kom terug. Hierdoor kunnen we bepalen welke
boodschap getoond moet worden. De volgende macros zullen dat
verduidelijken.
Er zijn nog twee macroacties die met tijdelijke variabelen te maken
hebben, TijdelijkeVariabeleVerwijderen en AlleTijdelijkeVariabelen
Verwijderen. Deze hebben verder geen uitleg nodig.
Het macrovenster van de eerste macro staat in guur 8.10. Merk op
dat bij de tweede actie een waarschuwingssymbooltje staat. Dat is
een macro die niet tot de vertrouwde macros behoort.
Figuur 8.10

We gaan de tweede macro maken. Het groene formulier wordt verwijderd en tevens worden enkele instellingen veranderd. Zo wordt
bijvoorbeeld de opdrachtknop Kom terug ingeschakeld, die niet
geselecteerd kon worden. Tijdens het ontwerpen van de knop hebben we de eigenschap Ingeschakeld op Nee gezet. De acties van de
macro staan in guur 8.11. Argumenten die niet nodig zijn, worden
in de tabel niet getoond.

279

8 Macros

Figuur 8.11
Actie
WaardeInstellen
EigenschapInstellen

Argument
Item
Expressie
Besturingselementnaam

Instelling
[Forms]![Groenformulier].[Visible]
Nee
Kom terug

NaarBesturingselementGaan
EigenschapInstellen

Eigenschap
Waarde
Besturingselementnaam
Besturingselementnaam

Ingeschakeld
-1 (Ja)
Kom terug
Verdwijn

Eigenschap
Waarde

Ingeschakeld
0 (Nee)

 Selecteer de knop Verdwijn in de ontwerpweergave van het rode


formulier en kies in het eigenschappenvenster, tabblad Gebeurtenis, de eigenschap Bij klikken.
 Activeer het macro venster.
De eerste actie wijzigt de eigenschap Visible (Zichtbaar) van het
groene formulier in de waarde Nee, het groene formulier verdwijnt
van het scherm. In het venster Opbouwfuncties voor expressies
kiezen we in de eerste kolom voor het groene formulier. In de
tweede kolom voor <Formulier> en in de derde kolom de eigenschap Visible. De eigenschappen in de derde kolom van dit venster
tonen ook in de Nederlandse versie de Engelse equivalenten.
De volgende actie, EigenschapInstellen, wijzigt van de opdrachtknop Kom terug de eigenschap Ingeschakeld (Enabled) in de
waarde Ja. In eerste instantie is de opdrachtknop Kom terug niet
te selecteren. De boodschap wordt ten slotte getoond, er valt niet
terug te keren. Nu de boodschap verdwenen is, kunnen we de
opdrachtknop Kom terug inschakelen, zodat deze geselecteerd
kan worden. Alleen de naam van het besturingselement is toegestaan. De actie EigenschapInstellen is maar voor een beperkt
aantal eigenschappen beschikbaar en alleen toepasbaar als het
formulier de focus heeft. Als we Ja of Nee moet gebruiken bij
het argument Waarde, moet -1 of 0 worden ingevoerd! De actie
EigenschapInstellen heeft een beperkt aantal eigenschappen. Wil
je meer eigenschappen instellen, maak dan gebruik van de actie
WaardeInstellen.
Vervolgens moet de opdrachtknop Verdwijn worden uitgeschakeld,
de boodschap is immers al verdwenen. Dit vindt plaats in de twee

280

Databaseontwikkeling 4 Access 2007

laatste acties. De opdrachtknop Verdwijn willen we uitschakelen,


echter een besturingselement kan alleen uitgeschakeld (of onzichtbaar) gemaakt worden als het niet de focus heeft. Aangezien op de
opdrachtknop is geklikt, heeft die de focus. Om de opdrachtknop
Verdwijn uit te schakelen moeten we eerst de focus verplaatsen
naar de opdrachtknop Kom terug. De actie NaarBesturingselementGaan verplaatst de focus naar een ander besturingselement. Deze
actie heeft maar n argument, Besturingselementnaam, waarbij
het niet mogelijk is om de volledige beschrijving te typen, alleen
de naam is toegestaan.
In de laatste actie vindt het uitschakelen van de opdrachtknop
Verdwijn plaats. Aangezien het rode formulier nog de focus heeft,
is het niet noodzakelijk om ook de naam van het formulier in te
voeren.
De boodschap is verdwenen. De opdrachtknop Verdwijn is niet
meer te selecteren en de opdrachtknop Kom terug kan nu wel geselecteerd worden.
Nu kunnen we de derde macro gaan maken. Deze macro wordt
gestart als op de opdrachtknop Kom terug wordt geklikt. De boodschap wordt opnieuw getoond. Vervolgens plaatsen we de tweede
boodschap in het besturingselement Boodschap. Hierna moet het
ingeschakeld zijn van de opdrachtknoppen Kom terug en Verdwijn
opnieuw stuivertje wisselen. Echter wanneer voor de vierde keer
de boodschap is getoond, wordt de macro beindigd.
 Selecteer de knop Kom terug in de ontwerpweergave van het rode
formulier en selecteer in het eigenschappenvenster het tabblad
Gebeurtenis.
 Activeer het macrovenster van de eigenschap Bij klikken.
De macroacties staan afgebeeld in guur 8.12. Argumenten die
niet nodig zijn, worden in de tabel niet getoond.
In de macro van de knop Kom terug komen voorwaarden voor.
Iedere keer als de tekst wordt getoond, wordt een andere boodschap zichtbaar. Na de vierde keer kan de boodschap niet meer
verwijderd worden. Om voorwaarden in macros mogelijk te
maken moet een vierde kolom in het macrovenster worden geactiveerd.

281

8 Macros

 Selecteer in het lint van het macrovenster de knop Voorwaarden.


Hierdoor verschijnt een extra kolom waarin we voorwaarden
kunnen opgeven. Als gevolg hiervan wordt het mogelijk om een
bepaalde actie, op grond van een voorwaarde, wel of niet uit te
voeren.
Figuur 8.12
Voorwaarde

Actie

Argument

Instelling

TijdelijkeVariabeleInstellen

Naam

Teller

Expressie
Item
Expressie
Objecttype
Objectnaam
In databasevenster
Item

[TempVars]![Teller]+1
[Forms]![Groenformulier].[Visible]
Ja
Formulier
Roodformulier
Nee
[Forms]![Groenformulier]![Boodschap]

Expressie
Item
Expressie
Item
Expressie

Hallo, dit is de tweede keer.


[Forms]![Groenformulier]![Boodschap]
Hallo, dit is al de derde keer.
[Forms]![Groenformulier]![Boodschap]
Sorry, ik laat me niet meer wegsturen.
Einde

Besturingselementnaam
Eigenschap
Waarde

Kom terug
Ingeschakeld
0 (Nee)

Besturingselementnaam
Eigenschap
Waarde

Verdwijn
Ingeschakeld
-1 (Ja)
Verdwijn

Besturingselementnaam
Eigenschap
Waarde

Kom terug
Ingeschakeld
0 (Nee)

WaardeInstellen
ObjectSelecteren

[TempVars]!Teller=2

WaardeInstellen

[TempVars]!Teller=3

WaardeInstellen

[TempVars]!Teller=4

WaardeInstellen

NaarBesturingselementGaan
EigenschapInstellen

MacroStoppen
EigenschapInstellen

Naar besturingselementGaan
EigenschapInstellen

De eerste actie verhoogt de waarde van de tijdelijke variabele


Teller met 1; de waarde wordt nu 2. De volgende keer dat deze
macro wordt gestart, gaat de waarde naar 3, enzovoort. De expressie is een beetje vreemd. De naam van de tijdelijke variabele is
Teller. Maar de waarde van de variabele is [TempVars]![Teller].
Dus, ook in de Nederlandse versie van Access, is achter de schermen een object [TempVars], waarin waarden van alle tijdelijke
variabelen wordt opgeslagen.

282

Databaseontwikkeling 4 Access 2007

De tweede actie van de macro is het zichtbaar maken van het groene formulier. De eigenschap Visible (Zichtbaar) van het formulier
krijgt de waarde Ja. De boodschap wordt weer getoond. Het zichtbaar maken van het groene formulier heeft ook de focus daarop
geplaatst. Aangezien nu veel acties uitgevoerd worden op het rode
formulier, verplaatsen we de focus naar het rode formulier in de
derde actie.
Iedere keer dat de boodschap op het scherm komt, willen we een
andere boodschap in het besturingselement Boodschap plaatsen.
Om dit te realiseren hebben we een voorwaarde nodig. Als de
tijdelijke variabele Teller de waarde 2 heeft, wordt de vierde actie
uitgevoerd. Als de waarde van het besturingselement Teller de
waarde 3 of 4 heeft, wordt respectievelijk de vijfde of zesde actie
uitgevoerd. De actie die uitgevoerd moet worden, is het plaatsen
van een boodschap in het besturingelement Boodschap van het
groene formulier. Afhankelijk van de waarde van de tijdelijke variabele Teller wordt een andere boodschap getoond.
Als voor de vierde keer een boodschap is getoond, wordt de
macro gestopt. De boodschap laten we niet meer verwijderen.
Hiervoor moet de opdrachtknop Kom terug uitgeschakeld worden.
Aangezien de opdrachtknop Verdwijn nog uitgeschakeld is, kan
dan alleen de opdrachtknop Einde nog gekozen worden.
Als de tijdelijke variabele Teller de waarde 4 heeft, worden verschillende acties uitgevoerd. We moeten voor iedere actie aangeven dat die alleen uitgevoerd mag worden als de tijdelijke variabele
Teller de waarde 4 heeft. Om typewerk of kopieer- en plakwerk
te besparen kunnen we volstaan door in de voorwaarde drie puntjes te typen. Hiermee geven we aan dat de voorwaarde herhaald
wordt. In de macro Kom terug wordt de zesde tot en met de negende actie alleen uitgevoerd als de tijdelijke variabele Teller de
waarde 4 heeft.
De focus wordt verplaatst naar de opdrachtknop Einde. De eigenschap Ingeschakeld van de opdrachtknop wordt op Nee gezet.
Hiermee is die opdrachtknop niet meer te selecteren. Als laatste
wordt de macro beindigd door de actie MacroStoppen.
Als de teller ongelijk is aan de waarde 4, worden na het tonen van
de boodschap in het besturingselement Boodschap, de acties tien

8 Macros

283

tot en met twaalf uitgevoerd. De opdrachtknop Verdwijn wordt


ingeschakeld. Deze krijgt vervolgens de focus. Als laatste actie
wordt de opdrachtknop Kom terug uitgeschakeld. Het volledige
schema is te zien in guur 8.13
Figuur 8.13

Terzijde
Opmerkingen over voorwaarden
 Het is niet mogelijk om zogeheten if...then...else-constructies te
maken. Wel kunnen we gebruikmaken van de operatoren And,
Or en Not.
 Het nesten van voorwaarden (voorwaarden in voorwaarden) is
niet mogelijk.
 Een voorwaarde in het macrovenster kan uitvergroot worden
door de voorwaarde te selecteren en vervolgens op de toetsencombinatie Shift+F2 te drukken (zoomen).
 Het is efcinter om bij het herhalen van een voorwaarde de
drie puntjes (...) te gebruiken, dan de volledige voorwaarde te
herhalen. Als gebruik wordt gemaakt van de drie puntjes, wordt
de voorwaarde maar n keer gevalueerd.

284

Databaseontwikkeling 4 Access 2007

De vierde en laatste macro kan gemaakt worden. Deze macro


wordt gestart na een klik op de opdrachtknop Einde. Het groene en
rode formulier worden gesloten.
 Selecteer de knop Einde in de ontwerpweergave van het rode
formulier en selecteer in het eigenschappenvenster het tabblad
Gebeurtenis.
 Activeer het macrovenster van de eigenschap Bij klikken.
De macroacties staan afgebeeld in guur 8.14.
Figuur 8.14

Actie

Argument

Instelling

Sluiten

Objecttype

Formulier

Objectnaam

Groenformulier

Sluiten

Opslaan

n.v.t

Objecttype

Formulier

Objectnaam

Roodformulier

Opslaan

n.v.t

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. Nu kunnen we gaan uitvoeren/
testen (uiteraard kunnen we ook tussendoor testen).
 Open het rode formulier.
Let op!
Er kan een melding komen waarin staat dat de macro niet uitgevoerd kan worden, zie guur 8.15.
Figuur 8.15

8 Macros

285

We hebben immers macroacties gebruikt die Access als onveilig


bestempelt. Wij hebben een aantal zeer onschuldige macros gemaakt en moeten Access vertellen dat deze database en dus de
macros te vertrouwen zijn. We moeten vertrouwde mappen hebben (ook al hebben we de database zelf gemaakt). In bijlage B vind
je hierover informatie (Categorie Vertrouwenscentrum). Als we
een database starten van een niet vertrouwde bron ook al ben je
dat zelf verschijnt de beveiligingwaarschuwing: Bepaalde inhoud in de database is uitgeschakeld. Klik op de knop Opties van
die melding en kies de optie om de inhoud in te schakelen. Hierna
kunnen we de macros wel uitvoeren. Maar iedere keer als de database wordt gestart, of welke andere database dan ook, blijft die
melding komen. Het kan zijn dat je de beveiligingswaarschuwing
niet meer ziet. Sluit dan Access af en open het daarna opnieuw. De
beveiligingswaarschuwing verschijnt dan weer. Mocht de beveiligingsregel niet komen, terwijl er geen vertrouwde mappen zijn, zie
dan bijlage B (Categorie Berichtenbalk).
Na het openen van het rode formulier wordt het groene formulier
automatisch geopend.
 Controleer de werking van de opdrachtknoppen.
Als de macro niet naar wens functioneert, controleer dan de macro
die niet goed werkt. Eventueel kunnen we de 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 functioneert, 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.3 a. Maak de formulieren en macros zoals beschreven in deze paragraaf.
b. Wijzig de macro zo dat er nog twee extra meldingen worden
getoond, voordat de boodschap niet meer te verwijderen is.

Het bouwen van een


toepassing

In de vorige hoofdstukken hebben we geleerd hoe we tabellen


ontwerpen en bouwen, hoe we querys, formulieren en rapporten
ontwikkelen en hoe we macros maken. In dit hoofdstuk zullen we
een toepassing (programma) maken die gebruikmaakt van alle
opgedane kennis. We maken een professionele lay-out en laten alle
gebeurtenissen door 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 zit bij de downloadbestanden. Hiermee kunnen we theorie en toepassing direct controleren. Behalve database
t Zonnetje vind je bij de downloadbestanden ook 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 precies 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.

288

Databaseontwikkeling 4 Access 2007

4. De menustructuur moet ontworpen worden. Hiermee bedoelen


we: hoe ziet het openingsscherm eruit (hoofdmenu) en de vervolgschermen (submenus). Deze kunnen we in Access maken met van
zelf gemaakte linten of 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 zelf gemaakte linten of schakelborden.
Deze stappen worden in de volgende paragrafen besproken, waarbij de eerste twee punten in ons voorbeeld als bekend worden verondersteld. 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 klantnummer 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

9 Het bouwen van een toepassing

289

5.7.8 en 6.3 is uitgelegd hoe dat in zijn werk gaat. Hetzelfde geldt
voor het veld Reisnummer, dit is ook een vreemde sleutel. Hierop is
eveneens een keuzelijst met invoervak gemaakt.
Figuur 9.1

Verder valt op te merken dat de veldlengte van Aantal volwassenen en Aantal kinderen op Integer is gezet. Het type Byte was
beter geweest (waarden 0-255), maar het gegevenstype Byte geeft
problemen in rapporten bij het sommeren. Vandaar dat gekozen is
voor Integer. In bijlage A worden alle gegevenstype en veldlengten
toegelicht.
In het veld Boekdatum heeft de eigenschap Standaardwaarde de
waarde Date() gekregen. Door deze standaardfunctie wordt automatisch de huidige datum ingevoerd bij een nieuwe boeking, die
wel te wijzigen is.

290

Databaseontwikkeling 4 Access 2007

Verder zijn in hoofdstuk 6 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 algemeen 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.
Op het veld Bestemmingcode is in de eigenschap Invoermasker de
tekst >?????;; geplaatst. Hierdoor kunnen er maximaal vijf letters ingevoerd worden en bovendien worden die letters automatisch
omgezet naar hoofdletters. Voor informatie over invoermaskers,
zie bijlage A.
Tabel Constant: deze tabel wordt hier voor het eerst gentroduceerd; in voorgaande hoofdstukken is die tabel niet eerder
gebruikt. Waar komt die vandaan? Een constantentabel is bij de
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 BTWpercentage 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 rapportontwerp op te nemen. Verandert het BTW-percentage, dan zullen
we alle formulieren en rapporten moeten nalopen om te controleren of die het BTW-percentage bevatten. Vervolgens moet het
gewijzigd worden.

291

9 Het bouwen van een toepassing

We noemen het in de informatiekunde wel constanten, maar het


zijn geen wiskundige constanten. Ze zijn dus alleen maar gedurende 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-percentage. 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
voorgaande hoofdstukken hebben we gerekend met een kortingspercentage van 50% 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 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 constanten 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.
Veldnaam

Gegevenstype Veldlengte

Notatie

Vereist

AnnuleerPerc

Numeriek

Enkele precisie

Percentage

Ja

KinderKortingPerc Numeriek

Enkele precisie

Percentage

Ja

De percentages moeten als fractie ingevoerd worden of als percentage. Kies voor het annuleringspercentage de waarde 4% en voor
het percentage van de kinderkorting de waarde 50%. Door bij de
notatie op te geven dat het percentages zijn, zorgen we ervoor dat

292

Databaseontwikkeling 4 Access 2007

de getallen als percentages worden getoond. In onze berekeningen


met de percentages is het dan niet noodzakelijk steeds door 100 te
delen. De veldlengte 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 aangemaakt 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 hoofdmenu 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
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. Deze menus zijn aparte formulieren die je door de toepassing navigeren. Om verwarring over de
naamgeving te voorkomen worden ze binnen Access schakelborden genoemd. Zoals in paragraaf 9.5 zal blijken, hadden we voor
onze menus (schakelborden) ook speciale linten kunnen maken.
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 verschillende overzichten. En na de keuze Onderhoud komen we in
een submenu waarin de basisgegevens gemuteerd kunnen worden.

9 Het bouwen van een toepassing

293

Voor twee keuzemogelijkheden, Overzichten en Onderhoud hebben we submenus gemaakt.


Submenu Overzichten
Klantenlijst
Vertreklijst
Omzetlijst
Dit submenu is gemaakt met een schakelbord. De Klantenlijst
drukt een alfabetisch klantenoverzicht af.
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 getoond.
De Omzetlijst toont per te boeken reis de omzet, alsmede de bijdrage, als percentage, van die reis aan de totale omzet.




Submenu Onderhoud
Klant mutaties
Reis mutaties
Bestemming mutaties
Constant mutaties
Ook dit submenu is gemaakt met een schakelbord. Na het klikken
op een van de items wordt een formulier zichtbaar waarop we mutaties in de basisgegevens kunnen doorvoeren. Het is niet noodzakelijk 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 formulieren
met elkaar samenwerken, deze ook gelijktijdig gemaakt worden.
Als laatste kunnen we dan de gemaakte formulieren en rapporten
aan de menus toekennen.
Voordat je verder leest 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 databasevenster. Er wordt direct een menu getoond waaruit een keuze

294

Databaseontwikkeling 4 Access 2007

gemaakt kan worden. Als we de formulieren, rapporten of macros


willen bestuderen (of kopiren), moeten we de toepassing starten
met de Shift-toets ingedrukt!
Als we de beveiligingsoptie willen uitschakelen moet ook de
Shift-toets ingedrukt worden gehouden. Als we hierna een venster
openen, moeten we die sluiten met Ctrl-W. Aangezien we in dit
voorbeeld de tabbladen achterwege hebben gelaten, zie paragraaf
9.5, kunnen we anders het venster niet meer afsluiten.
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 verschillende 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 Klant mutaties. 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 menuitem Onderhoud. Immers, wat is technisch het verschil tussen een
reis muteren of een klant muteren?
Open het formulier Klant mutaties 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 Het bouwen van een toepassing

295

Figuur 9.2

9.3.1

Formulier Klant mutaties

 Selecteer de tabel Klant en kies in het lint Maken, groep


Formulieren, Meer Formulieren, Wizard Formulier.
 Selecteer alle velden van de tabel Klant en ga naar het volgende
venster.
 Kies In kolomvorm en vervolgens de stijl Gieterij.
 In het laatste scherm kiezen we de titel Klant mutaties.
Hierna wordt het formulier in formulierweergave getoond. We
gaan het formulier een professionelere uitstraling geven door
bijvoorbeeld de mininavigatieknoppen te vervangen door zelfgeplaatste grotere knoppen.
Als eerste gaan we een aantal eigenschappen van het formulier
aanpassen.
 Toon daartoe het formulier in de ontwerpweergave.
 Plaats vervolgens het eigenschappenvenster op het scherm (F4).
 Selecteer in de keuzelijst van het eigenschappenvenster de eigenschappen van het formulier, zie guur 9.3.
 Wijzig hierin de eigenschappen zoals in guur 9.4 wordt getoond.

296

Databaseontwikkeling 4 Access 2007

Figuur 9.3

Figuur 9.4

Tabblad
Opmaak
Opmaak
Opmaak
Overige

Eigenschap
Recordkiezers
Navigatieknoppen
Schuifbalken
Werking tabtoets

Waarde
Nee
Nee
Geen
Huidig record

Toelichting eigenschappen
Recordkiezers: een recordkiezer is het pijltje dat aan de linkerkant
van het record getoond wordt. Handig indien rijen worden weergegeven, 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 standaardknopjes.
Schuifbalken: in ons formulier hebben we geen schuifbalken
nodig.
Werking tabtoets: hiermee wordt voorkomen dat na het drukken
op de Enter-toets, in het laatste veld, naar het volgende record (volgende klant) wordt gesprongen. We blijven in het actieve record.
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.

9 Het bouwen van een toepassing

297

We gaan het formulier compleet maken door de gewenste opdrachtknoppen toe te voegen. Het toevoegen van opdrachtknoppen is in
paragraaf 6.6 toegelicht. In totaal zijn er negen opdrachtknoppen
nodig, zie guur 9.2. Vijf opdrachtknoppen voor de recordnavigatie (eerste record, vorige record, volgende record, laatste record en
het zoeken naar een record). Drie opdrachtknoppen voor recordbewerkingen (nieuw record creren, record verwijderen en herstellen
van een bewerking). Een laatste opdrachtknop is toegevoegd om
het formulier te sluiten. Dat kan ook met de standaard X-knop,
maar op deze manier is het iets professioneler. We gaan de eerste
opdrachtknop, eerste record selecteren, op het formulier plaatsen.
 Selecteer de ontwerpweergave van het formulier.
 Sleep de formuliervoettekst ongeveer 2 cm naar beneden om daar
de gewenste opdrachtknoppen te kunnen plaatsen. Maak direct het
formulier 3 cm breder om daar ook opdrachtknoppen te kunnen
plaatsen.
 Selecteer in het lint Ontwerpen, groep Besturingselementen,
Knop en verplaats vervolgens de muiswijzer onder het label
Telefoonnummer om daar de eerste opdrachtknop te plaatsen.
 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 gebeuren als op die knop wordt geklikt, zie guur 9.5. Als de wizard
niet wordt gestart, klik dan op de knop Wizards voor besturingselementen in de groep Besturingselementen en plaats opnieuw een
opdrachtknop in het formulier.
Figuur 9.5

298

Databaseontwikkeling 4 Access 2007

 Kies uit de Categorien voor Recordnavigatie en hierin de actie


Naar eerste record gaan.
 Selecteer in het volgende venster Afbeelding en Naar eerste.
 Geef in het volgende scherm de opdrachtknop de naam Eerste en
voltooi de wizard.
 Zet op dezelfde manier de overige acht opdrachtknoppen op het
scherm, zie guur 9.6. Zet ze ongeveer op de gewenste plaats, zie
guur 9.2.
Figuur 9.6

Categorie

Actie

Type (Figuur)

Naam

Recordnavigatie

Naar vorige record gaan

Naar vorige gaan

Vorige

Recordnavigatie

Naar volgende record gaan

Naar volgende gaan

Volgende

Recordnavigatie

Naar laatste record gaan

Naar laatste

Laatste

Recordbewerkingen

Nieuw record toevoegen

Ga naar nieuw(e)

Nieuw

Recordnavigatie

Record zoeken

Verrekijker (zoeken)

Zoek

Recordbewerkingen

Record ongedaan maken

Ongedaan maken

Herstel

Recordbewerkingen

Record verwijderen

Prullenbak

Verwijder

Stoppen

Stoppen

Formulierbewerkingen Formulier sluiten

De acties van de opdrachtenknoppen worden uitgevoerd door ingesloten macros, zie paragraaf 8.2.










De opdrachtknoppen moeten nog dezelfde afmetingen, uitlijning


en tussenafstand krijgen.
Selecteer in de ontwerpweergave alle opdrachtknoppen (Shift-toets
+ klikken of sleep een denkbeeldige rechthoek om de knoppen).
Activeer het eigenschappenvenster en wijzig de eigenschap Breedte
en Hoogte in achtereenvolgens 1,5 cm en 0,6 cm, zie guur 9.7.
Access kan de afmetingen automatisch wijzigen in een iets andere
afmeting, zie de waarde 1,501 cm in guur 9.7. Alle opdrachtenknoppen hebben nu dezelfde afmetingen.
Selecteer vervolgens alleen de onderste vijf knoppen en kies in het
lint Schikken, groep Uitlijning bepalen, Boven uitlijnen (of Onder
uitlijnen). De opdrachtknoppen staan nu op n lijn.
Selecteer vervolgens alleen de vier navigatieknoppen (de knop
Stoppen uit de selectie halen) en kies in de groep Positie voor
Horizontale afstand verkleinen.
Selecteer de rechter vier opdrachtknoppen en de knop Stoppen en
zorg op dezelfde manier dat die links of rechts op n lijn komen te
staan en verklein daarna de verticale afstand van de bovenste vier
opdrachtknoppen.

9 Het bouwen van een toepassing

299

Figuur 9.7

De opdrachtknoppen hebben standaard een Tabstop. Dat wil zeggen: 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 (F4) en zet de
eigenschap Tabstop, in het tabblad Overige, op Nee.
Als laatste plaatsen we nog een lijn tussen de besturingselementen
en de onderste opdrachtknoppen.
 Kies in de ontwerpweergave in het lint Ontwerpen, groep
Besturingselementen, voor de knop Lijn. Verplaatst de muiswijzer
naar de gewenste plaats en sleep de lijn erin.
 Plaats het eigenschappenvenster van de lijn en verander de eigenschap Randbreedte, in tab Opmaak, in 2 pt. Hierdoor wordt de lijn
breder.
 Controleer of de eigenschap Hoogte de waarde 0 heeft, anders staat
de lijn een beetje schuin.

300

Databaseontwikkeling 4 Access 2007

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
postcode van een klant. Door op de Herstelknop te klikken komt
de oorspronkelijke postcode weer tevoorschijn.
Opmerking
Door het plaatsen van de opdrachtknop Stoppen, kunnen we de
standaard X-knop voor het sluiten van een formulier verwijderen.
Dat kan met de eigenschap Knop Sluiten van het formulier (tab
Opmaak). In de uitwerking van dit voorbeeld hebben we dat niet
gedaan.
9.3.2

Formulier Bestemming mutaties

Het formulier Bestemming mutaties is op precies dezelfde manier


gemaakt als het formulier Klant, zie guur 9.8.
Figuur 9.8

Tip: Kopieer de opdrachtknoppen en de lijn uit Klant mutaties.


Hierdoor is dit formulier nog sneller te maken.

9 Het bouwen van een toepassing

9.3.3.

301

Formulier Reis mutaties

Het formulier Reis mutaties is op bijna dezelfde manier gemaakt


als formulier Klant mutaties, zie guur 9.9. Er zijn een paar verschillen, naast de reisgegevens wordt ook de bestemminggegevens
getoond. Bovendien kan eventueel een nieuwe bestemming ingevoerd worden of een wijziging in een bestemminggegeven, bijvoorbeeld een typefout.
Figuur 9.9

 Start Wizard Formulier, kies uit de tabel Reis alle velden en uit de
tabel Bestemming de velden Plaats, Land en Werelddeel.
 De overige opties zijn gelijk aan het formulier Klant mutaties.
 Zet het formulier in de ontwerpweergave en verplaats de
besturingselementen Plaats, Land en Werelddeel onder
Bestemmingcode.
 Wijzig de eigenschappen van het formulier zoals weergegeven in
guur 9.4.
 Plaats op dezelfde manier als in formulier Klant mutaties de opdrachtknoppen en de lijn (eventueel kopiren en plakken).
De gegevens Plaats, Land en Werelddeel mogen in dit formulier
niet gewijzigd worden. Dat moet plaatsvinden via het formulier
Bestemming mutaties. Via het besturingselement Bestemmingcode

302

Databaseontwikkeling 4 Access 2007

kunnen we zorgen dat het formulier Bestemming mutaties wordt


geopend. We kunnen dan eventueel een nieuwe bestemming invoeren die nog niet in de database bestaat of een typefout corrigeren.
 Selecteer in de ontwerpweergave de besturingselementen (niet
de labels) Plaats, Land en Werelddeel en activeer het eigenschappenvenster. Verander in het tabblad Gegevens de eigenschap
Vergrendeld in Ja. Hierdoor kunnen die velden in dit formulier niet
meer gewijzigd worden.
 Selecteer vervolgens alleen het besturingselement Bestemmingcode
en verander in het eigenschappenvenster, tabblad Gegevens, de eigenschap Bewerkingsformulier lijstitems in Bestemming mutaties.
Als je nu de keuzelijst opent, verschijnt onderaan een doorschijnende knop. Als je daarop klikt, verschijnt het formulier
Bestemming mutaties. Hierin kun je de bestemming opzoeken
en muteren of een nieuwe bestemming invoeren. Na het verlaten
van het formulier wordt helaas niet de geselecteerde bestemming
direct voorgezet, maar met de keuzelijst kan snel de juiste bestemming worden gezocht. Het mutatie formulier van de bestemmingen
kan ook direct geselecteerd worden door het besturingselement
Bestemmingcode met de rechtermuisklik te selecteren. Kies in dit
snelmenu Lijstitems bewerken.
9.3.4

Formulier Constant mutaties

Het formulier Constant mutaties is het eenvoudigste formulier, zie


guur 9.10.
In dit formulier kunnen we onze constante gegevens muteren. Aangezien er maar n record in dit formulier zit met de waarden van
onze constanten, zijn alle opdrachtknoppen niet nodig, behalve
Stoppen. Navigeren door de records is niet nodig. Nieuwe records
toevoegen of verwijderen is niet toegestaan. Het formulier is op
dezelfde wijze gemaakt als het formulier Klant mutaties.
 Maak met de wizard een formulier van de tabel Constant. Sla dit
formulier op onder de naam Constant mutaties.
 Open het formulier in de ontwerpweergave en verander de eigenschappen van het formulier zoals in guur 9.4 is weergegeven.

9 Het bouwen van een toepassing

303

Figuur 9.10

 Verander de labels zodat die beter leesbaar worden en maak de


besturingselementen een beetje korter.
 Plaats de opdrachtknop Stoppen en verander de eigenschap
Tabtoets in Nee.
 Trek de lijn in het formulier.
Tip: Tijdens het werken met een database zul je merken dat de
database erg groot kan worden. Access slaat namelijk achter de
schermen alles op. Ook als je bijvoorbeeld een record, formulier of
rapport verwijdert, blijft dit in de database onzichtbaar aanwezig. Om dit fysiek te verwijderen moet je de database comprimeren: Windows-knop, Beheren, Database comprimeren en herstellen. 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 mutaties

De belangrijkste activiteit van het reisbureau, het boeken van reizen, vindt plaats in het formulier Boeking mutaties (zie guur 9.11).

304

Databaseontwikkeling 4 Access 2007

Figuur 9.11

Dit formulier wijkt iets af van de voorgaande formulieren. Er is


onder andere een extra opdrachtknop in het formulier geplaatst,
waarmee we van de boeking een factuur kunnen afdrukken. De
factuur is een rapport en zal later toegelicht worden. Verder is het
mogelijk om bij een nieuwe boeking, via de keuzelijst van de klant,
de klantgegevens te muteren of een nieuwe klant toe te voegen. Het
is namelijk niet handig als je aan het boeken bent en tot de conclusie komt dat de klant nog niet in het klantenbestand zit. Je zou
dan de boeking moeten afbreken, de klant in het formulier Klant
mutaties invoeren en dan weer opnieuw de boeking invoeren. In
het formulier Reis mutaties is zoiets ook toegepast in de keuzelijst
van Bestemmingcode. Bij een onbekende bestemming is dan snel
de nieuwe bestemming in te voeren.
Het ontwerp van het boekingformulier is in overleg met reisbureau
t Zonnetje totstandgekomen. We moeten dus eerst bepalen wat
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

9 Het bouwen van een toepassing

305

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 mutaties. Aan de naam van de query kunnen
we zien bij welk formulier deze gebruikt wordt. De stappen om
het formulier te maken worden nu toegelicht. Gebruik de database
Basis Zonnetje om de handelingen na te spelen.
 Selecteer in het lint Maken, groep Overige, Queryontwerp.
 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 uit de tabel Klant de velden
Naam, Adres, Postcode, 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, Land
en Werelddeel.
 Sorteer de query op aopend boekingnummer, zodat bij het openen van het formulier altijd de laatst ingevoerde boeking als eerste
wordt getoond.
 Sla vervolgens de query op onder de naam frmBoeking mutaties.
Hierdoor kunnen we later 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 maken.
 Start via het lint Maken, Meer Formulieren, Wizard Formulier.
 Kies in de keuzelijst de zojuist gemaakt query frmBoeking mutaties en kies vervolgens alle velden uit die query.
 Kies in het volgende venster voor Volgens boeking.
 Kies dan voor In kolomvorm en daarna voor de stijl Gieterij.
 Kies in het laatste venster voor de titel Boeking mutaties.
Voordat we het formulier naar onze wensen gaan inrichten, gaan
we eerst een (bekend) foutje in Access herstellen. Wij hebben wel
een query gemaakt met de aopende volgorde van boekingnummers, maar dat wordt niet getoond. De boekingnummers worden
oplopend weergegeven. Dat komt omdat Access onze query heeft
vervangen door de onderliggende SQL-opdracht. Echter zonder
volgorde. We kunnen dit eenvoudig herstellen.

306

Databaseontwikkeling 4 Access 2007

 Plaats het formulier in de ontwerpweergave en toon het eigenschappenvenster van het formulier.
 Selecteer in het tabblad Gegevens, bij de eigenschap Recordbron,
de zojuist gemaakte query frmKlant mutaties.
We starten om de lay-out te wijzigen aan de wensen van de klant.
 Zet het formulier in de ontwerpweergave.
 Sleep de besturingselementen naar hun gewenste plaatst en zorg
dat alle labels volledig leesbaar zijn, zie guur 9.11.
Het besturingselement Betaalwijze toont in de formulierweergave
de getallen 1, 2 of 3, die staan voor Contant, Pinnen en Acceptgiro.
Het moet vervangen worden door een groepsvak, zie ook paragraaf
6.1.
 Verwijder in de ontwerpweergave het besturingselement
Betaalwijze.
 Selecteer het groepsvak in het lint Ontwerpen, groep
Besturingselementen en plaats deze onder het besturingselement
Annuleringsverzekering.
 Doorloop de wizard, zie eventueel paragraaf 6.1. Zorg dat Pinnen
de standaard optie wordt, dat de waarde wordt opgeslagen in het
veld Betaalwijze en kies als bijschrift Betaalwijze.
De opmaak van het formulier wordt aangepast en we plaatsen de
opdrachtknoppen.
 Verander de eigenschappen van het formulier, zoals weergegeven
in guur 9.4.
 Plaats de standaard opdrachtknoppen en de lijn zoals die ook zijn
toegepast in bijvoorbeeld formulier Klant mutaties. Kopiren en
plakken is hiervoor de snelste optie.
De opdrachtknop die een factuur van de boeking toont is een bijzondere opdrachtknop. Die opdrachtknop is niet met de wizard
gemaakt, want de beschikbare opties van de wizard voldoen niet.
De actie van de opdrachtknop maken we zelf met een macro.
Bovendien is deze opdrachtknop pas op het formulier geplaatst,
nadat het rapport van de boeking (factuur) is gemaakt. De knop
opent immers het rapport. Het maken van dat rapport wordt in paragraaf 9.4.1 toegelicht.

9 Het bouwen van een toepassing

307

Om die opdrachtknop op het formulier te plaatsen voeren we de


volgende acties uit.
 Plaats het formulier in de ontwerpweergave.
 Selecteer in het lint Ontwerpen, groep Besturingselementen, Knop
en verplaats de muiswijzer naar de plaats waar de opdrachtknop
moet komen. De wizard wordt gestart.
 Omdat geen enkele standaard opdrachtknop voldoet, kunnen we de
wizard niet gebruiken. Klik op Annuleren.
 Plaats het eigenschappenvenster van de zojuist gemaakte opdrachtknop op het scherm. Verander in het tabblad Overige, de eigenschappen 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.12.
Selecteer hieruit Printer en klik op de knop OK.
 De opdrachtknop mag geen tabstop hebben, tabblad Overige.
Figuur 9.12

 Zorg volgens dat de opdrachtknop dezelfde afmeting krijgt als de


overige knoppen en op de juiste plaats wordt gezet. Gebruik hiervoor het lint Schikken, zoals dat eerder in dit hoofdstuk is besproken.
Als we nu op de opdrachtknop klikken, gebeurt er helemaal niets.
Er wordt geen actie uitgevoerd. Die actie gaan we door middel van
een macro zelf maken. De standaardacties van de wizard voldoen
niet. Als we bijvoorbeeld hadden gekozen voor afdrukken rapport,
dan worden alle rapporten afgedrukt en niet alleen het rapport
(factuur) van de actieve boeking die op het scherm staat. We moeten dus een voorwaarde in kunnen voeren en dat kan niet via de
wizard. Meer informatie over macros kun je lezen in hoofdstuk 8.

308

Databaseontwikkeling 4 Access 2007

 Plaats het eigenschappenvenster van de opdrachtknop en selecteer


het tabblad Gebeurtenis.
 Klik in de eigenschap Bij klikken op de knop met de drie puntjes.
Er volgt dan een nieuw venster.
 Kies in het venster voor Opbouwfunctie voor macros. Het macrovenster wordt actief.
 Kies in het macrovenster voor de actie RapportOpenen, zie guur
9.13 derde actie.
 Selecteer in het argument Rapportnaam het rapport Boeking. Dat
rapport moet dus al gemaakt zijn. Kies bij argument Beeld voor de
optie Afdrukvoorbeeld. In het afdrukvoorbeeld kun je eventueel het
rapport naar de printer sturen.
 Bij het argument WHERE-voorwaarde kunnen we een voorwaarde
opgeven. We willen alleen een rapport van de openstaande boeking. Voer de volgende voorwaarde in [Boekingnummer]=[Forms]
![Boeking mutaties]![Boekingnummer].
Figuur 9.13

Het boekingnummer uit het rapport moet gelijk zijn aan het boekingnummer van het formulier. De voorwaarde kan eenvoudig
gemaakt worden door op de knop met de drie puntjes te klikken
van het argument. Voer in het venster Opbouwfunctie voor expressies eerst handmatig [Boekingnummer]= in en selecteer dan uit het
geladen formulier ook Boekingnummer. Meer informatie over het
venster Opbouwfunctie in paragraaf 8.3 (guur 8.9).

9 Het bouwen van een toepassing

309

Zoals te zien is in guur 9.13, zijn er twee extra macroacties toegevoegd. Als een nieuw gemaakte boeking direct wordt afgedrukt,
treedt zonder deze extra macroacties 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 met een trucje voorkomen.
We verplaatsen tijdelijk de recordwijzer naar het volgende record.
De zojuist toegevoegde gegevens worden nu opgeslagen in de database. Vervolgens herstellen we de oorspronkelijke recordwijzer
door naar het vorige record te gaan. Hiervoor moeten twee extra
macroacties toegevoegd 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.
 Voeg de twee hulpacties toe.
 Klik op de knop Sluiten om het macrovenster af te sluiten. Let op!
Kies niet voor Opslaan als, anders krijgen we geen ingesloten macro.
Verder willen we alleen velden in kunnen voeren die nodig zijn
voor een boeking. De andere velden worden vergrendeld, zodat
bijvoorbeeld niet per ongeluk een wijziging kan worden gemaakt
in de vertrekdatum of land.
 Selecteer in de ontwerpweergave met Shift-Klik de velden Naam,
Adres, Postcode, Plaats, Telefoonnummer, Vertrekdatum, Aantal
dagen, Prijs per volwassenen, Plaats, Land en Werelddeel. Plaats
het eigenschappenvenster en verander de eigenschap Vergrendeld,
tabblad Gegevens, in Ja.
 Diezelfde velden hebben ook geen tabstop nodig, eigenschap
Tabstop, tabblad Overige.
 Door het verplaatsen van de velden hebben we geen logische tabvolgorde meer. Klik in het lint Schikken, groep Indeling bepalen,
op de knop Tabvolgorde. Er verschijnt een venster waarin we de
tabvolgorde kunnen bepalen, zie guur 9.14.
 Sleep de velden tot en met Kader43 (groepsvak; het nummer kan
anders zijn), naar hun plaats zoals in guur 9.14. De velden daaronder hebben geen tabstop, dus die volgorde maakt niet uit.

310

Databaseontwikkeling 4 Access 2007

Figuur 9.14

Als laatste moet het mogelijk zijn om bij een nieuwe boeking, via
de keuzelijst van de klant, de klantgegevens te muteren of een
nieuwe klant toe te voegen.
 Selecteer in de ontwerpweergave het besturingselement
Klantnummer (niet het label Klantnummer).
 Verander de eigenschap Bewerkingsformulier lijstitems in Klant
mutaties.
Als je nu de keuzelijst opent, verschijnt onderaan een doorschijnende knop. Als je daarop klikt, verschijnt het formulier Klant mutaties. Hierin kun je de klant opzoeken en muteren of een nieuwe
klant invoeren. Na het verlaten van het formulier wordt helaas niet
de geselecteerde klant direct voorgezet, maar met de keuzelijst kan
snel de juiste klant worden gezocht. Het mutatieformulier van de
klanten kan ook direct geselecteerd worden door het besturingselement Klantnummer met de rechtermuisklik te selecteren. Kies
in dit snelmenu Lijstitems bewerken.
Opmerking formulier Boeking mutaties
Als je constanten wilt toepassen uit de tabel Constant, bijvoorbeeld
om Prijs per kind te tonen, ga dan als volgt te werk.
Maak een macro die het formulier Constant mutaties onzichtbaar opent. Die macro activeer je in de eigenschap Bij openen
van het formulier Boeking mutaties. We hebben niet de tabel
Constant geopend, maar het formulier omdat we bij het argument
Venstermodus de waarde Verborgen kunnen opgeven. Plaats

9 Het bouwen van een toepassing

311

vervolgens in de ontwerpweergave van het formulier Boeking


mutaties een tekstvak, waarin je de prijs per kind wilt tonen.
Het tekstvak selecteer je uit de groep Besturingselementen. 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 van het tekstvak en zet de formule =[Prijs per
persoon]*[Forms]![Constant mutaties]![KinderKoringPerc] in de
eigenschap Besturingselementbron. Deze formule kun je maken
met de Opbouwfunctie.
Controleer in de indelingsweergave of formulierweergave of het
rekenveld goed werkt. Krijg je een foutmelding zoals #Naam? of
#Fout, dan moet je eerst het formulier Constant mutaties openen.
De macro sluiten van het formulier moet nu aangepast worden.
Niet alleen het actieve formulier moet gesloten worden, maar ook
het verborgen formulier Constant mutaties. Daarvoor moet je de
macro van de knop Stoppen met n actie uitbreiden. In paragraaf
9.4.4, Rapport Omzetlijst, wordt deze methode toegepast.
9.3.6

Formulier Vertreklijst

Dit formulier wordt voor de volledigheid hier toegelicht, zie guur


9.15.
Figuur 9.15

312

Databaseontwikkeling 4 Access 2007

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 ingevoerde bereik wordt afgedrukt. Zon voorwaarde hebben we eerder
gemaakt met een exibele query, maar de voorwaarde opvragen
in een formulier toont veel professioneler. In paragraaf 8.2 is een
soortgelijk voorbeeld uitgewerkt met een keuzelijst.
 Selecteer in het lint Maken, Formulierontwerp.
 Verander van het formulier de bekende eigenschappen, zie guur
9.4.
 Plaats via het lint Ontwerpen, groep Besturingselementen, twee
tekstvelden in het formulier.
 Verander de labelnamen in Begindatum: en Einddatum:.
 Verander van de tekstvelden de eigenschappen zoals getoond in
guur 9.16.
Figuur 9.16

Tekstvak
Begindatum

Einddatum

Eigenschap
Naam
Notatie
Standaardwaarde
Naam
Notatie
Standaardwaarde

Instelling
Begindatum
Korte datumnotatie
Date()+1
Einddatum
Korte datumnotatie
Date()+8

 Om het formulier dezelfde uitstraling te geven als de overige formulieren, moet een formulierkop- en voettekst gemaakt worden,
via de rechtermuisknop.
 De formuliervoettekst is niet nodig, dus kan dicht gesleept worden.
 Daarna in de formulierkoptekst, via de groep Besturingselementen,
een titel plaatsen door op de knop Titel te klikken. Wijzig de titel
in Vertreklijst.
 Selecteer voor de twee secties van het formulier, per sectie, via het
lint Schikken, groep AutoOpmaak, Wizard AutoOpmaak. Kies de
opmaak Gieterij en klik op OK.
 Sleep de besturingselementen naar hun gewenste plaats, zie guur
9.17.

9 Het bouwen van een toepassing

313

Figuur 9.17

Als laatste moeten de twee opdrachtenknoppen geplaatst worden.


Een opdrachtknop om het overzicht af te drukken en een om het
formulier te sluiten (stoppen). De eerste opdrachtknop kan niet
met de wizard gemaakt worden.
 Kopieer en plak in de ontwerpweergave de opdrachtknop Stoppen
en de lijn uit een van de voorgaande formulieren, bijvoorbeeld
Klant mutaties. Sleep ze naar de gewenste plaats.
 Plaats een tweede opdrachtknop op het formulier via de groep
Besturingselementen.
 De wizard van de opdrachtknop wordt gestart. Kik op de knop
Annuleren. We moeten immers zelf de macro maken.
 Plaats het eigenschappenvenster van de zojuist gemaakte opdrachtknop. Verander in het tabblad Overige, de eigenschappen Naam in
Drukaf, KnopInfo in Vertreklijst tonen en Tabstop in Nee.
 Selecteer het tabblad Opmaak en klik in de eigenschap Afbeelding
op de knop met drie puntjes. Selecteer uit de mogelijke guren
Printer en klik op de knop OK.
 Zorg vervolgens dat de opdrachtknop dezelfde afmeting krijgt als
de knop Stoppen en op de juiste plaats wordt gezet. Gebruik hiervoor het lint Schikken.
Het klikken op de afdrukknop levert nog niets op. De macro moet
nog gemaakt worden.
 Plaats het eigenschappenvenster van de opdrachtknop en selecteer
het tabblad Gebeurtenis.

314

Databaseontwikkeling 4 Access 2007

 Klik in de eigenschap Bij klikken op de knop met de drie puntjes.


Er volgt dan een nieuw venster.
 Kies in het venster voor Opbouwfunctie voor macros. Het macrovenster wordt actief.
Voordat het rapport wordt getoond gaan we in de macro eerst controleren of een correcte datumbereik is ingevoerd. Zo niet, dan
wordt het afdrukken geannuleerd, volgt hiervan een boodschap op
het scherm en wordt de cursor in de begindatum geplaatst.
 Omdat we een voorwaarde hebben in onze macro, moet een extra
kolom in het macrovenster getoond worden. Klik in het macrovenster, groep Weergaven/verbergen, op de knop Voorwaarden.
 Voer de acties in zoals getoond in guur 9.18. Argumenten die niet
wijzigen worden niet getoond.
 Klik op de knop Sluiten om het macrovenster af te sluiten. Let op!
Kies niet voor Opslaan als, anders krijgen we geen ingesloten macro.
 Sla vervolgens het formulier op onder de naam Vertreklijst.
Figuur 9.18
Voorwaarde
[Begindatum]
<=
[Einddatum]

Actie
RapportOpenen

Argument
Rapportnaam

Instelling
Vertreklijst

Beeld
WHEREvoorwaarde

Afdrukvoorbeeld
[Vertrekdatum] Between
[Forms]![Vertreklijst]!
[Begindatum] And
[Forms]![Vertreklijst]!
[Einddatum]
Standaard

Venstermodus

MacroStoppen
Berichtvenster

Bericht

NaarBesturingselementGaan

Pieptoon
Type
Titel
Besturingselementnaam

Er is een ongeldig
datumbereik ingevoerd!
Ja
Waarschuwing!
Bericht
Begindatum

De eerste actie controleert of een juist datumbereik is ingevoerd.


Als aan de voorwaarde is voldaan (begindatum kleiner of gelijk
aan einddatum) wordt het rapport geopend als afdrukvoorbeeld.

9 Het bouwen van een toepassing

315

Hierin kan het eventueel afgedrukt worden op de printer. De


vertrekdatum uit het rapport moet tussen het datumbereik in ons
formulier liggen, zie argument WHERE-voorwaarde. De tweede
actie van de macro is het stoppen van de macro. Die tweede actie
mag ook alleen uitgevoerd worden als aan de voorwaarde van het
datumbereik is voldaan. Door het plaatsen van de drie puntjes in
de voorwaarde is dat gerealiseerd. We hadden ook de voorwaarde
kunnen herhalen, maar de drie puntjes is daar een afkorting voor.
Als niet aan de voorwaarde is voldaan, worden de eerste twee acties uit de macro niet uitgevoerd en wordt als eerste de derde actie,
Berichtvenster, gestart. Er wordt een boodschap op het scherm
getoond. Als laatste wordt de cursor teruggeplaatst in de begindatum. De volledige macro staat afgebeeld in guur 9.19.
Figuur 9.19

Het formulier is klaar, maar kan nog niet getest worden omdat het
rapport Vertreklijst nog niet bestaat. Dat gaan we in paragraaf 9.4.3
maken.
Opmerking formulier Vertreklijst
Het controleren van een juist datumbereik kan ook met de eigenschappen Validatieregel en Validatietekst van de tekstvelden.
Bij begindatum moet de validatieregel <=[Einddatum] geplaatst
worden en bij validatietekst Onjuiste datum!. Bij het tekstveld
Einddatum kan dan >=[Begindatum] worden geplaatst. Het na-

316

Databaseontwikkeling 4 Access 2007

deel van deze methode is dat het direct wordt gecontroleerd. Als je
dus een ander datumbereik wilt invoeren en de begindatum is dan
groter dan de einddatum, krijg je al een foutmelding voordat je de
einddatum kan wijzigen. Je moet dan eerst een andere einddatum
invoeren en daarna een begindatum.

9.4

De rapporten

In deze paragraaf gaan we de rapporten toelichten die bij de toepassing 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 opgeroepen vanuit het formulier Boeking mutaties. Klikken we in het
formulier Boeking mutaties op de opdrachtknop met het printericoontje, dan wordt de macro gestart. Die macro is besproken in
de paragraaf van het formulier Boeking mutaties. 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.
9.4.1

Rapport Boeking

Met dit rapport tonen we het boekingsformulier in factuurvorm,


zie guur 9.20.
Een soortgelijk rapport is gemaakt in paragraaf 7.4. Het rapport
wordt daarom kort besproken. Verdere informatie staat in de genoemde paragraaf.
 Maak via het lint Maken, groep Overige, een query in de ontwerpweergave.
 De query bevat velden uit de database en de procesgegevens via
rekenvelden. Bij die procesgegevens hebben we ook de constanten
nodig. Selecteer de tabellen en velden die in guur 9.21 zijn aangegeven.

9 Het bouwen van een toepassing

317

 Sla de query op zonder het queryvenster te verlaten; Opslaan via


de rechtermuisknop op de tab van de query. Kies als naam rptBoeking.
Figuur 9.20

Figuur 9.21

Tabel
Boeking

Veld
Alle velden, behalve Annuleringsverzekering en Betaalwijze

Klant

Naam
Adres
Postcode
Woonplaats
Vertrekdatum
Aantal dagen
Prijs per persoon
Plaats
Land
Werelddeel
AnnuleerPerc

Reis

Bestemming

Constant

318

Databaseontwikkeling 4 Access 2007

Opmerking
Merk op dat de tabel Constant aan geen enkele tabel is gekoppeld,
zie guur 9.22. Hierdoor wordt automatisch aan alle records van
de gerelateerde tabellen, alle records van de tabel Constant gekoppeld. Aangezien de tabel maar n record heeft met twee velden,
worden de twee constanten aan alle records van de gerelateerde
tabellen gekoppeld. Dat is precies wat we nodig hebben. We kunnen dat bij het uitvoeren van de query controleren. Als de tabel
Constant meer dan n rij zou hebben, gaat het volledig fout!
In een query waarin een niet gekoppelde tabel voorkomt, kunnen
geen nieuwe records worden toegevoegd. Je kunt dit controleren in
de gegevensbladweergave van de query; bij de navigatieknoppen
kun je niet een nieuw record selecteren.
Deze constructie kunnen we daarom toepassen bij rapporten (geen
invoer). Bij formulieren waarin we ook records willen toevoegen,
kunnen we dit niet toepassen. Maak dan gebruik van het formulier
Constant mutaties om constanten toe te passen in een formulier of
rapport, zie hiervoor paragraaf 9.4.4 Rapport Omzetlijst, voor een
uitgewerkt voorbeeld.
Figuur 9.22

9 Het bouwen van een toepassing

319

 Maak vervolgens alle rekenvelden in de query, zie guur 9.23.


Gebruik daarbij eventueel de opbouwfunctie via de rechtermuisknop,.
Figuur 9.23

Prijs per kind: [Prijs per persoon]*[KinderKortingPerc]


Totaal volw: [Aantal volwassenen]*[Prijs per persoon]
Totaal kind: [Aantal kinderen]*[Prijs per kind]
Subtotaal: [Totaal volw]+[Totaal kind]
Annuleerkosten: IIf([Annuleringsverzekering];[Subtotaal]*[AnnuleerPerc];0)
Totaal: [Subtotaal]+[Annuleerkosten]
Nog te betalen: [Totaal]-[Betaald bedrag]
Tekst betaalwijze: Choose([Betaalwijze];"Contant";"Pinnen";"Acceptgiro")
Tekst annuleer: IIf([Annuleringsverzekering];Ja;Nee)

 Zorg voor de notatie Euro in de kolommen waarin geldbedragen


staan. Kolom selecteren met de rechtermuisknop en de eigenschap
Notatie op Euro zetten.
De query is klaar, het rapport kan gemaakt worden. Het volledige
rapport staat in guur 9.24.
 Start de Wizard Rapport, kies de zojuist gemaakte query en daarvan alle velden.
 In het volgende venster willen we niet groeperen, druk op de <knop.
 Een sortering is niet noodzakelijk. Hierna kiezen we voor
Kolomvorm.
 Daarna kiezen we de stijl Gieterij en als laatste kiezen we de titel
Boeking.
 Plaats het rapport in de indelingsweergave en sleep vervolgens de
velden naar hun juiste plaats, zie eventueel paragraaf 7.4.
 In de ontwerpweergave kunnen we het rapport verder verjnen,
door het trekken van lijnen.
 Er is een label gemaakt waarin onder andere de adresgegevens
staan. Via Shift-Enter kunnen we het in n label plaatsen. Hierna
is het rechts uitgelijnd.
 De eigenschap Voorgrondkleur van het label is hetzelfde gemaakt
als het titellabel (via kopiren / plakken).

320

Databaseontwikkeling 4 Access 2007

Figuur 9.24

Er is voor dit rapport n macro gemaakt. Die macro controleert


of er kinderen op reis gaan. Als er geen kinderen op de boeking
staan, wordt in het rapport geen informatie over kinderen getoond.
Deze macro geldt voor de sectie Details van het rapport. Selecteer
die sectie en maak de macro in de eigenschap Bij opmaken, zie
guur 9.25.
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.

321

9 Het bouwen van een toepassing

Figuur 9.25
Voorwaarde

Actie

Argument

Instelling

[Aantal kinderen]=0

WaardeInstellen

Item
Expressie

[Aantal kinderen].[Visible]
Nee

WaardeInstellen

Item
Expressie

[Aantal kinderen_Bijschrift].[Visible]
Nee

WaardeInstellen

Item
Expressie

[Prijs per kind].[Visible]


Nee

WaardeInstellen

Item
Expressie

[Prijs per kind_Bijschrift].[Visible]


Nee

WaardeInstellen

Item
Expressie

[Totaal kind].[Visible]
Nee

[Aantal kinderen]<>0

WaardeInstellen

Item
Expressie

[Aantal kinderen].[Visible]
Ja

WaardeInstellen

Item
Expressie

[Aantal kinderen_Bijschrift].[Visible]
Ja

WaardeInstellen

Item
Expressie

[Prijs per kind].[Visible]


Ja

WaardeInstellen

Item
Expressie

[Prijs per kind_Bijschrift].[Visible]


Ja

WaardeInstellen

Item

[Totaal kind].[Visible]

Expressie

Ja

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 drukken. Het is dan niet nodig een heel nieuw rapport te maken.
Opmerkingen rapport Boeking
 De macro had ook gebruik kunnen maken van de actie
EigenschapInstellen. De namen van de besturingselementen, vooral de bijschriften, moeten dan in het rapport worden opgezocht.
 De eigenschap Bij opmaak wordt geactiveerd in de weergave afdrukvoorbeeld, niet in de rapportweergave.
 Na het onzichtbaar maken van de besturingselementen in de macro, hadden we de actie MacroStoppen kunnen toepassen. Dan is
voor het zichtbaar maken van de besturingselementen geen voorwaarde meer nodig.
9.4.2

Rapport Klantenlijst

Nu volgt het eenvoudigste rapport van de toepassing: een alfabetische klantenlijst, zie guur 9.26.

322

Databaseontwikkeling 4 Access 2007

Figuur 9.26

Dit rapport kunnen we met de Wizard Rapport snel maken. We


zullen voor de uniformiteit gebruikmaken van een query.
 Maak een query in de ontwerpweergave waarin alleen de tabel
Klant wordt geselecteerd.
 Selecteer alle velden uit de tabel Klant (het sterretje is voldoende).
 Sla de query op onder de naam rptKlantenlijst.
 Start de Wizard Rapport.
 Selecteer de zojuist gemaakte query rptKlantenlijst en vervolgens
alle velden uit die query.
 In het daaropvolgende venster kunnen we groepeerniveaus aangeven. 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 Gieterij.
 Geef het rapport de titel (naam) Klantenlijst.

9 Het bouwen van een toepassing

323

Niet alle kolomkoppen zijn volledig zichtbaar. Ook de kolomvolgorde willen we veranderen. De kolommen klantnummer en naam
moeten gewisseld worden, zodat een natuurlijke volgorde ontstaat.
 Plaats het rapport in de indelingsweergave, wissel de kolommen en
zorg dat alle kolomkoppen zichtbaar zijn, zie guur 9.26
9.4.3

Rapport Vertreklijst

In hoofdstuk 7 heb je geleerd om dit rapport te maken. We zullen


het hier nog kort toelichten.
Het rapport toont per week per reisnummer de vertrekken klanten,
zie guur 9.27. Op n reisnummer kunnen meerdere klanten vertrekken. Die worden op naam gesorteerd.
Figuur 9.27

324

Databaseontwikkeling 4 Access 2007

Het rapport is gemaakt met de Wizard Rapport. Het afdrukken


van het rapport vindt plaats vanuit het formulier Vertreklijst. In dat
formulier worden een begindatum en een einddatum gevraagd.
Alle reizen binnen die grenzen worden getoond in het rapport
Vertreklijst. Het formulier Vertreklijst is bij de formulieren van de
toepassing al toegelicht, zie guur 9.15. Het rapport Vertreklijst is
als eerste gemaakt en daarna het formulier 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
tabel Klant de velden Naam en Woonplaats. Als laatste nemen we
uit de tabel Boeking de velden Aantal volwassenen en Aantal kinderen.
 Hierna gaan we het nieuwe rapport maken. Start de Wizard
Rapport. 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.
 In het volgende venster kunnen we groepeerniveaus opgeven, zie
guur 9.28.
 Aangezien we per week de vertrekkende klanten willen zien, kiezen we een extra groepering op Vertrekdatum, zie guur 9.28.
 Selecteer via Opties voor groeperen de optie Week, zodat gegroepeerd wordt per week.
Figuur 9.28

325

9 Het bouwen van een toepassing

 In het volgende venster 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 stijl aan het rapport geven, selecteer Gieterij.
 Geef in het laatste venster de titel (naam) Vertreklijst aan het rapport. Het resultaat wordt getoond als afdrukvoorbeeld.
Vertrekdatum per week neemt zoveel ruimte in dat kolommen onvolledig of helemaal niet worden getoond.
 Plaats het rapport in de indelingsweergave en maak de kopteksten
kleiner en daarna de kolommen smaller zodat alle kolommen worden getoond, zie guur 9.27.
 Als je alle kolommen hebt verkleind, valt op dat Aantal kinderen
helemaal niet meer wordt getoond, omdat die niet meer te tonen
was op een staand A4. Het Aantal kinderen is na het schikken weer
toegevoegd via de knop Bestaande velden toevoegen, op het lint
Ontwerpen.
 In de paginavoettekst is als laatste de paginainformatie verkleind,
zodat die binnen de pagina valt.
Er is voor dit rapport n macro gemaakt. Het kan voorkomen dat
een selectie is gemaakt, via het formulier Vertreklijst, waarin geen
enkele reis plaatsvindt. We zouden dan alleen een koptekst krijgen,
zonder regels. Dat kunnen we met een macro voorkomen.
 De macro geldt voor het rapport. Selecteer de eigenschappen van
het rapport en kies in het tabblad Gebeurtenis, de eigenschap Bij
geen gegevens.
 Maak in die eigenschap de macro, zie guur 9.29.
Figuur 9.29

Actie
GebeurtenisAnnuleren
Berichtvenster

Argument

Instelling

Bericht
Pieptoon
Type
Titel

Bereik levert geen gegevens op.


Nee
Informatie
Bericht

De macroactie RapportOpenen wordt geannuleerd en vervolgens


wordt een boodschap getoond.

326

Databaseontwikkeling 4 Access 2007

Opmerking rapport Vertreklijst


In de wizard van het rapport hebben we gegroepeerd per week van
vertrekdatum. Dat kunnen we ook achteraf instellen of wijzigen
in de indelingsweergave of ontwerpweergave, via Groeperen en
sorteren.
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 reisnummer afgedrukt. Ook het percentage dat het reisnummer heeft bijgedragen aan de totale omzet wordt weergegeven, zie guur 9.30.
Figuur 9.30

De omzetlijst is gemaakt met de Wizard Rapport. Hierna zijn enkele kleine cosmetische veranderingen aangebracht. Reizen die
nog niet geboekt zijn hebben geen omzet. Als de tabel Boeking
aan de tabel Reis wordt gekoppeld, worden alleen reizen getoond

9 Het bouwen van een toepassing

327

die geboekt zijn. Om ook de reizen te tonen die nog niet geboekt
zijn, moet de joineigenschap tussen die tabellen aangepast worden.
Bovendien hebben we de tabel Constant nodig voor de omzet.
Omdat we aan de joineigenschap gaan sleutelen, is het niet meer
toegestaan om een niet gekoppelde tabel (Constant) in de query te
plaatsen. Om toch van de constanten gebruik te maken, zorgen we
dat het formulier Constant mutaties onzichtbaar wordt geopend,
als het rapport wordt geopend. We kunnen dan gebruik maken van
de constanten uit het formulier. We gaan dat verder toelichten.
 Maak een query met daarin de tabellen Reis, Bestemming en
Boeking.
 Selecteer uit Reis de velden Reisnummer en Vertrekdatum. Uit de
tabel Bestemming de velden Plaats en Land en als laatste uit de
tabel Boeking het veld Betaald bedrag.
 Dubbelklik op de relatie tussen Reis en Boeking, het joineigenschappenvenster wordt zichtbaar.
 Kies de optie om alle records uit Reis op te nemen. Bij de relatie
wordt nu een pijltje getoond, zie guur 9.31.
Figuur 9.31

Als je de query uitvoert, krijg je bij Betaald bedrag lege velden.


Dat zijn de reizen die nog niet geboekt zijn. Als je nu de tabel
Constant toevoegt, zal de query niet meer uitgevoerd worden. Dat

328

Databaseontwikkeling 4 Access 2007

komt door het veranderen van de joineigenschap. We gaan nu in


de query het rekenveld Omzet plaatsen. Daar hebben we het veld
KinderKortingPerc uit de tabel Constant bij nodig.
 Open nu ook het formulier Constant mutaties in de formulierweergave. Let op, niet de tabel Constant. Het queryvenster blijft zichtbaar en in een ander tabblad staat het formulier Constant mutaties
in formulierweergave. De omzet kan nu berekend worden in de
query, zie guur 9.31.
 Sluit de query, niet het formulier Constant mutaties, en kies als
naam rptOmzetlijst.
Tijdens het ontwerpen van het rapport houden we het formulier
Constant mutaties in de formulierweergave. Als het rapport klaar
is maken we een macro die bovendien automatisch het formulier
Constant mutaties onzichtbaar opent. Als het rapport wordt gesloten, sluiten we bovendien automatisch het formulier Constant
mutaties.
 Start de Wizard Rapport en selecteer alle velden van de zojuist
gemaakte query.
 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.
 In het volgende venster kunnen we een sorteervolgorde opgeven en
opties voor totalen. Aangezien we groeperen op reisnummer, is de
standaard sorteervolgorde op reisnummer. Dat hoeven we niet te
veranderen.
 Hierna kiezen we Met interval en daarna de bekende stijl Gieterij.
 Geef als laatste een titel (naam) aan het rapport: Omzetlijst. De
omzetlijst wordt vervolgens als afdrukvoorbeeld op het scherm
getoond.
In paragraaf 7.2 en 7.3 is toegelicht hoe je verder het rapport kunt
aanpassen. Het eindresultaat staat in guur 9.32.
Er zijn voor dit rapport twee macros gemaakt. En macro opent
automatisch het formulier Constant mutaties en de andere macro
sluit datzelfde formulier weer. Beide macros zijn gemaakt in de
eigenschappen van het rapport.

329

9 Het bouwen van een toepassing

Figuur 9.32

 Selecteer de eigenschappen van het rapport en kies in het tabblad


Gebeurtenis de eigenschap Bij openen.
 Maak in die eigenschap de macro zoals getoond in guur 9.33.
Figuur 9.33

Actie
FormulierOpenen

Argument
Formuliernaam
Beeld
Venstermodus

Instelling
Constant mutaties
Formulier
Verborgen

Hiermee wordt ook het formulier Constant mutaties verborgen


geopend als het rapport wordt geopend.
 Selecteer nu de eigenschap Bij sluiten en maak de macro zoals getoond in guur 9.34.
Figuur 9.34

Actie
Sluiten

Argument
Objecttype
Objectnaam
Opslaan

Instelling
Formulier
Constant mutaties
Nee

330

Databaseontwikkeling 4 Access 2007

Het formulier Constant mutaties wordt ook gesloten als het rapport
wordt gesloten. We kunnen nu het formulier Constant mutaties
sluiten en dan opnieuw het rapport openen. Het rapport moet nu
goed worden weergegeven.
Opmerking rapport Omzetlijst
Bij reizen die niet zijn geboekt, wordt niets getoond. Die waarden
zijn Null. Als we daar de getallen 0 willen zien, kunnen we in de
ontwerpweergave de functie Nz() (Not Zero) toepassen. Die functie heeft twee argumenten. Het eerste is een veld of expressie en
het tweede de waarde die moet worden toegepast als het veld of de
expressie de waarde Null heeft. Nz([Betaal bedrag];0) zal 0 opleveren als het veld Betaald bedrag de waarde Null heeft. We kunnen dit al in de query toepassen of achteraf in de ontwerpweergave
van het rapport. Bijvoorbeeld =Som([Omzet]) moet dan veranderd
worden in =Nz(Som([Omzet]);0). We kunnen ook de functie IIf()
toepassen, maar die wordt veel langer.

9.5

Voltooien van de toepassing

De toepassing is bijna klaar: alle querys, formulieren en rapporten


zijn gemaakt. Nu moeten we alles nog samenvoegen tot een geheel.
We maken een hoofdmenu en twee submenus, zoals toegelicht in
paragraaf 9.2, met schakelborden. Verder kunnen we de toepassing
op een speciale manier laten opstarten. Als laatste zorgen we dat
het lint wordt verwijderd, het is namelijk niet meer nodig.
9.5.1

Schakelborden

Het hoofdmenu en de submenus moeten gemaakt worden. Deze


menus moet je niet verwarren met menus in het lint of de werkbalk voor snelle toegang. Deze menus worden gemaakt met
vensters. Om naamsverwarring te voorkomen worden ze binnen
Access schakelborden genoemd. Het hoofdmenu van de toepassing
wordt door het schakelbord getoond in guur 9.35.
Menus en submenus zijn in Access eenvoudig te maken met schakelborden. In paragraaf 9.2 zijn deze al vastgelegd.

9 Het bouwen van een toepassing

331

Figuur 9.35

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 mutaties. Dit formulier wordt het meest toegepast binnen
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
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 toepassing. Na het selecteren worden de rapporten als afdrukvoorbeeld getoond.

332

Databaseontwikkeling 4 Access 2007




Submenu Overzichten
Klantenlijst
Vertreklijst
Omzetlijst
Sluiten
Na de keuze Onderhoud uit het hoofdmenu komen we in het submenu Onderhoud. Hierin kunnen we een keuze maken uit het
onderhouden van de basisgegevens. Zo kunnen we toevoegen, verwijderen en wijzigingen doorvoeren in de basisgegevens.





Submenu Onderhoud
Klant mutaties
Reis mutaties
Bestemming mutaties
Constant mutaties
Sluiten
Nu we precies weten hoe de verschillende menus eruit moeten zien, gaan we de menus maken met Schakelbordbeheer van
Access.

 Kies in het lint Hulpmiddelen voor databases, groep Hulpmiddelen


voor databases, voor 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
blijken uit de toelichting, enige persoonlijke aanpassingen aanbrengen. Het onderdeel schakelbordbeheer opent het dialoogvenster
Schakelbordbeheer, zie guur 9.36.

9 Het bouwen van een toepassing

333

Figuur 9.36

In dit venster kunnen we menus en schakelbordpaginas opgeven. Standaard wordt al n hoofdmenu aangemaakt, namelijk
Hoofdschakelbord. We gaan twee nieuwe (sub)menus (schakelborden) 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 dialoogvenster kunnen we de items (onderdelen) van het hoofdmenu
opgeven, zie guur 9.37.
Figuur 9.37

Voordat we de menu-items gaan speciceren, veranderen we eerst


de naam van het hoofdschakelbord.

334

Databaseontwikkeling 4 Access 2007

 Verander de naam Hoofdschakelbord in Hoofdmenu. Klik hierna


op de knop Nieuw. Er volgt een venster waarin we het eerste menuitem kunnen invoeren, zie guur 9.38.
Figuur 9.38

 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 geselecteerd. De verschillende mogelijkheden worden in de keuzelijst
getoond. Aangezien het formulier Boeking mutaties moet worden
geopend, selecteren we Formulier openen in bewerkingsmodus.
 Selecteer in de derde keuzelijst het formulier dat geopend moet
worden, Boeking mutaties. Merk op dat het derde vakje afhankelijk
is van het tweede. In dit voorbeeld worden alle formulieren uit de
toepassing 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.
 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.

9 Het bouwen van een toepassing

335

 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 gewijzigd 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
ToonKlantenlijst.
Helaas kan een rapport alleen in de rapportweergave geopend
worden in deze menus. Om toch het rapport in de weergave
Afdrukvoorbeeld te tonen hebben we een algemene macro gemaakt, genaamd ToonKlantenlijst. Kies hiervoor in het lint Maken,
knop Macro. Selecteer de actie RapportOpenen en bij argument
Rapportnaam voor Klantenlijst en bij argument Beeld voor
Afdrukvoorbeeld. Sluit vervolgens de macro en kies als macronaam ToonKlantenlijst.
 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

Vertreklijst

336

Databaseontwikkeling 4 Access 2007

De Vertreklijst wordt afgedrukt nadat eerst een formulier,


Vertreklijst, op het scherm is getoond waarin we een begin- en
einddatum kunnen opgeven.
Argument

Instelling

Tekst

Omzetlijst

Opdracht

Macro uitvoeren

Macro

ToonOmzetlijst

Ook dit rapport willen we in afdrukvoorbeeld tonen, hiervoor is


ook een algemene macro gemaakt, genaamd ToonOmzetlijst.
Argument

Instelling

Tekst

Sluiten

Opdracht

Naar Schakelbord gaan

Schakelbord

Hoofdmenu

Kiezen we deze optie in het menu, dan gaan we n niveau


terug, naar het hoofdmenu. De menu-items voor het submenu 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 dezelfde 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 gedenieerd worden. We doen dit op dezelfde wijze als bij het submenu
Overzichten. Hieronder volgen de gegevens die ingevoerd moeten
worden.
Argument

Instelling

Tekst

Klant mutaties

Opdracht

Formulier openen in bewerkingsmodus

Formulier

Klant mutaties

9 Het bouwen van een toepassing

337

Het formulier Klant mutatie wordt geactiveerd onder dit item:


Argument

Instelling

Tekst

Reis mutaties

Opdracht

Formulier openen in bewerkingsmodus

Formulier

Reis mutaties

Het formulier Reis mutaties wordt geopend onder dit item:


Argument

Instelling

Tekst

Bestemming mutaties

Opdracht

Formulier openen in bewerkingsmodus

Formulier

Bestemming mutaties

Het formulier Bestemming mutaties wordt geactiveerd onder dit


item:
Argument

Instelling

Tekst

Constant mutaties

Opdracht

Formulier openen in bewerkingsmodus

Formulier

Constant mutaties

Het formulier Constant mutaties wordt geopend onder dit item.


Argument

Instelling

Tekst

Sluiten

Opdracht

Naar Schakelbord gaan

Schakelbord

Hoofdmenu

Wordt deze optie uit het menu gekozen, dan gaan we n


niveau terug, naar het hoofdmenu. De menu-items voor submenu 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.
 Open het formulier Schakelbord en controleer de werking van de
gemaakte menus.

338

Databaseontwikkeling 4 Access 2007

Het formulier Schakelbord wordt in een afwijkende kleur getoond


ten opzichte van onze overige formulieren. We gaan het formulier
Schakelbord op een aantal punten aanpassen, zodat het overeenstemt met onze overige formulieren.
 Plaats het formulier Schakelbord in de ontwerpweergave op het
scherm.
 Open het eigenschappenvenster van het formulier (F4).
We gaan eerst onze standaard stijl plaatsen.
 Selecteer de sectie Formulierkoptekst en kies in het lint Schikken
voor AutoOpmaak, Wizard AutoOpmaak, stijl Gieterij.
 Herhaal dit voor de twee andere secties in het formulier.
De tekst in de koptekst is met schaduw afgebeeld. Dit is gerealiseerd door twee labels vlak onder elkaar te plaatsen. We kunnen
niet een van de labels verwijderen, anders volgt er een foutmelding.
 Zet de labels precies boven elkaar, via het lint Schikken.
 Selecteer via het eigenschappenvenster de HorizontalHeaderBox,
en verwijder die rechthoek.
 Selecteer op dezelfde manier de VerticalShadowBox en verwijder
die ook.
 Selecteer in het eigenschappenvenster Picture. Die staat links naast
de opdrachtknop. Die is te klein voor een afbeelding, dus plaatsen
we er dezelfde achtergrondkleur als de koptekst.
 Kopieer de achtergrondkleur van de formulierkoptekst, via de
eigenschap Achtergrondkleur en plak die kleurcode in dezelfde
eigenschap van het besturingselement Picture.
 Verander tevens van het Picture de eigenschap Randstijl in
Transparant.
Opmerking Schakelbord
Het schakelbord is in Access 2007 nauwelijks verbeterd ten opzichte van vorige versies van Access. Hier ligt voor Microsoft nog
een verbeterpunt. Je kunt natuurlijk zelf formulieren maken die het
schakelbord vervangen.

9 Het bouwen van een toepassing

9.5.2

339

Opstarten

We willen het formulier Schakelbord meteen starten zodra de database wordt geopend. Dat kan gerealiseerd worden met een algemene macro AutoExec. Die macro wordt als eerste gestart zodra de
database wordt geopend. Er is echter een betere methode, waarin
we direct allerlei instellingen kunnen veranderen.
 Selecteer de Ofce-knop, kies onderaan het venster voor Opties
voor Access .
 Selecteer vervolgens Huidige database, zie guur 9.39.
Figuur 9.39

In dit venster kunnen we voor de huidige database onder andere


een titel aan de database geven, een start formulier aangeven of het

340

Databaseontwikkeling 4 Access 2007

navigatiegedeelte niet tonen. Zie bijlage B (Categorie Huidige database) voor verdere informatie.
 Verander de instellingen zoals weergegeven in guur 9.39. Bij
Toepassingspictogram hebben we het pictogram t Zonnetje.ico geselecteerd dat bij de database is geleverd (zie de downloadbestanden op de pagina bij dit boek op www.academicservice.nl). Na het
verlaten van het scherm wordt gevraagd om de database te sluiten
en opnieuw te openen.
Let op!
Iedere keer als je hierna de database opstart kom je direct in het
hoofdmenu. Je komt niet meer in het bekende databasevenster van
Access. Om de toepassing te starten zonder de opgegeven instellingen, start je de database met Shift-toets ingedrukt! Als je de
beveiligingsoptie wilt uitschakelen moet je ook de Shift-toets ingedrukt houden. Als je hierna een venster opent, moet je die sluiten
met Ctrl-W. Aangezien we in dit voorbeeld de tabbladen achterwege hebben gelaten, kun je anders het venster niet meer afsluiten.
Zie guur 9.39, optie Document tabbladen weergeven.
9.5.3

Lint verwijderen

Het lint Start blijft altijd zichtbaar. Als je dubbelklikt op het lint
wordt het geminimaliseerd. Dubbelklikt je opnieuw, dan wordt het
lint het weer getoond. Maar wat als je het lint helemaal weg wilt
hebben bij deze toepassing? Dat is niet zo gemakkelijk, maar wel
mogelijk.
 Open de toepassing met de Shift-toets ingedrukt.
 Selecteer het navigatiegedeelte met de rechtermuisknop. Kies
Navigatieopties en plaats een vinkje bij Systeem objecten weergeven. Systeemtabellen worden nu zichtbaar gemaakt.
 Maak vervolgens een tabel met drie velden, waarin Id het sleutelitem is, zie guur 9.40.
Figuur 9.40

Veldnaam
Id
RibbonName
RibbonXML

Type
Autonummering
Tekst
Memo

Veldlengte
255

9 Het bouwen van een toepassing

341

 Sla de tabel op als USysRibbons. Hierdoor wordt het een systeemtabel die standaard verborgen is.
 Maak twee records aan, zie guur 9.41.
Figuur 9.41

Veldnaam
Blank met werkbalk

Blank

Waarde
<customUI
xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="true">
<qat>
<sharedControls>
<button idMso="FileSave"/>
<control idMso="Undo"/>
<control idMso="Redo"/>
</sharedControls>
</qat>
</ribbon>
</customUI>
<customUI
xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="true"/>
</customUI>

Het is niet nodig dat je weet wat deze teksten betekenen. Het is
xml-code die twee linten heeft gemaakt. Blank met werkbalk
toont geen linten, maar wel de standaard werkbalk. Blank toont
geen linten en ook geen werkbalk. Die twee linten zijn gemaakt
in database t Zonnetje. Je kunt ze in andere database gebruiken
door de gemaakte systeemtabel te kopiren. Zorg dat na kopiren
de systeembestanden weer onzichtbaar worden. In het venster van
guur 9.39 kun je bij Naam lint een van deze linten selecteren of
verwijderen, zodat het standaard lint weer wordt getoond. Een nadeel van het verwijderen van de linten is dat je rapporten als afdrukvoorbeeld ziet, zonder een lint. Je kunt het rapport dan alleen
sluiten met Ctrl-W. Als je het rapport naar de printer wilt sturen
moet je de toetscombinatie Ctrl-P gebruiken. Om die reden is in
database t Zonnetje het lint niet verwijderd.
Hiermee is de toepassing voltooid en kunt je aan de slag. Nu volgen nog enige opmerkingen over het operationeel maken van de
toepassing.

342

Databaseontwikkeling 4 Access 2007

Opmerkingen
 Iedereen die weet dat de database te benaderen is met de Shifttoets ingedrukt, kan eenvoudig (ongewenste) veranderingen aanbrengen.
 We kunnen een compacte versie van de database maken. Selecteer
in het lint Hulpmiddelen voor databases, groep Hulpmiddelen voor
databases de optie ACCDE maken. Het hulpprogramma vraagt
om een naam een locatie voor het opslaan van de compacte versie.
Er wordt een versie gemaakt met de extensie .accde. Deze versie
compileert de VBA-code, indien aanwezig, en comprimeert de
database. Om wijzigingen door te voeren te voeren, moeten we de
oorspronkelijke database gebruiken.
 We kunnen de database distribueren over computers die niet
over Access 2007 beschikken. Er is door microsoft een gratis
Runtime van Access 2007 te downloaden; zoek op internet naar
Microsoft Ofce Access 2007 Runtime. Hiermee kan de toepassing uitgevoerd worden zonder Access 2007. Hiervoor moeten we
de extensie van de database wel veranderen van .accdb naar .accdr. Bovendien kunnen we ook een Microsoft Ofce Access 2007
Developer Extensions downloaden. Dat is een hulpprogramma
waarmee een .msi-bestand gemaakt kan worden. Via dat bestand
kunnen gebruikers zelfstandig de database installeren

10

SQL, Structured Query


Language

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 databasemanagementsystemen (DBMSen) zijn Oracle, MySQL, SQLserver en DB2.
Een kenmerk van deze pakketten is dat ze geschikt zijn voor het
bedienen 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 informatie kunnen opvragen uit vele databasesystemen.
In dit hoofdstuk zullen we ons beperken tot het formuleren van
querys. Het toevoegen van gegevens aan de database of het wijzigen 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,

344

Databaseontwikkeling 4 Access 2007

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 applicaties ontwikkeld worden. Het is echter ondoenlijk om voor iedere
informatiebehoefte, zeker voor die welke slechts sporadisch optreden, een applicatie op te zetten. Dat kost te veel tijd en geld.
Binnen Access kunnen we voor het opvragen van informatie altijd
gebruikmaken van querys, 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. Enerzijds kunnen we met SQL terecht bij ieder modern DBMS, waaronder Oracle of DB2. Anderzijds zijn er enkele soorten opvragingen 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. Een tabel bestaat uit een aantal rijen
en kolommen.
kolommen

Tabel ARTIKEL
Rijen

Artikelnummer

Omschrijving

Verkoopprijs

Voorraad

Leveranciercode

64447
75558
84494
46644
enzovoort

V-snaar
Accu
Stuurhoes
Binnenspiegel

56,00
225,00
23,95
37,50

5
2
4
1

J3633
K3773
P4774
J3633

Om iedere rij uniek te kunnen identiceren is er een gegeven, of


een combinatie van gegevens die iedere rij uniek maken, de primaire sleutel. In de tabel Artikel is dat het artikelnummer. In een

10 SQL, Structured Query Language

345

rij kunnen gegevens voorkomen die verwijzen naar de 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 items 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 databases. 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 tweede database betreft een database van een groothandel in
alcoholische dranken. Deze is bij de downloadbestanden aanwezig
onder de naam Alco en zal worden gebruikt om je vaardigheden
in de praktijk te toetsen. De praktijkgerichte opdrachten moeten
worden uitgewerkt met behulp van deze database. Bij de downloadbestanden kun je de uitwerkingen van de theorieopgaven vinden in een Word-bestand. Van de praktijkopdrachten is de uitvoer
opgenomen, dus niet de query zelf. Je kunt aan de hand van de
uitvoer controleren of je query waarschijnlijk goed is. Bovendien is
de uitgewerkte database van de praktijkopdracht beschikbaar bij de
downloadbestanden.

346

Databaseontwikkeling 4 Access 2007

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
Lezernr
Naam
Adres
Postcode
Plaats
Telefoon
Geboortedatum
* Filiaalnr
FILIAAL
Filiaalnr
FilAdres
FilPostcode
FilPlaats
FilTelefoon

UITGAVE
ISBN
Titel
Schrijver
Uitgeverij
Prijs

UITLENING
* Lezernr
* Exemplaarnr
* Huurdatum
* Retourdatum (datum waarop
* boek is teruggebracht)

EXEMPLAAR
Exemplaarnr
* Filiaalnr
* ISBN

RESERVERING
* Lezernr
* ISBN
* Datum

De primaire sleutels zijn onderstreept. Vreemde sleutels zijn voorzien van een sterretje.
Het bijbehorende ER-diagram is weergegeven in guur 10.1.
Figuur 10.1

o.b.v. ISBN
Reservering

o.b.v. ISBN

Uitgave

o.b.v. lezernr

Filiaal

Lezer

o.b.v. filiaalnr

Exemplaar

o.b.v. filiaalnr

o.b.v. lezernr
Uitlening

o.b.v. exemplaarnr

347

10 SQL, Structured Query Language

10.5

Database Alco (praktijkopdrachten)

Een groothandel in alcoholische dranken maakt onder meer


gebruik van de onderstaande tabellen.
ARTIKEL
Artikelcode
* Soortnr
Jaar
Inhoud
Adviesverkoopprijs
Opvoorraad

SOORT
Soortnr
* Productgroepnr
Naam
Kleur
Alcoholpercentage

PRODUCTGROEP
Productgroepnr
Productnaam

FACTUUR
Factuurnummer
* Afnemernummer
Factuurdatum

FACTUURREGEL
* Factuurnummer
* Artikelcode
Verkoopaantal
Verkoopprijs

AFNEMER
Afnemernummer
Naam
Adres
Postcode
Plaats
Regio

De primaire sleutels zijn onderstreept. Vreemde sleutels zijn voorzien van een sterretje.
Het bijbehorende ER-diagram is weergegeven in guur 10.2.
Figuur 10.2

factuurregel

factuur

o.b.v. factuurnr

afnemer
o.b.v. afnemernr

o.b.v. artikelcode
Artikel

Soort
o.b.v. soortnr

10.6

Productgroep

o.b.v. productgroepnr

Opvragingen uit n tabel

De volgende voorbeelden hebben betrekking op de bibliotheekdatabase. Om gegevens uit tabellen op te vragen moeten we
gebruikmaken van het SELECT-commando, dat de volgende
opbouw bezit:

348

Databaseontwikkeling 4 Access 2007

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 toegestaan, 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.
voorbeelden

De namen van alle lezers uit Rotterdam:


SELECT
FROM
WHERE

naam
lezer
plaats = Rotterdam ; (let op de aanhalingstekens)

Uitvoer :
NAAM
Jansen
Pietersen
Gerritsen
enzovoort
De titels en prijzen van alle boeken van Hermans:
SELECT
FROM
WHERE

titel, prijs
uitgave
schrijver = Hermans ;

Uitvoer :
TITEL
Onder professoren
Donkere kamer van Damocles
enzovoort.

PRIJS
34,95
29,95

10 SQL, Structured Query Language

349

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
FROM
WHERE

ladres, ltelefoon
liaal
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.
voorbeeld

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
FROM
WHERE
OR

titel
uitgave
(schrijver = Wolkers
AND prijs < 25
)
(schrijver = Campert
AND uitgeverij = de brede letter) ;

350

Databaseontwikkeling 4 Access 2007

Bij het opgeven van voorwaarden, moeten we teksten omgeven


door aanhalingstekens; getallen kunnen we direct opnemen.
Als we in een voorwaarde een datumaanduiding willen gebruiken, 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 eeuwaanduiding 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
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 aangegeven
door de eerste drie letters. De datum 3 mei 1981 wordt dan
#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 respectievelijk _ en % gebruikt.

In de voorwaarden kunnen we gebruikmaken van:


1. = , > , < , <= , >= en <>
WHERE prijs >= 49
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.

10 SQL, Structured Query Language

voorbeelden

351

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 uitvoertabel.
WHERE Retourdatum - Huurdatum > 7
Wie heeft er langer dan een week geleend? Het verschil tussen
twee datums levert het aantal dagen dat daartussen ligt. We kunnen dus gewoon met datums rekenen!
WHERE Geboortedatum BETWEEN 05-01-88 AND 05-31-88
Welke lezers zijn er in Mei 1988 geboren?
Het kan voorkomen dat bij bepaalde opvragingen meerdere keren
dezelfde rij zou worden afgedrukt. Als we bijvoorbeeld alle woonplaatsen van de lezers laten afdrukken, zullen diverse woonplaatsen zeer waarschijnlijk meerdere keren voorkomen. Als we alle
geproduceerde rijen slechts n maal in het overzicht willen opnemen, 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.

352

Databaseontwikkeling 4 Access 2007

SELECT
FROM

DISTINCT woonplaats
lezer ;

Om een overzicht van de namen van de schrijvers met de naam


van de uitgeverij van het betreffende boek te krijgen, zonder dubbele combinaties, formuleren we het volgende commando:
SELECT
FROM

DISTINCT schrijver, uitgeverij


uitgave ;

Hierbij kan wel de naam van een schrijver meerdere keren voorkomen, evenals de naam van een uitgeverij, maar iedere combinatie wordt hoogstens n keer in het overzicht opgenomen.
Opgaven
10.1 Verzorg aan de hand van de tabellen die behoren bij de bibliotheekdatabase 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 uitgegeven 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 2000.
f. De nummers van de lialen die minimaal n exemplaar hebben 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.
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 SQL, Structured Query Language

10.7

353

SQL gebruiken in Access

Standaard maakt Access gebruik van de norm ANSI 89. Deze


wijkt op een aantal punten af van de algemeen gebruikelijke norm
ANSI 92. Om beter aan te sluiten bij de praktijk, dus bij MS SQLserver, is het daarom mogelijk om Access zodanig in te stellen dat
het zich houdt aan de norm ANSI 92. Querys gemaakt volgens de
ene norm kunnen echter niet zonder meer gebruikt worden in de
andere norm. Vooral bij het gebruik van wildcards bestaan er belangrijke verschillen. In dit boek is gekozen om Access te gebruiken volgens de norm ANSI 89. In bijlage B vind je meer informatie. Tevens lees je daar hoe je kunt overschakelen naar ANSI 92.
Om binnen Access met SQL te werken moeten we eerst de betreffende database openen.
 Selecteer in het lint Maken, groep Ontwerpen, de knop
Queryontwerp.
 Omdat we in de SQL-query zelf opgeven welke tabellen we willen
gebruiken, sluiten we het venster Tabel toevoegen direct af, met de
knop Sluiten, zonder een tabel te selecteren.
Het scherm dat nu gepresenteerd wordt (zie guur 10.3), is bedoeld
om op de Access-manier, dus muisgestuurd, de querys te ontwerpen. We kunnen nu het scherm selecteren waarin we zelf SQLquerys kunnen invoeren (guur 10.4) door in het lint te kiezen
voor SQL Weergave.
We zien dat het woord SELECT al voor ons is neergezet. We kunnen nu de query intoetsen, waarna we hem kunnen laten uitvoeren
door op de knop Uitvoeren te drukken (de toets met het uitroep-teken). Op het scherm wordt de uitvoer van de query getoond, of een
foutmelding 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. We kunnen de uitvoer kopiren
of printen via de Ofce-knop. We kunnen terug keren naar de ontwerpweergave via Weergave, SQL Weergave.

354

Figuur 10.3

Figuur 10.4

Databaseontwikkeling 4 Access 2007

10 SQL, Structured Query Language

355

Een eenmaal ontwikkelde query kunnen we opslaan door met de


rechtermuisknop op de tab van de query te klikken of via de werkbalk Snelle toegang. 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 via het navigatiegedeelte.
Dubbelklikken we op de query dan wordt de query direct uitgevoerd. We kunnen ook met de rechtermuisknop op de query klikken en vervolgens kiezen voor Ontwerpweergave of voor Openen.
Ook querys die we op de standaard manier met Access hebben gemaakt kunnen we in SQL opvragen. Open de query in de ontwerpweergave en selecteer vervolgens voor Weergave, SQL Weergave.
Ook het omgekeerde is meestal mogelijk.
Let op!
Standaard SQL gaat ervan uit dat de namen van de kolommen
altijd uit n woord bestaan. Bij Access kunnen we echter kolomnamen uit meerdere woorden laten bestaan. Deze namen 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.
Opgave
10.4 Voer de volgende opdrachten uit aan de hand van de Alco-database.
a. Start Access 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 2010? Laat de
factuurnummers afdrukken.
e. Welke Artikelen hebben een adviesverkoopprijs onder de
25 euro en een voorraad van meer dan 30 stuks? Laat het soortnummer en jaartal afdrukken.

356
356

Databaseontwikkeling 4 Access 2007

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.

10.8

Eenvoudige opvragingen uit meerdere tabellen

In de vorige paragraaf hebben we ons beziggehouden met het uitvoeren 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.
voorbeeld

We geven een voorbeeld: een overzicht van de namen en nummers 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

10 SQL, Structured Query Language

357

dat liaalnr in LEZER een vreemde sleutel is, waarbij verwezen


wordt naar liaalnr in FILIAAL.
SELECT
FROM
WHERE
AND

lezer.naam, lezer.lezernr
lezer , liaal
lezer.liaalnr = liaal.liaalnr
liaal.lplaats = Breda ;

Hierbij is allereerst opgegeven wat er in het overzicht moet worden


opgenomen. Daarbij moet de kolomnaam voorafgegaan worden
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
FROM
WHERE
AND

naam, lezernr
lezer , liaal
lezer.liaalnr = liaal.liaalnr
lplaats = Breda ;

Vervolgens wordt opgegeven uit welke tabellen gegevens benodigd


zijn. Hierna worden de juiste rijen van de tabellen met elkaar gecombineerd. In dit geval gebeurt dit op basis van gelijk liaalnummer. 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.
voorbeeld

We willen een overzicht van de titels van de boeken die lezer


355267 in januari 2010 geleend heeft.
De gegevens komen uit de tabellen UITLENING, EXEMPLAAR
en UITGAVE. Voor het tot stand brengen van de juiste combinaties 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
AND

uitlening.exemplaarnr = exemplaar.exemplaarnr
exemplaar.isbn = uitgave.isbn

358

Databaseontwikkeling 4 Access 2007

Daarnaast hebben we nog te maken met beperkingen die uit de


vraagstelling volgen, te weten:
AND
AND
AND

uitlening.lezernr = 355267
uitlening.huurdatum >= #1-1-10#
uitlening.huurdatum <= #1-31-10# ;
( 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 aliasnaam op, door de tabelnaam te laten volgen door de door ons
gewenste alias-naam, gescheiden door een spatie. Bij het aanduiden van de tabellen moeten we vervolgens de alias-naam gebruiken.
SELECT
FROM
WHERE
AND
AND
AND
AND

DISTINCT u.titel
uitgave u , exemplaar e, uitlening ul
ul.exemplaarnr = e.exemplaarnr
e.isbn = u.isbn
ul.lezernr = 355267
ul.huurdatum >= #1-1-10#
ul.huurdatum <= #1-31-10# ;

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) exibel 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 tabellen. 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
AND

ul.huurdatum >= Startdatum


ul.huurdatum <= Einddatum ;

10 SQL, Structured Query Language

359

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 kunnen nu dus ook een overzicht opvragen over heel 2010, of over de
eerste week van mei, of van het derde kwartaal, of...
voorbeeld

We kunnen ook een overzicht maken van alle titels waarvoor een
reservering bestaat. Merk op dat het opnemen van DISTINCT
noodzakelijk is.
SELECT
FROM
WHERE

DISTINCT u.titel
uitgave u , reservering r
u.isbn = r.isbn ;

Tip: Uit een tabel alle kolommen nodig? Maak dan gebruik van
het teken *.
lezer.*
Bijvoorbeeld :
exemplaar.liaalnr, uitgave.*
of
e.liaalnr, u.*
of
Opgaven
10.5 Verzorg aan de hand van de tabellen die behoren bij de bibliotheekdatabase 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 lialen 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-database.
a. Start Access 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 2010 een factuur verstuurd? Laat naam,
adres, postcode en plaats afdrukken.

360
360

Databaseontwikkeling 4 Access 2007

c. Welke whiskys hebben een alcoholpercentage hoger dan 40?


Laat productnaam, soortnummer en naam afdrukken.
d. Aan wie hebben we op 30 juni 2010 n of meer essen
Riesling des Cigognes gefactureerd? Laat het factuurnummer
en afnemernummer afdrukken.
e. Welke wijnen uit het jaar 2002 hebben we in het assortiment?
Laat de naam, inhoud en adviesverkoopprijs afdrukken.

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 gebruiker
behoefte hebben aan een uitvoer die op een bepaalde wijze gesorteerd is. Daartoe kunnen we het SELECT-commando uitbreiden met ORDER BY.
SELECT
FROM
[ WHERE
[ ORDER BY

<te tonen kolom> [,<te tonen kolom>]


<tabelnaam> [,<tabelnaam>]
<voorwaarde> ]
<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 meerdere 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.
voorbeeld

Een overzicht van de boeken aanwezig in Leiden. Getoond moeten


worden: ISBN en titel, gesorteerd op titel.
SELECT
FROM
WHERE
AND
AND
ORDER BY

DISTINCT u.isbn, titel


uitgave u, exemplaar e, liaal f
u.isbn = e.isbn
e.liaalnr = f.liaalnr
lplaats = Leiden
titel ;

10 SQL, Structured Query Language

361

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 standaardsorteervolgorde 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

Een overzicht van alle titels en prijzen. In alfabetische volgorde


van titel, bij gelijke titel dalend op prijs.
SELECT
FROM
ORDER BY

titel, prijs
uitgave
titel, prijs DESC

Opgaven
10.7 Verzorg aan de hand van de tabellen die behoren bij de bibliotheekdatabase 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), gesorteerd op exemplaarnummer.
c. Een lijst met daarop alle liaalgegevens, gesorteerd op postcode.
10.8 Voer de volgende opdrachten uit aan de hand van de Alco-database.
a. Start Access 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, gesorteerd 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 adviesverkoopprijs.

362
362

Databaseontwikkeling 4 Access 2007

e. Geef een overzicht van namen van de afnemers voor wie we


op 29 of 30 juni 2010 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, esinhoud en adviesverkoopprijs tonen. De duurste es moet als
eerste worden getoond, de goedkoopste als laatste.

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 nietlege kolomwaarde in de genoemde kolom van de uitvoertabel.
 COUNT ( DISTINCT <kolomnaam> ) Bepaalt het aantal verschillende 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.
 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.
voorbeeld

Het aantal uitgaven waarbij een schrijver bekend is:


SELECT
FROM

COUNT (schrijver)
uitgave ;

10 SQL, Structured Query Language

363

De prijs van het duurste boek.


SELECT
FROM

MAX(prijs)
uitgave ;

Het aantal schrijvers waarvan boeken aanwezig zijn:


SELECT
FROM

COUNT (DISTINCT schrijver)


uitgave ;

Deze query werkt wel in standaard SQL, maar helaas niet in


Access.
De gemiddelde prijs van de boeken :
SELECT
FROM

AVG(prijs) of SELECT SUM(prijs)/COUNT(*)


uitgave
FROM uitgave ;

In de twee laatstgenoemde querys kunnen we twee verschillende


antwoorden vinden, omdat functies die op velden werken (bijvoorbeeld 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
FROM
WHERE

plaats , COUNT(*)
lezer
plaats = Dordrecht ;

We kunnen deze query wel anders formuleren:


SELECT
FROM
WHERE
Uitvoer:
MIN(plaats)
Dordrecht

MIN(plaats) , COUNT(*)
lezer
plaats = Dordrecht ;

COUNT(*)
1283

364

Databaseontwikkeling 4 Access 2007

Omdat in de uitvoertabel alleen de kolomwaarde Dordrecht voorkomt, 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.
SELECT
FROM
WHERE

MIN(plaats) AS Plaats , COUNT(*) AS Aantal


lezer
plaats = Dordrecht ;

Uitvoer:
Plaats
Dordrecht

Aantal
1283

3. Behalve de eerdergenoemde functies kent Access er nog veel meer,


die hier echter niet besproken worden. We kunnen via de ingebouwde hulp meer informatie opvragen.
Opgaven
10.9 Verzorg aan de hand van de tabellen die behoren bij de bibliotheekdatabase 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 2010.
g. Het aantal uitgaven dat nu uitgeleend is.
10.10 Voer de volgende opdrachten uit aan de hand van de Alco-database.
a. Start Access en activeer de database Alco. Gebruik bij de beantwoording de beschrijving van de database zoals je deze terug
vindt in paragraaf 10.5

10 SQL, Structured Query Language

b.
c.
d.
e.
f.
g.
h.
i.

365
365

Hoeveel klanten hebben we?


Hoeveel facturen zijn er verstuurd op 29 Juni 2010?
Hoeveel essen hebben we op dit moment totaal in voorraad?
Wat is de gemiddelde adviesverkoopprijs van wijnen uit het jaar
2005?
Wat kost de duurste rode wijn?
Van welke whisky hebben we het kleinste aantal essen op
voorraad? Toon het gevonden aantal.
Van welke whisky hebben we het grootste aantal liters op voorraad? Toon het gevonden aantal.
Voor welk bedrag is er op 29 Juni 2010 gefactureerd aan klanten die niet uit Rotterdam komen?

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
FROM
GROUP BY
[HAVING

<te tonen kolom> [,<te tonen kolom>]


<tabelnaam> [,<tabelnaam>]
<kolomnaam> [,<kolomnaam>]
<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 kolommen 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.

366

Databaseontwikkeling 4 Access 2007

voorbeeld

Een overzicht van alle schrijvers waarvan boeken aanwezig zijn:


SELECT
FROM
GROUP BY

schrijver
uitgave
schrijver ;

Alle schrijvers komen slechts n maal in het overzicht voor.


Een alternatieve oplossing:
SELECT
FROM
voorbeeld

DISTINCT schrijver
uitgave ;

De onderstaande query is NIET toegestaan:


SELECT schrijver, titel
FROM
uitgave
GROUP BY
schrijver ;
Na het groeperen op schrijver(naam) kan de naam worden afgedrukt. De naam heeft immers in de betreffende groep van uitgegeven 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?

voorbeeld

Een overzicht van alle schrijvers, tezamen met het aantal door hen
geschreven boeken:
SELECT
FROM
GROUP BY

schrijver, COUNT(*)
uitgave
schrijver ;

Van iedere schrijver worden de naam en het aantal aangetroffen


titels afgedrukt. Bedenk dat we nu wel een kolom kunnen combineren 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!
voorbeeld

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.

10 SQL, Structured Query Language

367

Een overzicht van de schrijvers die meer dan tien titels op hun
naam hebben staan:
SELECT
FROM
GROUP BY
HAVING

schrijver
uitgave
schrijver
COUNT(*) > 10 ;

Een overzicht van de uitgebrachte boeken per schrijver per uitgeverij, tezamen met het aantal uitgebrachte boeken:

voorbeeld

SELECT
FROM
GROUP BY

schrijver, uitgeverij, COUNT(*)


uitgave
schrijver, uitgeverij ;

Een GROUP BY mag dus bestaan uit meerdere kolommen. Per


unieke combinatie wordt in dat geval een rij in de uitvoertabel
opgenomen.
Per schrijver de prijs van het duurste boek dat door hem of haar is
geschreven:

voorbeeld

SELECT
FROM
GROUP BY

1.

2.
3.
4.
5.

schrijver, MAX(prijs)
uitgave
schrijver ;

Er gelden enkele specieke eigenschappen bij het gebruik van


GROUP
BY:
In het SELECT-gedeelte mogen alleen die kolommen worden
opgesomd die ook voorkomen in het GROUP BY-gedeelte, alsmede functies. Het is overigens niet verplicht het GROUP BYargument op te nemen in de SELECT-regel.
Functies werken nu per groep en mogen wel kolommen bevatten
waarop niet wordt gegroepeerd.
Per groep wordt slechts n rij in de uitvoertabel opgenomen.
We kunnen groeperen aan de hand van meerdere kolommen. Per
unieke combinatie ontstaat een rij.
We kunnen met HAVING voorwaarden opleggen aan de groepen.
Alleen groepen die voldoen aan de voorwaarde worden opgenomen in de uitvoertabel. We mogen hier alleen de kolommen

368

Databaseontwikkeling 4 Access 2007

gebruiken die ook in het GROUP BY-gedeelte voorkomen, alsmede 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
FROM
[ WHERE
GROUP BY
[ HAVING
[ ORDER BY

1.
2.
3.
4.
5.
6.
voorbeeld

<te tonen kolom> [,<te tonen kolom>]


<tabelnaam> [,<tabelnaam>]
<voorwaarde(n)> ]
<kolomnaam>
<voorwaarde(n)> ]
<te tonen kolom> [ASC/DESC] ] ;

De volgorde waarin de diverse stappen worden doorlopen, is nu als


volgt:
Welke tabellen gebruiken?
(FROM)
Welke rijen selecteren?
(WHERE)
Welke groepen maken?
(GROUP BY)
Welke groepen selecteren?
(HAVING)
Welke kolommen in de uitvoer? (SELECT)
Welke volgorde in de uitvoer?
(ORDER BY)
Een overzicht van de lialen met meer dan 1000 leden die voor
1990 geboren zijn. Ook het betreffende aantal moet worden
afgedrukt. Het overzicht moet worden gesorteerd op het aantal
aangetroffen leden.
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

liaalnr, COUNT(*)
lezer
geboortedatum < #1-1-90#
liaalnr
COUNT(*) > 1000
COUNT(*) ;

Hier wordt allereerst de tabel lezer geselecteerd. Uit deze tabel


worden de leden geselecteerd die voor 1990 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 aangetroffen rijen, opgenomen in de uitvoertabel. (Per groep wordt slechts

10 SQL, Structured Query Language

369

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 eveneens de tabel Filiaal gebruiken en deze op basis van het liaalnummer 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 alfabetisch 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:
SELECT
FROM
WHERE
AND
GROUP BY
HAVING
ORDER BY

f.liaalnr, COUNT(*), MIN(lnaam)


lezer l, liaal f
l.liaalnr = f.liaalnr
geboortedatum < #1-1-80#
f.liaalnr
COUNT(*) > 1000
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
FROM
WHERE
AND
GROUP BY
HAVING
ORDER BY

f.liaalnr, COUNT(*), lnaam


lezer l, liaal f
l.liaalnr = f.liaalnr
geboortedatum < #1-1-80#
f.liaalnr, lnaam
COUNT(*) > 1000
COUNT(*) ;

370

Databaseontwikkeling 4 Access 2007

Als algemene regel zouden we kunnen aanhouden: wat in SELECT


staat (behalve functies) staat ook bij de GROUP BY.
voorbeeld

Een overzicht met daarop het lezernummer, de lezernaam en het


aantal door de lezer geleende boeken:
SELECT
FROM
WHERE
GROUP BY

voorbeeld

Idem, maar nu alleen voor de lezers uit Rotterdam:


SELECT
FROM
WHERE
AND
GROUP BY

voorbeeld

l.lezernr, naam, count(*)


lezer l, uitlening u
l.lezernr = u.lezernr
l.lezernr, naam ;

l.lezernr, naam, count(*)


lezer l, uitlening u
l.lezernr = u.lezernr
plaats = Rotterdam
l.lezernr, naam ;

Idem maar nu alleen voor de lezers uit Rotterdam die minder dan
100 boeken hebben geleend:
SELECT
FROM
WHERE
AND
GROUP BY
HAVING

l.lezernr, naam, count(*)


lezer l, uitlening u
l.lezernr = u.lezernr
plaats = Rotterdam
l.lezernr, naam
count(*) < 100 ;

Opgaven
10.11 Verzorg aan de hand van de tabellen, behorend bij de bibliotheekdatabase 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 2010 per lezer uitgeleende
boeken; het overzicht moet in volgorde van oplopend aantal
worden getoond.

10 SQL, Structured Query Language

371
371

d. Per uitgeverij het totaal aantal aanwezige boeken waarvan de


aanschafprijs meer dan 30, bedraagt.
e. Per uitgeverij het aantal uitgegeven boeken, geschreven door
Wolkers.
f. Geef per exemplaar het aantal uitleningen in 2010 (huurdatum).
Toon exemplaarnummer, ISBN, titel en aantal uitleningen.
10.12 Voer de volgende opdrachten uit aan de hand van de Alco-database.
a. Start Access 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.
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 voorraad? Laat de productnaam afdrukken.
g. Van welke soort hebben we in Juni 2010 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 boekenprijs? Om die vraag te kunnen beantwoorden zullen we eerst
de gemiddelde boekenprijs moeten bepalen. De onderstaande
query levert die waarde op.

372

Databaseontwikkeling 4 Access 2007

SELECT
FROM

AVG(prijs)
uitgave ;

Stel dat hier een bedrag van 27,50 wordt gevonden. Dan kunnen
we nu met de volgende query de vraag beantwoorden.
SELECT
FROM
WHERE

*
uitgave
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:
SELECT
FROM
WHERE

*
uitgave
prijs

> ( SELECT
FROM

AVG(prijs)
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 tegelijkertijd. 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
FROM

AVG(prijs)
uitgave ;

Vervolgens gaan we alle prijzen achterhalen die onder deze gemiddelde waarde liggen.

373

10 SQL, Structured Query Language

SELECT
FROM
WHERE

prijs
uitgave
prijs

< ( SELECT
FROM

AVG(prijs)
uitgave ) ;

Van al deze prijzen zijn we eigenlijk alleen maar genteresseerd in


de grootste waarde omdat die het dichtst onder de gemiddelde aankoopprijs ligt. We krijgen dan:
SELECT MAX (prijs)
FROM
uitgave
WHERE
prijs

< ( SELECT
FROM

AVG(prijs)
uitgave ) ;

Tenslotte willen we nu nog weten voor welk boek (of boeken) deze
prijs geldt.
SELECT
FROM
WHERE

*
uitgave
prijs =
FROM
WHERE

( SELECT MAX(prijs)
uitgave
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 laatste 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 2010 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 2010 wel zijn uitgeleend en bepaal vervolgens
welke boeken daar niet bij zitten. Om te bepalen welke boeken er
in 2010 zijn uitgeleend kunnen we gebruik maken van de onderstaande query.

374

Databaseontwikkeling 4 Access 2007

SELECT
FROM
WHERE
AND
AND

uitgave.*
uitgave, exemplaar, uitlening
uitgave.isbn = exemplaar.isbn
exemplaar.exemplaarnr =
uitlening.exemplaarnummer
huurdatum BETWEEN #1-1-2010#
AND #12-31-2010# ;

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:
SELECT
FROM
WHERE
AND
AND

uitgave.isbn
uitgave, exemplaar, uitlening
uitgave.isbn = exemplaar.isbn
exemplaar.exemplaarnr =
uitlening.exemplaarnummer
huurdatum BETWEEN #1-1-2010#
AND #12-31-2010# ;

Als uitvoer krijgen we nu een lijst met alle nummers van de wel in
2010 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 2010 uitgeleend. We krijgen:
SELECT
FROM
WHERE

*
uitgave
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
WHERE

*
uitgave
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-2010#
AND #12-31-2010#) ;

375

10 SQL, Structured Query Language

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 eenvoudiger om tot een correcte oplossing te komen.
Bij subquerys kunnen we onder andere de volgende twee hoofdconstructies tegenkomen. Met deze constructies kunnen vrijwel
alle overzichten worden gegenereerd.
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
FROM
WHERE
ORDER BY exemplaarnr ;

isbn
uitgave
schrijver = Wolkers )

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.

376

Databaseontwikkeling 4 Access 2007

Geef de titel(s) van het duurste boek(en):


SELECT
FROM
WHERE

titel
uitgave
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
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
FROM
WHERE

titel
uitgave
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 schrijvers zijn gebruikt:
SELECT
FROM
WHERE
AND

titel
uitgave
schrijver = Wolkers
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 afgedrukt.

377

10 SQL, Structured Query Language

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 voorwaarde.
3. Een subquery moet een waarde of een waardenverzameling opleveren 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.
SELECT
FROM
WHERE
AND

GROUP BY
ORDER BY

voorbeelden

......
......
......
... IN (SELECT
FROM
WHERE
AND
.......
....... ;

......
......
......
...... )

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
FROM
GROUP BY

COUNT(*)
uitgave
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!

378

Databaseontwikkeling 4 Access 2007

SELECT
FROM
GROUP BY
HAVING

schrijver
uitgave
schrijver
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.
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
FROM
GROUP BY

COUNT(*)
schrijver
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 benaderen. Omdat de bibliotheek wel bijhoudt wie er wel een boek
heeft gereserveerd, zullen we de nummers van die lezers bepalen.

10 SQL, Structured Query Language

379

Vervolgens onderzoeken we bij iedere lezer of zijn/haar nummer


voorkomt in de zojuist gevonden verzameling. We krijgen dan:
SELECT
FROM
WHERE

lezernr, naam
lezer
lezernr NOT IN ( SELECT
FROM

lezernr
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.
SELECT
FROM
WHERE

lezernr, naam
lezer
lezernr NOT IN ( SELECT
FROM
AND
Plaats = Rotterdam
ORDER BY naam ;

lezernr
reservering )

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
FROM
WHERE
AND

isbn
lezer l, uitlening ul, exemplaar e
l.lezernr = ul.lezernr
ul.exemplaarnr = e.exemplaarnr

Nu worden alle geleende boeken getoond. Wij willen echter


alleen de boeken die geleend zijn door lezers uit dezelfde woonplaats 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
FROM
WHERE
AND
AND

isbn
lezer l, uitlening ul, exemplaar e
l.lezernr = ul.lezernr
ul.exemplaarnr = e.exemplaarnr
plaats = Emmen

380

Databaseontwikkeling 4 Access 2007

Nu kunnen we de query opstellen die de lezers toont die ook zon


boek hebben geleend. We krijgen dan:
SELECT
FROM
WHERE
AND
AND

l.lezernr, naam
lezer l, uitlening ul, exemplaar e
l.lezernr = ul.lezernr
ul.exemplaarnr = e.exemplaarnr
isbn IN (SELECT isbn
FROM lezer l, uitlening ul, exemplaar e
WHERE l.lezernr = ul.lezernr
AND
ul.exemplaarnr = e.exemplaarnr
AND
plaats = Emmen )

Er wordt nu steeds gekeken of de lezer uit Emmen komt, wat uiteraard niet juist is. In de subquery moeten we kijken of de woonplaats 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
FROM
WHERE
AND
AND

l1.lezernr, naam
lezer l1, uitlening ul, exemplaar e
l1.lezernr = ul.lezernr
ul.exemplaarnr = e.exemplaarnr
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 gebruikelijk, 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!

10 SQL, Structured Query Language

381
381

Opgaven
10.13 Verzorg aan de hand van de tabellen die behoren bij de bibliotheekdatabase de volgende overzichten:
a. Van welke schrijvers er geen boeken gereserveerd zijn.
b. Welke uitgeverij het grootste aantal titels heeft uitgebracht.
c. Welke schrijvers slechts voor n uitgeverij hebben geschreven.
d. Welke exemplaren nog nooit zijn uitgeleend.
e. Welke titel het meest is uitgeleend.
f. Het boek met de hoogste aanschafprijs.
g. Het aantal lezers dat in januari 2010 geen boeken heeft geleend.
h. Het boek waarvoor de meeste reserveringen bestaan.
10.14 Voer de volgende opdrachten uit aan de hand van de Alco-database.
a. Start Access 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 2010 geen factuur gekregen?
e. Welke artikelen zijn in Juni 2010 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 artikel met de grootste adviesverkoopprijs?
i. Wie heeft er een wijn uit 2001 besteld die ook door iemand uit
een andere woonplaats is besteld?
j. Welke artikelen zijn duurder dan de gemiddelde artikelprijs in
hun productgroep?

382

Databaseontwikkeling 4 Access 2007

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
FROM
WHERE

titel, u.isbn, exemplaarnr, liaalnr


uitgave u, exemplaar e
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
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 toevoeging 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
FROM
ON

titel, u.isbn, e.exemplaarnr, liaalnr


uitgave u LEFT JOIN exemplaar e
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 exemplaren aanwezig zijn in de bibliotheek worden ook het bijbehorende exemplaarnummer en liaalnummer getoond.

10 SQL, Structured Query Language

383

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 verwisselen krijgen we feitelijk weer de eerder besproken left join!
Als tweede voorbeeld formuleren we de query waarmee we kunnen 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.
SELECT
FROM
ON
WHERE

l.lezernr, naam, exemplaarnr, huurdatum


lezer l LEFT JOIN uitlening u
l.lezernr=u.lezernr
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 factuuradres en waarschijnlijk niet het aeveradres. Een verkoper ziet
alleen maar de klanten die tot zijn rayon behoren, terwijl zijn afdelingschef 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:

384

Databaseontwikkeling 4 Access 2007

CREATE VIEW RotterdamseKlanten AS ( SELECT


FROM
WHERE

*
Afnemer
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.
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 statisch 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 ondersteunt:
SELECT
FROM
WHERE

COUNT (DISTINCT schrijver)


uitgave, exemplaar
uitgave.isbn = exemplaar.isbn ;

Een alternatieve oplossing met behulp van een view:


SELECT
FROM

COUNT (*)
(SELECT
FROM
WHERE

DISTINCT (schrijver)
uitgave, exemplaar
uitgave.isbn = exemplaar.isbn );

10 SQL, Structured Query Language

385

Een ander voorbeeld.


Hoeveel lezers hebben in 2010 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:
SELECT
FROM
WHERE
AND
AND
AND

COUNT(DISTINCT lezernr),
SUM (retourdatum huurdatum + 1)
uitgave, exemplaar, uitlening
uitgave.isbn = exemplaar.isbn
exemplaar.exemplaarnr = uitlening.exemplaarnr
YEAR(huurdatum) = 2010
schrijver = J.K. Rowlings ;

Met behulp van een view:


SELECT
FROM

10.14

COUNT(*), SUM (aantalperklant)


(SELECT
lezernr, SUM (retourdatum
huurdatum + 1) AS aantalperklant
FROM
uitgave, exemplaar, uitlening
WHERE
uitgave.isbn = exemplaar.isbn
AND
exemplaar.exemplaarnr =
uitlening.exemplaarnr
AND
YEAR(huurdatum) = 2010
AND
schrijver = J.K. Rowlings
GROUP BY lezernr );

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.

386

Databaseontwikkeling 4 Access 2007

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 toevoegen 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
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 webpagina ingevoerde gegevens toe te voegen aan een tabel. Daarbij
moet je dan wel een script/programmeertaal gebruiken die speciaal 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 worden 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 verwijderd (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 standaardopvraagfaciliteiten van Access!

10 SQL, Structured Query Language

SELECT
FROM
WHERE
UNION
SELECT
FROM
WHERE

387

lezernr
lezer
liaalnr = 14
lezernr
uitlening
huurdatum = 2-15-10;

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 uitlening. 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 uitgenodigd 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
FROM
UNION ALL
SELECT
FROM

naam, adres, postcode, woonplaats


student
naam, adres, postcode, plaats
docent ;

Veldeigenschappen

Tijdens het ontwerpen van een tabel kun je niet alleen opgeven
welke velden je in de tabel wenst op te nemen, je kunt ook de eigenschappen van het veld instellen. Er bestaan veel verschillende
eigenschappen. Deze kun je echter niet altijd instellen omdat ze
niet altijd relevant zijn. Afhankelijk van het soort veld kun je een
eigenschap wel of niet instellen. Je kunt dit ook achteraf doen door
de bestaande tabel te openen in de Ontwerpweergave.
Figuur A.1

In deze bijlage komen alle eigenschappen aan bod.

390

Databaseontwikkeling 4 Access 2007

Veldlengte
Hiermee stel je de Veldlengte in bij velden van het type Tekst,
Numeriek en Autonummering.
De lengte voor een tekstveld staat standaard ingesteld op 255, 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 stel je deze waarde zo laag mogelijk in. Zorg er wel voor
dat al je gegevens, ook de gegevens die je in de toekomst nog zult
invoeren, in het veld passen.








Bij een veld van het type numeriek, wordt de veldlengte opgegeven
door in te stellen welk soort getal je wilt kunnen verwerken. Hier
kun je 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,4w1038
en +3,4w1038;
dubbele precisie getal met maximaal 15 decimalen, tussen
1,797w10308 en +1,797w10308;
decimaal getal met maximaal 28 decimalen, tussen 1028 en
+1028. In het veld Precisie kun je het totale aantal bij te houden cijfers opgeven. In het veld Schaal geef je op hoeveel cijfers je achter
de komma wilt 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 kun je voor de veldlengte alleen kiezen uit lange integer en replicatie id.
Hoewel Access hier zelf de nummering bijhoudt, kun je wel benvloeden wat het eerstvolgende nummer moet worden. Stel je wilt in
de database Reisbureau in de tabel Klant de eerstvolgende waarde
van het klantnummer op 4000 zetten. Open dan eerst de tabel
Klant en zorg ervoor dat klantnummer niet langer een sleutelveld
is. Creer vervolgens een nieuwe tabel en neem in deze tabel n
veld op, met eveneens de naam klantnummer, maar nu van het type

A Veldeigenschappen

391

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 je straks wilt beginnen. Sluit de tabel
vervolgens weer. Maak nu een query aan in de ontwerpweergave
en baseer deze query op de zojuist gemaakte tabel. Neem het veld
klantnummer op. Selecteer vervolgens via het lint Ontwerpen,
groep Querytype, voor Querytype: toevoegen en geef op dat je de
gegevens wilt toevoegen aan de tabel Klant. Laat nu de query uitvoeren. Open hierna de tabel Klant en verwijder het zojuist toegevoegde record, met de waarde 3999. Zorg er bovendien voor dat de
originele sleutelinstelling weer wordt ingesteld, dus klantnummer
weer aanwijzen als sleutel. Als je nu een nieuw record toevoegt,
zul je zien dat Access automatisch de waarde 4000 toekent als
eerstvolgende klantnummer.
Het is overigens verstandig om, voordat je de bovenstaande actie
onderneemt, 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. Heb je als test in een database gewerkt en
gebruikgemaakt van een autonummer, dan kun je na het verwijderen van alle testgegevens het comprimeren gebruiken om de startwaarde van autonummer weer op 1 te zetten. Om te comprimeren
selecteer je achtereenvolgens de Microsoft Ofce-knop, Beheren,
Database comprimeren en herstellen.
Notatiewijze
Met de eigenschap Notatie kun je 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, op het scherm
gepresenteerd worden als een tekst in hoofdletters.

@
&
<
>

Afhankelijk van het soort veld kun je de notatiewijze instellen.


Voor een tekst-veld kun je gebruikmaken van:
op de positie van dit teken wordt het ingetypte teken of een spatie
getoond. Tekens zijn vereist;
op de positie hiervan wordt het teken getoond; als er niets is ingetoetst, wordt er niets getoond. Tekens zijn niet vereist;
alles wordt in kleine letters weergegeven;
alles wordt in hoofdletters weergegeven.

392

Databaseontwikkeling 4 Access 2007

Je kunt 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.
Voorbeeld
Om een artikelcode te tonen volgens het formaat twee tekens, punt,
vier tekens, punt, n teken, alle tekens in hoofdletters, kun je gebruikmaken 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 heb je 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, standaard worden er twee decimalen getoond.
Euro de valutanotatie wordt gebruikt, waarbij altijd het eurosymbool wordt getoond, onafhankelijk van het in Windows ingestelde
valutasymbool.
Vast er wordt ten minste n cijfer weergegeven, zonder duizendtalteken, standaard worden er twee decimalen getoond.
Standaard het scheidingsteken voor duizendtallen wordt gebruikt; de standaardinstelling van het aantal decimalen is 2.
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 kun je bij getallen ook een eigen
presentatiewijze deniren. Je kunt dan gebruikmaken van:
. (punt)
het scheidingsteken voor duizendtallen;
, (komma) het decimale scheidingsteken;
0
tijdelijke cijferaanduiding. Geeft altijd een cijfer
(eventueel 0) weer;

A Veldeigenschappen

%
E of e

E+ of e+

393

tijdelijke cijferaanduiding. Geeft een cijfer of niets


weer;
geeft het eurosymbool weer. Je kunt hier overigens
ook andere valuta-aanduidingen gebruiken ($, , ,
enzovoort)
percentage: de waarde wordt vermenigvuldigd met
100 en er wordt een procentteken toegevoegd;
wetenschappelijke notatie, met een minteken () bij
negatieve exponenten en geen teken bij positieve
exponenten; te gebruiken in combinatie met andere
symbolen, bijvoorbeeld 0,00E00 of 0,00E00;
wetenschappelijke notatie, met een minteken bij negatieve exponenten en een plusteken (+) bij positieve
exponenten; te gebruiken in combinatie met andere
symbolen, bijvoorbeeld 0,00E+00.

Je kunt bij getallen werken met vier secties, van elkaar gescheiden
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 [Rood]; Nul;Onbekend.
Door deze instelling worden getallen altijd getoond als bedragen,
voorafgegaan door de aanduiding . Er wordt altijd minimaal n
cijfer voor het decimaalteken getoond en altijd twee decimalen.
Bij negatieve bedragen (2e sectie) wordt het bedrag in de kleur
rood afgedrukt. De waarde 0 (derde sectie) wordt als woord uitgeschreven. In een leeg veld (sectie vier) wordt de tekst Onbekend
getoond.
De bovengenoemde eigenschappen gelden ook voor velden van het
type valuta.
Voor een veld van het type datum/tijd heb je 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: 7-8-09 17:34:00;
 Lange datumnotatie lange aanduiding, volgt de instelling van
Windows zelf. Standaard staat deze op de weergave: Vrijdag 7 augustus 2009;

394

Databaseontwikkeling 4 Access 2007

 Middellange datumnotatie middellange aanduiding, bijvoorbeeld:


7-aug-09;
 Korte datumnotatie korte notatie, volgt de instelling van
Windows zelf. Standaard staat deze op de weergave: 7-8-09.
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 instelling 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 kun je ook een eigen presentatiewijze deniren. Je kunt dan gebruikmaken van:
:
scheidingsteken binnen de tijdaanduiding, aan te passen
binnen Windows zelf;
/
scheidingsteken binnen de datum;
c
als de vooraf gedenieerde Standaard datumnotatie;
d
dag van de maand in n of twee cijfers, afhankelijk 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);

A Veldeigenschappen

395

j
jj
jjjj
u
uu
n
nn
s
ss
ttttt
AM/PM

dag van het jaar (van 1 tot en met 366);


laatste twee cijfers van het jaartal (van 01 tot en met 99);
volledig jaartal in vier cijfers;
uren in n of twee cijfers;
uren in (altijd) twee cijfers;
minuten in n of twee cijfers;
minuten in (altijd) twee cijfers;
seconden in n of twee cijfers;
seconden in (altijd) twee cijfers;
als de vooraf gedenieerde Lange tijdnotatie;
tijdaanduiding in maximaal 12 uren, met toevoeging 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 hoofdletter 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.
Voor een veld van het type Ja/nee heb je de keuze uit drie standaardinstellingen:
 Waar/onwaar;
 Ja/nee;
 Aan/uit.
Je kunt ook zelf de eigenschappen instellen; daartoe beschik je
over drie secties. De eerste sectie blijft ongebruikt, je gaat dus
direct met een ; door naar de tweede sectie. Daar geef je op welke
waarde getoond moet worden als de waarde Waar, Ja of Aan is. In
de derde sectie geef je de waarde op die je wenst 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 Yes/No standaard wordt weergegeven
als afvinkvakje, wordt de presentatiewijze voornamelijk gebruikt
bij het laten uitvoeren van querys en rapporten.

396

Databaseontwikkeling 4 Access 2007

Bij alle velden, ongeacht het type, kun je 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 je
ze omsluit met dubbele aanhalingstekens of (ieder afzonderlijk)
laat voorafgaan door het teken \.
Je kunt ook de kleur instellen door deze op te geven tussen rechte
haken, bijvoorbeeld [rood]. Je kunt kiezen uit zwart, blauw, groen,
lichtblauw, rood, lila, geel en wit.
Invoermasker
Met een Invoermasker kun je per teken opgeven welke invoer is
toegestaan. Daarbij kun je gebruikmaken van de onderstaande
symbolen:
0
verplichte invoer van een cijfer (0 t/m 9), het plus- en
minteken zijn niet toegestaan;
9
invoer van een cijfer (0 t/m 9) of een spatie, niet verplicht, het plus- en minteken zijn niet toegestaan;
#
invoer van een 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 hierop volgende teken wordt letterlijk weergegeven.

A Veldeigenschappen

397

Je kunt 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.
Je kunt bij het werken met een invoermasker gebruikmaken van
drie secties. In de eerste sectie geef je het masker zelf op. In de
tweede sectie geef je op of je de letterlijke-weergave-tekens (volgend op \) in de tabel wilt opslaan wanneer je gegevens invoert.
Als je in deze sectie 0 typt, worden alle letterlijke tekens (bijvoorbeeld de haakjes in een invoermasker voor een telefoonnummer)
samen met de waarde opgeslagen. Als je 1 typt of de sectie leeg
laat, worden alleen de tekens opgeslagen die je daadwerkelijk intoetst. In de derde sectie geef je het teken op waarmee je spaties in
het invoermasker wenst weer te geven.
Om een bankrekening in te toetsen volgens het formaat
12.34.56.789, waarbij je de punten zelf niet opslaat, geef je de volgende notatie op: 00\.00\.00\.000;1;. Een postcode kan volgens de
lay-out 0000\ >LL;1 De spatie (tussen de tekens \ en >) wordt nu
niet opgenomen in het bestand.
Door niet zelf een masker in te toetsen maar op de knop met de
drie puntjes te drukken, start je een wizard die het instellen van
een masker vereenvoudigt doordat de uitwerking van jouw instelling 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.
Je kunt hier een eerste keuze maken. Selecteer het masker dat het
best aan jouw 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. Tevens kun je zelfgedenieerde standaardmaskers toevoegen.
In het scherm van guur A.3 kun je het masker aanpassen voor het
veld waarmee je bezig bent. Een wijziging die je hier aanbrengt,
is dus alleen voor dit ene veld geldig. Tevens kun je hier aangeven
met welk teken je het veld wilt vullen. Dit teken wordt later overschreven door de ingetoetste tekens. Hierna kun je naar de volgende stap van de wizard gaan.

398

Databaseontwikkeling 4 Access 2007

Figuur A.2

Figuur A.3

Je dient nu (zie guur A.4) op te geven of de door jou gebruikte


symbolen uit het masker ook moeten worden opgeslagen of niet.
Hiermee krijg je de mogelijkheid de veldlengte te verkleinen. Je
slaat de vaste symbolen immers niet op in de tabel, maar presenteert deze wel in de in- en uitvoer doordat je deze symbolen hebt
opgenomen in het masker. Ten slotte voltooi je het masker.

A Veldeigenschappen

399

Figuur A.4

Let op!
Als je gebruikmaakt van een invoermasker en tegelijkertijd van de
eigenschap Notatie, heeft de eigenschap Notatie prioriteit bij het
weergeven van de gegevens.
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 je
een andere tekst opgeven die als bijschrift moet worden gebruikt.
Standaardwaarde
Met deze eigenschap kun je een veld van een nieuw record automatisch laten vullen met een Standaardwaarde. Dit is handig als
je in een veld vaak dezelfde waarde moet invullen. Je kunt hier ook
gebruikmaken van functies. Bij een datumveld kun je bijvoorbeeld
gebruikmaken van de functie Date() om de huidige datum te noteren. Uiteraard kun je tijdens het daadwerkelijk invoeren van gegevens de standaardwaarde wijzigen in een andere waarde.
Validatieregel
Met een Validatieregel kun je controleren of de door de gebruiker
ingetoetste waarde voldoet aan de beperkingen zoals je die hebt
opgegeven. Je kunt een validatieregel direct invoeren, maar ook

400

Databaseontwikkeling 4 Access 2007

gebruikmaken van de opbouwfunctie voor expressies zoals je die


ook bent 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
je dit expliciet opgeeft in de validatieregel en bij de eigenschap
Vereist.
Om een numerieke waarde te controleren waarvan de waarde moet
liggen tussen 10 en 250, geef je de volgende regel op: >=10 And
<=250 of Between 10 And 250. Ook in de Nederlandstalige versie
dien je de uitdrukking And of Between 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 op!
Je moet ook de waarde van Vereist instellen op Nee!
Validatietekst
Als je gebruikmaakt van een Validatieregel, zal Windows een
standaardmelding tonen op het moment dat er onjuiste invoer is ingegeven. Wil je een eigen melding laten tonen, dan kun je de tekst
Validatietekst opgeven.
Vereist
De eigenschap Vereist gebruik je om op te geven of een veld verplicht een waarde moet krijgen of dat het ook leeg mag blijven.
Lengte nul toegestaan
De eigenschap Lengte nul toegestaan bepaalt of je lege invoer
toestaat of niet. Deze eigenschap werkt direct samen met de eigenschap Vereist. Is de eigenschap Vereist op Nee ingesteld, dan is
lege invoer (bijvoorbeeld direct op Enter of op de spatiebalk drukken) toegestaan. In het veld wordt dan de Null-waarde geplaatst.
Staat de waarde van de eigenschap Vereist op Ja, dan heb je de
onderstaande 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 acties is toegestaan.

A Veldeigenschappen

401

Gendexeerd
Met de eigenschap Gendexeerd kun je opgeven of bij het betreffende veld een index moet worden aangemaakt (en bijgehouden)
of niet. Een index zorgt ervoor dat het zoeken in en sorteren op het
betreffende veld aanzienlijk sneller verloopt. Moet je vaak zoeken
naar waarden in een bepaald veld, dan is het verstandig op dat veld
een index te deniren. Access creert zelf automatisch een index
voor ieder sleutelkenmerk. Vanuit een sleutelwaarde 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 foreign keys, 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 vertraagd omdat de index steeds opnieuw moet worden bijgewerkt.
Je kunt 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 dien je dus in te stellen bij
de index die je aanlegt op basis van een foreign key.
 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.
Voor het bijhouden van een agenda moet de combinatie datum en
tijd uniek zijn, maar de afzonderlijke velden hoeven dat niet te zijn!
Wil je een index op meerdere velden tegelijkertijd dan moet je
gebruikmaken van het venster Indexen, te bereiken via het lint
Ontwerpen, groep Weergeven/verbergen, knop Indexen.
In het venster (zie guur A.5) voeg je de door jou gewenste index toe aan de reeds bestaande indexen. Je geeft eerst de index
een naam in de kolom Indexnaam. Hierna geef je in de kolom
Veldnaam de verschillende te combineren velden op. Deze velden plaats je onder elkaar op verschillende regels, waarbij je
bij het tweede en volgende veld de kolom Indexnaam leeg laat.
Vervolgens geef je in de kolom Sorteervolgorde, per veld, de gewenste volgorde aan, Oplopend of Aopend.

402

Databaseontwikkeling 4 Access 2007

Figuur A.5

Onder in het scherm kun je vervolgens nog drie eigenschappen


opgeven:
 Primair moet de index als primaire sleutel dienst doen? Hiermee
verwijder je 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 worden opgenomen of niet.
In dit scherm kun je ook bestaande indexen wijzigen of verwijderen. Je verwijdert een index door de betreffende regel te markeren
en vervolgens op de toets Delete te drukken.
Unicode-compressie
Access ondersteunt, net als de andere Ofce-modules, het
Unicode-schema. Hiermee is het mogelijk in plaats van de gebruikelijke 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 je de Unicodecompressie bij een veld toestaat, 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 schijfruimte is het verstandig om het comprimeren altijd toe te staan.
Alleen indien je afwijkende tekens gebruikt en jouw gegevens wilt
kunnen uitwisselen met andere 32-bits applicaties (geen Ofcemodules) die eveneens Unicode ondersteunen, is het verstandig de
compressie uit te schakelen.

A Veldeigenschappen

403

IME-modus / IME-zinmodus
IME staat voor Input Method Editor. Dit is een programma
waarmee gewone toetsaanslagen, bij gebruikmaking van de
Oost-Aziatische talen kunnen worden omgezet naar specieke
Oost-Aziatische karakters (fonetische invoer). Met behulp van de
eigenschappen IME-Modus en IME-zinmodus kun je instellen
hoe er in het betreffende veld moet worden omgegaan met de ingevoerde toetsaanslagen. Het werken met deze twee eigenschappen
heeft alleen maar zin indien je de IME van de door jou gewenste
taal daadwerkelijk hebt genstalleerd. Je hebt hierbij de keuze uit
Chinees, Japans en Koreaans. De door jou gewenste IME kun je
downloaden vanaf de ofcile Windows Ofce-webpagina.
Infolabels
Een infolabel 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 bijvoorbeeld in staat om
snel een e-mail te versturen, een afspraak te plannen 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 hebben standaardacties
ontwikkeld. Heb je een infolabel aan een veld gekoppeld, dan zal,
zodra je het veld selecteert, het infolabelsymbool verschijnen. Door
hier met de rechtermuisknop op te klikken kun je de actie starten. Wil je infolabels bij gebruik van het gegevensblad tonen, dan
kun je dit bereiken door via de Ofce-knop, Opties voor Access,
Geavanceerd, naar het onderdeel Weergave te gaan en hier voor de
betreffende keuze het vinkje te plaatsen.
Tekstuitlijning
Algemeen wordt tekst links uitgelijnd en getallen en datums rechts
uitgelijnd. Met de eigenschap Tekstuitlijning kun je hiervan afwijken. Naast Algemeen heb je de keuze uit Links, Centreren, Rechts
en Verdelen. De optie Verdelen verdeelt de tekens over de totale
breedte van het veld. Het woord Hallo, kan er dan zo uitzien:
H a l l o.

404

Databaseontwikkeling 4 Access 2007

Datumkiezer weergeven
Voor datumvelden kun je in de eigenschap Datumkiezer weergeven instellen of datums geselecteerd kunnen worden via een kalendervenster.
Tekstopmaak
Voor memovelden kun je in de eigenschap Tekstopmaak aangeven
of tekst met of zonder opmaak is toegestaan. In tekst met opmaak
kun je onder andere een lettertype kiezen, vet, cursief en opsommingtekens toepassen. In tekst zonder opmaak kun je alleen platte tekst invoeren.
Alleen toevoegen
Voor memovelden kun je de eigenschap Alleen toevoegen inschakelen. Hierna kun je in een memoveld alleen maar tekst toevoegen.
Dit is een handige optie als je een bepaalde historie wilt opbouwen
over een bepaald onderwerp. De historische informatie kun je selecteren met de rechtermuisknop, Kolomgeschiedenis weergeven.
Zet je de eigenschap op Nee, dan wordt de historie verwijderd.

Opties

Tijdens het werken met Access zul je merken dat het programma
een aantal vooraf ingestelde standaardwaarden kent, bijvoorbeeld
de standaardlengte van een tekstveld of de plaats waar de databases worden opgeslagen. Deze waarden kun je voor het grootste
deel zelf wijzigen. Enkele belangrijke standaardinstellingen worden hieronder nader toegelicht.
Wil je standaardwijzigingen maken, kies dan via de Ofce-knop
voor Opties voor Access. Hierna wordt een venster getoond, waarin we standaardwijzigingen kunnen invoeren, zie guur B.1.
De gegevens zijn gegroepeerd in specieke categorien. Er zijn
tien categorien: Populair, Huidige database, Gegevensblad,
Ontwerpfuncties voor objecten, Controle, Geavanceerd,
Aanpassen, Invoegtoepassingen, Vertrouwenscentrum en
Informatiebronnen. In iedere categorie zijn groepen gemaakt
waarin je standaardinstellingen kunt wijzigen. Van de belangrijkste categorien volgt een uitgebreide toelichting.
Categorie Populair
Hierin heeft Access een aantal populaire eigenschappen geplaatst,
zie guur B1.
De belangrijkste opties voor het werken met Access
De optie Altijd ClearType gebruiken zorgt dat op platte beeldschermen een beter leesbare lettertype wordt getoond. Op oude beeldschermen kan dat weleens wazige letters opleveren. Verwijder
dan het vinkje. Als je met de muiswijzer boven een knop komt
verschijnt extra informatie. Bij Stijl voor scherminfo kun je aangeven of je dat volledig, gedeeltelijk of niet wilt zien. Bovendien

406

Databaseontwikkeling 4 Access 2007

kun je, door middel van een vinkje bij Sneltoetsen weergeven in
scherminfo, bepalen of daarin wel/niet sneltoetseninformatie wordt
getoond, bijvoorbeeld Plakken Ctrl-V. Standaard zijn onder andere
de randen van de vensters in Access blauw. Je kunt in de optie
Kleurenschema kiezen voor een andere kleur, bijvoorbeeld zwart.
Figuur B.1

Databases maken
Databases gemaakt in versie 2007 zijn niet uitwisselbaar met voorgaande versies. Je kunt via de optie Standaardbestandsindeling
aangeven dat je databases wenst te maken in het formaat van
voorgaande versies. Via de optie Standaarddatabasemap kun je
een standaardbestandsmap selecteren. Eventueel kun je nog kiezen voor een specieke sorteervolgorde bij Sorteervolgorde voor
nieuwe database.

B Opties

407

Persoonlijke instellingen voor jouw exemplaar van Office opgeven


In deze groep kun je een Gebruikersnaam en Initialen instellen en
bij Taalinstellingen kun je een taal selecteren die wordt toegepast
bij de spellingscontrole.
Categorie Huidige database
In deze categorie kun je allerlei instellingen maken voor jouw huidige database, zie guur B.2.
Deze categorie is handig als je een toepassing hebt gemaakt die
ook door anderen wordt gebruikt. Die moeten kunnen werken zonder kennis van Access. In deze categorie kun je dan instellingen
maken, zodat de database eenvoudiger door derden is te gebruiken.
In paragraaf 6.5 wordt toegelicht hoe je de formulieren, rapporten,
enzovoort eenvoudig ter beschikking kunt stellen aan derden. In
paragraaf 6.5.2 is deze categorie ook toegepast op de toepassing
t Zonnetje.
Figuur B.2

408

Databaseontwikkeling 4 Access 2007

Toepassingsopties
Je kunt jouw toepassing van een andere naam voorzien dan de bestandsnaam bij Toepassingsnaam. Ook kun je op de taakbalk een
eigen pictogram plaatsen, Toepassingspictogram. Als je het pictogram ook in de tabbladen van formulieren en rapporten wenst te
zien, plaats een vinkje bij Als formulier- en rapportpictogram gebruiken. Indien je de database start, kun je bij de optie Formulier
weergeven aangeven welk formulier direct wordt getoond.
Hiermee kun je dus jouw openingsformulier selecteren.
In een toepassing wordt meestal niet de statusbalk getoond. Die
kun je uitschakelen via Statusbalk weergeven. Bij Opties voor
documentvensters kun je kiezen uit Overlappende vensters of
Documenten met tabbladen. In voorgaande versies van Access
wordt gebruikgemaakt van overlappende vensters. Je kunt
hierin meerdere vensters openen die elkaar kunnen overlappen.
Documenten met tabbladen zijn beeldvullend. Je kunt nog aangeven, door een vinkje bij Documenttabbladen weergeven, of de tabs
zichtbaar moeten zijn (standaardinstelling). Objecten van Access
worden dan in verschillende tabbladen geplaatst en zijn daardoor
eenvoudig te selecteren. Als je documenttabbladen niet wenst te
zien, kun je het formulier of rapport sluiten met Ctrl-W.
Access heeft een aantal speciale toetsen, zoals F11voor het tonen
of verbergen van het navigatiegedeelte. Die toetsen kun je bij
Speciale Access-toetsen gebruiken uitschakelen. Je kunt de database automatisch laten comprimeren bij de optie Comprimeren
bij sluiten. Deze optie kun je beter niet gebruiken als meerdere
personen tegelijk werken met dezelfde database (multi-user). Het
comprimeren duurt bij grote databases lang. Bovendien als meerdere personen van de database gebruikmaken, moet iedereen de
database afsluiten. Je kunt dat beter op een rustig moment, bijvoorbeeld s avonds, zelf uitvoeren.
Persoonlijke gegevens, zoals naam en initialen worden bij de database opgeslagen, je kunt dat onderdrukken door een vinkje te
plaatsen bij Persoonlijke gegevens bij het opslaan uit de bestandseigenschappen verwijderen.
Besturingselementen met Windows-themas gebruiken in formulieren kun je uitschakelen. Als de database ook door derden
wordt gebruikt is het verstandig om Indelingsweergave toestaan
voor deze database uit te zetten. Ze kunnen anders eenvoudig
ongewenste wijzigingen doorvoeren. Hetzelfde geldt voor de optie Ontwerpwijzigingen in tabellen toestaan in de gegevensbladweergave.

B Opties

409

Controleren op velden met afgekapte getallen zorgt dat getallen die


niet passen in de breedte van een besturingselement, worden weergegeven als #####. Als dit niet is ingesteld, worden de meest linkse getallen niet getoond. Dat kan vervelende consequenties hebben.
Je ziet in het formulier staan: Te betalen 100,00, maar in werkelijkheid staat er 1100,00. In voorgaande versies van Access leverden
veel afbeeldingen in de database problemen op in verband met de
bestandsomvang. Als je een database maakt, met afbeeldingen, die
ook in vorige versies van Access moet kunnen werken, kies dan bij
Opslagindeling voor afbeeldingen voor Alle afbeeldingen converteren naar bitmaps.
Navigatie
In een toepassing is het niet nodig om het navigatiegedeelte te
tonen. Via Navigatiedeelvenster weergeven kunnen we het navigatiegedeelte verbergen. Via de knop Navigatieopties kunt je diverse
instellingen veranderen of zelf een aangepast navigatiescherm maken.
Lint en werkbalk opties
Het is mogelijk om zelf een lint te maken. Echter dat valt buiten
het bereik van dit boek. Het maken van linten is ook erg gecompliceerd. Vaak wensen we geen lint in een toepassing. In paragraaf 6.5.3 hebben we een tweetal eenvoudige linten gemaakt,
die geen lint tonen! Daar kun je direct de gecompliceerdheid van
linten zien. Die zijn in Naam Lint te selecteren. Als je het veld
leeg maakt, worden de standaard linten getoond. Ook het zelf
snelmenus maken valt buiten het bereik van dit boek. Die zijn in
de optie Snelmenubalk te selecteren. Je kunt de linten onderdrukken door het vinkje bij Volledige menus toestaan te verwijderen.
Alleen lint Start blijft dan beschikbaar. Hetzelfde geldt voor de
snelmenus, deze kun je onderdrukken via Standaardsnelmenus
toestaan.
Opties voor automatische naamcorrectie
Het is zeer onverstandig om tabelnamen te veranderen in een database. De tabelnamen worden toegepast in bijvoorbeeld querys en
formulieren. Mocht dat toch nodig zijn, dan kun je de wijzigingen
automatisch door laten voeren in de andere objecten. Back-up-bestanden moet je dan uiteraard ook aanpassen.
Door een vinkje te plaatsen bij Informatie bijhouden over Automatische naamcorrectie en Automatische naamcorrectie toepassen

410

Databaseontwikkeling 4 Access 2007

kun je een wijziging automatisch doorvoeren. Door een vinkje te


plaatsen bij Logboek van Automatische naamcorrectie kun je het
in een logboek laten vastleggen. Het logboek is een tabel met de
naam Logboek automatische naamcorrectie.
Opties voor opzoeken met filter voor <naam database> Database
In tabellen, querys, formulieren en rapporten kun je lteren in een
lijst met alle mogelijke waarden, zie guur B.3.
Figuur B.3

Die waarden moeten in de database opgezocht worden. Als geen


index voor dat veld aanwezig is, zal Access op brute kracht, alle
records doorzoeken en de waarden tonen. Bij grote databases kan
dat een probleem worden, het wordt dan erg traag. De optie Lokale
gendexeerde velden toont alleen de mogelijke waarden indien
een index bestaat op dat veld. De optie Lokale niet-gendexeerde
velden toont ook alle waarden als er niet gendexeerd is op dat
veld. Als je beide vinkjes weghaalt, wordt nooit een lijst met alle
waarden getoond. De optie ODBC-velden staat standaard uit. Met
Open DataBase Connectivity kun je externe databases benaderen,
bijvoorbeeld een Oracle database. Daaruit zou je ook een lijst met
waarden kunnen maken. Aangezien het benaderen van externe databases trager werkt dan de Access-database, is het niet verstandig
dit te activeren. Als laatste kun je aangeven dat boven een bepaald
aantal records geen waarden meer worden getoond.

B Opties

411

Categorie Gegevensblad
In deze categorie kun je standaardkleuren instellen, opties voor
rasterlijnen en standaardlettertypen selecteren, zie guur B.4.
Figuur B.4

Categorie Ontwerpfuncties voor objecten


In deze categorie kun je instellingen maken die tijdens het ontwerpen van tabellen, querys, formulieren en rapporten worden toegepast, zie guur B.5.
Tabelontwerp
Je kunt een Standaardveldtype, Standaardlengte van tekstvelden
en Standaardlengte van numerieke velden vastleggen. Bij de optie
AutoIndex bij importeren/maken kun je veldnaamuitgangen automatisch laten indexeren. Indien bijvoorbeeld een veldnaam eindigt
op Id of Code wordt automatisch een index aangelegd. Dat kan
weleens negatieve gevolgen hebben, denk bijvoorbeeld aan het veld
Postcode, hierop wordt nu automatisch een index geplaatst. Als
laatste in deze sectie kun je een vinkje zetten bij Knoppen voor bijwerkopties voor eigenschappen weergeven. Als je een wijziging in

412

Databaseontwikkeling 4 Access 2007

een veld maakt, kun je een knop tonen die vraagt of de wijziging
door heel de database (bijvoorbeeld in formulieren en rapporten)
doorgevoerd moet worden. Dat is een zeer handige optie.
Figuur B.5

Queryontwerp
De optie Tabelnamen weergeven toont de tabelnamen tijdens het
ontwerpen van de query. Via Alle velden weergeven kun je direct
na het plaatsen van een tabel ook alle velden laten selecteren.
Aangezien dat niet vaak voorkomt, is het geen handige optie. Na
het plaatsen van twee tabellen kun je automatisch de relatie laten
leggen bij Autojoin activeren. Het is verstandiger eenmalig alle
relaties tussen de tabellen vooraf vast te leggen. Verder kun je in
het ontwerpvenster een Lettertype en Grootte opgeven.
De laatste twee opties hebben betrekking op hoofdstuk 7. Hierin is
het werken met de standaard databasetaal SQL (ook toegepast in
Access) toegelicht. De optie Met SQL Server compatible syntaxis
(ANSI 92) bepaalt of je wilt werken met de standaard ANSI 92 of
met de standaard ANSI 89 in de Huidige database of Standaard

B Opties

413

voor nieuwe databases. Access werkt bij SQL standaard met ANSI
89. Deze standaard is dan ook in dit boek aangehouden. Zolang je
werkt met de Access-database geeft dit weinig tot geen beperkingen. Indien je echter gegevens wilt ontsluiten die in een professioneel DBMS, zoals Microsoft SQL Server liggen opgeslagen,
moet je gebruikmaken van de standaard ANSI 92. MS-SQL Server
werkt namelijk volgens die standaard.
Er zitten echter verschillen tussen beide standaarden, die direct
gevolgen kunnen hebben voor de geproduceerde uitvoer. Een belangrijk detail waarin de beide standaarden van elkaar verschillen, is het gebruik van wildcards. De n gebruikt een * waar de
ander een %-teken gebruikt. 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, terwijl in
de andere standaard geen uitvoer wordt geproduceerd, omdat daar
letterlijk naar de tekst B* wordt gezocht, die niet wordt aangetroffen!
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 al jouw querys dient te
controleren op juist functioneren. In dit boek gaan we ervan uit dat
je werkt volgens de standaard van Access, dus ANSI 89.
Naast de mogelijkheid om gemakkelijk te kunnen werken met
bijvoorbeeld MS SQL Server, biedt ANSI 92 ook de mogelijkheid
om:
 rechten toe te kennen / te herroepen met GRANT en REVOKE;
 gebruik te maken van DISTINCT bij rekenkundige functies;
 de omvang van de uitvoer te beperken met LIMIT TO ... ROWS.
Formulieren/rapporten
Als je met de muiswijzer een denkbeeldige rechthoek (selectiekader) om objecten maakt, selecteer je die objecten. Je kunt objecten
selecteren via Volledig omsluiten of Gedeeltelijk omsluiten. Met de
laatste optie hoeft het selectiekader maar een deel van het object
te doorkruisen om het volledig te selecteren. In Formuliersjabloon
en Rapportsjabloon kun je een formulier/rapport selecteren die
als sjabloon voor alle andere formulieren/rapporten gebruikt zal
worden. Als laatste kun je Altijd gebeurtenisprocedures gebruiken.
In hoofdstuk 5 (en 6) heb je leren werken met macros. In de eigenschappen van het tabblad Gebeurtenis kun je een macro maken.

414

Databaseontwikkeling 4 Access 2007

Als je in een eigenschap op de -knop klikt, krijg je een venster


waarin je onder andere een macro kunt maken. Professionele programmeurs willen echter direct VBA-code invoeren. Als je een
vinkje bij de optie plaatst, krijg je niet meer het venster om een
macro in te voeren, maar wordt direct het VBA-venster getoond.
Foutcontrole
In deze laatste sectie kun je allerlei foutcontroles aanzetten. Bij
het ontwerpen van een rapport hebben we gezien dat er een groen
driehoekje werd getoond als het rapport te breed is voor het gekozen papierformaat. Via dat driehoekje kan dan een knop worden
geselecteerd waarin we dat automatisch kunnen corrigeren. Je kunt
eventueel die foutcontroles uitschakelen of een andere kleur voor
het driehoekje kiezen.
Categorie Controle
Access biedt dezelfde opties als bijvoorbeeld Word om spellingfouten te corrigeren, zie guur B.6.
Figuur B.6

B Opties

415

Categorie Geavanceerd
Hierin kun je geavanceerde instellingen invoeren, zie guur B.7.
Het is verdeeld in vijf secties.
Figuur B.7

Bewerken
In deze groep kun je bijvoorbeeld opgeven wat er na het indrukken
van de Enter-toets gebeurt of wat de werking van de pijltjestoetsen
is.
Weergeven
In deze groep kun je bijvoorbeeld opgeven hoeveel onlangs geopende bestanden getoond moeten worden en of de statusbalk
weergegeven moet worden.
Afdrukken
In deze sectie kun je de standaardmarges van het papier opgeven.

416

Databaseontwikkeling 4 Access 2007

Algemeen
Hierin kun je bijvoorbeeld opgeven of een jaartal met vier cijfers
getoond moet worden. Ook kun je diverse instellingen voor webpaginas opgeven, zoals de kleur van een weblink.
Geavanceerd
Hierin kun je opgeven of de laatst gebruikte database direct opgestart moet worden. Verder hebben de meeste opties betrekking op
een multi-useromgeving, zoals hoe omgegaan moet worden met
recordvergrendeling.
Categorie Aanpassen
Handig om de werkbalk Snelle toegang aan te passen met lint-opties, kan ook via de werkbalk zelf, zie guur B.8. Plaats hier niet te
veel knoppen, het wordt dan erg onoverzichtelijk.
Figuur B.8

B Opties

417

Categorie Invoertoepassingen
Geeft een lijst van invoegtoepassingen die momenteel worden gebruikt door Access Informatiebronnen, zie guur B.9.
Figuur B.9

Invoegtoepassingen zijn kleine programma-onderdelen die aan


Access toegevoegd kunnen worden. Een aantal worden door
Access aangeleverd, zoals Infolabels. Maar er zijn ook infolabels
die door derden zijn gemaakt. Die kun je toevoegen aan Access,
via het lint Hulpmiddelen voor databases, groep Hulpmiddelen
voor databases. Zo zijn op internet vele invoegtoepassingen
van derden te vinden. Access geeft wel een waarschuwing bij
het toevoegen van het programma-onderdeel, zie ook categorie
Vertrouwenscentrum.
Categorie Vertrouwenscentrum
In deze categorie kun je allerlei beveiligingsopties instellen, zie
guur B.10. Door het klikken op de getoonde internetlinks kun je
informatie verkrijgen over privacy en beveiliging van computers.

418

Databaseontwikkeling 4 Access 2007

Figuur B.10

Om van de beveiligingswaarschuwing af te komen van databases


die je zelf hebt gemaakt of van vertrouwde databases kun je een
aantal instellingen veranderen. Klik op de knop Instellingen voor
het vertrouwenscentrum. Er verschijnt een venster waarin we zes
beveiligingsgroepen zien, zie guur B.11.
Vertrouwde uitgevers
Toon een lijst met vertrouwde uitgevers. Als je een database van
een derde opent kunt je een melding krijgen of je alle documenten
van deze uitgever accepteert. Indien je die accepteert, wordt de
uitgever toegevoegd als vertrouwde uitgever. In dit venster kun je
ook vertrouwde uitgevers verwijderen.
Van vertrouwde uitgevers krijg je geen beveiligingsboodschap
bij het openen van hun database. Als je een macro verandert (of
VBA-code) van een vertrouwde uitgever, wordt de beveiligingsregel weer getoond. Indien je daarna die beveiligingsregel niet meer
wenst te tonen, zie Vertrouwde locaties.

B Opties

419

Figuur B.11

Vertrouwde locaties
Toont een lijst met vertrouwde locaties op jouw computer of netwerk. In deze groep kun je mappen maken, verwijderen of aanpassen, waarin je vertrouwde bestanden kunt opslaan. Als je een database in die map plaatst, wordt die gezien als vertrouwd en zal de
beveiligingsregel niet getoond worden. Dit is de beste methode om
zelfgemaakte databases of vertrouwde databases op te slaan.
In het venster kun je bovendien aangeven of een vertrouwde locatie zich in het computernetwerk mag bevinden. Ook kun je met n
vinkje alle vertrouwde locaties blokkeren.
Na het klikken op de knop Nieuwe locatie toevoegen kun je een
locatie selecteren. Indien je alle submappen ook wenst te vertrouwen plaats je een vinkje bij Submappen op deze locatie worden
ook vertrouwd.
Access heeft zelf ook een vertrouwde locatie gemaakt waarin
Wizard Databases liggen opgeslagen, zie guur B.11.

420

Databaseontwikkeling 4 Access 2007

Invoegtoepassingen
In dit venster kun je aangeven of alleen invoegtoepassingen van
vertrouwde uitgevers geaccepteerd mogen worden of geen enkele
invoegtoepassing actief mag zijn. Die laatste optie kan wel gevolgen hebben, aangezien Access zelf ook al invoegtoepassingen
heeft, zie Categorie Invoegtoepassingen.
Instellingen voor Macros
In deze groep kun je aangeven of macros wel of niet uitgeschakeld
moeten worden.
Berichtenbalk
De beveiligingswaarschuwingsregel kun je hier onderdrukken
of juist activeren. Standaard wordt die getoond. Als je de beveiligingsbalk met de beveiligingswaarschuwing niet meer toont,
blijft wel de beveiliging! Als het programma macros heeft die een
vertrouwde uitgever of -locatie eisen, wordt het programma onderbroken.
Privacyopties
In deze groep kun je instellingen aanvinken die automatisch Ofceverbeteringen doorvoeren op het gebied van privacy.
Categorie Informatiebronnen
Internetlinks naar nuttige informatiebronnen voor het gebruik van
Access.

Een grote, uitgewerkte


opgave

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 3 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 Accessdatabase en worden de tabellen gevuld met gegevens. Ten slotte
worden enkele querys, formulieren en rapporten ontwikkeld waarmee de opgeslagen informatie ontsloten wordt.
Docenten kunnen vergelijkbare opgaven verkrijgen via de docentenhandleiding van het boek. Voor meer informatie hierover verwijzen we naar het voorwoord.
De opgave
Een tweewielercentrum in Almelo verkoopt etsen, brommers en
scooters. Sinds enige jaren heeft men de klanten ook de mogelijkheid gegeven om brommers en scooters te leasen. Om de gegevens
hiervan bij te houden maakt men onder andere gebruik van de
hierna getoonde overzichten.
In guur C.1 wordt per leasecontract vastgelegd wie welke brommer of scooter least, vanaf welke datum en tegen welk bedrag.
Tevens wordt na aoop van het contract de datum vastgelegd waarop het contract eindigt. Men kan een contract per maand opzeggen.
Er geldt wel een opzegtermijn van twee maanden. Tot slot 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 of men ook een verzekering via het tweewielercentrum
heeft afgesloten. In dat geval ontvangt men een korting van 10%
op het standaardleasebedrag per maand.

422

Databaseontwikkeling 4 Access 2007

Figuur C.1

In guur C.2 wordt per merk en type de prijs bijgehouden die men
per maand in rekening brengt.
Figuur C.2

C Een grote, uitgewerkte opgave

423

a. Logisch ontwerp
a.1. Normaliseer de bijgaande guren. Licht de normalisaties toe,
denk daarbij aan het toelichten van proces-, samengestelde en
constante gegevens.
Licht ook jouw sleutelkeuze toe.
a.2. Integreer de normalisaties tot n geheel en ontwerp het bijbehorende ER-diagram.
b. Technisch ontwerp
b.1. Ontwerp de tabellen met behulp van Access. Zorg dat bij foreign keys alleen uit de bijbehorende sleutelwaarde kan worden gekozen door gebruik te maken van een keuzelijst met
invoervak (zie boek 5.7.8).
b.2. Leg tussen de tabellen alle bestaande relaties en dwing daarbij de controle op referentile integriteit af.
c. Opbouwen tabellen
c.1. Vul de bestanden met correcte gegevens. Zorg 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 hieronder staande
opgaven kunnen worden uitgevoerd en getest.
c.2. Maak een invoerformulier waarbij twee tabellen betrokken
zijn. Er moet een subformulier getoond worden. Zorg dat dit
formulier netjes, overzichtelijk en uitnodigend is.
d. Opvragen gegevens met querys
Sla de opdrachten op als D1, D2, etc.
d.1. Verzorg een query waarmee alle klantgegevens worden gepresenteerd van klanten die per automatische incasso betalen.
Op volgorde van postcode.
d.2. Verzorg een query waarmee een overzicht wordt verkregen
met daarop 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.
d.3. Hoeveel leasecontracten zijn er in 2009 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 lopende leasecontracten. Toon het overzicht op volgorde van
plaatsnaam.

424

Databaseontwikkeling 4 Access 2007

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.
e. Manipuleren gegevens
e.1. Verzorg een query waarmee het bedrag per maand wordt aangepast. Leasebedragen boven de 20, moeten met 2% worden verhoogd. Alle andere moeten met 3% worden verhoogd.
Maak voordat je dit test een kopie van jouw database!
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 jouw database!
f. Rapporten
f.1. Verzorg een rapport waarmee ongeveer guur C.2 kan worden gegenereerd.
f.2. Verzorg een rapport waarmee ongeveer guur C.1 kan worden gegenereerd, nadat het nummer van het betreffende contract is ingevoerd.
Tip: maak een exibele query.
Uitwerking
a. Logisch ontwerp
a.1 We beginnen met het normaliseren van guur C.1. In dit overzicht zien we allereerst de gegevens van het tweewielercentrum 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 ten slotte 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, aut. incasso, maandbedrag, RG (betaaldatum,
betaald bedrag))

C Een grote, uitgewerkte opgave

425

Per contract wordt een uniek nummer gebruikt. Het contractnummer kan dus als sleutel worden gebruikt. Alle gegevens
worden n keer vermeld, met uitzondering van de betaalgegevens, die dus zijn opgenomen in een repeterende 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, ingangsdatum, beindigingdatum, verzekering,
aut. incasso, 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 combinatie contractnummer, betaaldatum.
2 NV = 1 NV
Er is in n groep sprake van een samengestelde sleutel, maar
het daarin opgenomen niet-sleutelkenmerk is afhankelijk van
de gehele sleutel.
3 NV ( contractnummer, klantnummer, merk, type, ingangsdatum, beindigingdatum, verzekering, aut. incasso,
maandbedrag)
( contractnummer, betaaldatum, betaald bedrag )
( klantnummer, naam, adres, postcode, plaats, telefoonnummer, geboortedatum)
Er is een nieuwe groep ontstaan met daarin de gegevens van
de klant.

426

Databaseontwikkeling 4 Access 2007

We vinden dus uiteindelijk:


CONTRACT

BETALING
KLANT

( contractnummer, klantnummer, merk, type,


ingangsdatum, beindigingdatum, verzekering, aut. incasso, maandbedrag)
( contractnummer, betaaldatum, betaald bedrag )
( 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 tweewielercentrum als
constanten beschouwd kunnen worden. Alle kenmerken repeteren in 0NV: RG(merk, type, prijs per maand). Aangezien
iedere 0NV repeteert, kunt je de RG verwijderen. Zie voor
extra informatie de laatste opmerking van paragraaf 4.3.
Vervolgens geldt dat de gevonden nulde normaalvorm ook
direct de eerste, tweede en derde normaalvorm is. We krijgen
dus uiteindelijk:
VOERTUIG

( merk, type, prijs per maand )

a.2. De integratie geeft in eerste instantie de volgende vier tabellen.


CONTRACT

BETALING
KLANT
VOERTUIG

( contractnummer, klantnummer, merk, type,


ingangsdatum, beindigingdatum, verzekering, aut. incasso, maandbedrag)
( contractnummer, betaaldatum, betaald bedrag )
( klantnummer, naam, adres, postcode, plaats,
telefoonnummer, geboortedatum)
( merk, type, prijs per maand )

Door de integratie ontstaat er plotseling een procesgegeven.


Het maandbedrag in de tabel CONTRACT is na integratie een
procesgegeven geworden, omdat dit bedrag ook kan worden

427

C Een grote, uitgewerkte opgave

afgeleid 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 berekend. We laten het
maandbedrag dus achterwege. We krijgen dan:
CONTRACT

BETALING
KLANT
VOERTUIG

( contractnummer, klantnummer, merk, type,


ingangsdatum, beindigingdatum, verzekering, aut. incasso )
( contractnummer, betaaldatum, betaald bedrag )
( klantnummer, naam, adres, postcode, plaats,
telefoonnummer, geboortedatum)
( merk, type, prijs per maand )

Dit levert het volgende ER-diagram op.


BETALING

CONTRACT

o.b.v. contractnummer

KLANT

o.b.v. klantnummer
o.b.v. merk + type

VOERTUIG

Bij een contract kunnen nul, n of meer betalingen horen. Een


betaling hoort bij precies n contract. Bij een contract hoort precies 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 voertuig. Bij een bepaald type
voertuig kunnen we nul, n of meer contracten vinden.
b. Technisch ontwerp
b.1. De ontworpen tabellen kun je terugvinden in de database
TWEEWIELERCENTRUM. Deze database is te vinden op de
downloadbestanden bij dit boek op www.academicservice.nl.

428

Databaseontwikkeling 4 Access 2007

Een afdruk van de ontworpen tabellen is weergegeven in de


guren C.3 tot en met C.6.
Figuur C.3

Figuur C.4

Figuur C.5

Figuur C.6

b.2. De relaties zoals weergegeven in het ER-diagram zijn ook


opgenomen in de database TWEEWIELERCENTRUM. Een
afdruk is te vinden in guur C.7.

429

C Een grote, uitgewerkte opgave

Figuur C.7

c. Opbouwen tabellen
c.1. De inhoud van de tabellen kan worden teruggevonden in de
database TWEEWIELERCENTRUM. Voor de overzichtelijkheid is de inhoud van de tabellen ook hier weergegeven in de
guren C.8 tot en met C.11
Figuur C.8

contract
contract-

klant-

nummer

nummer

merk

type

ingang-

beeindi-

verzeke-

aut

datum

ging-

ring

incasso

datum
1

6 Asprilla

SX50

13-3-2009

Ja

Ja

4 Yamaha

Giggle

13-3-2009

Nee

Nee

9 Asprilla

SX50

16-5-2009

Nee

Ja

3 Vespa

GTS

31-5-2009

Ja

Ja

2 Asprilla

SR50 R

1-6-2009

Nee

Nee

1 Yamaha

Neos 25

1-6-2009

Nee

Nee

1 Vespa

LX

1-9-2009

1-9-2009

Nee

Nee

5 Yamaha

Giggle

13-10-2009

Ja

Ja

7 Vespa

GTS

24-1-2009

Ja

Ja

10

8 Yamaha

Giggle

26-1-2009

Nee

Ja

11

4 Asprilla

SR50 R

12

8 Vespa

LX

26-3-2009

3-1-2009

Ja

Ja

26-3-2009

Nee

Nee

430

Databaseontwikkeling 4 Access 2007

betaling

Figuur C.9
contractnummer

betaaldatum

betaald bedrag

1-1-2009

` 23,40

1-2-2009

` 23,40

1-3-2009

` 23,40

1-4-2009

` 16,00

1-5-2009

` 23,40

1-6-2009

` 23,40

1-7-2009

` 23,40

1-8-2009

` 23,40

1-9-2009

` 23,40

1-10-2009

` 23,40

1-11-2009

` 23,40

1-12-2009

` 23,40

1-1-2009

` 12,50

1-4-2009

` 9,00

1-5-2009

` 12,50

1-7-2009

` 25,00

1-9-2009

` 25,00

1-10-2009

` 12,50

2
2
3
3
3
3
3
3
3
3
3
3
4
4
4
4
4
4
4
4
5

1-11-2009

` 12,50

1-12-2009

` 12,50

1-1-2009

` 13,00

1-2-2009

` 13,00

1-3-2009

` 13,00

1-6-2009

` 13,00

1-7-2009

` 13,00

1-8-2009

` 13,00

1-9-2009

` 13,00

1-10-2009

` 13,00

1-11-2009

` 13,00

1-12-2009

` 13,00

1-1-2009

` 18,00

1-2-2009

` 18,00

1-7-2009

` 18,00

1-8-2009

` 18,00

1-9-2009

` 18,00

1-10-2009

` 9,00

1-11-2009

` 9,00

1-12-2009

` 36,00

1-1-2009

` 32,00

431

C Een grote, uitgewerkte opgave

betaling
contractnummer

betaaldatum

betaald bedrag
` 25,00

1-2-2009

1-3-2009

` 25,00

1-7-2009

` 32,00

1-8-2009

` 32,00

1-9-2009

` 32,00

1-10-2009

` 32,00

1-11-2009

` 32,00

1-12-2009

` 32,00

1-7-2009

` 13,75

1-8-2009

` 13,75

1-9-2009

` 13,75

1-1-2009

` 22,50

1-2-2009

` 22,50

1-3-2009

` 22,50

1-10-2009

` 22,50

1-11-2009

` 22,50

1-12-2009

` 22,50

1-1-2009

` 12,50

1-2-2009

` 12,50

1-3-2009

` 12,50

1-11-2009

` 5,00

1-12-2009

` 12,50

1-2-2009

` 6,00

1-3-2009

` 18,00

10

1-2-2009

` 3,50

10

1-3-2009

` 12,50

11

1-2-2009

` 26,00

11

1-3-2009

` 28,80

432

Databaseontwikkeling 4 Access 2007

Figuur C.10

klant
klantnum-

naam

telefoon-

geboorte-

nummer

datum

adres

postcode

plaats

1 Jansen,
Jan

Kerkstraat 2

7607 BS

Almelo

0546753796

1-3-1993

2 Walters,

Merelstraat 13

7605 BG

Almelo

0546758869

27-12-1992

Oranjestraat

7461 DK

Rijssen

0548442943

31-3-1993

mer

Wouter
3 Verploeg,
Koen

164

4 Wit,
Erica de

Almeloseweg
182

7614 LB

Mariaparochie

0546433839

15-11-1993

5 Boer,
Koen de

Eikenlaan 10

7461 XS

Rijssen

0548499303

28-3-1990

6 Gerets,
Monique

1e lageveldsweg 2

7641 RM

Wierden

0546933302

3-12-1992

7 Gerets,

1e lagevelds-

7641 RM

Wierden

0546933302

3-12-1992

Jannie

weg 2

8 Hoofd,
Eric

Hofstraat 13

7607 AB

Almelo

0546749941

26-12-1993

9 Mens,

Ravelstraat 42

7604 HZ

Almelo

0546747732

18-11-1992

Hans

Figuur C.11

voertuig
merk

type

Asprilla

SR50 R

prijs per maand


` 32,00

Asprilla

SR50 SL

` 29,00

Asprilla

SX50

` 26,00

Vespa

GTS

` 20,00

Vespa

LX

` 22,50

Yamaha

Giggle

` 12,50

Yamaha

Neos 25

` 13,75

c.2. Er is gekozen om betalingen van klanten in te voeren. Het


formulier is gemaakt met de wizard Formulier.

C Een grote, uitgewerkte opgave

433

Figuur C.12

d. Opvragen gegevens met querys


d.1. Figuur C.13 bevat een afdruk van het ontwerpscherm. Figuur
C.14 toont de gegenereerde uitvoer.
Figuur C.13

Figuur C.14

434

Databaseontwikkeling 4 Access 2007

d.2. Figuur C.15 bevat een afdruk van het ontwerpscherm. Figuur
C.16 toont de gegenereerde uitvoer.
Figuur C.15

Figuur C.16

d.3. Figuur C.17 bevat een afdruk van het ontwerpscherm. Figuur
C.18 bevat de gegenereerde uitvoer.

C Een grote, uitgewerkte opgave

435

Figuur C.17

Figuur C.18

d.4. Figuur C.19 bevat een afdruk van het ontwerpscherm. Figuur
C.20 bevat de gegenereerde uitvoer.
Figuur C.19

436

Databaseontwikkeling 4 Access 2007

Figuur C.20

d.5. Figuur C.21 bevat een afdruk van het ontwerpscherm. Figuur
C.22 bevat de gegenereerde uitvoer.
Figuur C.21

Figuur C.22

C Een grote, uitgewerkte opgave

437

e. Manipuleren gegevens
e.1. Figuur C.23 bevat een afdruk van het ontwerpscherm. Er is
gebruikgemaakt van de IIf-functie om de wijziging tot stand
te brengen.
Figuur C.23

e.2. Figuur C.24 bevat een afdruk van het ontwerpscherm. Om


deze query goed te laten verlopen dient de relatie tussen
Contract en Betaling te zijn ingesteld op Gerelateerde records trapsgewijs verwijderen. Hierdoor zullen ook de betalingen van de betrokken contracten worden verwijderd!
Figuur C.24

438

Databaseontwikkeling 4 Access 2007

f. Rapporten
f.1. Figuur C.25 bevat een afdruk van het ontwerpscherm.
Figuur C.25

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. Hierbij is
gebruikgemaakt van de IIf-functie om het maandbedrag uit te
rekenen, zie een gedeelte van de query in guur C.26. Er is bij de
bouw van de query voor gezorgd dat eerst om een contractnummer wordt gevraagd. De gegevens van het bijbehorende contract
worden vervolgens gegenereerd. De query is opgeslagen onder de
naam rptF2.
Vervolgens is op basis van deze query het rapport opgemaakt.
Figuur C.27 bevat een afdruk van het ontwerpscherm.

C Een grote, uitgewerkte opgave

Figuur C.26

Figuur C.27

439

441

Index
Symbolen
#Fout 311
#Naam? 311
A
Aantal 111
Aantal kolommen 134
Aantal records 234
Aantal rijen 135
Aantal waarden 234
ACCDE maken 342
achtergrondkleur 271
actiekolom 261
Afbeeldingsformaatmodus
Kader niet vullen 173
Kader vullen 173
Uitsnede 173
Afdrukvoorbeeld 139
Afhankelijke kolom 134
alias 358
Alle acties weergeven 265
Alleen lijst 135, 183
Alleen toevoegen 404
AND 349
ANSI 353
applicatie 5
argumenten 261
ASC 360
Attachment 168
attribuut 37, 76
attribuutwaarde 37
AutoOpmaak 139
autorisatie 15
AVG 362
B
Back-up maken 127
Berichtenbalk 420
Bestaande velden toevoegen 164
bestanden 38

Best passend 192


besturingselementen 187
besturingselementnaam 280
BETWEEN 350
beveiligingswaarschuwing 85
Bewerken lijst met waarden 178
Bewerkingsformulier lijstitems 192
Bij geen gegevens 325
Bij klikken 268
Bijlage 82
Bijlagenveld 168
FileData 172, 173
FileName 172, 173
FileType 172, 173
Bij Openen 269
Bij opmaken 320
bijschrift 399
Bij sluiten 329
Byte 82
C
cartesisch product 318
conceptueel datamodel 14, 63
constante gegevens 25
constantentabel 290
converteren 7
COUNT 362
D
database 9
aanmaken 77
selecteren 84
database-administrator 14
Database comprimeren 157
Database herstellen 157
Database sluiten 83
datadictionary 66
datamodel 14
datumaanduiding 350
Datumkiezer weergeven 404
DELETE FROM 386
derde normaalvorm 33

442

Databaseontwikkeling 4 Access 2003

DESC 360
detail 224
Details verbergen 208
Details weergeven 208
Developer Extensions 342
DISTINCT 351
draaigraeken 211
Draaigraekweergave toestaan 215
draaitabellen 205
dubbele repeterende groep 49, 58
duplicaten verbergen 226
E
Eerste 111
eerste normaalvorm 28
Eigenschappenvenster 118
eilandautomatisering 1
Eindtotaal 234
elementaire gegevens 25
embedded macro 259
Enkele precisie 82
entiteit 37
entiteit-occurence 37
Entiteit-Relatie-Diagram 38
ER-Diagram 38
Etiketten 147
Expression Builder 276
F
lteren 91
Filter in-/uitschakelen 91
Filters
Datumlters 91
Getallters 91
Tekstlters 91
foreign key 40
Formulier
met Wizard 154
snelle methode 152
formulier(en) 161
FROM 348

functie
Choose 250
Date 289
Datepart 108
DateSerial 108
Day 108
Hour 108
IIf 117
Month 108
Now 224
Nz 330
Switch 255
Weekday 108
Year 108
functioneel datamodel 14, 63
G
Gebeurtenis 274
gegeven 2
gegevens
manipuleren 424, 437
opvragen 433
gegevensanalyse 20
gegevensbank 9
Gegevensbladweergave 100
gegevenstructuur 7
Geladen formulieren 268
Gem 111
gestapelde weergave 141
Graektype wijzigen 217
groeperen 120, 365
Groeperen en sorteren 232
Groepering en totalen 232
Groepsvak 164
GROUP BY 365
H
HAVING 366
homoniemen 64
hoofdformulier 184
Hoogte 246, 299

443

Index

I
identity integrity 27, 345
IN 351
inconsistent 5
Indelingsweergave 138
indexeren 401
informatie 2
informatie-analyse 20
informatiebehoefte 20
ingeschakeld 187
Ingesloten macro 259
inner join 382
INSERT INTO 386
Integer 82
integreren 65
integriteit 2
Invoermasker 290, 396
Invoertoepassingen 417
IS NULL 351
J
join 356
joineigenschap 110
joineigenschappen 109
K
kandidaat-sleutels 28
kenmerk 26
keuzelijsten
met invoervak 173
zonder invoervak 173
Keuzelijst met invoervak 133
Keuzelijst met meerdere waarden 177
Value 179
Keuzerondje 163
klassieke bestandsorganisatie 9
knopinfo 204
Knop Sluiten 300
Kolombreedten 134
Kolomgeschiedenis weergeven 404
Kolomkoppen 134

kolommen 38
Koppeling verwijderen 157, 191
koptekst 364
L
Laatste 111
labels koppelen 237
Lange integer 82
left join 382
Legenda 214
Lengte nul toegestaan 400
Lijn 246
Lijstbreedte 135
Lijst met velden 178
LIKE 351
logisch ontwerp 424
Logo 172
M
Macro
AlleTijdelijkeVariabelenVerwijderen
278
AutoExec 265, 339
AutoKeys 265
Berichtvenster 262
EigenschapInstellen 279
FilterToepassen 262
FormulierOpenen 274
GoToControle 280
Instellingen 420
MacroStoppen 282
NaarBesturingselementGaan 280
NaarRecordGaan 309
OpenForm 274
Rapport openen 268
SetValue 275
Sluiten 263
StopMacro 282
TabelOpenen 261
TijdelijkeVariabeleInstellen 277
TijdelijkeVariabeleVerwijderen 278

444

Databaseontwikkeling 4 Access 2003

WaardeInstellen 275, 279


macronaam 261
MAX 362
Max 111
meerdere tabellen 356
Meerdere waarden toestaan 177
menustructuur 292
metagegevens 68
MIN 362
Min 111
minimaliteit-eis 345
MSI-bestand 342

Ontwerpfuncties voor objecten 411


Populair 405
Vertrouwenscentrum 417
Opties voor groeperen 230
Opties voor opzoeken met lter 410
Opties voor totalen 231
OR 349
ORDER BY 360
outer join 382

N
naam 307
Navigatiegedeelte 85
navigatieknoppen 296
Navigatieopties 340
Neerzetgebieden Weergaven/verbergen
211
Nieuwe pagina 253
normaliseren 23
Notatie 232, 319
nulde normaalvorm 23

P
Page/Pages 224
Page Index 199
pagina-index 199
Pagina-instellingen 140
Pagina invoegen 199
paginakoptekst 224
Pagina verwijderen 199
paginavoettekst 224
permissie 15
Primaire sleutel 82
primaire sleutel 344
procesgegevens 26
programma 287

O
Objecttype 87
ODBC 410
Ontwerpweergave 88, 139
Opbouwfunctie 248
Opbouwfunctie voor expressies 276
opdrachtknoppen 199
Open 87
Openen 87
Opties voor Access 403, 405
Aanpassen 416
Controle 414
Geavanceerd 415
Gegevensblad 411
Huidige database 407
Informatiebronnen 420

Q
Query
bijwerkquery 125
dubbele records verwijderen 131
kruistabelquery 131
niet gerelateerde records 131
Queryontwerp 111
selectiequery 104
tabelmaakquery 130
toevoegquery 131
verwijderquery 127
query
gecorreleerd 380
groepeer~ 120
selectie~ 115
Query ontwerp 102

445

R
Randbreedte 254, 299
Randkleur 253
Randstijl 246
Rapport
met Wizard 141
Paginakoptekst 252
Rapportkoptekst 252
rapport 424, 438
rapporten 221
etiketten 147
rapportkoptekst 224
rapportvoettekst 225
Rapportweergave 139
Rasterlijen 139
Rasterlijnbreedte 238
Rasterlijnen 244
Rasterlijnkleur 238
Rasterlijnstijl boven 238
record 38, 76
~kiezers 296
~locking 16
lteren 91
sorteren 90
toevoegen 89
vervangen 93
verwijderen 90
wijzigen 90
zoeken 92
Recordbron 306
RecordSelectors 296
Recordsortering opheffen 90
Records sorteren 90
redundantie 5
referential integrity 345
referentile integriteit 97
afdwingen 98
rekenkundige bewerkingen 362
rekenveld 205
rekenveld in ontwerpweergave 255
relaties 96
toevoegen 98
verwijderen 101

relationele database 13
repeterende groep 26
right join 383
rij 38
Rijbron 133
Runnen query 104
Runtime versie 342
S
Schakelbordbeheer 332
schakelborden 330
Schikken
Gestapeld 141
Grootte aanpassen aan breedste 204
Horizontale afstand vergroten 204
Links 236
Onder uitlijnen 204
Tabelvorm 141
Uitlijnen op raster 255
Verwijderen 245
Schikken van besturingselementen 204
schuifbalken 296
SELECT 348
selectievakje 161
sleutel 82
sleutelkenmerk 27
sleutelveld 82
Sluiten 83
Som 111
speciale joins 382
SQL 343
Standaardwaarde 289
standaardwaarde 399
subformulier 184
subgegevensblad 101
Subgegevensblad, Verwijderen 152
subquerys 371
SUM 362
synoniemen 65
Systeem objecten weergeven 340

446

Databaseontwikkeling 4 Access 2003

T
Tabbesturingselement 194
tabbladen 193
tabel 4, 66, 344
aanpassen 88
tabelindeling 141
tabellen 38
Tabelontwerp 83
tabstop 202
Tabvolgorde 309
technisch ontwerp 427
tekst met opmaak 404
Tekstopmaak 404
Tekst rechts uitlijnen 252
Tekstuitlijning 403
tijdelijke variabele 277
TempVars 281
Titel 172
toepassing 287
Toepassingsopties 408
Toepassingspictogram 340
Totalen
Aantal 94
Gemiddelde 94
Group By 121
Maximum 94
Minimum 94
Som 94
Standaarddeviatie 94
trapsgewijs bijwerken 99
trapsgewijs verwijderen 99
tweede normaalvorm 31
Type rijbron 133
U
uitvoeren 353
Uitvoeren macro 263
Uitvoeren query 104
Unieke records 118
Unieke waarden 118
UNION 387

UPDATE 386
USysRibbons 341
V
Validatieregel 315
validatieregel 399
Validatietekst 315
validatietekst 400
Valutanotatie toepassen 232
veld 66, 76
velden 38
velden met meerdere waarden 177
Venstermodus 310
vereist 400
vergrendeld 187
Vertrouwde locaties 419
vertrouwde mappen 85
Vertrouwde uitgevers 418
Vertrouwenscentrum 417
Vervangen 93
Verwijderen koppeling 157
view 14
volgorde 360
voorbeeldopgave 421
Voorwaardelijk opmaak 197
vreemde sleutel 40, 345
W
Waarschuwingsdriehoekje rapporten 227
wachtwoord 397
Weergave besturingselement 133
Werking tabtoets 296
WHERE 348
WHERE-voorwaarde 262, 268
Wisselknop 163
Wizard AutoOpmaak 312
Wizard Formulier 154
Wizard opzoeken 136
wizard opzoeken 174
Wizard Rapport 141
Wizard voor besturingselementen 194