Databaseontwikkeling Access 2003

449
Databaseontwikkeling 4 (Access 2003)

description

Databaseontwikkeling Acces 2003/2007/2010

Transcript of Databaseontwikkeling Access 2003

Page 1: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 (Access 2003)

Page 2: Databaseontwikkeling Access 2003
Page 3: Databaseontwikkeling Access 2003

Database-ontwikkeling 4 (Access 2003)

Ies Korpershoek

Ben Groenendijk

Page 4: Databaseontwikkeling Access 2003

Meer informatie over deze en andere uitgaven kunt u verkrijgen bij:Sdu KlantenservicePostbus 200142500 EA Den Haagtel.: (070) 378 98 80fax: (070) 378 97 83

© 2007 Sdu Uitgevers bv, Den HaagAcademic Service is een imprint van Sdu Uitgevers bv

1e druk, juli 20052e druk, maart 2007

Vormgeving en omslag: Studio Bassa, Culemborg

Zetwerk: Redactiebureau Heijer, Markelo

ISBN 978 90 395 2483 1NUR 124

Alle rechten voorbehouden. Alle auteursrechten en databank-rechten 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 verveel-voudigd, opgeslagen in een geautomatiseerd gegevensbestand of openbaar gemaakt in enige vorm of op enige wijze, hetzij elektronisch, mechanisch, door fotokopieën, opnamen of enige andere manier, zonder voorafgaande schriftelijke toestemming van de uitgever.

Voorzover het maken van reprografische verveelvoudigin-gen uit deze uitgave is toegestaan op grond van artikel 16 h Auteurswet 1912, dient men de daarvoor wettelijk verschul-digde 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 commerciële doeleinden dient men zich te wenden tot de uitgever.

Hoewel aan de totstandkoming van deze uitgave de uiter-ste 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 voor-komende fouten en onvolledigheden.

All rights reserved. No part of this publication may be repro-duced, stored in a retrieval system, or transmitted in any form or by any means, electronic, mechanical, photocopying, recor-ding or otherwise, without the publisher’s 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 con-sequences.

Page 5: Databaseontwikkeling Access 2003

Woord vooraf

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

basis van de nieuwe competentiegerichte eindtermen voor MBO-

ICT die vanaf 2007 van kracht zijn.

Bij de ontwikkeling van de leerstof voor de nieuwe competentie-

gerichte 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 ont-

wikkelen (ontwerpen/realiseren) als het beheren/onderhouden van

een informatiesysteem aan de hand van de toepassing van de po-

pulaire applicatie Access (in dit geval versie 2003) 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 afzon-

derlijke uitgave over informatieanalyse. De kandidaat kan met dit

boek over Access 2003 zelfstandig de opdrachten maken en daar-

voor 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 deel-

nemer in of buiten het klaslokaal veel tijd aan de computer door-

brengen. 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 toege-

past. In de opgaven wordt een aantal bestaande databases gebruikt.

Op de hierin opgeslagen gegevens moeten vervolgens de nodige

bewerkingen worden uitgevoerd.

Page 6: Databaseontwikkeling Access 2003

Databaseontw ikke l ing 4 (Access 2003)vi

Het is niet noodzakelijk eerst het deel Informatieanalyse te behan-

delen alvorens over te gaan op het deel gegevensanalyse en eventu-

eel 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 2003 in de Nederlandse versie. De bij dit

boek behorende databases zijn te vinden op de cd-rom die u achter

in het boek aantreft.

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 opgeno-

men vragen extra toelichting gegeven.

Daarnaast zijn de antwoorden (query’s) van het laatste hoofdstuk,

werken met SQL, 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 serie cases richt zich met name op de eerste zeven hoofd-

stukken van het boek, dus normaliseren, eenvoudige bewerkingen

in Access en het werken met rapporten en formulieren.

De tweede 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 pas-

sen aan uw eigen wensen.

Cases worden voortdurend aangepast of vernieuwd. Docenten

kunnen hierover contact opnemen met de auteurs via e-mail.

Ook vragen of opmerkingen zijn welkom. De adressen zijn:

[email protected] en [email protected].

Ben Groenendijk februari 2007

Ies korpershoek

Page 7: Databaseontwikkeling Access 2003

vii

Inhoud

Inleiding xiii

1 Gegevens en betrouwbaarheid 11.1 Gegevens en informatie 1

1.2 Integriteit 2

1.3 Consistentie en redundantie 4

1.4 Klassieke en moderne wijze van gegevensopslag 6

1.5 Samenvatting 10

2 Relationele databases 132.1 Databasemanagementsysteem 13

2.2 Relationele databases 16

2.3 Samenvatting 21

3 Normaliseren, inleiding 233.1 Stap 1, de nulde normaalvorm 23

3.2 Stap 2, de eerste normaalvorm 28

3.3 Stap 3, de tweede normaalvorm 31

3.4 Stap 4, de derde normaalvorm 33

3.5 Entiteit Relatie Diagram (ERD) 36

3.6 Samenvatting 40

4 Normaliseren, verdieping 474.1 Dubbele (geneste) repeterende groepen 47

4.2 Dubbele (opeenvolgende) repeterende groepen 52

4.3 Opmerkingen met betrekking tot normaliseren 56

4.4 Integreren 57

4.5 Datadictionary 60

4.6 Samenvatting 62

5 Eenvoudige bewerkingen in Access 695.1 Inleiding 69

5.2 Het programma Access starten 70

5.3 De database en de tabel creëren 71

5.4 Een bestaande database openen 77

5.5 Records manipuleren 80

Page 8: Databaseontwikkeling Access 2003

Databaseontw ikke l ing 4 (Access 2003)viii

5.6 De bestandsweergave wijzigen 85

5.7 Afdrukken van gegevens 88

5.8 Met meerdere tabellen tegelijkertijd werken 90

5.9 Gegevens selecteren en manipuleren 100

5.10 Rapporten 124

5.11 Formulieren 135

5.12 Webpagina’s 140

6 Uitgebreide formulieren 1456.1 Keuzemogelijkheden 145

6.2 Afbeeldingen – OLE-objecten 151

6.3 Keuzelijsten 156

6.4 Hoofd- en subformulieren 165

6.5 Tabbladen 174

6.6 Opdrachtknoppen 180

6.7 Draaitabellen/Draaigrafieken 185

6.8 Webpagina’s 198

7 Uitgebreide rapporten 2117.1 Rapport zonder duplicaten 211

7.2 Rapport met groepen 216

7.3 Rapport met meerdere groepen 236

8 Macro’s 2478.1 Een eenvoudige macro 248

8.2 Geavanceerde macro’s 253

9 Het bouwen van een toepassing 2719.1 Tabellen en relaties 272

9.2 Menustructuur 275

9.3 De formulieren 277

9.4 De rapporten 304

9.5 Schakelborden 328

10 SQL, Structured Query Language 34110.1 Inleiding 341

10.2 Begrippen 342

10.3 Opbouw hoofdstuk 343

Page 9: Databaseontwikkeling Access 2003

I nhoud ix

10.4 Database Bibliotheek (theorieopdrachten) 344

10.5 Database Alco (praktijkopdrachten) 345

10.6 Opvragingen uit één tabel 345

10.7 SQL gebruiken in Access 351

10.8 Eenvoudige opvragingen uit meerdere tabellen 355

10.9 Wijzigen van de volgorde 359

10.10 Rekenkundige bewerkingen 361

10.11 Groeperen 364

10.12 Subquery’s 370

10.13 Speciale joins en views 380

10.14 SQL, meer mogelijkheden 384

Appendix A Veldeigenschappen 387

Appendix B Opties 403

Appendix C Een grote, uitgewerkteopdracht 413

Index 433

Page 10: Databaseontwikkeling Access 2003
Page 11: Databaseontwikkeling Access 2003

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 pro-ces 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 normalisatie-proces de informatiestructuur bepaald worden. Deze structuur wordt vervolgens grafisch 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 gege-vens opvragen steeds meer geautomatiseerd zal worden. Er zullen formulieren, rapporten en macro’s worden ontworpen en gebruikt.

Page 12: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003xii

De ontworpen rapporten, formulieren en macro’s worden vervol-gens 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 grafische wijze bouwstenen te selecteren, deze iets aan te passen en vervolgens samen te voegen tot professioneel ogende applica-ties.

Omdat databases algemeen toepasbaar zijn, wordt het boek af-gesloten met een hoofdstuk waarin de standaard vraagtaal SQL wordt behandeld. Deze taal wordt niet alleen door Access onder-steund, maar door vrijwel ieder databasemanagementpakket dat op de markt te verkrijgen is. Enige kennis van deze taal is dus onont-beerlijk.

Page 13: Databaseontwikkeling Access 2003

1 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 geauto-matiseerd, eerst de afdeling Boekhouding, dan de Inkoopafdeling, vervolgens de afdeling Verkoop en ten slotte het Voorraadbeheer. Dit wordt eilandautomatisering genoemd. Die verschillende eiland-jes 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, internet-ten, 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, produc-tiegegevens. Van onszelf liggen ook bij vele instanties gegevens opgeslagen. Van iedere volwassen inwoner van Nederland liggen de persoonsgegevens in honderden computersystemen opgesla-

Page 14: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 20032

gen. Denk hierbij aan de banken, verzekeringsmaatschappijen, belastingdienst, gemeentelijke instellingen, sportverenigingen, motorrijtuigadministratie, school, krantadministratie, salarisadmi-nistratie, enzovoort.

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 op magne-tisch materiaal zodat de computer ze kan lezen, valt onder deze definitie, net als foto’s, geluid of beelden. Informatie is de beteke-nis 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 gevon-den telefoonnummer betekent iets voor ons. In dezelfde gegevens kunnen verschillende soorten informatie zitten. Na een repetitie-week worden per klas alle behaalde cijfers van de leerlingen op een lijst weergegeven. Voor de leerling zijn de behaalde cijfers infor-matie. Voor een docent Engels zijn in hetzelfde overzicht de cijfers die voor het vak Engels zijn behaald informatie.

1.2 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, wij-zigen 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 onbe-trouwbaar informatiesysteem. Dit lijkt misschien allemaal logisch, maar dat is in vele praktijkgevallen nog niet het geval. Met twee voorbeelden zullen we dit duidelijk maken.

gegevens

informatie

muteren

integriteit

Page 15: Databaseontwikkeling Access 2003

1 Gegevens en betrouwbaarheid 3

Na een verhuizing ontvangen mensen nogal eens onduidelijke brie-ven zoals in de volgende brief:

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 op-geslagen. 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 financiële 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 verzekeringsmaat-schappij 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

Basketbalvereniging DunkyPostbus 20503070 AB Rotterdam

M.C. den HoedLeiweg 122907 TV Capelle a/d IJssel

Geachte mevrouw Den Hoed,

Hierbij ontvangt u uw nieuwe teamgegevens en het trainingschema voor hetkomende basketbalseizoen. Hieronder staan de gegevens zoals deze in onscomputersysteem liggen opgeslagen.

M.C. den HoedLarenstraat 262984 EK Ridderkerk

Team: dames 1Training: maandag van 19.00-20.30, woensdag van 19.30-21.00

Indien er onvolledige of onjuiste gegevens zijn vermeld, kunt u telefonisch con-tact opnemen met de heer Verkerk (010 – 4830554).

Page 16: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 20034

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 adreswijzi-ging wel aangebracht bij de afdeling Hypotheken maar niet in de levensverzekeringadministratie. Na deze constatering en de aan-passing 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 figuur 1.1. In computertermen noemen we dit bestanden of tabellen.

Figuur 1.1 Levensverzekering

Polis- Naam Adres Postcode Plaats Polisbedrag Premienummer

6798316 R. Ederzeel Hoofdweg 67 1067 RT Amsterdam 191.000,00 62,50

6798317 T. de Vries Steenstraat 34 1380 VB Weesp 161.000,00 40,50

6798318 E. van der Nieuwendam 67 1621 AP Hoorn 145.000,00 124,80Wouden

6798319 E.R. Spruyt Ringweg 56 1200 GH Hilversum 127.000,00 113,90

6798320 B.J. Larenstraat 26 2984 EK Ridderkerk 168.000,00 48,50Groenendijk

……….

Hypotheek

Hypo- Naam Adres Postcode Plaats Hypotheek Rentenummer Bedrag Perc.

33-812347 R. van Dam Loefweg 56 3965 JJ Houten 113.500,00 6,1

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 2907 TV Capelle a/d 127.000,00 6,0Groenendijk IJssel

33-812351 E. van der Nieuwendam 67 1621 AP Hoorn 181.500,00 5,9Wouden

33-812352 R. van Dam Loefweg 56 3965 JJ Houten 168.000,00 5,5

……….

Page 17: Databaseontwikkeling Access 2003

1 Gegevens en betrouwbaarheid 5

Merk op dat niet iedereen die een hypotheek afsluit ook voorkomt bij de levensverzekeringen. Men kan namelijk zo’n verzeker-ing 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 figuur 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.

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 gege-vens inconsistent (onbetrouwbaar) zijn. Het is dus niet zo gemak-kelijk 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 ver-strekken. 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-

inconsistent

redundantie

Page 18: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 20036

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 figuur 1.2 ontstaan. De rechthoeken stellen de computerprogramma’s voor en de cilinders de bestanden (tabellen) met de gegevens.

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 figuur 1.3.

Gegevens worden nu dus niet meer dubbel opgeslagen (geen redun-dantie) 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

Figuur 1.2Hypotheek

Hypotheek

Levens-verzekering

Inboedel-verzekering

Opstal-verzekering

Levens-verzekering

Inboedel-verzekering

Opstal-verzekering

Page 19: Databaseontwikkeling Access 2003

1 Gegevens en betrouwbaarheid 7

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 klanten-bestand moet hiervoor aangepast worden. Er moet een zesde item (geboortedatum) aan toegevoegd worden. Het klantenbestand moet hiervoor geconverteerd worden. Converteren is de oude gegevens-structuur omzetten naar de nieuwe gegevensstructuur: klantnum-mer, naam, adres, postcode, plaats en geboortedatum. De klant-gegevens 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 klant-bestand gelezen en naar het nieuwe klantenbestand geschreven.

Figuur 1.3

converteren

Hypotheek

Klant

Levens-verzekering

Inboedel-verzekering

Opstal-verzekering

Woning

Hypotheek Levens-verzekering

Inboedel-verzekering

Opstal-verzekering

Page 20: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 20038

Vervolgens wordt de geboortedatum van die klant aan het nieuwe bestand toegevoegd. Dit proces gaat net zo lang door tot alle klan-tengegevens 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 geboor-tedatum 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 af-deling 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 geïnteresseerd. 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 klantnum-mer 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 ‘kra-len’ (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

Page 21: Databaseontwikkeling Access 2003

1 Gegevens en betrouwbaarheid 9

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 appli-caties van de andere afdelingen ook moet aanpassen aan de nieuwe gegevensstructuur van het klantenbestand, ook al zijn ze niet ge-interesseerd 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 compu-terprogramma’s voor alle andere afdelingen die van het klanten-bestand gebruikmaken, ook al zijn ze in die nieuwe gegevens niet geïnteresseerd.

De moderne manier van gegevensopslag voorziet in een oplos-sing van het hiervoor genoemde probleem. Die moderne manier van gegevensopslag noemen we een database (gegevensbank).De oude manier van gegevensopslag noemen we sindsdien klas-sieke bestandsorganisatie. Er zijn nog veel bedrijven en instellin-gen die gebruikmaken van die klassieke gegevensopslag. Het zijn veelal bedrijven die in een vroeg stadium zijn gaan automatiseren, zoals banken, financiële instellingen, belastingdienst en olie-maatschappijen. 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 euro’s 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 gegevens-structuur. Maar ook bij moderne systemen kunnen problemen ontstaan als bijvoorbeeld twee bedrijven fuseren. Ook al hebben

database

Page 22: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200310

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 (geïntegreerd) worden tot één nieuw geïntegreerd computersysteem. Daar zijn hoge kosten aan verbon-den.

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 ge-gevens). Bij eilandautomatisering (klassieke bestandsorganisatie)worden dezelfde gegevens meerdere keren opgeslagen (redun-dantie). Hierdoor moeten wijzigingen in die gegevens meerdere keren doorgevoerd worden. Wordt dit niet consequent gedaan, dan ontstaan er tegenstrijdigheden in het informatiesysteem (inconsis-tentie). 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 in-formatie die het informatiesysteem produceert, wordt de integriteitvan het informatiesysteem genoemd.

Opgaven

1. Waarom is in de klassieke bestandsorganisatie de kans op inconsis-tentie (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 klas-sieke bestandsorganisatie kostbaar in het onderhoud?

Page 23: Databaseontwikkeling Access 2003

1 Gegevens en betrouwbaarheid 111 Gegevens en betrouwbaarheid 11

6. Bij voetbalvereniging HGS wordt de financiële administratie ver-zorgd door de penningmeester, de heer Van Vliet. De ledenadmi-nistratie 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 leden-

administrateur 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 gebruik-maken?

Page 24: Databaseontwikkeling Access 2003
Page 25: Databaseontwikkeling Access 2003

2 Relationele databases

In dit hoofdstuk wordt uitgelegd wat een databasemanagement-systeem is. Ook wordt toegelicht wat een datamodel en een relati-onele database is, en verklaren we enkele begrippen uit de gege-vensanalyse.

2.1 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 wor-den voor de verschillende afdelingen niet meer dubbel opgeslagen, waardoor redundantie (overtolligheid) en inconsistentie (tegenstrij-digheid) van gegevens wordt voorkomen. Bij een database hoort een databasemanagementsysteem, afgekort DBMS. Zo’n DBMS is afbeeld in figuur 2.1. Dit systeem vormt een sluis tussen diverse computerprogramma’s en de gegevensbestanden. Het DBMS regelt

DBMS

Figuur 2.1Hypotheek Levens-

verzekeringInboedel-verzekering

Opstal-verzekering

WoningHypotheek Levens-verzekering

Inboedel-verzekering

Opstal-verzekering

DBMS

Klant

Page 26: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200314

de toevoegingen en wijzigingen in de database en zorgt er dus voor dat er geen redundantie en inconsistentie kan optreden.

In het databasemanagementsysteem worden de volledige gegevensstructuren van alle benodigde bestanden vastgelegd. Zo wordt daar de gegevensstructuur voor het klantenbestand vast-gelegd, klantnummer, naam, adres, postcode, plaats en geboor-tedatum. 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 data-model 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 datamodelgenoemd.

Nadat alle volledige gegevensstructuren zijn vastgelegd, wordt vervolgens per afdeling vastgelegd welke gegevens zij nodig heb-ben uit de verschillende bestanden. Zo wordt voor de afdeling Hypotheken vastgelegd dat zij van het klantenbestand alleen klant-nummer, 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 wor-den. Mocht iemand van de klantenadministratie van de afdeling Hypotheken een overzicht wensen van alle bekende klantengege-vens, 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-admini-strator. De database-administrator legt de volledige structuur vast en per afdeling de view op de database. Ook kan de database-administrator de view per afdeling wijzigen, ‘vergroten’ of ‘ver-kleinen’.

conceptueel of functioneel

view

database-administrator

Page 27: Databaseontwikkeling Access 2003

2 Relationele database 15

Als nu de gegevensstructuur van een bestand aangepast moet wor-den, wordt dat doorgegeven aan de database-administrator. Stel dat de afdeling Inboedelverzekeringen het telefoonnummer van een klant wenst, dan wijzigt de database-administrator de gegevens-structuur 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 computerprogramma’s van bijvoorbeeld de afdeling Hypotheken ondervinden hier geen enke-le 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?

We hebben al gezegd dat de view op de database wordt vastge-legd 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 voor deze gegevens, oftewel toe-stemming om deze gegevens te gebruiken. Zo kan bijvoorbeeld al-leen de personeelsfunctionaris het salaris van een werknemer zien en de andere personen die gebruikmaken van de werknemergege-vens niet. Vertegenwoordigers die in rayons werken, bijvoorbeeld provincies, zien alleen de klantgegevens uit hun rayon. Een over-zicht van alle klanten levert dan bijvoorbeeld alleen maar klanten uit de provincie Utrecht.

Met autorisatie kunnen we ook vastleggen dat een gebruiker de gegevens alleen mag raadplegen. Het toevoegen, wijzigen of ver-wijderen van gegevens is dan niet toegestaan. Natuurlijk zijn alle variaties hierop mogelijk, zoals wel toevoegen van nieuwe gege-vens maar niet het verwijderen van gegevens.

Het DBMS kan nog meer taken uitvoeren, zoals back-ups ma-ken 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

autorisatie

Page 28: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200316

gegeven kunnen wijzigen. Dit wordt record-locking genoemd. We zullen dit toelichten met een voorbeeld. Het bedrijf Sunparks ver-huurt 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 vakantiehuis-jes 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 vakantie-huisjes 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 compu-ter 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 hiërarchische 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 relatio-nele databases aan de hand van een voorbeeld toelichten. Op de afdeling Hypotheek zijn de hypotheekgegevens nog volgens de klassieke opslagmethode opgeslagen, zie figuur 2.2. Bij de afde-ling Levensverzekeringen zijn weer andere gegevens gewenst, zie figuur 2.3, ook op de klassieke manier opgeslagen.

record-locking

Page 29: Databaseontwikkeling Access 2003

2 Relationele database 17

Hierin is duidelijk de redundantie en inconsistentie te zien. Klantgegevens liggen op de verschillende afdelingen dubbel op-geslagen, 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 incon-sistentie als volgt opgelost. Men slaat de klantgegevens van alle afdelingen apart op en geeft aan iedere klant een uniek klantnum-mer. De gegevens van iedere klant worden slechts één keer opge-slagen. De hypotheekgegevens en polisgegevens van de klanten worden daarna via het klantnummer gekoppeld (gerelateerd) aan de klantgegevens, zie figuur 2.4.

Hypotheek

Hypo- Naam Adres Postcode Plaats Hypotheek Rentenummer Bedrag Perc.

33-812347 R. van Dam Loefweg 56 3965 JJ Houten 113.500,00 6,1

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 2907 TV Capelle a/d 127.000,00 6,0Groenendijk IJssel

33-812351 E. van der Nieuwendam 67 1621 AP Hoorn 181.500,00 5,9Wouden

33-812352 R. van Dam Loefweg 56 3965 JJ Houten 168.000,00 5,5

……….

Figuur 2.2

Figuur 2.3 Levensverzekering

Polis- Naam Adres Postcode Plaats Polisbedrag Premienummer

6798317 T. de Vries Steenstraat 34 1380 VB Weesp 161.000,00 140,50

6798318 E. van der Nieuwendam 67 1621 AP Hoorn 145.000,00 124,80Wouden

6798319 E.R. Spruyt Ringweg 56 1200 GH Hilversum 127.000,00 113,90

6798320 B.J. Larenstraat 26 2984 EK Ridderkerk 168.000,00 148,50Groenendijk

……….

Page 30: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200318

Er is geen redundantie meer, alle gegevens zijn maar één keer opgeslagen. De relatie tussen de hypotheekgegevens en klant-gegevens verloopt via het klantnummer. Voor de levensverzeke-ringgegevens 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

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 Rente KlantnrBedrag Perc.

33-812347 113.500,00 6,1 10006

33-812348 191.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 168.000,00 5,5 10006

……….

Levensverzekering

Polisnummer Polisbedrag Premie Klantnr

6798316 191.000,00 162,50 10002

6798317 161.000,00 140,50 10001

6798318 145.000,00 124,80 10004

6798319 127.000,00 113,90 10005

6798320 168.000,00 148,50 10003

……….

Figuur 2.4

Page 31: Databaseontwikkeling Access 2003

2 Relationele database 19

luidt: het klantnummer uit de tabel Klant is gelijk aan het klant-nummer uit de tabel Hypotheek.

Nu kunnen we ook de definitie van een database geven. Een data-base 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 figuur 2.5.

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 figuur 2.6.

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?”

definitie database

Hypotheek

Hyponummer Hypotheek Rente KlantnrBedrag Perc.

33-812350 127.000,00 6,0 10003

Klant

Klantnr Naam Adres Postcode Plaats

10003 B.J. Groenendijk Leiweg 12 2907 TV Capelle a/d IJssel

Figuur 2.5

Klant

Klantnr Naam Adres Postcode Plaats

10006 R. van Dam Loefweg 56 3965 JJ Houten

Hypotheek

Hyponummer Hypotheek Rente KlantnrBedrag Perc.

33-812347 113.500,00 6,1 10006

33-812352 168.000,00 5,5 10006

Figuur 2.6

Page 32: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200320

Door het klantnummer van Van Dam (nummeridentificatie) wor-den automatisch de bijbehorende klant- en hypotheekgegevens gevonden.

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 werk-plek 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 beke-ken 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 vaststel-len. Uiteraard is het vaststellen van die informatiebehoefte een ingewikkelde klus. Niet alleen moet vastgesteld worden welke gegevens waar opgeslagen worden, maar ook vanuit welke invals-hoeken er gewerkt wordt. Dit proces wordt informatie-analyse ge-noemd. Daarna moeten de informatiebehoeften worden ‘vertaald’ naar gegevensstructuren, zodat de gegevens zonder redundantie en inconsistentie worden opgeslagen. We noemen dit gegevensana-lyse. We maken daarbij gebruik van een manier die is bedacht door de Amerikaan Edgar Codd. Deze 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, verwijde-ren of overzichten/rapporten kunnen afdrukken.

Er zijn vele databasepakketten te koop. Voor de pc’s zijn de be-kendste pakketten Access, FoxPro en Paradox. 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, Sybase en SQL-Server. SQL-Server is de zware database van Microsoft. De firma Oracle is na Microsoft de grootste softwarefabrikant ter wereld.

Access wordt veel toegepast op pc’s waarbij de database lokaal op de harde schijf van de computer wordt opgeslagen. Anderen

informatiebehoefte

informatie-analyse

gegevensanalyse

Page 33: Databaseontwikkeling Access 2003

2 Relationele database 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 kun-nen 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 pc’s (clients) waarbij Access gebruikmaakt van de Oracle-database op de server. Access wordt dan front-end software genoemd en Oracle 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. Het front-end/back-end-prin-cipe wordt in grotere organisaties voor hun databases veel toege-past. De combinatie van gebruiksgemak aan de front-endkant en degelijkheid aan de back-endkant is dan ook een heel aantrekke-lijke. Helaas vergeten vele gebruikers eerst de informatiebehoefte nauwkeurig te bepalen. Het normaliseren van de gegevens wordt dan niet of slechts intuïtief 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 data-base 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 ge-gevens 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-managementsysteem (DBMS). Hiermee kunnen de tabellen wor-

front-end/

back-end

Page 34: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200322

den gemaakt, de relaties worden gelegd, de tabellen gevuld wor-den, 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, Sybase en Oracle. De Access-database 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 firma 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 geïnstalleerd op de lokale pc’s, zodat direct reizen geboekt kunnen worden. Die boe-kingen 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?

Page 35: Databaseontwikkeling Access 2003

3 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.

Voor het bepalen van de indeling van de database bestaan verschil-lende 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 normali-seren 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 geïnteresseerd te zijn in het jaar van uitbrengen van de cd, dan zul-len we dit jaartal uiteraard moeten opnemen in de database. Als hij aangeeft absoluut niet te willen weten door welke muziekmaat-schappij een cd is uitgegeven, heeft het geen zin om dit gegeven

normaliseren

Page 36: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200324

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 geïnteresseerd kunnen zijn. Hieruit blijkt dat we niet kunnen pra-ten 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 ge-bruiker verschillen. Het is dus noodzakelijk om tijdens het ont-werpen 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 cd’s onder de aandacht wil brengen. Hij krijgt hiervoor een kleine onkostenvergoeding die hij gebruikt om zijn cd-collec-tie 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 pre-cies wat hij aan het begin van de maand allemaal heeft gedraaid. Daarom maakt hij het betreffende overzicht (zie figuur 3.1) direct na afloop van het programma. Daarop staat vermeld welke num-mers hij heeft gedraaid. Ieder nummer heeft een eigen code. Deze code is bepaald door een van de medewerkers van het lokale ra-diostation. 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 zo’n 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

Page 37: Databaseontwikkeling Access 2003

3 Normaliseren, inleiding 25

van een of meer overzichten en ervoor zorgen dat de daarop aan-wezige informatie kan worden verzorgd. Het door Paul gewenste overzicht is afgebeeld in figuur 3.1.

We nemen aan de hand van figuur 3.1 de eerste stap om de gege-vens uiteen te rafelen. We krijgen dan de zogenaamde nulde nor-maalvorm. We bepalen de nulde normaalvorm door alle elemen-taire, relevante gegevens te bepalen en op te schrijven.

Op ons overzicht staat een aantal verschillende gegevens.

Allereerst zien we een koptekst boven het overzicht. Deze kop-tekst 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 nooit op in de database.

TerzijdeWe 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 DJ’s 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!

Figuur 3.1

Page 38: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200326

Vervolgens zien we een aantal gegevens die iedere keer zullen ver-schillen: 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.

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, zou-den 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 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 gege-vens zullen we meestal de term attributen gebruiken.

Met de door ons gevonden attributen is iets speciaals aan de hand. Het eerste gegeven, 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 vol-gende manier:

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

Daarbij staat RG voor repeterende groep (repeating group). Alle gegevens die meerdere keren, repeterend, voorkomen, staan ver-volgens tussen ronde haken vermeld.

procesgegeven

elementaire gegevens

samengestelde gegevens

attributen

repeterende groep

Page 39: Databaseontwikkeling Access 2003

3 Normaliseren, inleiding 27

Het overzicht uit figuur 3.1 is het overzicht van 17 februari 2001. 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 sleutelattribuut. We geven het sleutelattribuut aan door dit te onderstrepen. We hebben nu uiteindelijk de nulde normaalvorm gevonden. We noteren dit op de volgende manier:

0 NV (datum, RG (code, titel, artiest, soortcode, soortomschrijving))

Bij het begrip sleutelattribuut kunnen we nog het volgende opmer-ken. Allereerst zal een sleutelattribuut 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. Met andere woorden, er mogen in onze stapel geen twee overzichten voor-komen met daarop dezelfde datum. In dat geval zouden we immers niet weten welke van de twee de juiste is.Vervolgens geldt dat een sleutelattribuut altijd zo minimaal moge-lijk 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-2001 + zaterdag). Omdat we echter ook met een deel hiervan (datum) als sleutel kun-nen werken, zijn we verplicht het overtollige deel, de dagaandui-ding, weg te laten. We kunnen volstaan met alleen de datum omdat bij iedere datum slechts één dagaanduiding hoort.

Ten slotte merken we nog even op dat er soms sprake is van meer-dere attributen die als sleutelattribuut zouden kunnen fungeren. We noemen dit kandidaatsleutels. Een voorbeeld hiervan is het leerlingnummer zoals dat op school gebruikt wordt en het CRI-nummer waaronder iemand in Groningen bekend is. Ook het CRI-nummer is op school bekend. Men heeft daar nu om een leerling te kunnen aanwijzen twee mogelijkheden, twee kandidaatsleutels.

sleutelattribuut

kandidaatsleutels

Page 40: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200328

Zou men ook nog het SoFi-nummer kennen, dan zou er zelfs sprake zijn van een drietal kandidaatsleutels. In het algemeen kiest men uit de kandidaatsleutels er één die als sleutelattribuut zal gaan fungeren.

Maak opdracht 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 auto-matisch 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 gege-vens 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 Coming Home van Romeo in een jaar totaal zestig keer heeft gedraaid, hij ook zestig keer alle gegevens heeft genoteerd. Dat is toch raar? Waarom kun-nen 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.

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 reeks 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.

Page 41: Databaseontwikkeling Access 2003

3 Normaliseren, inleiding 29

We krijgen dan:

(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. Daartoe moeten we ons eerst afvragen hoe we de nu ontstane groep terug-zien op het originele overzicht. Dan weten we namelijk wat we proberen aan te wijzen en kunnen we bepalen wat een goede sleu-telkeuze is. Kijk eens naar figuur 3.2.

Onze groep gegevens, met eenmaal een datum, eenmaal een code, eenmaal een titel, enzovoort vinden we terug als een enkele regel van het overzicht. Om precies één regel op een bepaald formulier aan te duiden moeten we eerst aangeven naar welke formulier, van welke 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 uitzen-ding 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 delen 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

Figuur 3.2

Page 42: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200330

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 verschil-lende datums, kunnen terugvinden. 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 sleu-tel. 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 ver-wijderen 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))

Door de repeterende groep te verwijderen houden we alleen over:

(datum)

Deze groep voegen we toe. We krijgen dan uiteindelijk de eerste normaalvorm:

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.

Page 43: Databaseontwikkeling Access 2003

3 Normaliseren, inleiding 31

In het toegelichte voorbeeld zien we dat de sleutel uit de nulde nor-maalvorm (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 opdracht 3.2.

3.3 Stap 3, de tweede normaalvorm

Zoals reeds gezegd heeft de door ons gevonden eerste normaal-vorm 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 attributen (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 toelich-ten. We kijken alleen maar naar groepen in de eerste normaalvorm waarbij de sleutel samengesteld is, dus uit meerdere attributen bestaat. In ons geval de groep:

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

We moeten nu zoeken naar niet-sleutelattributen die slechts af-hankelijk zijn van een deel van de sleutel, dus in ons voorbeeld van alleen de datum of alleen de code. De gegevens titel, artiest, soortcode en soortomschrijving hebben niets te maken met de datum, maar zijn alleen maar afhankelijk van de code van het ge-draaide nummer (‘vertel ons de code en wij vertellen u de artiest, de titel, enzovoort’). Die hebben dus niets te maken met de datum. Kortom, de gegevens titel, artiest, soortcode en soortomschrijving zijn niet afhankelijk van de gehele sleutel, maar slechts van een deel van de sleutel. Deze gegevens nemen we apart, tezamen met het deel van de sleutel waarvan ze afhankelijk blijken te zijn. We krijgen dan:

(code, titel, artiest, soortcode, soortomschrijving)

Page 44: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200332

In de originele groep laten we de betreffende niet-sleutelvelden achterwege. We hadden:

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

en we krijgen nu dus:

(datum, code)

Let erop dat het sleuteldeel waarvan de niet-sleutelvelden afhan-kelijk waren (code) in deze groep gewoon blijft bestaan.

De nu gevonden groepen:

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

vullen we ten slotte aan met de groepen die we in de eerste nor-maalvorm al hadden gevonden maar waar geen samengestelde sleutel in aanwezig was.

We krijgen dan uiteindelijk de tweede normaalvorm:

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 num-mer 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 opdracht 3.3.

Page 45: Databaseontwikkeling Access 2003

3 Normaliseren, inleiding 33

3.4 Stap 4, de derde normaalvorm

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

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

Er zit in deze tweede normaalvorm nog een vorm van overtollig-heid (redundantie). Die heeft te maken met de attributen soortcode en soortomschrijving. Bij ieder nummer staan beide gegevens opgenomen. Als we de gegevens van 1000 nummers op single heb-ben, 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 normaal-vorm.Om de derde normaalvorm te bepalen vragen we ons of er niet-sleutelattributen (niet-onderstreepte gegevens) zijn die niet af-hangen van de sleutel, maar die eigenlijk afhangen van andere niet-sleutelattributen. Als dat zo is, nemen we deze gegevens op in een nieuwe groep, geven daar de sleutel aan en verwijderen uit de originele groep het afhankelijke attribuut.

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 er sprake van een aantal niet-sleutel-attributen. We gaan deze allemaal langs en vragen ons steeds af of ze afhankelijk zijn van de sleutel of van een ander niet-sleutelat-tribuut. Om de titel van een nummer te weten te komen hebben we niets aan de artiest, die kan immers meerdere nummers op zijn repertoire hebben staan. Het heeft ook niets te maken met de soort

Page 46: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200334

muziekdrager, single of cd. Nee, de titel is geheel afhankelijk van de code van het nummer: ‘vertel ons de code en wij vertellen u welke titel daarbij hoort’. De titel is dus geheel afhankelijk van de sleutel. We laten de titel met rust. Om dezelfde reden doen we niets met artiest en soortcode.

Met de soortomschrijving is wel iets speciaals aan de hand. Om deze te weten te komen hoeven we niet te weten over welk num-mer we precies praten (de code) maar moeten we weten welke soortcode van toepassing is: ‘vertel ons de soortcode en wij vertel-len u de soortomschrijving’. De soortcode heeft dus niets te maken met de sleutel, maar alles met een ander niet-sleutelattribuut. We nemen deze twee attributen daarom apart op in een afzonderlijke groep:

(soortcode, soortomschrijving)

Daarbij geldt dat de soortcode het sleutelattribuut zal worden: ‘ver-tel ons de code en wij vertellen u de omschrijving’. Dus:

(soortcode, soortomschrijving)

In de originele groep laten we het nu het afhankelijke niet-sleute-lattribuut (soortomschrijving) achterwege. We houden dan over:

(code, titel, artiest, soortcode)

Let erop dat het attribuut 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 ande-re, 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

Page 47: Databaseontwikkeling Access 2003

3 Normaliseren, inleiding 35

zal daarbij worden vertaald in een afzonderlijke tabel. Hierdoor kunnen we later op relatief eenvoudige wijze alle gegevens invoe-ren en alle gewenste informatie opvragen. We zullen daar in latere hoofdstukken uitgebreid op terugkomen.

Eerst moeten we nog een paar afrondende handelingen verrich-ten. De eerste handeling bestaat uit het toekennen van namen aan de gevonden groepen, aan de gevonden tabellen. De eerste tabel geven we de naam SOORT, omdat daarin de soort muziek-drager wordt bijgehouden, single of cd. De tweede tabel noemen we TRACK omdat daarin de gegevens van de tracks worden bijgehouden. In de derde tabel worden de gegevens bijgehouden van de nummers die gedraaid zijn, we kunnen dit zien als een DRAAILIJST. Ten slotte hebben we nog de laatste tabel waarin de datums liggen opgeslagen van de dagen waarop Paul een program-ma heeft verzorgd. Deze tabel noemen we DATUM.

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

We kunnen ons echter afvragen of het zin heeft om deze tabel bij te houden. Immers, een overzicht van alle draaidatums kunnen we ook afleiden uit de tabel DRAAILIJST. Tenslotte komen alle datums daar ook in voor. Omdat de tabel DATUM verder geen speciale betekenis heeft, zullen we deze weglaten. Daardoor gaan er geen gegevens verloren.We houden dan dus 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 tabel-len waarin alleen maar sleutelattributen voorkomen. De tabellen mogen alleen maar worden weggelaten als er daardoor verder geen informatie verloren gaat. Niet iedere tabel die bestaat uit alleen maar sleutelattributen mag dus worden weggelaten! Controleer altijd terdege. De groep DRAAILIJST mag in ons voorbeeld niet

Page 48: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200336

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.

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 tweede normaalvorm gelijk blijkt te zijn aan de eerste normaalvorm, noteren we bij de tweede nor-maalvorm: 2NV = 1NV.

Maak opdracht 3.4.

3.5 Entiteit Relatie Diagram (ERD)

Tijdens het normalisatieproces hebben we voornamelijk gesproken in termen van gegevens en groepen met gegevens. Officieel zijn er echter andere termen in gebruik.

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

In plaats van gegevens hebben we het officieel 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 ‘So close’ kunnen optreden. De attributen zien we in het schema van figuur 3.3 terug als kolommen. Attributen beschrijven groepen, groepen die voor de gebruiker, in ons geval Paul, betekenisvol zijn. In plaats van de term groepen gebruiken we meestal 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 figuur 3.3.

atribuutwaarde

entiteit

entiteit-occurence

Page 49: Databaseontwikkeling Access 2003

3 Normaliseren, inleiding 37

In ons voorbeeld zijn in totaal drie entiteiten gevonden. Deze drie entiteiten hangen niet als los zand aan elkaar maar hebben duide-lijk 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 entiteit DRAAILIJST de door ons 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 entiteit 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 figuur 3.4.

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

Om dit te voorkomen zullen we een aantal dingen afspreken. Als eerste de term vreemde sleutel (foreign key). Hiermee bedoelen we een gegeven (attribuut) dat verwijst naar de sleutel van een tabel (entiteit). In ons voorbeeld is er sprake van een tweetal vreemde sleutels. Als eerste het attribuut code in DRAAILIJST. Dit is een

Attributen

Code Titel Artiest Soortcode

R2734 Coming home Romeo S

B1954 To the limit Boys II Men C

T5985 CrazySexyCool TLS C

……..

Entiteit-occurencesAttribuutwaarden

Entiteit : TRACKFiguur 3.3

vreemde sleutel

Page 50: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200338

vreemde sleutel omdat het verwijst naar het attribuut code in de tabel TRACK, dus naar een sleutel. Ook het attribuut soortcode in TRACK is een vreemde sleutel, want het verwijst naar de sleutel van de tabel SOORT (soortcode). We geven vreemde sleutels wel aan door ze met een stippellijn te onderstrepen. Dus:

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

Vreemde sleutels verwijzen in het algemeen naar andere tabel-len. Dit lukt alleen maar als iedere waarde die de vreemde sleutel aanneemt ook als sleutelwaarde voorkomt in de tabel waarnaar verwezen wordt. Met andere woorden: als in de DRAAILIJST de code ‘R7734’ voorkomt, moet deze waarde ook voorkomen als code in TRACK, met daarbij de naam van de artiest en de titel van het nummer. De eis dat iedere waarde die een vreemde sleutel aan-

Figuur 3.4 DRAAILIJST

Datum Code

17-2-2001 R2734

17-2-2001 B1954

17-2-2001 T5985

17-2-2001 R4288

18-2-2001 N2773

18-2-2001 T5985

……….. ……..

TRACK

Code Titel Artiest Soortcode

B1954 To the limit Boys II Men C

N2773 He’s my favourite DJ Nance S

R2734 Coming Home Romeo S

R4288 Got to be Romeo C

…….. ………………….. …………… …

SOORT

Soortcode Soortomschrijving

S Single

C CD

Page 51: Databaseontwikkeling Access 2003

3 Normaliseren, inleiding 39

neemt ook als sleutelwaarde moet voorkomen in de andere entiteit, staat bekend onder de eis van referentiële 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 attri-buut code in de tabel DRAAILIJST. Een vreemde sleutel kan ech-ter ook een niet-sleutelattribuut zijn. Kijk maar naar het attribuut soortcode in de tabel TRACK.

Via de vreemde sleutels zijn de entiteiten met elkaar verbonden. Deze verbondenheid geven we graag weer door middel van een diagram, omdat dat over het algemeen veel duidelijker is. Dit diagram noemen we Entiteit Relatie Diagram oftewel een Entity Relationship Diagram, kortweg ERD.

Om weer te geven dat twee entiteiten iets gemeenschappelijks heb-ben, via een vreemde sleutel, nemen we de beide entiteiten 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 het verband bestaat.

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 entiteit DRAAILIJST naar de entiteit TRACK gaan, komen we aan via een enkelvoudig einde van de lijn. Dat betekent dat ieder gegeven in DRAAILIJST, iedere entiteitoccurence, 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 entiteit-occurence uit TRACK, dus bij ieder nummer, meer dan één keer gegevens 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 het

referentiële integriteit

Entity Relationship Diagram

DRAAILIJST TRACK SOORT

o.b.v. code o.b.v. soortcode

Figuur 3.5

Page 52: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200340

gemeenschappelijke attribuut, de vreemde sleutel, ook als sleutel optreedt, moet een enkelvoudig einde worden opgenomen. Een sleutelwaarde moet immers altijd uniek zijn en kan dus maar één keer voorkomen, dus een enkelvoudig einde. Aan de andere kant van de lijn, waar het geen sleutel is, gelden geen beperkingen en kan iedere waarde vaker optreden, dus een vertakt einde.

Soms zie je ook dat aan een van de einden een rondje is opgeno-men in de lijn. Dat geeft aan dat er niet altijd aan die kant iets bij hoeft te worden gevonden. Zo hoeft nog niet iedere track al een keer gedraaid te zijn. Niet iedere code die in TRACK voorkomt, hoeft dus voor te komen in DRAAILIJST. Dat is de reden dat er aan die kant een rondje is opgenomen in de lijn. Het rondje staat voor nul.

Hieronder staan alle mogelijkheden kort weergegeven:

er wordt er precies één bij gevonden:

er wordt er nul of één bij gevonden:

er worden er één of meer bij gevonden:

er worden er nul, één of meer bij gevonden:

Maak opdracht 3.5.

3.6 Samenvatting

In dit hoofdstuk hebben we de eerste beginselen van het normali-seren 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 (constan-ten) 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 repeating group te verwijderen.

Page 53: Databaseontwikkeling Access 2003

3 Normaliseren, inleiding 41

Hierna bepalen we de tweede normaalvorm. Daarbij nemen we alle gegevens 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 gegevens apart die helemaal niet van de sleutel afhangen, maar die van een ander niet-sleutelattribuut 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 sleutelattributen bestaan.De gegevensstructuur die we nu hebben gevonden, geven we vervolgens grafisch weer door middel van een Entiteit Relatie Diagram (ERD). We laten daarbij het verband tussen de diverse tabellen zien. Deze verbanden zijn gebaseerd op vreemde sleutels.Een vreemde sleutel mag alleen maar waarden aannemen die ook in de overeenkomstige andere tabel voorkomen (referentiële inte-griteit).

Opdrachten

3,1 Nulde normaalvorma. In de nulde normaalvorm mogen geen procesgegevens worden

opgenomen. Geef aan waarom dat is en gebruik in het antwoord de termen efficiënt ruimtegebruik en consistentie.

b. In een bibliotheek zal men de afzonderlijke boeken moeten kun-nen aanduiden. Hiertoe zullen zij een sleutelattribuut hebben gedefinieerd. Zou men hiervoor het ISBN gebruiken? Verklaar het antwoord.

c. Gegeven het overzicht uit figuur 3.6. Stel hiervan de nulde nor-maalvorm op.

Figuur 3.6

Page 54: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200342 Databaseontwikkeling 4 Access 200342

3.2 Eerste normaalvorma. Gegeven is het overzicht uit figuur 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 kortings-bedrag en het eindtotaal niet opgenomen in de nulde normaal-vorm?

Bepaal uitgaande van de genoemde nulde normaalvorm de eer-ste normaalvorm.

b. Ga uit van de nulde normaalvorm die je eerder bij opdracht 3.1c gevonden hebt en bepaal de daarbij behorende eerste normaal-vorm. Controleer goed of de gekozen sleutel niet korter kan.

3.3 Tweede normaalvorma. Gegeven is het overzicht uit figuur 3.8. Iemand heeft daarbij de

volgende eerste normaalvorm gevonden.

Figuur 3.7

Page 55: Databaseontwikkeling Access 2003

3 Normaliseren, inleiding 433 Normaliseren, inleiding 43

1 NV (Bestelnummer, naam klant, kortings%) (Bestelnummer, artikelnr, omschrijving, prijs p/s, aantal)

Bepaal uitgaande van de bovenstaande eerste normaalvorm de tweede normaalvorm.

b. Wat is het wezenlijke verschil tussen de 1 NV zoals die bij op-dracht 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 normaalvorma. 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%, enzo-voort. Ten slotte geldt dat iedere klant een eigen uniek klant-nummer heeft dat altijd voor hem gebruikt wordt.

Figuur 3.8

Page 56: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200344 Databaseontwikkeling 4 Access 200344

2 NV (ordernummer, klantnummer, klantnaam) (ordernummer, artikelnr, aantal, kortings%) (artikelnr, omschrijving, prijs p/s)

Bepaal uitgaande van deze tweede normaalvorm de derde nor-maalvorm.

b. Een voetbalvereniging maakt gebruik van (onder andere) het overzicht van figuur 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.

c. Het overzicht van figuur 3.10 wordt bij een camping gebruikt om de reserveringen bij te houden. Op die manier probeert men te voorkomen dat een plaats aan meer dan één klant tegelijker-tijd wordt toegekend. Normaliseer dit overzicht tot en met de derde normaalvorm.

Commissie : BC, Barcommissie

Lidnummer Naam Telefoon

34 L. Ketelaar 010-4883922

122 V. Borrelaar 0180-499302

307 M. Vervat 010-7559403

Figuur 3.9

Camping Zee en Strand, OuddorpPlaatsnummer 23 Klant Aankomstdatum Vertrekdatum

8448 6 augustus 2001 20 augustus 2001P. LiversKerkweg 233109 BF Spijkenisse

3662R.L.F. HuKorenstraat 58102 BA Raalte 23 juli 2001 30 juli 2001

Figuur 3.10

Page 57: Databaseontwikkeling Access 2003

3 Normaliseren, inleiding 453 Normaliseren, inleiding 45

3.5 Entiteit Relatie Diagrama. Gegeven is de volgende genormaliseerde gegevensstruc-

tuur. 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 twee gedeelten betaald worden. Het eerste deel moet worden betaald binnen vier weken na de boek-datum, het laatste deel moet betaald worden uiterlijk zes weken voor de geplande aankomstdatum. Per boeking wordt er steeds één campingplaats geboekt.

GAST (gastnummer, naam, adres, postcode, plaats, geboortedatum, telefoonnummer)

BOEKING (boekingnummer, boekdatum, aankomstdatum, vertrekdatum, plaatsnummer)

PLAATS (plaatsnummer, voorzieningen, bedrag per nacht)

REGISTER (gastnummer, boekingnummer) BETALING (boekingnummer, betaaldatum, betaald bedrag)

Teken ook het bijbehorende ERD.

b. Gegeven is de volgende genormaliseerde gegevensstructuur. Geef hier de vreemde sleutels aan door deze gestippeld te onderstrepen. Ga er daarbij van uit dat meerdere spelers deel uitmaken van een elftal, dat ieder elftal slechts één leider heeft en dat er ereleden bestaan. Deze ereleden staan wel als speler genoteerd, maar er is geen elftalcode ingevuld.

ELFTAL (elftalcode, leidercode) LEIDER (leidercode, leidernaam, telefoonnummer) LID (lidcode, lidnaam, lidadres, lidplaats, elftalcode)

Teken ook het bijbehorende ERD.

c. Gegeven is het volgende ERD. Beantwoord op basis van dit ERD de gestelde vragen.

Page 58: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200346 Databaseontwikkeling 4 Access 200346

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?

AFDELING CHEFWERKNEMER

o.b.v. werknemernummer o.b.v. chefnummer

Page 59: Databaseontwikkeling Access 2003

4 Normaliseren, verdieping

Bij de bovenstaande opsomming gaan we ervan uit dat de leerlin-gen een case uitwerken waarbij de docent/begeleider de rol van opdrachtgever/gebruiker speelt.

Dit hoofdstuk is een verdieping van de stof zoals die in hoofd-stuk 3 is behandeld. In dit hoofdstuk gaan we moeilijker typen overzichten normaliseren. Dit zijn overzichten waar meer dan één repeterende groep in voorkomt.

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 figuur 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 figuur 4.1 normaliseren, zullen we uiter-aard weer beginnen met het opstellen van de nulde normaalvorm, dus het noteren van alle relevante, elementaire gegevens.

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 repe-terende groep. Bij één datum zien we vervolgens een aantal keer

Page 60: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200348

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:

(vak, klas, RG (toetsdatum, RG (leerlingnummer, naam, cijfer))

Als sleutel zal hier moeten gelden de combinatie van vak 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 vak en klas vormt dus de sleutel. We krijgen dan:

0 NV (vak, klas, RG (toetsdatum, RG (leerlingnummer, naam, cijfer)))

We zien nu dat we twee maal een repeterende groep hebben, waar-bij de tweede groep onderdeel van de eerste is. We zeggen wel dat de tweede groep genest ligt binnen de eerste groep.

Bij de stap naar de eerste normaalvorm verwijderen we altijd de repeterende groep. Nu hebben we er echter twee. Hoe pakken we

Figuur 4.1

Page 61: Databaseontwikkeling Access 2003

4 Normaliseren, verdieping 49

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 uitein-delijk in de binnenste doos een heel klein presentje zit. Om bij het presentje te komen zullen we eerst de buitenste doos moeten ver-wijderen, vervolgens de een na buitenste, vervolgens... We gaan net zolang door met het verwijderen van dozen, van buiten naar bin-nen, 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 sleutelattributen uit de oude groep toe en kiezen vervolgens in de nieuwe groep een sleutel.

We nemen dus de repeterende groep (toetsdatum , RG (leerling-nummer, naam, cijfer)) apart en voegen daar de oorspronkelijke sleutelattributen (vak, klas) van de originele groep aan toe. We krijgen dan de volgende tussenstap:

(vak, klas, toetsdatum, RG (leerlingnummer, naam, cijfer)) (vak, klas)

Nu gaan we in de nieuwe groep de sleutel bepalen. We krijgen dan:

(vak, klas, toetsdatum, RG (leerlingnummer, naam, cijfer)) (vak, klas)

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 wel-ke datum we de gegevens willen zien. Dus een driedelige sleutel.

We zien dat we nu één repeterende groep verwijderd hebben. Er is er nog maar één overgebleven. Deze groep zullen we nu op de-zelfde bekende wijze verwijderen. Dus we nemen de repeterende groep apart en voegen de sleutelattributen uit de oude groep toe.

Page 62: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200350

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

Ten slotte bepalen we de sleutel in de nieuwe groep. We krijgen dan als eerste normaalvorm:

1 NV (vak, klas, toetsdatum, leerlingnummer, naam, cijfer) (vak, klas, toetsdatum) (vak, klas)

De nieuwe sleutel bestaat hier uit de combinatie van vak, toets-datum en leerlingnummer. Daarbij gaan we er dus van uit dat er per vak hooguit één keer per dag een toets wordt afgelegd door een leerling en dat een leerling meer dan één toets per vak kan krijgen.

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 klasaan-duiding 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. Daarbij zoeken we naar niet-sleutelattributen die niet afhangen van de gehele sleutel maar slechts van een deel van de sleutel. We hoe-ven alleen de bovenste groep van de eerste normaalvorm maar te onderzoeken. Daarin zien we de niet-sleutelattributen klas, naam en cijfer. Om de eerste twee te weten hoeven we echt niet te weten op welke datum en voor welk vak er een toets geweest is. We hoe-ven alleen maar het leerlingnummer te weten. Voor het cijfer geldt natuurlijk dat we moeten weten wie (leerlingnummer) wanneer (toetsdatum) en voor welke vak (vak) het is behaald. Het cijfer is dus afhankelijk van de gehele sleutel.Alleen de klas en de naam nemen we apart, tezamen met het sleu-teldeel waarvan ze afhankelijk zijn, het leerlingnummer. We krij-gen dan:

Page 63: Databaseontwikkeling Access 2003

4 Normaliseren, verdieping 51

2 NV (vak, toetsdatum, leerlingnummer, cijfer) (leerlingnummer, klas, naam) (vak, klas, toetsdatum) (vak, klas)

Ten slotte rest ons nog het onderzoek naar de derde normaalvorm. Daarbij zoeken we naar niet-sleutelattributen die niet afhangen van de sleutel maar van andere niet-sleutelattributen. We hoeven dan dus alleen maar in de tweede groep van de tweede normaalvorm te kijken omdat alleen daar meerdere niet-sleutelattributen aanwezig zijn. We vragen ons nu af of de klas afhankelijk is van de naam van de leerling, of andersom. Natuurlijk is dat niet zo. De klas-aanduiding en de naam van een leerling hebben absoluut niets met elkaar te maken. Leerling De Boer zou in klas 3B1, maar ook in klas 2C2 kunnen zitten, of zelfs in beide klassen tegelijk, dan zijn het wellicht de gebroeders De Boer.

De derde normaalvorm is dus gelijk aan de tweede normaalvorm. We krijgen dan:

3 NV (vak, toetsdatum, leerlingnummer, cijfer) (leerlingnummer, klas, naam) (vak, klas, toetsdatum) (vak, klas)

Om het normaliseren netjes af te ronden, geven we de groepen eerst een naam.

3 NV RESULTAAT (vak, toetsdatum, leerlingnummer, cijfer) LEERLING (leerlingnummer, klas, naam) TOETSDATUM (vak, klas, toetsdatum) VAK-KLAS (vak, klas)

We zien dat we twee groepen, entiteiten, hebben die alleen maar uit sleutelattributen bestaan. Van deze groepen moeten we ons altijd afvragen of we deze mogen weglaten zonder dat er infor-matie verloren gaat. In de entiteit TOETSDATUM ligt vastgelegd welke klas, voor welk vak op welke datum een toets heeft gehad. Die informatie kunnen we echter ook terugvinden in de entiteiten RESULTAAT (welk vak en welke datum) en LEERLING (welke klas). We kunnen bij ieder cijfer op basis van het leerlingnummer

Page 64: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200352

de klas erbij zoeken. We mogen dus de entiteit TOETSDATUM weglaten. Voor de entiteit VAK-KLAS kunnen we dezelfde re-denering volgen. Ook de informatie uit deze entiteit kunnen we afleiden uit de entiteiten RESULTAAT en LEERLING. We laten daarom ook de entiteit VAK-KLAS weg.

De uiteindelijke derde normaalvorm ziet er dus uit als:

3 NV RESULTAAT (vak, toetsdatum, leerlingnummer, cijfer) LEERLING (leerlingnummer, klas, naam)

Het bijbehorende ERD:

Een leerling kan nul, een of meer resultaten hebben behaald. Een resultaat behoort toe aan één leerling.

Het verband tussen de beide entiteiten is op basis van de vreemde sleutel leerlingnummer.

Maak opdracht 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 voor-beeld. We gaan daarbij uit van een overzicht zoals dat bij een auto-dealer wordt gebruikt, zie figuur 4.3.

Op de bekende manier bepalen we de nulde normaalvorm. Daarbij laten we de procesgegevens (subtotalen, BTW-bedrag en totaal-bedrag) achterwege.

LEERLINGRESULTAAT

o.b.v. leerlingnummer

Figuur 4.2

Page 65: Databaseontwikkeling Access 2003

4 Normaliseren, verdieping 53

0NV (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 over-gang naar de eerste normaalvorm in één keer verwijderen, onaf-hankelijk van elkaar. We krijgen dan:

Figuur 43

Page 66: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200354

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 ge-splitst in de werkelijk gerekende prijzen en de standaard advies-prijzen. 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 nor-maalvorm, waar de gegevens van de algemene werkzaamheden en algemene onderdelen staan vermeld, is de adviesprijs toegevoegd. Dit heeft een simpele reden. Stel dat we op 31 december een auto repareren. De auto 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 prij-zen 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.

Page 67: Databaseontwikkeling Access 2003

4 Normaliseren, verdieping 55

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, advies- onderdeelprijs) (kenteken, merk, type)

Uiteindelijk ontstaan dus de volgende groepen (entiteiten):

FACTUUR (factuurnummer, kenteken, kmstand, datum)FACTUURWERK (factuurnummer, werknummer, aantal, werkprijs)FACTUURONDERDEEL(factuurnummer, onderdeelnummer, aantal onderdelen, onderdeelprijs) WERK (werknummer, werkomschrijving, adviesprijs)ONDERDEEL (onderdeelnummer, onderdeel- omschrijving, advies-onderdeelprijs)AUTO (kenteken, merk, type)

Het bijbehorende ERD:

AUTO

FACTUUR

FACTUURWERK FACTUURONDERDEEL

WERK ONDERDEEL

Figuur 4.4

Page 68: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200356

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 sleu-tel bedenken. Gebruik dan nooit een naam of een omschrijving als sleutelattribuut, 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 firma werkt niet met klant-nummers, 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 koffieshop 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 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 voor-letters, 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 bijvoor-

Page 69: Databaseontwikkeling Access 2003

4 Normaliseren, verdieping 57

beeld 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. VlietstraWoonboot Neeltje, tegenover Koelandenweg 19534 TB Westdorp

Maak opdracht 4.2.

4.4 Integreren

Tot nu toe hebben we steeds gekeken naar één overzicht tegelijker-tijd. 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 van-uit dezelfde database. Hoe pakken we dat aan?

We beginnen dan gewoon met het apart normaliseren van alle overzichten afzonderlijk. Voor ieder afzonderlijk overzicht levert dit dan een groepje entiteiten, bestanden ofwel tabellen. Deze groepjes gaan we vervolgens in elkaar schuiven. Dat doen we dan zodanig dat met het eindresultaat alle afzonderlijke overzichten kunnen worden gegenereerd. Hoe weten we nu welke tabellen we tezamen kunnen nemen? Dat kunnen we achterhalen aan de hand van de sleutels. Verschillende tabellen, die dezelfde sleutel hebben, kunnen worden samengevoegd. Tabellen 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 klantentabel gevonden. Achtereenvolgens:

KLANT-1 (klantnr, naam, adres, postcode, plaats, telefoonnr, faxnr)

integreren

Page 70: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200358

KLANT-2 (klantnr, afleveradres, afleverpostcode, afleverplaats, contactpersoon, telefoonnr)

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

KLANT (klantnr, naam, adres, postcode, plaats, afleveradres, afleverpostcode, afleverplaats, telefoonnr, faxnr, contactpersoon)

In deze tabel zijn alle gegevens uit de afzonderlijke tabellen opge-nomen. Gegevens die in beide tabellen voorkwamen (bijvoorbeeld het telefoonnummer), nemen we uiteraard slechts één keer op.

Bij het integreren kan er sprake zijn van homoniemen en synonie-men. 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 financiële 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 (leerlingnummer, naam, adres, enzovoort)VAK (vakcode, naam, coördinator, 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. Homoniemenzijn 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:

LEERLING (leerlingnummer, naam leerling, adres, enzovoort)VAK (vakcode, vaknaam, coördinator, enzovoort)

homoniemen

synoniemen

Page 71: Databaseontwikkeling Access 2003

4 Normaliseren, verdieping 59

Bij het integreren kan ook sprake zijn van synoniemen. Hiermee bedoelen we twee termen waarmee we eigenlijk hetzelfde bedoe-len. Ook dat is in het kader van de eenduidigheid ongewenst. Bijvoorbeeld:

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

In de voorgaande tabellen is er sprake van een synoniem. De term debiteurnummer is synoniem voor de term klantnummer. We be-doelen 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 (factuurnummer, klantnummer, factuurdatum, enzovoort)KLANT (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 (factuurnummer, debiteurnummer, factuurdatum, enzovoort)DEBITEUR (debiteurnummer, debiteurnaam, debiteuradres, enzovoort)

Homoniemen en synoniemen komen met name voor als het nor-maliseren zoveel werk met zich meebrengt dat dit wordt verdeeld over meerdere personen. Ieder neemt dan een aantal overzichten voor zijn rekening en na afloop worden alle uitkomsten in elkaar geschoven, geïntegreerd. Als er slechts één persoon bezig is met het normaliseren van alle overzichten, dan zullen homoniemen en synoniemen meestal achterwege blijven omdat we automatisch voor onszelf eenduidige termen gebruikt.

Maak opdracht 4.3.

Page 72: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200360

4.5 Datadictionary

Tijdens het normaliseren wordt achterhaald welke gegevens op welke wijze in welke bestanden 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.

Het ontwerp op papier dat ontstaat als resultaat van het normali-seren moet later worden omgezet in een echte database. In de database wordt vastgelegd met welke tabellen moet worden gewerkt, hoe die tabellen zijn opgebouwd en welke verbanden er tussen de tabellen bestaan (ERD). Er wordt echter ook vastgelegd wat voor soort gegevens we willen vastleggen en welke waardendaarbij zijn toegestaan. Zo kan een code bijvoorbeeld altijd opge-bouwd 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 gegevens 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 auto-

matisch voorzien zal worden van het geldsymbool en worden afgerond op twee decimalen.

Tekst: Een tekst, die allerlei tekens kan bevatten, bijvoor- beeld 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.

Page 73: Databaseontwikkeling Access 2003

4 Normaliseren, verdieping 61

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 soortgegevens 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, con-trole 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 na-melijk kiezen voor het type tekst. Daarnaast moeten we opgeven welke waarden mogen worden ingevoerd. Bestaat de klantcode bij-voorbeeld 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 ver-plicht zijn deze gegevens in te vullen. Het telefoonnummer hoeft niet verplicht te worden ingevoerd, omdat we rekening willen hou-den met klanten die hun telefoonnummer geheim willen houden. We kunnen dan niets invullen, ook al zouden we het graag willen!

De persoon die de database echt gaat bouwen, kan de door ons op-gegeven beperkingen standaard opnemen in de database. Daardoor 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.

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 als het voorbeeld hierna.

Een datadictionary kan per gevonden tabel worden gemaakt. Er kan ook gekozen worden voor één grote datadictionary waarin de gegevens van alle tabellen gezamenlijk zijn opgenomen. De laatste vorm heeft het voordeel dat we ieder gegeven slechts één maal hoe-

Page 74: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200362

ven te beschrijven. Als we werken per tabel, hebben we te maken met gegevens die in meer dan één tabel voorkomen. Die gegevens moeten we dan ook meerdere keren beschrijven.

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 opdracht 4.4.

4.6 Samenvatting

In dit hoofdstuk hebben we moeilijker type overzichten genormali-seerd. 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 con-sequent toe te passen kunnen dergelijke overzichten op een bijna routinematige manier worden uiteengerafeld.In dit hoofdstuk hebben we ook gekeken naar een aantal proble-men 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

Gegeven Type Waardenbereik Verplicht Omschrijving

Klantcode Geheel 100.000-499.999 Ja Identificeert een klant,getal numeriek, altijd zes

cijfers.

Telefoon- Tekst Precies 10 cijfers Nee Moet tekst zijn innummer verband met voor-

lopende nul van hetkengetal

Klantnaam Tekst Maximaal Ja Achternaam van de25 tekens klant

Geboorte- Datum 1-1-1860 Nee Geboortedatum van dedatum t/m vandaag klant.

Gehuwd Logisch Ja / Nee Nee Is de klant gehuwd, magworden leeg gelaten.

metagegevens

Page 75: Databaseontwikkeling Access 2003

4 Normaliseren, verdieping 63

opstellen. Een datadictionary beschrijft de gegevens die we tijdens het normaliseren hebben gevonden. Kenmerken als type, bereik, verplicht en omschrijving spelen daarbij een rol.

Opdrachten

4.1 Geneste repeterende groepena. Het overzicht van figuur 4.5 is in gebruik op de verkoopafde-

ling van de firma ZEEP BV. Deze firma levert aan zelfstandige winkelbedrijven en heeft daartoe een twintigtal vertegenwoor-digers 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 ERD.

b. Het overzicht van figuur 4.6 is in gebruik bij een MBO-insti-tuut. Dit instituut biedt zijn leerlingen buiten de reguliere lessen de mogelijkheid om tegen zeer gereduceerd tarief extra cursus-sen te volgen. Daarbij maakt men onder andere gebruik van het overzicht uit figuur 4.6. 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 ERD.

Figuur 4.5

Page 76: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200364 Databaseontwikkeling 4 Access 200364

c. In het overzicht van figuur 4.7 worden de gegevens van de door een vertegenwoordiger afgelegde bezoeken vastgelegd. Per

Figuur 4.6

Figuur 4.7

Page 77: Databaseontwikkeling Access 2003

4 Normaliseren, verdieping 654 Normaliseren, verdieping 65

bezoek wordt er één regel opgenomen. Een vertegenwoordiger heeft meerdere klanten onder zijn/haar hoede. Klanten hebben te maken met meerdere vertegenwoordigers. Klanten worden hooguit één keer per dag door één van de vertegenwoordigers bezocht. Een vertegenwoordiger werkt vanuit één vast filiaal. De vertegenwoordigers hebben per klant te maken met één vaste contactpersoon.

Normaliseer dit overzicht tot en met de derde normaalvorm en teken ook het ERD.

4.2 Opeenvolgende repeterende groepenUitzendbureau ’t VolleVat fungeert als tussenpersoon tussen bedrij-ven 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 figuur 4.8.Normaliseer dit overzicht tot en met de derde normaal normaal-vorm. Ga er daarbij van uit dat een werknemer hoogstens voor één werkgever tegelijkertijd werkt. Iemand kan meerdere keren bij hetzelfde bedrijf worden ingezet. Een werknemer volgt een cursus slechts één keer. Teken ook het bijbehorende ERD.

Figuur 4.8

Page 78: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200366 Databaseontwikkeling 4 Access 200366

4.3 IntegrerenGegeven is het overzicht zoals dat gebruikt wordt bij een camping, zie figuur 4.9. Daarbij is de volgende derde normaalvorm gevon-den.

3 NV PLAATS (plaats, max. aantal tenten, max. aantal personen, prijs laagseizoen, prijs hoogseizoen, voorzieningcode) VOORZIENING (voorzieningcode, omschrijving)

Bij dezelfde camping maakt men ook gebruik van het overzicht zoals afgebeeld in figuur 4.10. Daarbij is de volgende derde nor-maalvorm gevonden.

Figuur 4.9

Figuur 4.10

Page 79: Databaseontwikkeling Access 2003

4 Normaliseren, verdieping 674 Normaliseren, verdieping 67

3 NV PLEK (plaatscode, toelichting plaats) KLANT (klantcode, naam, adres, postcode, plaats, bank/gironummer, telefoonnummer) RESERVERING (reserveringcode, plaatscode, datumbegin, datumeind, klantcode, omschrijving, factuurdatum, betaaldatum) NACHTREGISTER (reserveringscode, volgnummer, geslacht, voorletters, naam, geboortedatum)

Integreer de gevonden derde normaalvormen tot één derde nor-maalvorm. Verwijder daarbij homoniemen en synoniemen. Teken tevens het bijbehorende ERD.

4.4 Datadictionarya. In paragraaf 4.6 hebben we twee normaalvormen geïntegreerd

tot één. Maak voor deze geïntegreerde normaalvorm één geza-menlijke datadictionary.

b. In paragraaf 4.3 is uitgaande van het overzicht zoals getoond in figuur 4.11 (zie pagina 58) de bijgaande derde normaalvorm gevonden. Maak de hierbij behorende datadictionary.

FACTUUR (factuurnummer, kenteken, kmstand, datum)FACTUURWERK (factuurnummer, werknummer, aantal, werkprijs)FACTUURONDERDEEL(factuurnummer, onderdeelnummer, aantal onderdelen, onderdeelprijs) WERK (werknummer, werkomschrijving, adviesprijs)ONDERDEEL (onderdeelnummer, onderdeelomschrijving, advies-onderdeelprijs)AUTO (kenteken, merk, type)

Page 80: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200368 Databaseontwikkeling 4 Access 200368

Figuur 4.11

Page 81: Databaseontwikkeling Access 2003

5 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 database-pakket zijn we in staat het logisch ontwerp 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 voor-raad zijn, in welke aantallen, wat het verbruik is en welke open-staande bestellingen er nog zijn.

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 resultaat van het structureren bestaat uit een verzameling entiteit-

Boeknummer Titel Schrijver Aanschafdatum Etc.

EC466-32 Boekhouden Fuchs e.a. 23-5-1996 ..gestaafd

MM844-02 Marketing Kotler 06-7-1997 ..Management

WK536-78 Basis wiskunde Van den Hoek 23-5-1996 ..

LO466-06 Inleiding logistiek Schmidt e.a. 12-12-1998 ..

Rijen

Page 82: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200370

typen die iets met elkaar te maken hebben – die met elkaar gere-lateerd zijn. Een entiteittype kan ook gezien worden als een tabel. Op de vorige pagina is een tabel weergegeven waarin de gegevens van de boeken van een schoolbibliotheek staan vermeld.

We kunnen een tabel opvatten als een verzameling rijen. Eén 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 schrij-ver. In plaats van over kolommen praten we in Access meestal over velden of attributen. Om tabellen aan te kunnen duiden geven we ze een naam. Deze naam dient een zo goed mogelijke beschrijving te zijn van het object 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 vast-gelegd wie welke boeken heeft geleend of wenst te lenen. We zul-len in de rest van dit boek leren werken met tabellen en databases; we laten zien hoe deze moeten worden gecreëerd, gevuld, gemu-teerd 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 gebrui-kelijke manier de computer opstarten en eventueel inloggen op een netwerk. Ga naar de Start-knop en kies achtereenvolgens Programma’s, Office en Microsoft Access. In sommige gevallen verloopt het starten van Access op een iets afwijkende manier, dit is afhankelijk van hoe de instellingen ter plekke zijn.

De praktijk in dit boek wordt gedaan met behulp van databases die te vinden zijn op de cd-rom die bij dit boek wordt geleverd. Deze databases moeten gekopieerd worden naar de harddisk of de dis-kette. Bewerkingen zijn immers alleen mogelijk als er schrijfrech-

tabel

records

velden of atributen

database

Page 83: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 71

ten op het medium zijn. In het vervolg zullen we ervan uitgaan dat de databases op een diskette zijn opgeslagen.

5.3 De database en de tabel creëren

5.3.1 De database aanmaken

Na het starten van Access meldt het programma zich met het dia-loogvenster dat is afgebeeld in figuur 5.1 of figuur 5.2.

Het scherm van figuur 5.1 laat aan de rechterkant niet het taak-venster zien, dat figuur 5.2 wel laat zien. Figuur 5.2 verschijnt ook door in figuur 5.1 op de knop Nieuw te drukken of door te kiezen voor Bestand, Nieuw. We nemen in de rest van het boek aan dat na het starten direct figuur 5.2 op het scherm verschijnt. Je kunt dit overigens afdwingen door na het openen van een database in het menu te kiezen voor Extra, Opties, Weergave en vervolgens een vinkje te plaatsen bij Taakvenster opstarten.

In het scherm van figuur 5.2 kun je opgeven of je wilt werken met een al bestaande database via Bestand, Openen. Maar het is makkelijker om op het bestaande bestand in het taakvenster te klikken, waarna het direct wordt geopend. Wordt het gewenste bestand niet getoond dan kun je in het taakvenster via Meer ..... het

Figuur 5.1

Page 84: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200372

scherm Openen oproepen, dat je al kent uit andere Microsoft-appli-caties. Wil je een nieuwe database aanmaken dan klik je in het taakvenster op Een nieuw bestand maken, waarna je in een nieuw taakvenster terechtkomt. Hier klik je onder het kopje Nieuw op de keuze Lege database.

Een database is de basis voor een verzameling bij elkaar horende tabellen. Voordat je tabellen kunt aanmaken of gebruiken, moet je eerst de bijbehorende database aanmaken en selecteren. Omdat we nog geen database hebben, gaan we deze nu maken.

Kies Bestand, Nieuw. Kies in het taakvenster, onder het kopje Nieuw, voor Lege database door er één keer op te klikken. Geef op waar de database moet worden opgeslagen en met welke naam. Zie figuur 5.3.Selecteer boven in het venster van figuur 5.3 bij Opslaan in de juiste schijf en typ onderin bij Bestandsnaam de naam: Oefening.Klik vervolgens op de knop Maken.

De database wordt nu aangemaakt. Deze bevat natuurlijk nog geen enkele tabel. Het getoonde venster (zie figuur 5.4) met daarin de inhoud van de database bevat daarom alleen een aantal items waarmee we tabellen kunnen gaan maken.

Figuur 5.2

Page 85: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 73

Maak het venster eventueel beeldvullend.

5.3.2 De tabel aanmaken

Een database bevat onder meer een aantal tabellen die onderling verband houden. We kunnen tabellen toevoegen aan een database door deze database eerst te openen:

Kies in het venster Oefening : Database in het linkerdeel, onder het kopje Objecten, het object Tabellen en vervolgens in de menubalk voor Nieuw. Het scherm van figuur 5.5 verschijnt.

We willen de tabel gaan ontwerpen.

Figuur 5.3

Figuur 5.4

Page 86: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200374

Kies voor de Ontwerpweergave. Klik daarna op OK. We had-den dit ook kunnen bereiken door in het scherm, zoals getoond in figuur 5.4, direct te kiezen voor Tabel maken in ontwerpweergave.

Een tabel beschrijft een object, bijvoorbeeld een klant of een boek. We moeten nu opgeven welke beschrijvende gegevens, attributen ofwel velden, we willen opnemen in de tabel. Bovendien moeten we bij ieder veld opgeven welk soort gegeven daar mag worden ingevoerd, een getal, een tekst, een datum, enzovoort. In het ven-ster van figuur 5.6 kunnen we opgeven welke velden we in de tabel willen opnemen en welke eigenschappen we aan dit veld wensen toe te kennen.

In het bovenste gedeelte van het venster, bij Veldnaam, geven we van ieder veld allereerst de naam op, vervolgens bij Gegevenstype het soort veld en ten slotte de beschrijving van het veld bij

Figuur 5.5

Figuur 5.6

Page 87: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 75

Beschrijving. We maken voor het soort veld een keuze uit de keu-zelijst (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 64.000 tekens.Numeriek – Dit veldtype is bedoeld voor het opnemen van getal-len, al dan niet voorzien van decimalen. Het soort getallen dat we kunnen gebruiken, wordt gedetailleerd besproken in bijlage A.Datum/tijd – Een veld bedoeld voor het opnemen van datums en tijdstippen. Er wordt automatisch gecontroleerd op juistheid. De datum 29 februari 1998 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 deci-malen.Autonummering – Een veld waarvan de inhoud automatisch steeds met één verhoogd wordt, bedoeld om automatisch te nummeren. De startwaarde waarmee het nummeren begint, kan eventueel worden gewijzigd (zie bijlage A).Ja/Nee – Is iets wel of niet waar?OLE-object – Hier kunnen we objecten uit andere Windows-appli-caties opnemen, bijvoorbeeld grafieken, plaatjes, geluiden, enzo-voort.Hyperlink – Een adres dat verwijst naar een bestand ergens anders op een computer. Het betreffende bestand kan zelfs benaderd wor-den via een netwerk of internet.Wizard Opzoeken – Hiermee kunnen we ervoor zorgen dat de in te voe-ren waarden ergens anders worden opgezocht. We kunnen zo bijvoorbeeld boeken alleen laten uitlenen aan lezers van wie het nummer in de lezertabel voorkomt.

In het onderste deel van het scherm kunnen we voor ieder veld nadere beperkingen opgeven door deze in te voeren op de tabbla-den Algemeen en Opzoeken. We gebruiken hier voorlopig alleen

Page 88: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200376

het gegeven Veldlengte om de lengte van tekstvelden te beperken. Standaard krijgen die namelijk een lengte van 50 tekens. In het geval van numerieke velden kan de veldlengte worden gebruikt om het soort getal op te geven, bijvoorbeeld Integer of Decimaal. Later zullen we op de andere mogelijkheden van deze twee tabbladen terugkomen. Een uitgebreide bespreking van de veldeigenschappen staat in bijlage A.

In iedere tabel moet een sleutelveld (of een combinatie van sleu-telvelden) 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.

Om een veld als sleutelveld aan te wijzen plaatsen we de cursor in de regel van het betreffende veld en klikken in de werkbalk op het sleutelsymbool of kiezen in het menu Bewerken, Primaire sleutel. Voor aan de regel van het betreffende veld verschijnt nu het sleu-telsymbool. Access zal er zelf zorg voor dragen dat alle waarden in het betreffende veld uniek blijven. Willen we de sleutel uit een combinatie van twee of meer velden laten bestaan dan dienen we de betreffende velden eerst te selecteren door, terwijl we de Control-toets ingedrukt houden, te klikken op de grijze blokjes voor de betreffende veldnamen. Hierna maken we ze op de boven-staande wijze bekend als sleutel.

Nadat op deze wijze alle velden bekend gemaakt zijn, slaan we het ontwerp van de tabel op door in het menu te kiezen voor Bestand, Opslaan. Geef, als dit nog niet is gedaan, de tabel een naam.We kunnen het werken met de database beëindigen door in het menu te kiezen voor Bestand, Sluiten. Hierna kunnen we Access afsluiten door te kiezen voor Bestand, Afsluiten.

Opgave

5.1 a. Start Access en creëer de database oefening, zoals is beschre-ven.

b. Ontwerp een tabel met de indeling die hieronder staat weerge-geven. Zorg ervoor dat het veld Volgnummer sleutelveld wordt.

Page 89: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 775 Eenvoudige bewerkingen in Access 77

c. Beëindig het aanmaken van de tabel, sla daarbij de tabel op onder de naam Boeken en sluit de database af.

Veldnaam Gegevenstype Veldlengte

Volgnummer Autonummering Boeknummer Tekst 8 Titel Tekst 30 Schrijver Tekst 30 Aanschafdatum Datum/tijd Aanschafprijs Valuta Afgeschreven Ja/Nee

5.4 Een bestaande database openen

5.4.1 Een bestaande database selecteren

Om te werken met een tabel moeten we eerst de database waar die tabel toe behoort activeren. Start allereerst Access, zie figuur 5.7.

Als het taakvenster niet getoond wordt, druk dan eenmaal op Nieuw. Of kies in het menu voor Bestand, Nieuw. Door nu te klik-ken op de betreffende bestandsnaam open je de database. Het kan

Figuur 5.7

Page 90: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200378

zijn dat je eerst nog een beveiligingswaarschuwing te zien krijgt, bedoeld om te voorkomen dat je onbewust onveilige code activeert die mogelijk in het te openen bestand is opgenomen. Vertrouw je de makers van de database dan open je deze. Je kunt het beveili-gingsniveau eventueel aanpassen via Extra, Macro, Beveiliging. Door het laagste niveau te kiezen blijft de waarschuwing welis-waar achterwege, maar neem je wel risico! Wordt het gewenste bestand niet getoond dan kun je in het taakvenster via Meer ..... het scherm Openen oproepen, dat je al kent uit andere Microsoft-appli-caties. Na het openen van de database kunnen we alle in deze data-base opgenomen elementen benaderen, ook de tabellen.

5.4.2 Een bestaande tabel selecteren

Na het openen van een database zijn alle tabellen uit de betreffende database te benaderen. Om een tabel te openen moeten we in het databasevenster het overzicht Tabellen activeren, de betreffende tabel markeren en vervolgens op de knop Openen klikken. De ta-bel wordt zo getoond dat we direct gegevens kunnen toevoegen of bestaande gegevens kunnen wijzigen (figuur 5.8).

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 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.

Figuur 5.8

Page 91: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 79

Als de tabel een groot aantal rijen bevat, kunnen deze niet alle-maal tegelijk getoond worden. We kunnen dan door de records bladeren door gebruik te maken van de pijltjestoetsen op het toetsenbord, door gebruik te maken van de schuifbalken die in het venster worden getoond of door gebruik te maken van de ver-plaatsingsknoppen linksonder in het venster ( , ). Om in één keer naar het eerste record te springen kunnen we gebruikmaken van de verplaatsingsknop of de toetsencombinatie Ctrl+Home. Naar het einde van de tabel springen we snel met de knop of met de toetsencombinatie Ctrl+End. Met de knop springen we in één keer naar het einde van de tabel en voegen daar een nieuwe, nog lege rij toe. Binnen een record verplaatsen we de cursor met de muis, de pijltjestoetsen, met de toets Tab of Shift+Tab of met de toetsen Home dan wel End.

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:

Open de tabel Oefening met de knop Ontwerpen. We komen in hetzelfde scherm terecht als eerder is gebruikt om de tabel te ont-werpen.Selecteer het betreffende veld en breng de gewenste wijziging aan. Het kan gebeuren dat we de melding krijgen dat er gegevens verlo-ren (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.Het kan ook zijn dat we een veld willen verwijderen. Markeer daartoe het betreffende veld door links van de veldnaam op de knop te klikken. We markeren daarmee de hele regel. Verwijder nu met behulp van de toets Delete het veld. We kunnen ook ge-bruikmaken van de knop Knippen of in het menu kiezen voor Bewerken, Verwijderen.Op soortgelijke wijze passen we de volgorde van de velden onder-ling aan. Markeer een te verplaatsen veld en versleep het vervol-gens naar de nieuwe plaats.Sluit na het aanbrengen van alle wijzigingen op de bekende manier het ontwerpen af met Bestand, Sluiten.

Page 92: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200380

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 overzicht Tabellen. Kies in het menu Bewerken, Kopiëren of klik op de knop Kopiëren. Plaats de kopie in het databasescherm met de menukeuze Bewerken, Plakken of met de knop Plakken. Het venster Plakopties voor tabel (figuur 5.9) wordt nu getoond.We kunnen de naam voor de kopietabel opgeven, maar we kun-nen 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.

5.5 Records manipuleren

5.5.1 Records toevoegen

We voegen records toe door de cursor te plaatsen in de nieuwe, lege regel. Deze regel is gemarkeerd met een asterisk (*). We hoe-ven nu alleen nog maar de nieuwe gegevens in te toetsen.

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.

Figuur 5.9

Page 93: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 81

5.5.3 Records verwijderen

We kunnen records verwijderen door de cursor in het betref-fende record te plaatsen en vervolgens in het menu te kiezen voor Bewerken, Record verwijderen. Willen we meerdere records tege-lijk 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 kun-nen we met Bewerken, Record verwijderen de selectie laten ver-wijderen. Gemarkeerde records kunnen we ook verwijderen door op de toets Delete te drukken. Voordat de records definitief ver-wijderd worden, waarschuwt Access nog even voor de gevolgen. Verwijderde records kunnen we niet meer terugroepen. We moeten dan opnieuw de gegevens invoeren!

Het kan zijn dat de menuoptie Record verwijderen niet direct getoond wordt nadat we hebben gekozen voor Bewerken. Dat is het gevolg van de intelligente menu’s zoals die ook in Access aan-wezig zijn. Alleen de veel gebruikte menukeuzes worden getoond. Dit heeft tot gevolg dat de menu’s er van gebruiker tot gebruiker net even iets anders uit kunnen zien. Willen we van een bepaalde menukeuze alle items zien, dan klikken we op de dubbele pijltjes onderaan de menulijst. Nu worden wel alle items getoond.

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. Kies voor de gewenste sortering door in het menu te kiezen voor Records, Sorteren en vervolgens Oplopend sorteren of Aflopend sorteren. We heffen een sortering op door te kiezen voor Records, Filter/sorteervolgorde ongedaan maken. Of we maken gebruik van de desbetreffende knoppen in de menubalk.

5.5.5 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 filteren daar-mee deze records eruit. De overige records worden niet getoond. Een selectiefilter geven we op door in een veld van een record de

Page 94: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200382

gewenste waarde te markeren (er met de muis overheen slepen) en hierna te kiezen voor Records, Filter. Alleen de records die vol-doen, worden nu getoond. Onder in het venster wordt getoond dat er een filter actief is. Een filter heffen we op door te kiezen voor Records, Filter/sorteervolgorde ongedaan maken.

Willen we filteren op meer dan één gegeven, dan kunnen we gebruikmaken van een formulierfilter via Records, Filter, Formulierfilter. We kunnen nu in iedere kolom een of meer waar-den opgeven. Deze waarden kunnen we bovendien kiezen uit alle waarden die in de betreffende kolom voorkomen. Om meerdere waarden in één kolom op te geven maken we gebruik van het tabblad Of onder in beeld. Ieder record dat voldoet aan de voor-waarden zoals in één van de tabbladen is opgegeven, zal worden getoond. We activeren het filter door in het menu te kiezen voor Filter, Filter/sorteervolgorde toepassen. Ook hier kunnen we weer gebruik maken van de desbetreffende knoppen in de menubalk.

5.5.6 Records zoeken

In grote tabellen is het vaak een hele klus om een specifiek 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 Bewerken, Zoeken. Zie figuur 5.10.

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

Figuur 5.10

Page 95: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 83

keuze Gedeelte van veld heeft tot gevolg dat er gekeken wordt of 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 ver-schil 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 hoofd-letters/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 gebruik-maken 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 voor Bewerken, Zoeken. Vervolgens selecteren we het tabblad Vervangen. De verdere afhandeling lijkt sterk op wat in de vorige paragraaf is besproken.

Page 96: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200384 Databaseontwikkeling 4 Access 200384

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 dub-belklikken.

c. Let op de manier waarop een datum moet worden ingevoerd. Deze is afhankelijk van de instellingen van Windows. Probeer de datum 28 januari 2000 eens in te voeren. Het kan zijn dat we moeten invoeren: 28-1-2000, 28-01-2000, 1-28-2000 of 01-28-2000. Het kan zelfs zijn dat we het jaartal 2000 moeten invoeren als 00. Let ook op het formaat waarin Access de datum vervolgens in de tabel weergeeft. Deze kan weer afwij-kend 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. Verwijder het derde record.g. Voor vrijwel iedere besproken handeling is er ook een knop

opgenomen in de werkbalk. Zoek de knoppen voor achtereen-volgens Record verwijderen, Nieuw record, Zoeken, Selectiefilter en Oplopend sorteren.

h. Sluit de tabel en de database af.

5.3 a. Selecteer de database Reisbureau en activeer de tabel Bestemming.

b. In verband met de politieke situatie worden er geen reizen meer georganiseerd naar Irak. Verwijder op een zo gemakkelijk mo-gelijke 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 filter!)

d. Hef het filter weer op.e. Welke reizen duren er 14 dagen en kosten 1600,–? Toon

tegelijkertijd de reizen met een vertrekdatum van 10 mei 2005. Gebruik de tabel Reis en gebruik een formulierfilter.

f. Hef het filter weer op.g. Een wat slordige medewerker heeft de naam van Spanje onjuist

in de tabellen opgenomen. Verbeter deze foute naam (Spagne) op de meest efficiënte manier.

Page 97: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 85

5.6 De bestandsweergave wijzigen

Een tabel wordt getoond in een standaard lay-out, die we echter kunnen aanpassen. We zullen kort bespreken hoe we het letter-type, de opmaak van een cel, de kolombreedte en rijhoogte kun-nen wijzigen en hoe we de plaats en eigenschappen van kolommen kunnen instellen. Om dit te kunnen doen moeten we uiteraard eerst de betreffende tabel openen.

5.6.1 Lettertype aanpassen

Het lettertype passen we aan door in het menu te kiezen voor Opmaak, Lettertype, waarna het bijbehorende venster (figuur 5.11) verschijnt.

We kunnen het lettertype, de tekenstijl, de puntgrootte oftewel punten, onderstrepen en kleur instellen. Het font wordt voor de hele tabel ingesteld.

5.6.2 Opmaak van een cel aanpassen

Om de opmaak van een cel aan te passen kiezen we voor Opmaak,Gegevensblad, zodat het venster uit figuur 5.12 verschijnt.

Hierin kunnen we opgeven of we rasterlijnen wensen weer te geven, welke kleur we willen gebruiken voor de rasterlijn en achtergrond en op welke wijze, met welk effect, een cel moet wor-den getoond. We kunnen de stijl van de diverse randen en lijnen aangeven (gesloten, gestippeld, gestreept, enzovoort). Ten slotte kun je in het veld Richting aangeven of je de velden van links naar

Figuur 5.11

Page 98: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200386

rechts wilt plaatsen. Dat is gebruikelijk in de Engelstalige landen en in West-Europa. Je kunt ook aangeven dat je de velden van rechts naar links wilt plaatsen. Dit laatste is gebruikelijk in de landen van het Midden-Oosten. Het sluit aan op de daar gebrui-kelijke lees- en schrijfrichting. Ook deze instellingen gelden voor de hele tabel.

5.6.3 Kolombreedte en rijhoogte instellen

De kolombreedte of rijhoogte passen we aan met Opmaak,Kolombreedte of Opmaak, Rijhoogte. Afhankelijk van de keuze verschijnt figuur 5.13 of 5.14.

We kunnen nu de kolombreedte instellen. De breedte wordt inge-steld voor de geselecteerde kolom(men) of voor de kolom waar de cursor zich bevindt. De rijhoogte wordt ingesteld voor de hele tabel. Door het vakje Standaardhoogte/breedte af te vinken zet-ten we de hoogte of breedte weer terug op de standaardwaarde. De optie Best passend bij het instellen van de kolombreedte zorgt ervoor dat de breedte zo wordt ingesteld dat de gegevens precies in de kolom passen.

Figuur 5.12

Figuur 5.13 Figuur 5.14

Page 99: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 87

We kunnen de breedte van een kolom ook aanpassen door in de kolomtitelbalk de kolomscheiding te verslepen of erop te dubbel-klikken. De rijhoogte passen we op soortgelijke wijze aan.

5.6.4 Kolommen verplaatsen

De onderlinge volgorde van de kolommen van een tabel kan wor-den gewijzigd. Hiertoe markeren we eerst een of meer kolommen door erover te slepen. Nadat we dit gedaan hebben, slepen we nog-maals. Hiermee verplaatsen we de gemarkeerde kolommen. Bij het afsluiten van de tabel zal Access vragen of de nieuwe lay-out be-waard moet blijven of niet. In het eerste geval zal de nieuwe volg-orde ook de volgende keer dat we werken, aangehouden worden.

5.6.5 Kolommen verbergen

Niet altijd willen we alle kolommen in beeld hebben. We kunnen kolommen die we (tijdelijk) niet willen zien, verbergen. Selecteer daartoe eerst de te verbergen kolommen en kies Opmaak, Kolom verbergen. De geselecteerde kolommen worden niet langer ge-toond. Bij het afsluiten van de tabel zal Access vragen of we deze instelling willen opslaan. Kiezen we daarvoor, dan zal de kolom (blijvend) verborgen blijven totdat we expliciet de opdracht geeft de kolom weer te tonen.We kunnen een kolom weer zichtbaar maken door in het menu te kiezen voor Opmaak, Kolommen zichtbaar maken.

In het venster (figuur 5.15) worden alle bestaande kolommen ge-toond, waarbij door een vinkje wordt aangegeven welke kolommen wel en welke niet zichtbaar zijn. Door een verborgen kolom af te

Figuur 5.15

Page 100: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200388

vinken wordt deze weer zichtbaar. We kunnen dit venster overi-gens ook gebruiken om kolommen te verbergen.

5.6.6 Kolommen vastzetten

Het is niet altijd mogelijk om alle kolommen tegelijkertijd op het scherm te tonen. In zo’n geval kunnen we horizontaal schuiven (scrollen) om de andere kolommen te zien. Hierbij worden andere kolommen echter weer niet getoond. Om te weten met welk record we aan het werk zijn, is het vaak makkelijk om een of meer kolom-men vast in beeld te hebben. Hierdoor kunnen we bijvoorbeeld de linkerkolom, waarin dan de naam van de klant getoond wordt, op het scherm vast zetten. Deze blijft zichtbaar, hoever we ook naar rechts gaan.

Als we een kolom willen vastzetten, markeren we de betreffende kolom (of plaatsen de cursor in de betreffende kolom) en kiezen in het menu voor Opmaak, Kolom blokkeren. De betreffende kolom wordt aan de linkerkant van het scherm geplaatst en gevolgd door een dikke lijn. Deze kolom zal vanaf nu in beeld blijven. We kun-nen meerdere kolommen bevriezen door deze als één geheel te markeren en vast te zetten of door de een na de ander te blokkeren. We kunnen het vastzetten opheffen door in het menu te kiezen voor Opmaak, Kolomblokkering opheffen. De geblokkeerde kolom blijft overigens links staan, maar is niet langer altijd in beeld. Ook kan de kolom nu weer worden versleept naar de originele positie. Bij het opslaan van de tabel zal Access weer vragen of we de nieu-we instellingen willen opslaan.

5.7 Afdrukken van gegevens

Het zal regelmatig voorkomen dat we gegevens uit een tabel op papier willen afdrukken. We kunnen dat op twee manieren tot stand brengen. Allereerst kunnen we de knop Afdrukken uit de werkbalk gebruiken. Alle gegevens uit de tabel worden dan direct naar de printer gestuurd. Eventueel laten we eerst met behulp van de knop Afdrukvoorbeeld een voorbeeld van de afdruk op het scherm tonen, om te controleren of alles er goed uitziet.

We kunnen ook afdrukken door te kiezen voor Bestand, Afdrukken. Zie figuur 5.16.

Page 101: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 89

In het dialoogvenster Afdrukken kunnen we nog een aantal za-ken instellen. We kunnen de te gebruiken printer selecteren, laten afdrukken naar een bestand op schijf en opgeven welke records moeten worden afgedrukt: alle records, alleen de op te geven pagi-na’s of alleen de geselecteerde records. Ten slotte is ook de print-volgorde op te geven. Bij het afdrukken worden de instellingen die zijn aangebracht met betrekking tot de volgorde van kolommen, het verbergen van kolommen, de kolombreedte, enzovoort aan-gehouden.

Opgave

5.4 a. Selecteer de database Reisbureau en open de tabel Klant.b. Voeg een record toe en zet daar eigen gegevens in. Access kent

automatisch het klantnummer 23 toe.c. Verberg de kolommen met de adressen en postcodes.d. Zet de kolom met de plaatsnaam helemaal links en zet deze

kolom ook vast.e. Zorg ervoor dat de onderlinge recordvolgorde gebaseerd is op

klantnaam.f. Laat alle gegevens afdrukken op papier. Controleer eerst de

uitvoer via het printvoorbeeld.g. Zorg ervoor dat er geen rasterlijnen meer getoond worden.h. Maak alle kolommen precies passend, zet de rijhoogte op 20,

laat de gegevens tonen in het lettertype Times New Roman puntgrootte 12.

i. Selecteer nu de records van de klanten uit Rotterdam en laat alleen deze records afdrukken op papier.

j. Maak alle kolommen weer zichtbaar.k. Sluit de tabel af zonder de wijzigingen op te slaan.

Figuur 5.16

Page 102: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200390

5.8 Met meerdere tabellen tegelijkertijd werken

5.8.1 Verbanden leggen

Veelal zullen de tabellen die binnen één database zijn opgenomen verband houden met elkaar, met andere woorden: er bestaan rela-ties tussen de tabellen. Zo zullen we bij een klant op basis van het klantnummer alle boekingen van de klant kunnen (en willen) zoe-ken. 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

De bestaande relaties staan weergegeven in het volgende ERD (Entiteit Relatie Diagram):

Ook binnen Access kunnen we de relaties bekend maken. Bovendien kunnen we opgeven dat we de bijbehorende referentiële 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:

KLANT REISBOEKING BESTEMMING

o.b.v. klantnummer o.b.v. reisnummer o.b.v. bestemmingcode

Page 103: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 91

Open de database waarbinnen de relaties bekendgemaakt moeten worden.Klik op de knop Relaties in de werkbalk of kies Extra, Relaties. Het relatievenster verschijnt, zie figuur 5.17. Hierin staan alle bek-ende relaties vermeld.

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 gedefinieerde relaties hier nu opgeven.

Plaats eerst de betreffende tabellen op het scherm. Klik hiervoor op de knop Tabel weergeven of kies Relaties, Tabel toevoegen. Selecteer in het venster dat verschijnt (figuur 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.17

Figuur 5.18

Page 104: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200392

De nieuwe tabellen zijn nu opgenomen in het relatiescherm, maar ze zijn nog niet verbonden.

Klik – in de tabel waar het gemeenschappelijke veld de sleutel is (de primaire tabel, dus Reis) – op dit sleutelveld om alle relaties bekend te maken en sleep het vervolgens naar de andere tabel (de gerelateerde tabel, dus Boeking). Access toont nu het scherm waarin de relatie nauwkeurig kan worden ingesteld (figuur 5.19). Hier wordt de relatie tussen Reis en Boeking bekendgemaakt.

Zet een vinkje voor de optie Referentiële integriteit afdwingen.Access zal nu de referentiële integriteit verzorgen. Dat betekent dat we bijvoorbeeld geen reis kunnen boeken voor een klant van wie het klantnummer niet in het klantenbestand voorkomt.Als we de keuze Gerelateerde velden trapsgewijs bijwerken afvin-ken, 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 over-eenkomstige 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 tabel-len 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 verwijderenop 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 ver-

Figuur 5.19

Page 105: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 93

wijderen 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 teken-ing overzichtelijker maken door de tabellen op het scherm zodanig te verslepen dat er nette, rechte lijnen ontstaan (figuur 5.20).

Het kan voorkomen dat we een relatie tussen twee tabellen willen definiëren waarbij de relatie is gebaseerd op een meervoudige sleu-tel. 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 Control-toets inge-drukt. Hierna verslepen 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 kun-nen ook weer aangeven of we de referentiële 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.

Figuur 5.20

Page 106: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200394

Proberen we een van de verbindingslijnen te verwijderen, dan zal Access alle betrokken lijnen verwijderen en daarmee de gehele relatie.

We kunnen de gedefinieerde relaties laten ‘afdrukken’ door het scherm waarmee we relaties definiëren (zie figuur 5.20) te acti-veren en vervolgens in het menu te kiezen voor Bestand, Relaties afdrukken. Het overzicht wordt niet direct afgedrukt, maar eerst in een rapport geplaatst. Dit rapport kunnen we vervolgens afdrukken.

5.8.2 Relaties verwijderen

We kunnen bestaande relaties verwijderen door in het scherm van figuur 5.20 de lijn die de relatie weergeeft aan te klikken met de rechtermuisknop. In het opgeroepen snelmenu kunnen we nu kiezen voor Verwijderen. Sluit het onderdeel relaties af door het betreffende scherm te sluiten.

TerzijdeDe relatie kan ook verwijderd worden door aanklikken met de linkermuisknop, gevolgd door het indrukken van de Delete-toets.

5.8.3 Toepassing van relaties, referentiële integriteit

Het begrip referentiële integriteit is direct verbonden met de relaties die er bestaan tussen de diverse tabellen. Als er tussen de tabellen Bestemming en Reis een relatie ligt op basis van de Bestemmingcode, is het niet toegestaan om een reis in te voeren naar een bestemming die nog niet bestaat. We kunnen ook zeggen dat het alleen mogelijk is om reizen in te voeren naar bestemmin-gen die al bestaan, die dus eerder zijn ingevoerd.

In Access is het mogelijk om bij het invoeren van gegevens in een tabel bij velden die verwijzen naar de sleutel in een andere (pri-maire) tabel, bijvoorbeeld de bestemmingcode in Reis die verwijst naar bestemmingcode in Bestemming, een keuzelijst te laten tonen met daarin de gegevens die in de primaire tabel voorkomen. Alleen uit deze gegevens kan dan gekozen worden. Bij het invoeren van

Page 107: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 95

een reis kunnen we dan bij het veld Bestemmingcode een lijst laten tonen met alle codes en bijbehorende gegevens zoals die in de pri-maire tabel Bestemming zijn ingevoerd (zie figuur 5.21). Hierdoor wordt het voor de persoon die de gegevens moet invoeren makke-lijker om de juiste codes op te zoeken en in te voeren.

We kunnen een dergelijke keuzelijst op vrij eenvoudige wijze ma-ken nadat we alle relaties tussen de diverse tabellen hebben opge-geven. Om ervoor te zorgen dat bij het invoeren van een reis alleen gekozen kan worden uit bestaande bestemmingen, gaan we op de volgende wijze te werk:

Open de betreffende tabel, in dit geval Reis.De tabel moet worden getoond in de ontwerpweergave. Selecteer deze door na het openen van de tabel te kiezen voor Beeld,Ontwerpweergave. Plaats de cursor in de regel van het veld Bestemmingcode (figuur 5.22). Selecteer onder in het scherm het tabblad Opzoeken. Zet de muisaanwijzer in het veld Weergave besturingselementKlik op en kies voor Keuzelijst met invoervak.We willen gegevens laten opzoeken vanuit een andere tabel. Kies voor Type rijbron dus Tabel/query.

Figuur 5.21

Page 108: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200396

Plaats de cursor in het veld Rijbron. We kunnen nu een opdracht (query) opstellen waarmee we de gegevens kunnen laten opzoeken in de andere tabel(len). Klik op de knop met de drie puntjes. We komen nu in het scherm Opbouwfunctie voor query’s, zie figuur 5.23.

Figuur 5.22

Figuur 5.23

Page 109: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 97

We moeten opgeven uit welke tabel(len) we gegevens nodig hebben.

Selecteer de tabel Bestemming vanwege de bestemmingcode, plaatsnaam en het land. Die drie gegevens willen we op het scherm tonen. Selecteer de betreffende tabel met behulp van de knop Toevoegen. Access zal de tabel in het ontwerpscherm opnemen (figuur 5.24). Hebben we meer dan één tabel geselecteerd, dan zullen ook de bestaande relaties tussen de tabellen getoond worden. Sluit het selecteren van de tabel af met de knop Sluiten.

In het onderste deel van het ontwerpscherm is te zien welke velden we geselecteerd hebben: nu nog niets. We moet de te tonen velden nog toevoegen door ze te selecteren.

Selecteer een veld door het in de betreffende tabel aan te klikken. Sleep het naar het onderste deel en laat het in een kolom los. Sleep op deze manier alle gewenste velden, Bestemmingcode,Plaats en Land uit Bestemming, naar beneden, zie figuur 5.25.

Figuur 5.24

Figuur 5.25

Page 110: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 200398

Klik bij het betreffende veld in de regel Sorteervolgorde om de volgorde op te geven waarin de keuzelijst getoond moet worden. Omdat men bij het toevoegen van reizen veelal zal zoeken op plaats van bestemming, is het verstandig de lijst in volgorde van plaatsnaam te leggen.Sluit het venster af via Bestand, Sluiten. Access vraagt of de wij-zigingen moeten worden bewaard. Beantwoord deze vraag bevesti-gend. We keren automatisch terug in het tabelontwerpscherm.

Standaard wordt er van de zojuist ontworpen query slechts één kolom getoond. We willen er echter drie zien. Daartoe moeten we de details van de keuzelijst instellen. We kunnen de volgende details omtrent het uiterlijk van de keuzelijst opgeven:

Afhankelijke kolom. Welke kolom uit de keuzelijst wensen we over te nemen in het veld? In ons geval de eerste kolom (bestem-mingcode), dus 1.Aantal kolommen. Hoeveel kolommen moeten er in de keuzelijst worden getoond? We hebben er drie geselecteerd (code, plaats en land), dus 3.Kolomkoppen. Moeten er 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 worden van elkaar scheiden door middel van een puntkomma. Wij kiezen hier voor 3cm;4cm;4cm.Aantal rijen. Hoeveel rijen, records, moeten er tegelijkertijd in de opzoeklijst worden getoond? Standaard zijn dit er acht. Deze waarde accepteren we.Lijstbreedte. Wat moet de totale breedte van de opzoeklijst wor-den? Wij willen alle kolommen goed getoond hebben, dus moet de breedte op 3+4+4 ofwel 11cm worden gezet.Alleen lijst. Mag de invoer alleen worden geaccepteerd als deze ook in de lijst voorkomt? In ons geval is dat zo, anders zouden we reizen boeken naar bestemmingen die we niet in ons assortiment hebben, dus ja.

Vul deze gegevens in en sluit daarna het definiëren af door het scherm af te sluiten.Sla de wijzigingen op. Open opnieuw de tabel Reis. Bekijk het resultaat door de cursor in het veld Bestemmingcode te plaatsen.

Page 111: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 99

Wanneer we de tabel Reis hebben geopend in de gegevensblad-weergave, zien we dat er voor iedere rij een plusteken is geplaatst. Dit vindt zijn oorzaak in het feit dat er tussen de tabellen Reis en Boeking een relatie is gedefinieerd. Op basis van deze relatie wor-den alle boekingen bij een bepaalde reis automatisch bijgezocht. Deze boekingen worden getoond op het moment dat we op het plusteken voor een bepaalde reis klikken. Zo zien we bijvoorbeeld dat er bij reisnummer 10 twee boekingen worden gevonden. Dit principe van automatisch opzoeken werkt alleen vanuit de tabel waarin het gemeenschappelijke veld tevens de gehele sleutel is. Zo geldt bijvoorbeeld dat er tussen Boeking en Klant een relatie ligt op basis van het klantnummer. Het klantnummer is sleutel in de tabel Klant. Dus bij de weergave van de inhoud van het klantenbestand kunnen automatisch de boekingen van iedere klant worden bij-gezocht. Andersom niet, maar dat heeft ook geen zin omdat er bij iedere boeking toch altijd slechts één klant wordt gevonden.

Opgave

5.5 a. Open de database Reisbureau. Open het scherm waarin de rela-ties 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 referentiële integriteit wordt afgedwongen. Het is niet nodig trapsgewijs wijzigen en trapsgewijs verwijde-ren te activeren.

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, beëindig dan het invoe-ren van de boeking door op de toets Esc te drukken.

e. Open de tabel Klant en probeer eens de klant met het nummer 15 (Brugman) te verwijderen uit de klantentabel. Verklaar zelf waarom dit nu wel of niet lukt.

f. Open de tabel Reis en zorg ervoor dat bij het veld Bestemmingcode een keuzelijst wordt getoond, zoals in de vorige paragraaf is toegelicht.

g. Open de tabel Boeking en zorg ervoor dat bij het veld Reisnummer een keuzelijst getoond wordt.

Laat in de keuzelijst relevante gegevens tonen, dus niet alleen het reisnummer uit de tabel Reis, maar ook de vertrekdatum uit

Page 112: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003100 Databaseontwikkeling 4 Access 2003100

de tabel Reis en de plaatsnaam en het land van bestemming uit de tabel Bestemming. Pas op! We kunnen in de keuzelijst het veld Reisnummer opnemen vanuit twee tabellen, te weten van-uit de tabel Reis of vanuit de tabel Boeking. We moeten er hier uiteraard voor kiezen het reisnummer uit de tabel Reis te tonen. Daar komen namelijk alle nummers, van alle verzorgde reizen voor, ongeacht of er al een boeking voor bestaat of niet. Laten we het Reisnummer selecteren uit de tabel Boeking, dan komen we daar alleen nummers tegen van reizen waarvoor al een boe-king bestaat!

h. Open de tabel Boeking nogmaals en zorg er nu voor dat bij het veld Klantnummer een keuzelijst wordt getoond. Laat het klant-nummer, de naam en de plaats van de klant in de lijst opnemen. Zorg voor een zinvolle volgorde. Pas op! We moeten nu in het scherm waarin we de lijst defi niëren, alleen de tabel Klantopnemen. We kunnen dan beschikken over alle klantgegevens. Nemen we echter (ten onrechte) ook de tabel Boeking op in het scherm, dan zal Access direct zien dat er 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, kunnen we dan niet selecteren omdat deze klanten niet in beide tabellen tegelijker-tijd voorkomen (zie ook de opmerking aan het einde van de volgende paragraaf)!

i. Eerder hebben we onszelf toegevoegd aan de klantentabel. Boek nu zelf een reis naar Tanger (in Marokko).

5.9 Gegevens selecteren en manipuleren

5.9.1 Gegevens selecteren, selectiequery

Om gegevens te selecteren uit de database kunnen we gebruik-maken van een query (een vraag opgemaakt in een speciale vraag-taal). Het opstellen van een query is al bekend: we hebben een query gebruikt bij het opstellen van een keuzelijst ten behoeve van de invoer van gegevens. We kunnen met een query echter meer dan tot nu toe aan bod gekomen is.

Open de database Reisbureau. Selecteer het overzicht Query’s.

Page 113: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 101

In het scherm van figuur 5.26 worden alle bestaande query’s getoond. Om een query te kunnen maken dienen we eerst een informatiebehoefte – oftewel een vraag naar informatie – te heb-ben. Stel we willen weten wie er een reis hebben geboekt naar Azië. Van de betreffende personen willen we de naam, de woon-plaats en het telefoonnummer weten, zodat we even contact kun-nen opnemen.

Klik op de knop Nieuw om de bijbehorende query te maken. We kunnen opgeven hoe we de query willen maken: hand-matig met Ontwerpweergave of met behulp van een Wizard Selectiequery; zie figuur 5.27.

Kies Wizard Selectiequery. Dit is een hulpprogramma dat ons veel werk uit handen neemt. Klik op de knop OK.

Figuur 5.26

Figuur 5.27

Page 114: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003102

De Wizard moet nu een aantal zaken weten (figuur 5.28). Allereerst zal worden gevraagd welke velden we nodig hebben om in onze informatiebehoefte te voorzien.

Selecteer eerst een van de benodigde tabellen. Alle velden uit de betreffende tabel worden links getoond. We kunnen in de linker-helft van het scherm een veld selecteren en op de knop > klikken. Het veld wordt opgenomen in de query. Het verschijnt nu in het rechtergedeelte. Zijn alle getoonde velden nodig, klik dan op de knop >>. We kiezen hierna de volgende tabel en voegen ook hier-uit de benodigde velden toe aan de query. Voor ons overzicht selecteren we achtereenvolgens uit de tabel Klant de gegevens Naam, Woonplaats en Telefoonnummer. Uit de tabel Bestemming kiezen we het gegeven Werelddeel.Zijn alle velden die bij de query betrokken zijn geselecteerd, klik dan op de knop Volgende.Geef in het tweede scherm van de Wizard (figuur 5.29) op of de afzonderlijke gegevens getoond moeten worden of alleen een sa-menvatting met totalen. Kies voor het tonen van de details en klik op de knop Volgende. Hebben we gegevens uit slechts één tabel gebruikt, dan zal dit scherm overigens achterwege blijven en kun-nen we direct de naam van de query opgeven.Geef de query een naam, zie figuur 5.30. Deze naam gebruiken we om later de query nogmaals te laten uitvoeren.

Figuur 5.28

Page 115: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 103

We kunnen opgeven of we de query direct willen laten uitvoeren, de query openen om gegevens weer te geven, of dat we het ont-werp direct willen aanpassen, het queryontwerp wijzigen. In het eerste geval wordt de query direct uitgevoerd. Alle geselecteerde velden worden dan getoond voor alle records.Kies voor het kunnen aanpassen van de query – we willen name-lijk nog een selectie kunnen laten uitvoeren (alleen Azië) – en klik op de knop Voltooien. We komen nu terecht in het ontwerpscherm (figuur 5.31).

Figuur 5.29

Figuur 5.30

Page 116: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003104

We zien boven in het scherm de tabellen die nodig zijn voor de query. De Wizard heeft deze tabellen zelf bepaald. Onderin staan de velden die we eerder hebben opgegeven als de velden die bij de query van belang zijn. De instellingen van deze velden kunnen we nu nader specificeren.

Het veld Werelddeel hoeft niet te worden getoond in de uitvoer. Dit is alleen benodigd als selectiecriterium. We willen immers alleen gegevens van de klanten die een reis naar Azië hebben geboekt. Verwijder om dit aan te geven bij het veld Werelddeel het vinkje in de regel Weergeven. Voer in de regel Criteria het criterium in, dus de tekst Azie bij het veld Werelddeel.Om de uitvoer zinvoller te maken willen we deze op volgorde van plaatsnaam gepresenteerd te krijgen. Klik bij het veld plaats in de regel Sorteervolgorde en kies de sorteervolgorde: Oplopend. Het scherm ziet er nu ongeveer uit als figuur 5.32.

Figuur 5.31

Figuur 5.32

Page 117: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 105

Sla de query op door het venster te sluiten via Bestand, Sluiten. We komen dan weer terecht in het overzicht Query’s van het database-scherm. De zojuist gemaakte query is hier nu in opgenomen. Laat eventueel de query uitvoeren door de naam van de query te selecteren en op de knop Openen te klikken of door op de naam te dubbelklikken. De gewenste uitvoer wordt op het scherm getoond.

De voorgaande query was vrij eenvoudig, omdat er slechts één voorwaarde bij betrokken was. We kunnen query’s echter aanzien-lijk ingewikkelder maken. Bijvoorbeeld een query waarin dezelfde gegevens getoond worden als in de voorgaande query, maar nu alleen voor de personen die naar Azië gaan, of die in West-Europa blijven maar niet in Rotterdam wonen, of reizen waarvan de prijs ligt tussen de 500,– en 1250,–.We gaan dan op dezelfde wijze te werk als hiervoor beschreven is. We selecteren echter meer velden dan zojuist omdat we nu ook de velden Prijs per persoon en Vertrekdatum uit de tabel Reis nodig hebben. Het queryscherm zal er nu uitzien als figuur 5.33.

Nu moeten we nog opgeven welke velden we wel en niet wen-sen te zien. We verwijderen daartoe alle vinkjes in de regel Weergeven, met uitzondering van die bij Naam, Woonplaats en Telefoonnummer. Ten slotte moeten we de voorwaarden opgeven. We hebben te maken met drie (meervoudige) voorwaarden, te we-ten:bestemming is Azië, ofbestemming is West-Europa en de woonplaats is niet Rotterdam, ofde prijs van de reis ligt tussen 500,– en 1250,–.

Figuur 5.33

Page 118: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003106

We geven deze voorwaarden in drie, afzonderlijke, onder elkaar gelegen Criteria-regels. Voorwaarden die we op dezelfde criteria-regel 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. Het scherm ziet eruit als in figuur 5.34.

Let op de regelindeling van de voorwaarden. Bij de voorwaarden 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)

Figuur 5.34

Page 119: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 107

Deze bewerkingen werken op alle veldsoorten, dus op getallen en teksten, maar ook op datums. Ook de eerdergenoemde jokers kun-nen we gebruiken.

Bij datum en tijd kunnen we nog een aantal extra functies gebrui-ken. Let er daarbij op dat het veld waarop de functie wordt uit-gevoerd 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

uit een datum

Month selecteert de maandaanduiding Month([Boekdatum]) = 12

Year selecteert het jaartal Year([Boekdatum]) = 1999

Weekday selecteert de dag van de week, Weekday([Boekdatum])=7

zondag=1, maandag=2, ...

Hour selecteert de uuraanduiding Hour([Vertrektijd])=15

Datepart selecteert het weeknummer (ww) Datepart(“q”,[Boekdatum])=2

of het kwartaalnummer (q) Datepart(“ww”,[Boekdatum])=30

bij een datum

TerzijdeWat de taal betreft: bij het opgeven van functies kunnen/moeten we van de hiervoor genoemde, Engelstalige functies gebruik-maken zodra we óf een Engelstalige versie van Windows óf een Engelstalige versie van Access gebruiken. Alleen bij gebruik van de Nederlandstalige versie van zowel Windows als Access kunnen we de functies in het Nederlands opgeven, hoewel hier in specifieke gevallen weer uitzonderingen op bestaan.

Opmerkingen met betrekking tot query’s:

We kunnen een query ook opstellen zonder gebruik te maken van de wizard. Daartoe klik je in het databasescherm, in het overzicht Query’s op de knop Ontwerpen. Je moet nu als eerste de te gebrui-ken tabellen toe voegen. Hierna sleep je de benodigde velden zelf naar het onderste deel van het ontwerpscherm en voegt eventuele voorwaarden toe. Op deze manier kunnen we ook een eerder ont-worpen query achteraf aanpassen.

Page 120: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003108

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 crite-riumregel. We kunnen dan inzoomen. Er verschijnt een venster waarin we het criterium kunnen plaatsen. We kunnen dit venster ook oproepen door op de betreffende knop in de menubalk te klik-ken.Hebben we niet alle benodigde velden geselecteerd, dan kun-nen 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 ver-wijderen we het door op de toets Delete te drukken of door in het menu te kiezen voor Bewerken, Verwijderen.Hebben we een veld nodig uit een tabel die niet in het bovenste deel wordt getoond, voeg de tabel dan toe door in het menu te kiezen voor Query, Tabel weergeven. Hierna kunnen we het betref-fende veld selecteren en het door te slepen opnemen in de query.Om een query direct vanuit het ontwerpscherm te laten uitvoeren klikken we op de run-knop, de knop met het opschrift !. Om van-uit het uitvoerscherm van de query weer direct terug te keren naar het ontwerpscherm klikken we op de knop Beeld, links in de werk-balk.We kunnen de betekenis van de relaties tussen de tabellen aanpas-sen. 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 daadwerke-lijk 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 rech-termuisknop op de betreffende relatie tussen Klant en Boeking(op de lijn) en kiezen voor Joineigenschappen. Vervolgens kun-nen we de relatie specificeren: 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 (figuur 5.35). We kunnen de eigenschappen van de relatie op twee plaatsen aanpassen: in het algemene relatiescherm (figuur 5.20) en tijdens het opbouwen van een query (figuur 5.24). Wijzigen we de relatie in het relatiescherm, dan geldt vanaf dat moment de nieuwe instelling bij alle opvragingen en query’s die we nog gaan maken. Wijzigen we een relatie tijdens het opbouwen van een query, dan

Page 121: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 109

geldt deze gewijzigde instelling alleen voor die betreffende query. Buiten deze query blijft de algemeen ingestelde relatie gehand-haafd.

Opgave

5.6 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 1500,– bedraagt.d. Geef ook de plaats van bestemming van de reizen uit onderdeel

c, op volgorde van plaats.e. Geef de namen en telefoonnummers van de klanten die op 23

of 24 maart 2005 een reis hebben geboekt. De datum mag niet worden getoond.

f. Laat het voorgaande overzicht nogmaals tonen, maar nu alleen voor de klanten van wie de reis langer dan 14 dagen duurt. Laat ook de reisduur tonen.

g. Naar welke plaatsen in Azië vertrekken er in de periode van 5 t/m 12 mei 2005 reizen? Laat plaats en land zien, op volgorde van land.

h. Welke klant heeft er 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 klan-ten zonder boeking ook worden getoond (via joineigenschap-pen) en geef bij de query zelf als criterium dat er in het veld boekingnummer niets mag zijn ingevuld. We vinden – als het goed is – twee klanten, te weten Taks en Brigman.

Figuur 5.35

Page 122: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003110

5.9.2 Gegevens opvragen, rekenkundige bewerkingen

We kunnen query’s 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 eerst het query-ontwerpscherm waarmee we een nieuwe query kunnen opstellen. Voeg op de bekende manier alle betrokken tabellen weer toe.Plaats het veld waarop de rekenkundige bewerking moet worden uitgevoerd, in ons geval Prijs per persoon. Druk hierna op de knop Totalen in de werkbalk of kies in het menu de keuze Beeld en vink de optie Totalen aan. 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 uit te vouwen. Kies in het getoonde menu de gewenste func-tie, in ons geval de functie Gem, zie figuur 5.36.

Figuur 5.36

Page 123: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 111

De uitvoer wordt nu ietwat slordig getoond, zie figuur 5.37.

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 ver-vangen door de door ons gewenste tekst Gemiddelde bedrag: Prijs per persoon. Vergeet daarbij niet om ook weer de dubbele punt te plaatsen, zie figuur 5.38.

De uitvoer ziet er nu netter uit, zie figuur 5.39.

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. Dit doen we door in de regel Totaal te kiezen voor de functie Waar (van Waarvoor geldt dat) en door in de regel Criteria de betreffende waarde te plaatsen waarop moet worden geselecteerd, in ons geval de tekst Spanje. We zien dat het vinkje in de regel Weergeven automatisch wordt verwijderd. Er zijn immers meer-dere reizen naar Spanje. Dit betekent dat de query dus meerdere keren iets wenst te tonen. Er is echter maar één gemiddelde prijs

Figuur 5.37

Figuur 5.38

Figuur 5.39

Page 124: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003112

voor deze reizen. Aan de ene kant moet iets dus vaker worden ge-toond, het land, en aan de andere kant moet iets slechts één keer worden getoond. Dat kan niet. Access lost dit op door het land niet te laten opnemen in de query, zie figuur 5.40.

Opgave

5.7 Zorg ervoor dat alle uitvoer netjes wordt getoond.a. Wat is de gemiddelde duur van alle door het reisbureau aan-

geboden reizen? We vinden als het goed is 16,29.b. Hoeveel klanten heeft het reisbureau? We vinden als het goed is

22. 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 19.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 2250.

5.9.3 Gegevens opvragen, geavanceerde selectiequery

De query’s zoals we die tot nu toe hebben gemaakt, zijn vaste query’s. Ze geven altijd antwoord op dezelfde vragen, bijvoorbeeld welke klanten een reis naar Azië hebben geboekt. Om een soort-gelijk overzicht te krijgen van de klanten die een reis naar Noord-Amerika hebben geboekt, moeten we een nieuwe query aanmaken, met een iets andere voorwaarde. Op deze manier ontstaan er echter erg veel query’s die eigenlijk in niets van elkaar verschillen, alleen een kleine wijziging in een criterium.

Figuur 5.40

Page 125: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 113

Het is mogelijk om query’s flexibeler te maken en bij het uitvoeren van de query te laten vragen om de waarde van het selectiecrite-rium. 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 flexibele query te maken moeten we bij de betreffende voorwaarde (het criterium) een vraag opgeven. Tijdens het uitvoe-ren 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 figuur 5.41 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.

Na uitvoering van de query verschijnt eerst het scherm uit figuur 5.42, waarin om het gewenste werelddeel wordt gevraagd.

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

Figuur 5.41

Figuur 5.42

Page 126: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003114

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 uiter-ste betaaldatum opnemen in de query. Dit doen we als volgt:

Open het query-ontwerpscherm; maak dus een nieuwe query of wijzig een bestaande query. 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. Behandel het veld verder alsof het een normaal, bestaand veld is; we kunnen dus sorteren, voorwaarden opgeven, enzovoort. Denk eraan dat bij het gebruik van veldnamen in de berekening, de veldnaam tussen rechte haken moet worden geplaatst, dus: [Boekdatum] + 30.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), gevol-gd door een punt. In figuur 5.43 is het voorbeeld te zien, let op de vierde kolom van de query.

In het zojuist besproken voorbeeld geldt voor iedere reis dat er uiter-lijk binnen dertig dagen na de boekdatum moet zijn betaald. Stel

Figuur 5.43

Page 127: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 115

dat we dit alleen willen hanteren bij reizen waarvan de prijs min-der 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 deze afhankelijkheid in de voorwaarde brengen 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 voor-waarde 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, 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 ).

In het algemeen geldt dat wanneer we werken met query’s 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. Daartoe klikken we in het scherm waarin de query’s wor-den opgebouwd (zie figuur 5.38) op de rechtermuisknop en kiezen vervolgens in het getoonde menu voor Eigenschappen. We kunnen nu een aantal eigenschappen opgeven, zie figuur 5.44.

Page 128: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003116

Drie van de getoonde eigenschappen zijn heel goed bruikbaar. Dit betreft als eerste de instelling Top-waarden. Hiermee kunnen we ervoor zorgen dat van een grote hoeveelheid uitvoerrijen bijvoor-beeld slechts de eerste 25 rijen of de eerste 5% van de rijen worden getoond. De twee andere zeer bruikbare instellingen zijn die van Unieke waarden en Unieke records. Nu wordt dubbele uitvoer op het scherm achterwege gelaten. Kiezen we voor unieke waarden, 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.

5.9.4 Gegevens groeperen, group-by-query

Tot nu zijn query’s 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 maxi-mum, enzovoort. Per groepje gegevens laten we dit vervolgens op het scherm tonen. Een dergelijke query maken we als volgt:

Figuur 5.44

Page 129: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 117

Zorg dat het query-ontwerpscherm actief is. Plaats de cursor in het onderste deel van het queryscherm, in het veld op basis waarvan gegroepeerd moet worden. Klik op de sommatieknop . Er verschijnt dan een nieuwe regel, de regel Totaal. In deze regel kunnen we per veld opgeven welke rekenfunctie we willen gebruiken.

In figuur 5.45 is gebruikgemaakt van de tabellen Bestemming en Reis. Per land van bestemming is hier de maximumprijs, de gemid-delde prijs en het aantal reizen bepaald. De gegevens worden alleen getoond als de gemiddelde prijs hoger is dan 1000,–. Daartoe is eerst het veld Land geplaatst. Vervolgens is op de sommatieknop geklikt om te laten groeperen, waarna twee maal het veld Prijs per persoon is ingevoegd. In de regel Totaal is daar vervolgens de functie Max en de functie Gem aan toegevoegd. Daardoor worden per land van bestemming de hoogste prijs en de gemiddelde prijs (een maal) getoond. Ten slotte is het veld Reisnummer toegevoegd, voorzien van de functie Aantal. Daardoor wordt per land van be-stemming het aantal reizen (reisnummer) bepaald en afgedrukt.

Overigens, om een query direct vanuit het ontwerpscherm te laten uitvoeren klikken we op de run-knop, de knop met het opschrift !. Om vanuit het uitvoerscherm van de query weer direct terug te keren naar het ontwerpscherm klikken we op de knop Beeld, links in de werkbalk.

We kunnen bij het groeperen onder andere de volgende functies gebruiken:

Figuur 5.45

Page 130: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003118

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 veldAantal het aantal keren dat er in het veld iets is ingevuld (niet leeg)Eerste de waarde in het eerste recordLaatste de waarde in het laatste record

Als we gegevens groeperen (Group By) en een criterium gebrui-ken, dan geldt dit criterium voor de groep. Dat wil zeggen dat er eerst wordt gegroepeerd en dat er pas op het moment van afdruk-ken wordt gekeken naar het opgegeven criterium. Alleen groepen die voldoen aan het criterium worden opgenomen in het overzicht. In de query die in figuur 5.46 is afgebeeld wordt per land van bestemming het aantal georganiseerde reizen getoond, als de gemiddelde prijs van die reizen hoger is dan 2000. Hierbij wordt dus niet gekeken naar de afzonderlijke reizen, maar alleen naar de reizen als groep.

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 (Total) selecteren we de optie Waar (Where). Ten slotte plaatsen we het criterium 21. We krijgen dan de query zoals deze in figuur 5.47 staat weergegeven.

Figuur 5.46

Page 131: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 119

Allereerst worden nu de reizen geselecteerd die voldoen aan de voorwaarde dat deze 21 dagen duren. Vervolgens worden deze rei-zen 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 2000! Let erop dat de kolom waar de optie Waar (Where) gebruikt wordt, nooit getoond wordt in het overzicht. Het gaat hier namelijk niet om een groeps-gegeven, maar om een gegeven van de individuele records! Access verwijdert daarom automatisch het vinkje in de weergaveregel.

5.9.5 Gegevens wijzigen, bijwerkquery

Een bijwerkquery gebruiken we om op eenvoudige wijze de waarde in een veld aan te passen; bijvoorbeeld: door een staking van de vluchtleiders moeten alle reizen die in de eerste week van mei vertrekken met een week worden uitgesteld. We handelen als volgt:

Zorg dat het query-ontwerpscherm actief is.Selecteer in het menu Query of klik op de knop Querytype en selecteer in de lijst Query bijwerken. In het queryscherm wordt nu een extra regel opgenomen, de regel Wijzigen in. Geef hier bij de desbetreffende te wijzigen velden een nieuwe waarde op. Verhoog in het geval van de uitgestelde reis dus bij de Vertrekdatum de datum met zeven dagen; de formule [Vertrekdatum]+7.Dit alleen moet gebeuren bij de reizen in de eerste week van mei. Voeg er de voorwaarde Between #1-5-2005# And #7-5-2005# aan toe, zie figuur 5.48. Door de query te laten uitvoeren worden de wijzigingen aangebracht.

Figuur 5.47

Page 132: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003120

5.9.6 Gegevens verwijderen, verwijderquery

We kunnen ook een query gebruiken om records te verwijderen. We gaan op dezelfde wijze te werk als hiervoor beschreven. Nu kiezen we echter met behulp van de knop Querytype het type Verwijderquery. De regel Verwijderen wordt toegevoegd. Onder deze regel kunnen we weer de voorwaarden opnemen. Alle records die voldoen aan de voorwaarde(n) zullen tijdens de uitvoering worden verwijderd. In het voorbeeld van figuur 5.49 zullen alle reizen worden verwijderd die korter dan zeven dagen duren.

Bij de verwijderquery kunnen we slechts records uit één tabel tegelijkertijd verwijderen. Als er bij het verwijderen meer dan één tabel betrokken is, moeten we in de regel Veld alle velden uit de betreffende tabel (de tabel waaruit moet worden verwijderd) selec-teren, door daar de naam van de tabel op te geven gevolgd door de toevoeging .*, dus bijvoorbeeld: Bestemming.*. Als we bij de relatie tussen de betrokken tabellen de mogelijkheid trapsgewijs verwij-deren hebben geactiveerd, zullen indien nodig ook gerelateerde records uit de andere bestanden worden verwijderd, zie ook para-graaf 5.8.1. Tevens moeten we dan in het tabblad Eigenschappen, zie figuur 5.44, de eigenschap Unieke records op Ja instellen.

Bij het verwijderen van records uit een tabel is het belangrijk dat we de relaties naar de tabel juist hebben gedefinieerd omdat het ons anders niet zal lukken records te verwijderen! Het is van belang om van iedere relatie waarbij de tabel als primaire tabel optreedt, dat wil zeggen dat in de tabel het veld waarop de relatie is gebaseerd de sleutel is, de eigenschap Gerelateerde records trap-

Figuur 5.48

Page 133: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 121

gewijs verwijderen aan te vinken. Je kunt dit achteraf doen door in het scherm Relaties de bestaande relatie te verwijderen en vervol-gens opnieuw te definiëren. Tijdens het definiëren kun je het trap-gewijs verwijderen opgeven. Wordt er nu een record uit de primai-re tabel verwijderd, dan zullen ook alle overeenstemmende records (op basis van de gedefinieerde relatie) uit de gerelateerde tabel(len) worden verwijderd. Door nu een klant te verwijderen worden automatisch ook alle boekingen van die klant verwijderd! Bedenk dat door het verwijderen van één record uit de betreffende tabel, er vele honderden records uit gerelateerde tabellen kunnen worden verwijderd. Je bent niet verplicht de gerelateerde tabellen specifiek bij de query te betrekken. Access betrekt ze er op de achtergrond zelf wel bij. Dit heeft als gevolg dat de verwijderquery zoals die staat afgebeeld in figuur 5.49 niet alleen de betreffende records uit de tabel Reis verwijdert maar ook de boekingen die voor deze reizen gemaakt zijn. Dit komt omdat het verband tussen Boekingen Reis is gebaseerd op het gegeven Reisnummer, en Reisnummer is in Reis de sleutel. Zouden de bijbehorende boekingen niet auto-matisch worden verwijderd, dan zouden er boekingen ontstaan die verwijzen naar een niet meer bestaande reis! En dat willen we niet. Want waar ging die klant dan naar toe? En hoeveel moest hij ei-genlijk betalen? En wanneer moeten we de klant gepakt en gezakt voor de balie verwachten (vertrekdatum)? Vinken we het trapsgewijs verwijderen niet aan, dan kun je een record uit de primaire tabel niet verwijderen zolang er in de gerelateerde tabel overeenstemmende records bestaan! Dit om te voorkomen dat er in de gerelateerde tabel records overblijven die verwijzen naar een niet langer bestaande sleutelwaarde.

Figuur 5.49

Page 134: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003122

5.9.7 Overige query’s

Naast de hiervoor besproken query’s (opvraag, group by, bijwerk en verwijder) kunnen we ook query’s definiëren om een nieuwe tabel aan te maken of een bestaande tabel uit te breiden. Hiertoe ontwerpen we eerst een normale opvraagquery. 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 query-ontwerpscherm met behulp van de knop Querytype het type Tabelmaakquery. Vervolgens laten we de query nogmaals uitvoeren.

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, het type Toevoegquery. Ook nu laten we hierna de query nogmaals uitvoeren. In beide gevallen zal Access de naam van de tabel vragen die moet worden aangemaakt of moet worden uitgebreid.

In figuur 5.27 kun je zien dat er nog twee andere soorten query’s bestaan die soms goed kunnen worden toegepast. De eerste query zoekt naar wat Access noemt ‘dubbele records’. Daarbij kunnen we in een tabel laten zoeken naar records waar in de door ons opgegeven velden waarden meer dan één keer voorkomen. Records die daaraan voldoen worden opgenomen in de uitvoer. Het andere 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 op basis van welk gemeen-schappelijk veld de vergelijking tussen de beide tabellen moet worden gemaakt. Hiermee kun je snel een overzicht maken van de klanten zonder boeking, of van bestemmingen zonder reizen, of …

Opgave

5.8 a. Verzorg een overzicht met alle gegevens van de klanten uit een door de gebruiker in te toetsen woonplaats.

b. Bepaal per land van bestemming het aantal reizen naar dat land. Toon per land het gevonden aantal.

Page 135: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 1235 Eenvoudige bewerkingen in Access 123

c. Bepaal per reis het totale bedrag dat inmiddels al betaald is. Toon de reisnummers en de gevonden bedragen.

d. Bepaal per reis het aantal boekingen, toon de plaats van bestemming en de gevonden aantallen, in volgorde van oplopende aantallen.

e. Bepaal 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. (Er zijn vijf landen.)

f. Men wil reizigers die binnen twee weken na het boeken van hun reis het verschuldigde bedrag voldoen, een korting van 5% geven. Laat een overzicht afdrukken met daarin per reis de vol-gende gegevens: plaatsnaam, land, vertrekdatum, standaardprijs en prijs inclusief 5% korting.Aanwijzing: gebruik voor de prijs inclusief korting een reken-veld.

g. Ten gevolge van politieke spanningen wordt besloten dat op reizen een extra brandstoftoeslag wordt geheven. Buiten West-Europa bedraagt de toeslag 35,– per reis per persoon, binnen West-Europa geldt een opslag van 25,–. Verzorg een over-zicht met daarin het reisnummer, de plaats van bestemming, het werelddeel en de te heffen toeslag. Aanwijzing: definieer de toeslag als rekenveld en maak gebruik van de functie IIF.

h. 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 41/2 %. Aanwijzing: gebruik hier de functie IIF. (Maak eerst een kopie van de database via Bestand, Backup maken van de database. Er wordt bij achttien reizen een prijswijziging doorgevoerd.)

i. 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. (Controleer eventueel eerst nog even of bij de relatie tussen Boeking en Klant de optie trapgewijs verwij-deren is aangevinkt.) Gebruik de query om alle Rotterdamse klanten daadwerkelijk te verwijderen. Controleer of inderdaad alle Rotterdammers zijn verwijderd. Bepaal nu nogmaals het aantal boekingen en controleer of dit aantal klopt.

Zet ten slotte de gemaakte kopie van je database weer terug.

Page 136: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003124

5.10 Rapporten

Tot nu toe zijn alle overzichten op het scherm getoond. We hebben ons daarbij voornamelijk beperkt tot de uitvoer van query’s. 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. We maken daarbij gebruik van rapporten.

Er zijn drie manieren om een rapport te ontwerpen. We kunnen gebruikmaken van een standaardrapport ofwel AutoRapport (snel-rapport): dit is een zeer eenvoudige standaard lay-out voor een rap-port. 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 gege-nereerd rapport later met de hand te vervolmaken. Het zelf aanpas-sen en ontwerpen van rapporten komt in een later hoofdstuk ter sprake, in deze paragraaf beperken we ons tot het ontwerpen met behulp van wizards.

5.10.1 Rapport ontwerpen via AutoRapport

Een rapport aanmaken via AutoRapport gaat als volgt:

Open de bijbehorende database. Selecteer in het databasescherm het overzicht Rapporten. Alle bestaande rapporten worden getoond, zie figuur 5.50. Klik op de knop Nieuw om een nieuw rapport te ontwerpen. Geef aan op welke wijze het rapport moet worden ingedeeld, zie figuur 5.51.Kies voor Autorapport: in kolomvorm of AutoRapport: in tabel-vorm. In het eerste geval worden de gegevens (per record) onder elkaar getoond, in het tweede geval worden de gegevens als tabel getoond, dus de gegevens van één record naast elkaar.Geef aan op welke tabel of op welke query het rapport moet wor-den gebaseerd. Klik op de knop OK; het rapport wordt gegenereerd en op het scherm getoond.

Page 137: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 125

Klik om het rapport af te drukken in de werkbalk op de knop Afdrukken of kies Bestand, Afdrukken. Bekijk zonodig eerst het printvoorbeeld, klik op de knop Afdrukvoorbeeld. Zo kunnen we bijvoorbeeld de grootte instellen, evenals het aantal pagina’s dat tegelijkertijd moet worden getoond. Figuur 5.52 bevat een voor-beeld van een rapport in kolomvorm, gebaseerd op de tabel Reis.Sluit af door in de werkbalk op de knop Sluiten te klikken of door op de knop X te klikken in het scherm waarin het printvoorbeeld wordt getoond. (Klikken we op de knop Sluiten om af te sluiten, dan komen we terecht in het rapportontwerpscherm. Hier kunnen we het rapport verder bewerken; we komen hier later op terug. Sluit dit scherm af door op de knop X te klikken.)

Figuur 5.50

Figuur 5.51

Page 138: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003126

Voordat we het genereren van het rapport volledig afsluiten, zal Access nog vragen of we het rapport willen opslaan en onder wel-ke naam. De naam die we hier opgeven, wordt later getoond op het tabblad met alle bestaande rapporten.

5.10.2 Rapport ontwerpen via de Wizard

Willen we een rapport met meer vrijheid dan het standaardrapport, dan gebruiken we de Wizard Rapport:

Activeer in het databasescherm het overzicht Rapporten en klik op de knop Nieuw. Kies voor de mogelijkheid Wizard Rapport.Geef in dit venster een tabel of query op waarop het rapport geba-seerd dient te worden; dit hoeft trouwens niet meteen. Klik op de knop OK. We komen in het scherm terecht waarin we opgeven welke tabellen en met name welke velden er in het rapport moeten worden opgenomen, zie figuur 5.54. We kunnen meerdere tabellen of query’s na elkaar selecteren en hiervan velden op laten nemen in het rapport door ze naar het deel Geselecteerde velden te verplaatsen.

Figuur 5.51

Page 139: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 127

In figuur 5.54 zijn achtereenvolgens velden uit de tabellen Bestemming, Reis, Boeking en Klant geselecteerd. Klik nadat alle velden zijn geselecteerd op de knop Volgende .

Geef in het scherm dat verschijnt op (zie figuur 5.55) of de gege-vens gegroepeerd moeten worden en als dat zo is, op basis van welk veld dat dan moet gebeuren. Access zal zelf, op basis van de gebruikte tabellen en de volgorde bij het selecteren van de velden, een voorstel doen voor het groeperen. Pas dit eventueel aan door een van de getoonde tabellen te selecteren. De bijbehorende inde-ling verschijnt in het rechterdeel.Klik nadat de juiste indeling is opgegeven op de knop Volgende. Definieer in het nu getoonde scherm (zie figuur 5.56) eventueel nog extra groepeerniveaus door één van de velden waarop kan worden gegroepeerd over te zetten naar het rechterdeel van het scherm.

Figuur 5.53

Figuur 5.54

Page 140: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003128

De plaats waar de groep moet worden ondergebracht, kan met de Prioriteit-knoppen worden beïnvloed. Met de knop Opties voor groeperen hebben we inspraak en kunnen we er bijvoorbeeld voor zorgen dat gegevens in groepjes van tien stuks worden getoond. Sluit dit scherm af met de knop Volgende.Geef in het scherm dat nu verschijnt (zie figuur 5.57) op hoe de getoonde gegevens moeten worden gesorteerd. We kunnen de detailgegevens op basis van maximaal vier velden tegelijkertijd laten sorteren, dus bijvoorbeeld op naam en bij gelijke naam op boekdatum. Klik na het maken van een keuze op Volgende. Het volgende scherm (zie figuur 5.58) geeft gelegenheid de lay-out voor het rap-port op te geven. We hebben de keuze uit zes verschillende moge-lijkheden.

Figuur 5.55

Figuur 5.56

Page 141: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 129

Van de gekozen lay-out wordt het voorbeeld getoond. Geef hier ook op of het rapport Staand of Liggend moet worden afgedrukt. Kies de optie Veldbreedte aanpassen... eventueel om aan te geven dat Access de breedte van de velden mag aanpassen, zodat alle velden getoond kunnen worden. Sluit met de knop Volgende ook dit scherm weer af.We komen nu terecht in het voorlaatste scherm van de Wizard, zie figuur 5.59. Geef hierin de stijl van het rapport op door een keuze te maken uit de zes verschillende stijlen. Van iedere stijl wordt een voorbeeld getoond. Sluit weer af met de knop Volgende.

Figuur 5.57

Figuur 5.58

Page 142: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003130

Geef in het laatste scherm van de Wizard, figuur 5.60, het rapport een naam. De lay-out en alle andere instellingen van het rapport worden onder de opgegeven naam bewaard voor later gebruik.

Geef desgewenst op of er een afdrukvoorbeeld moet komen of dat het zojuist ontworpen rapport direct handmatig gewijzigd moet worden. Meestal zullen we kiezen voor het afdrukvoorbeeld. Sluit de Wizard af met de knop Voltooien. De Wizard zal het rap-port genereren en het vervolgens tonen in het zojuist gekozen scherm (afdrukvoorbeeld of ontwerpscherm).

Figuur 5.59

Figuur 5.60

Page 143: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 131

In hoofdstuk 7 wordt uitgebreid ingegaan op het ontwerpen en ver-fijnen van rapporten.

5.10.3 Etiket ontwerpen

Een etiket is feitelijk niets anders dan een speciaal opgemaakt rap-port, afgedrukt op een afwijkend papierformaat. Een etiket ontwer-pen gaat als volgt:

Start in het databasescherm overzicht Rapporten via de knop Nieuw de Wizard Adresetiketten. Geef daarbij direct op op welke tabel of query het etiket moet zijn gebaseerd, zie figuur 5.61.

De Wizard zal als eerste vragen welk type etiketten gebruikt moet worden (zie figuur 5.62). De meest voorkomende formaten zijn voorgeprogrammeerd. Maak een keuze. Op de doos van de etiket-ten staat de soortaanduiding ook vermeld, bijvoorbeeld Avery J8159. De fabrikant (Avery) maken we bekend door op de naam van de fabrikant te laten filteren. Hierna kunnen we het juiste pro-ductnummer (J8159) selecteren. 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 (la-serprinter, sheetfeeder) of van kettingformulieren (matrixprinter). Definieer eventueel een nieuw, afwijkend formaat met behulp van de knop Aanpassen.Klik op de knop Volgende om door te gaan. Geef in het scherm (figuur 5.63) de tekenopmaak op, dus het lettertype, de puntgroot-te, zwarting, tekengewicht en tekenkleur. Geef eventueel ook op of de gegevens cursief en/of onderstreept afgedrukt moet worden.

Figuur 5.61

Page 144: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003132

Klik op de knop Volgende. Geef op welke gegevens op het etiket opgenomen moeten worden, zie figuur 5.64. Selecteer een regel in het rechterdeel van het scherm, het Modeletiket. Typ eventueel eerst wat begeleidende tekst en selecteer vervolgens in het linker-gedeelte van het scherm een van de beschikbare velden. Neem met de knop > het gegeven vervolgens ook op in het modeletiket. Op deze wijze bouwen we het etiket op.Klik op de knop Volgende; we komen in het voorlaatste scherm van de Wizard. Geef op wat de gewenste sorteervolgorde is (figuur 5.65). We kunnen op meer dan één veld laten sorteren. Plaats de velden op de bekende wijze over naar het gedeelte Sorteren op. Geven we meer dan één veld op, dan wordt eerst gesorteerd op de

Figuur 5.62

Figuur 5.63

Page 145: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 133

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.

Klik op de knop Volgende, zie figuur 5.66. We kunnen het etiket-ontwerp een naam geven en bepalen of we de gegevens willen zien in een printvoorbeeld of dat we het ontwerp direct willen verfijnen door het in het ontwerpscherm op te roepen. Dit laatste scherm wordt in een later hoofdstuk besproken.

Figuur 5.64

Figuur 5.65

Page 146: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003134

5.10.4 Een rapport of etiket afdrukken

Een rapport of etiket afdrukken:

Selecteer in het databasescherm het tabblad Rapporten. Kies het betreffende rapport of etiket en activeer het met behulp

van de knop Voorbeeld. Het rapport of etiket wordt als afdruk-voorbeeld op het scherm getoond.

Laat het hier vervolgens afdrukken via Bestand, Afdrukken.

Omdat in een rapport niet alleen is opgegeven hoe de opbouw van het rapport is, maar ook op welke tabel(len) of op welke query het is gebaseerd, ligt de uitvoer in principe vast; bijvoorbeeld een overzicht van alle reizen binnen Europa, of etiketten voor de klanten die over twee weken vertrekken. Willen we de toepassings-mogelijkheden van rapporten vergroten, dan is het verstandig deze te baseren op fl exibele query’s. Doordat de gebruiker hier zelf (fl exibel) kan opgeven welke selectiecriteria gelden, kan het rap-port aan waarde winnen. Met één rapport kan dan zowel een over-zicht worden verkregen van de reizen binnen als buiten Europa, of etiketten voor de klanten die met een nader te bepalen reis mee-gaan. We komen hier later op terug.

Figuur 5.66

Page 147: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 1355 Eenvoudige bewerkingen in Access 135

Opgave

5.9 a. Ontwerp een eenvoudig rapport (AutoRapport) 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 bestem-ming, het land en per geplande reis naar deze bestemming de datum van vertrek en de namen en woonplaatsen van de klan-ten die voor de betreffende reis hebben geboekt. De klanten die op dezelfde reis hebben geboekt moeten op volgorde van naam worden getoond. Zie het voorbeeld in fi guur 5.67.

d. Bij onderdeel a. van opdracht 5.8 hebben we een query opge-steld 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 gebruike-lijke gegevens op het etiket tonen.

5.11 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. We kunnen echter voor het invoeren of wijzigen van gegevens ook gebruikmaken van formu-lieren. Bij het werken met een formulier bepalen we zelf hoe de lay-out van de gegevens op het scherm moet zijn. Bovendien heb-ben we nu de mogelijkheid om steeds slechts één record tegelijker-tijd op het scherm te laten tonen. We kunnen bij het ontwerpen van formulieren weer hulp krijgen van Access.

5.11.1 Formulier ontwerpen via AutoFormulier

Een AutoFormulier (snelformulier) gebruiken we om gegevens van één tabel of één query tegelijkertijd te benaderen, te tonen, te wijzigen of in te voeren. De records worden daarbij afzonderlijk van elkaar op het scherm getoond, de een na de ander. Om een AutoFormulier te ontwerpen gaan we op de volgende manier te werk.

Page 148: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003136

Open de betreffende database. Selecteer in het databasescherm het overzicht Formulieren en klik op de knop Nieuw. Geef in het venster dat verschijnt (figuur 5.68) op hoe het autofor-mulier moet worden opgezet: in kolomvorm, tabelvorm of in de vorm van een gegevensblad.

Kiezen we voor een formulier in kolomvorm, dan krijgen we een formulier waarbij de afzonderlijke gegevens van één record in kolomvorm (onder elkaar) staan weergegeven. In de tabelvorm worden de gegevens van één record naast elkaar afgebeeld. Er worden meerdere records tegelijkertijd getoond. Dit lijkt sterk op de standaardwijze van invoeren, met dat verschil dat het scherm

Figuur 5.67

Figuur 5.68

Page 149: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 137

alleen is voorzien van een achtergrondstructuur. Kiezen we voor de gegevensbladvorm, dan krijgen we het standaardscherm zoals we dat tot nu toe steeds hebben gebruikt. De laatste twee vormen zullen we waarschijnlijk niet gauw kiezen. De eerste manier, in kolomvorm, wel.

Geef behalve de gewenste presentatiewijze (kolom, tabel of gege-vensblad) ook op welke tabel of (uitvoer van de) query benaderd moet worden.Klik op de knop OK. Het formulier wordt ontworpen en we kun-nen het gebruiken om door de tabel te grasduinen of om nieuwe gegevens toe te voegen.Sluit het formulier af door het formuliervenster te sluiten. Access zal vragen onder welke naam het formulier moet worden bewaard. Deze naam kunnen we later gebruiken om het formulier weer te activeren.

5.11.2 Formulier ontwerpen via de Wizard

We kunnen een formulier laten ontwerpen met behulp van de Wizard. Daarbij krijgen we iets meer mogelijkheden dan die gebo-den zijn bij het gebruik van een AutoFormulier. Om een formulier te maken met behulp van de Wizard gaan we op dezelfde wijze te werk als in de vorige paragraaf. Nu kiezen we echter voor de Wizard Formulier.

We hoeven hier vooralsnog niet op te geven welke tabel of query we willen benaderen. Klik dus op OK. Geef in het scherm dat verschijnt (zie figuur 5.69) op welke tabel-len en welke velden op het formulier geplaatst moeten worden. Zet de betreffende velden van het gedeelte Beschikbare velden naar het gedeelte Geselecteerde velden.

We kunnen gegevens uit meer dan één tabel selecteren. In deze paragraaf wordt alleen toegelicht hoe we werken met één tabel of query tegelijkertijd. In een van de volgende hoofdstukken wordt het werken met meerdere tabellen tegelijkertijd toegelicht. We wer-ken dan met hoofd- en subformulieren.

Klik als op de gebruikelijke wijze alle relevante velden zijn geselecteerd op de knop Volgende. Geef hier op op welke wijze de gegevens gepresenteerd moeten worden (zie figuur. 5.70).

Page 150: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003138

Hierbij geldt weer dat we waarschijnlijk alleen de kolomvorm of uitvulvorm zullen gebruiken. De laatste vorm is gelijk aan de kolomvorm, alleen worden de gegevens nu ook gedeeltelijk naast elkaar geplaatst, zodat de volle breedte van het scherm gebruikt wordt. Maak een keuze en klik op Volgende.Geef in het scherm dat verschijnt (figuur 5.71) op op welke achter-grond het formulier geplaatst moet worden. We hebben de keuze uit tien mogelijkheden. Na het maken van de keuze klikken we weer op Volgende.

Figuur 5.69

Figuur 5.70

Page 151: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 139

Geef het formulier een naam (zie figuur 5.72) en geef op of het geopend moet worden om te gebruiken of dat het formulier direct gewijzigd moet worden om alle details naar eigen wens in te stel-len. Op het laatste komen we later uitgebreid terug. Klik ten slotte op de knop Voltooien.

In hoofdstuk 6 wordt uitgebreid ingegaan op het ontwerpen en ver-fijnen van formulieren.

Figuur 5.71

Figuur 5.72

Page 152: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003140

5.11.3 Een formulier gebruiken

Een formulier dat we eerder hebben ontworpen, kunnen we acti-veren door in het databasescherm het tabblad Formulieren te activeren. Vervolgens selecteren we het betreffende formulier en klikken op de knop Openen om het te activeren. We kunnen met het formulier gegevens toevoegen, verwijderen en wijzigen. Onder in het scherm staan weer de bekende knoppen waarmee we door de gegevens kunnen bladeren. Na afloop sluiten we het formulier-scherm door op de knop X te klikken.

Opgave

5.10 a. Gebruik de mogelijkheid AutoFormulier om een formulier te ontwerpen waarmee we gegevens kunnen toevoegen aan de tabel Bestemming. Gebruik de tabelvorm en noem het formulier Bestemming.

b. Gebruik de Wizard Formulier om formulieren te maken voor het invoeren van reizen. Doe dit ook voor het invoeren van boekingen en voor het invoeren van klanten. Kies hier de tabel-vorm voor het invoeren van reizen en boekingen en kies voor het invoeren van klanten voor de vorm Uitgevuld. Sla de formu-lieren op onder respectievelijk de naam Reis, Boeking en Klant.

5.12 Webpagina’s

Access biedt de mogelijkheid om Data Access-pagina’s te ontwer-pen en te koppelen aan bestaande databases. Met een Data Access-pagina kan informatie die ligt opgeslagen in een database (Access of MS SQL) worden opgevraagd of worden gemuteerd via een webbrowser, dus via het internet of via een intranet. Als gebruikers de Data Access-pagina willen bekijken en ermee willen werken, moeten ze beschikken over Microsoft Internet Explorer 5 (of ho-ger) en een gebruiksrecht voor Microsoft Office 2000 (of hoger). Een Data Access-pagina kan gebruikt worden voor het doorvoe-ren van mutaties (toevoegen, wijzigen, verwijderen) als er op de betreffende pagina slechts gegevens gebruikt worden die uit één enkele tabel afkomstig zijn. Als de gegevens vanuit meerdere, met elkaar gerelateerde tabellen, afkomstig zijn, kan de pagina

Page 153: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 141

alleen maar gebruikt worden om bestaande gegevens te raad-plegen. De gegevens worden daarbij over het algemeen gegroe-peerd aangeboden, bijvoorbeeld per reis alle namen van de deel-nemers of per deelnemer alle geboekte reizen. Helaas blijkt het niet mogelijk te zijn om dergelijke raadpleegpagina’s met behulp van een wizard direct in een bruikbare lay-out te ontwerpen. Een met een wizard ontworpen raadpleegpagina dient handmatig te worden aangepast. In een van de volgende hoofdstukken wordt daar verder op ingegaan. Hier zullen wij ons beperken tot het ontwerpen van pagina’s die gebaseerd zijn op slechts één enkele tabel. Daarmee kunnen we bijvoorbeeld klanten toevoegen of reizen raadplegen. We kunnen dus niet per reis de gegevens van alle deelnemers opvragen.

Om een pagina aan te maken of te bewerken, selecteren we in het databasescherm het overzicht Pagina’s. Hier gebruiken we de knop Nieuw en vervolgens kiezen we voor Autopagina: in kolomvorm. Tevens geven we aan op welke tabel de pagina betrekking moet hebben. Hierna wordt de betreffende pagina gegenereerd en op het scherm getoond. We kunnen door de records van de betreffende tabel grasduinen zoals we dat ook bij een formulier gewend zijn. Als we de pagina afsluiten, vraagt Access of we het ontwerp wil-len opslaan. Kiezen we ervoor om het ontwerp op te slaan, dan vraagt Access allereerst de naam waaronder dat moet gebeuren. De standaard extensie wordt htm; het betreft hier immers een pagina die via een webbrowser kan worden benaderd. Tevens vraagt Access de locatie waar het ontwerp moet worden opgesla-gen. De pagina is namelijk geen onderdeel van de database, maar wordt afzonderlijk opgeslagen. Hierdoor kan de betreffende pagina vrijelijk en afzonderlijk worden gedistribueerd over alle mogelijke gebruikers, zonder dat deze ook echt over de database dienen te beschikken. In het ontwerp van de pagina is onder andere vast-gelegd met welke database deze pagina verbinding moet maken en waar de betreffende database ligt opgeslagen. Dit heeft dus het voordeel dat we kunnen volstaan met het verspreiden van de pagina, bijvoorbeeld via internet. Het heeft echter ook een nadeel. Omdat de naam van de te gebruiken database is vastgelegd in de pagina, kunnen we de plaats waar de database ligt opgesla-gen naderhand niet zonder meer wijzigen. Als de database fysiek verplaatst wordt, van de ene folder naar de andere, of van de ene computer (server) naar de andere, zal ook in de pagina deze wijzi-ging moeten worden doorgevoerd. Het is daarom verstandig om de

Page 154: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003142

pagina niet echt te verspreiden over de potentiële gebruikers, maar om deze via het (inter)net aan te bieden. Mochten we nood-gedwongen de database moeten verplaatsen, omdat we bijvoor-beeld van provider veranderen, dan hoeven we deze wijziging slechts éénmaal door te voeren in de door ons via internet aan-geboden pagina.

De wijziging kunnen we op twee manieren aanbrengen. De eerste manier is dat we de pagina opnieuw ontwerpen en daarbij direct de nieuwe locatie van de database opgeven. De tweede manier bestaat eruit dat we de internetversie van onze pagina (extensie htm) in de browser laden en vervolgens de broncode aanpassen, via Beeld, Bron. Hier zoeken we de eigenschap Connectionstring. Bij deze eigenschap geven we vervolgens de nieuwe locatie van de Data Source op. Hierna slaan we de webpagina weer op.

Opgave

5.11 Ontwerp Data Access-pagina’s voor alle vier de tabellen uit de database Reisbureau. Sluit hierna Access af en probeer de zojuist ontworpen pagina’s uit in de webbrowser. Let er daarbij op dat we tijdens het invoeren van nieuwe records in een veld van het type Autonummering geen gegevens kunnen plaatsen. Deze gegevens worden door de op de achtergrond automatisch geopende database zelf toegevoegd. We kunnen dit controleren door even te gras-duinen door de nieuw ingevoerde records.

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 20%) door de database eerst te openen en daarna in het menu te kiezen voor Extra, Databasehulpprogramma’s, Database comprimeren en herstellen. De data binnen de database wordt nu geoptimaliseerd en aaneengesloten weggeschreven waardoor de omvang op schijf sterk afneemt. Het verdient aanbeveling deze activiteit met enige regelmaat te laten uitvoeren.

Page 155: Databaseontwikkeling Access 2003

5 Eenvoudige bewerkingen in Access 1435 Eenvoudige bewerkingen in Access 143

Herhalingsopdrachten

5.12 Creëren database en bestanda. Ontwerp de database Telefoon. Neem hierin de tabel Telefoon

op met daarin de velden: telefoonnummer, naam, adres, post-code 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.

b. Voer een aantal personen in.c. Sluit de database weer af.

5.13 Manipuleren/tonen gegevensa. Selecteer de database Reisbureau. Activeer de tabel Klant.b. Gebruik een filter om alleen de klanten uit Rotterdam te laten

zien.c. Hef het filter op.d. Geef een overzicht van de klanten, gesorteerd op postcode.e. Geef het overzicht nogmaals, nu echter alleen de namen en tele-

foonnummers.f. Geef het overzicht ook op papier.

5.13 Meerdere tabellena. Selecteer de database Reisbureau.b. Verwijder de relatie tussen Reis en Bestemming.c. Leg de relatie weer aan. Zorg ervoor dat referentiële 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 zon-

der stapsgewijs wijzigen en verwijderen wordt.

5.14 Query’sa. Selecteer de database Reisbureau.b. Geef de namen van de personen die geboekt hebben voor een

bestemming in Frankrijk.

Page 156: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003144 Databaseontwikkeling 4 Access 2003144

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.

f. Ten gevolge van een gemeentelijke herindeling wordt Abbenbroek toegevoegd aan de gemeente Spijkenisse; dit dorp houdt dus op te bestaan. Maak een query waardoor deze wijzi-ging ook in het klantenbestand wordt aangebracht.

g. Wat is de totale omzet geweest van de boekingen uit de eerste week van april 2005?

5.16 Rapport / etiket / formuliera. Selecteer de database Reisbureau.b. Ontwerp een autorapport met de gegevens van de klantenc. 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. Maak een rapport met daarin per plaats van bestemming het totale aantal personen dat met een reis naar die plaats is mee-gegaan.

f. Ontwerp een formulier om gegevens toe te voegen aan de tabel Klant uit de database Reisbureau.

5.17 Rapporta. Selecteer de database Reisbureau.b. Ontwerp een rapport om per bestemming een overzicht te krij-

gen 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.

Page 157: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren

Bij de bovenstaande opsomming gaan wij ervan uit dat de leer-lingen een case uitwerken waarbij de docent/begeleider de rol van opdrachtgever/gebruiker speelt.

In dit hoofdstuk gaan we de mogelijkheden van een formulierverder toelichten. Zo wordt het plaatsen van keuzerondjes, selectie-vakjes 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 zo’n veld ook een keuze-rondje 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 annu-leringsverzekering wenst:

Page 158: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003146

Open om de wijziging in de structuur van de tabel aan te bren-gen de tabel. Selecteer in de database Reisbureau het overzicht Tabellen. 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 Annu-leringsverzekering. Het gegevenstype dient Ja/nee te worden. Sla op de bekende manier het nieuwe ontwerp op en sluit de tabel.

We gaan met de Wizard een nieuw formulier voor de tabel Boekingontwerpen:

Selecteer in het overzicht Formulieren de optie Formulier maken met wizard.Kies de tabel Boeking.Selecteer alle velden. Het formulier dient In kolomvorm getoond te worden. Kies het opmaakprofiel Standaard en wijzig de titel (naam) van het formulier in Boeking voorbeeld. Het formulier wordt nu getoond, zie figuur 6.1.

We zien dat bij het besturingselement Annuleringsverzekeringeen selectievakje staat. We zien ook dat de lay-out niet optimaal is: de tekst Annuleringsverzekering is niet helemaal leesbaar. We kunnen dit eenvoudig aanpassen door in de ontwerpweergave het selectievakje te verplaatsen en het tekstvakje te vergroten. 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

Figuur 6.1

Page 159: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 147

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:

Open het formulier in de ontwerpweergave.Selecteer het selectievakje (niet de tekst).Kies in de menubalk Opmaak, Wijzigen in, Keuzerondje. Het kan zijn dat in eerste instantie de keuze Wijzigen in niet zichtbaar is in de menu-opties. Klik in dat geval op de twee pijltjes onderaan de menu-opties.

Het selectievakje is nu gewijzigd in een keuzerondje, zie figuur 6.2. Op soortgelijke wijze kunnen we het selectievakje vervangen door een wisselknop.

Naast de informatie of de klant bij een boeking een annulerings-verzekering wenst, zullen we nog een aanpassing maken. Men wil 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.

Figuur 6.2

Page 160: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003148

Sed gaat van start. Er wordt gevraagd om de namen (labelnamen) van onze opties; zie figuur 6.3.

Kies als eerste label Contant. Druk op de Tab-toets en voer vervol-gens Pinnen en Acceptgiro in. Ga naar het volgende scherm via de knop Volgende.Het scherm dat verschijnt (zie figuur 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 Acceptgiro als standaardoptie en klik op de klecteer het overzicht Tabellen en open de tabel Boeking in de ontwerpweergave. Voeg het veld Betaalwijze toe. Het gegevenstype moet numeriek zijn.

Selecteer bij Veldlengte, Byte. Bij die veldlengte kunnen de getal-len 0-255 worden opgeslagen; ruim voldoende voor onze getallen.

Figuur 6.3

Figuur 6.4

Page 161: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 149

Standaard krijgt de eerste optie de waarde 1. De tweede optie krijgt de waarde 2, enzovoort. Extra informatie over veldlengte kun je vinden in bijlage A.Sla de nieuwe structuur op. Selecteer vervolgens in het overzicht Formulieren het zojuist gemaakte formulier, Boeking voorbeeld, in de ontwerpweergave. Onder het veld Annuleringsverzekering gaan we het nieuwe veld toevoegen. Als daar geen ruimte voor is, sleep dan de Formuliervoettekst iets naar beneden of vergroot de rechterkant iets.Open indien nodig de werkset met de knop Werkset op de werk-balk. Activeer eventueel in de werkset de knop Wizards voor besturings-elementen. Hierdoor krijgen we hulp bij het maken van een groeps-vak. Klik in de werkset op de knop Groepsvak, verplaats de muis naar het formulier en markeer het gebied waar het groepsvak moet komen. De Wizarnop Volgende.De optie die we kiezen, krijgt een numerieke waarde toegekend, die aan het veld Betaalwijze in onze tabel Boeking wordt opgesla-gen. De waarden zijn, zoals reeds eerder opgemerkt, standaard op 1, 2 en 3 gezet, zie figuur 6.5. Eventueel kunnen we die waarden veranderen. We doen dat niet. Kies voor de standaardwaarden en klik op de knop Volgende.

In het scherm dat verschijnt (figuur 6.6) wordt gevraagd of we de geselecteerde waarde willen gebruiken voor later gebruik of wil-len opslaan in de database. Wij willen het geselecteerde opslaan

Figuur 6.5

Page 162: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003150

in het veld Betaalwijze uit de tabel Boeking. Klik op het keuze-rondje Opslaan in dit veld en selecteer uit de keuzelijst het veld Betaalwijze. Klik weer op de knop Volgende.

In het volgende scherm van de Wizard hebben we de keuze uit ver-schillende opmaakmogelijkheden van het groepsvak; zie figuur 6.7. We kunnen kiezen uit Selectievakjes, Keuzerondjes of Wissel-knoppen. 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, Scha-duw 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.

In het laatste scherm van de Wizard gaan we weer door de finish-vlag. Hier kunnen we het groepsvak nog van een bijschrift voor-zien. Kies als bijschrift Betaalwijze en klik op de knop Voltooien.

Figuur 6.6

Figuur 6.7

Page 163: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 151

Bekijk vervolgens het nieuwe formulier in de formulierweer-gave. Merk op dat de vinkjes bij bestaande records nog niet aan-wezig 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, Acceptgiro, 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 aan-passen. 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 para-graaf 6.3, Keuzelijsten.

Opgave

6.1 a. Open het formulier Boeking voorbeeld in de formulierweer-gave. Vul bij iedere boeking in of een annuleringsverzekering gewenst is en de gewenste betaalwijze.

b. Wijzig in het formulier Boeking voorbeeld het veld Annulerings-verzekering zodanig dat het getoond wordt als wisselknop.

c. Het groepsvak Betaalwijze dient in hetzelfde formulier weer-gegeven te worden als een verzameling keuzerondjes.

6.2 Afbeeldingen – OLE-objecten

In Access is het mogelijk om een veld te maken dat afbeeldingen kan bevatten. Hierbij kunnen we denken aan een cd-database, die naast de gegevens van de artiest en de nummers ook een foto van die cd toont. Een ander voorbeeld is een makelaar in huizen, die naast de gegevens van het huis ook een foto van dat huis kan tonen. In onze Reisbureau-database zouden we nog hotels kun-nen opnemen met hotelgegevens en een foto van het hotel. Een afbeelding dient als gegevenstype OLE-object te krijgen. In een OLE-objectveld kunnen niet alleen afbeeldingen van foto’s wor-den opgeslagen, maar ook videofragmenten, Excel-grafieken of

Page 164: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003152

-werkbladen, geluidsfragmenten, tekeningen die gemaakt zijn met bijvoorbeeld Paint en nog veel meer.

Een OLE-object kan weergegeven worden in een afhankelijk kaderof in een niet-afhankelijk kader. We spreken over een afhankelijk en niet-afhankelijk objectkader. In een afhankelijk objectkader wor-den de OLE-objecten weergegeven die opgeslagen liggen in een tabel van de database. Onze genoemde voorbeelden worden dus getoond in een afhankelijk objectkader, de plaatjes komen immers uit een tabel van de database. Als we een afbeelding op een formu-lier of rapport willen tonen die niet uit een tabel komt, moeten we een niet-afhankelijk objectkader kiezen. Hierbij valt te denken aan het tonen van een bedrijfslogo op formulieren of rapporten. Ook zou in onze Reisbureau-database een openingsscherm getoond kunnen worden met hierop een foto van een mooi strand.

6.2.1 Afhankelijk objectkader

Open de database Oefening, die we eerder hebben gemaakt. Is dat nog niet gedaan, creëer dan eerst deze database. Ontwerp een nieuwe tabel met de volgende structuur.

Veldnaam Gegevenstype VeldlengteKenteken Tekst 8Bouwjaar Numeriek IntegerFoto OLE-objectStatus Tekst 8

Kies het veld Kenteken als sleutel. Sla de tabel op onder de naam Auto.

We gaan een formulier voor deze tabel ontwerpen. In het veld Fotogaan we foto’s van de auto’s opslaan. We zullen dan foto’s van de auto’s moeten maken met een digitale camera, zodat ze in de data-base opgeslagen kunnen worden. Op de cd-rom bij dit boek zijn drie plaatjes van auto’s opgenomen.

Selecteer de tabel Auto en kies vervolgens in het menu voor Invoe-gen, AutoFormulier. Het formulier in de formulierweergave staat in figuur 6.8. We zien dat er een kader is getekend waar de foto in geplaatst kan worden. Aangezien het een lege tabel betreft, zijn er nog geen gegevens en foto’s te zien. We gaan een record vullen.

Page 165: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 153

Voer een kenteken en bouwjaar in en ga vervolgens met de muis in het fotokader staan.Nu moeten we onze foto invoegen. Kies uit de menubalk Invoegen, Object. Er verschijnt een scherm waarin we nieuwe of bestaande objecten kunnen invoegen, zie figuur 6.9.

Door Nieuw te kiezen kunnen we verschillende nieuwe objecten maken en deze vervolgens in het kader plaatsen; bijvoorbeeld Bit Images, Excelgrafieken en foto’s uit Microsoft Photo Editor. De foto van onze auto staat echter al op schijf.

Selecteer Bestand gebruiken. Klik op de knop Bladeren om het fotobestand te zoeken. In dit voorbeeld PorscheBoxter.bmp.

Figuur 6.8

Figuur 6.9

Page 166: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003154

Verder staan op dit scherm nog twee selectievakjes, Koppelen en Als pictogram weergeven. We zetten een vinkje bij Koppelen als een koppeling gewenst is met het geselecteerde object. Het object in de database wordt dan ‘gekoppeld’ aan het origineel. Wijzigingen aan het origineel worden op die manier doorgevoerd in het object in de database. Het databaseobject verwijst immers naar het origineel. Als we bijvoorbeeld een Excel-grafiek opnemen in de database en later de grafiek met Excel wijzigen, zal de gra-fiek in de database ook aangepast zijn. Zetten we geen vinkje bij Koppelen, dan wordt het object ingesloten in de database en zullen wijzigingen in het origineel niet worden doorgevoerd in de data-base. Wij vinken Koppelen niet af; we gaan later de foto immers toch niet bewerken.

We kunnen Als pictogram weergeven van een vinkje voorzien als we niet het plaatje wensen te zien, maar een pictogram dat na het aanklikken daarvan het plaatje laat zien. Wij doen dit niet, aan-gezien we de foto direct wensen te zien.

Klik op de knop OK en de foto wordt getoond. Voer bij Status in Te koop, Optie of Verkocht.

De Wizard heeft ervoor gezorgd dat het kader waarin de foto is ge-plaatst bepaalde afmetingen heeft. Die afmetingen kunnen we van-zelfsprekend wijzigen in de ontwerpweergave. Wat gebeurt er als de foto niet in het kader past, maar te groot of te klein is? Access biedt hiervoor drie mogelijkheden, de zogenoemde Formaatmodus.

De drie opties zijn:Uitsnede – Deze optie wordt standaard gekozen door de Wizard. Als de foto niet in het kader past, wordt het gedeelte linksboven in het kader geplaatst.Kader vullen – Het kader wordt volledig gevuld met de foto. Hierdoor worden wel de horizontale en verticale afmetingen aan-gepast aan het kader, wat tot gevolg kan hebben dat de afbeelding uit zijn verband wordt getoond.Kader niet vullen – Het kader wordt zo goed mogelijk gevuld ter-wijl de beeldverhoudingen intact blijven. De onderkant of rechter-kant van het kader kan dan niet gevuld zijn.

Page 167: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 155

Selecteer de opties door in de ontwerpweergave het object-kader aan te klikken en vervolgens op de werkbalk de knop Eigenschappen te kiezen. Het tabblad Opmaak bevat de eigenschap Formaatmodus. Hier kunnen we onze keuze kenbaar maken. Als veel foto’s van verschillende afmetingen getoond moeten worden, is de optie Kader niet vullen de beste optie in combinatie met de eigenschap Speciaal effect op Geen. Zijn alle foto’s van gelijke afmetingen, dan kan voor Kader vullen gekozen worden. De afme-tingen van het kader dienen dan wel op maat gemaakt te worden, door het kader te vergroten of te verkleinen en het resultaat te bekijken.

Activeer het eigenschappenvenster en selecteer het foto-object.Verander in tabblad Opmaak de eigenschap Formaatmodus in Kader niet vullen en de eigenschap Speciaal effect in Geen.Sla het formulier op onder de naam Auto voorbeeld.

6.2.2 Niet-afhankelijk objectkader

Als we op een formulier of rapport een afbeelding willen plaatsen die niet afkomstig is uit een tabel van de database, maar dient ter verfraaiing van het formulier of rapport, dan spreken we van een niet-afhankelijk objectkader. Hierbij kunnen we denken aan een logo op ieder formulier, een logo bij het afdrukken van een rapport of een foto van een mooi strand in het openingsscherm voor het reisbureau. We zullen een logo op het autoformulier van de auto-handelaar plaatsen.

Maak via het overzicht Formulieren het formulier Auto weer actief in de ontwerpweergave.Plaats zo nodig via de werkbalk, knop Werkset, de werkset op het formulier. Sleep eventueel met de muis de rechterkant van het formulier naar rechts om ruimte te maken voor het logo.Klik in de werkset op de knop Kader voor niet afhankelijk object en ga met de muis naar het formulier en markeer een kader. Vervolgens verschijnt het scherm Object invoegen. Dat scherm is al besproken bij een afhankelijk objectkader. We kunnen dus een nieuw logo maken of een reeds bestaand logo van schijf halen. Kies voor Bestand gebruiken en activeer het bestand Logo.bmp.Merk op dat het logo in de ontwerpweergave direct wordt getoond, het hoort immers bij het ontwerp.

Page 168: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003156

Om het logo goed in het kader te krijgen dienen we de eigenschap-pen nog aan te passen. Maak het eigenschappenvenster actief voor ons logo. Kies in het tabblad Opmaak de eigenschap Formaatmodus en kies voor Kader niet vullen. Maak nu eventueel het kader nog passend. Controleer het formulier in de formulierweergave.

Er is nog een tweede – snelle – manier om een niet-afhankelijk objectkader te maken. Als het formulier in de ontwerpweergave geopend is, kunnen we via Plakken een afbeelding van het klem-bord in het formulier plaatsen. Als we dus een afbeelding hebben, plaatsen we deze via Kopiëren op het klembord. Hierna kunnen we de afbeelding direct opnemen in het formulier. De afmetingen en formaatmodus moeten dan nog wel aangepast worden.

Opgave

6.2 a. Voeg aan de tabel Auto nog twee records toe. We kunnen nog twee plaatjes toevoegen, te weten MercedesC180.bmp en FerrariEnzo.bmp.

Pas het kader en de formaatmodus zodanig aan dat de plaatjes zo gunstig mogelijk worden afgebeeld.

b. Verwijder ons logo en voeg zelf een afbeelding toe als nieuw logo. Kies eventueel via het venster Object invoegen, Nieuw,Microsoft Clip Gallery en Transport voor de rode Ferrari.

Zorg wel dat de afbeelding op de juiste wijze in het kader past.c. Op het formulier staat nog een tekst bij de foto, namelijk foto.

Die tekst is volkomen overbodig, verwijder hem daarom van het formulier.

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 mo-

Page 169: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 157

gelijke waarden wordt getoond waaruit een keuze gemaakt kan worden. De keuzelijst zonder invoervak toont een lijst met opties waaruit gekozen kan worden, zonder dat een waarde ingevoerd kan worden.

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 ofde 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 sport-zaak. In voorgaande hoofdstukken hebben we van deze mogelijk-heid 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 para-graaf komen we hierop terug. We gebruiken de eerste optie als de waarden uit de keuzelijst kunnen veranderen. Dit geldt bijvoor-beeld voor klant- en artikelgegevens: er kunnen immers klanten of artikelen zijn toegevoegd of verwijderd. Met de tweede optie die-nen we de waarden uit de keuzelijst te typen. Zo’n lijst kiezen we als de waarden uit de lijst niet aan verandering onderhevig zijn.

Kies voor De waarden zullen worden getypt. De opties ‘Te koop’, ‘Optie’ en ‘Verkocht’ zullen immers niet veranderen. Kies volgen-de.

Page 170: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003158

Het venster dat verschijnt (figuur 6.10) biedt ons de mogelijkheid om in te voeren hoeveel kolommen weergegeven dienen te worden en welke waarden we in die kolommen willen zien.

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 verklei-nen 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 effi-ciëntere 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 vol-tooi de Wizard. Klik vervolgens op het tabblad Opzoeken; dit bevat onze keuzemogelijkheden bij Rijbron.

Figuur 6.10

Page 171: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 159

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 eigen-schap zichtbaar. Door hierop te klikken kunt u de gewijzigde eigenschap van het veld Status automatisch doorvoeren in formu-lieren 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 mede-deling dat geen objecten bijgewerkt te hoeven worden. Omdat in de formulieren die we hebben het veld Status nog als Tekstveld is gedefinieerd en niet als Keuzelijst. Een tekstveld heeft geen opzoe-keigenschappen. Sla de nieuwe structuur op en sluit af.

Als we nu query’s of formulieren maken, zal het statusveld auto-matisch een keuzelijst met invoervak zijn.

We gaan een nieuw formulier ontwerpen, waarop Status als keuze-lijst wordt getoond.

Selecteer in het overzicht Formulieren de optie Formulier maken met wizard.Kies de tabel Auto en selecteer de velden Kenteken, Bouwjaar en Status.Selecteer in het volgende scherm In kolomvorm, Standaard en sluit af met de formuliernaam Keuzelijst voorbeeld.Controleer vervolgens de werking en probeer zelf ook een waarde in te voeren. Toets een correcte en een niet-toegestane waarde in en bekijk de reactie.

Als we het formulier sluiten en het formulier Auto in de formu-lierweergave openen, zien we bij het veld Status geen keuzelijst met invoervak. In de formulieren die al gemaakt zijn, is de keu-zelijst voor het veld Status niet bekend. Als we daar een keuzelijst van willen maken, moeten we het formulier aanpassen.

Page 172: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003160

Zet daartoe het formulier in de ontwerpweergave. Selecteer de tekst Status en het veld Status en verwijder deze (Delete-toets). Klik op de werkbalk op de knop Lijst met velden. Hier zien we een voorbeeld van een keuzelijst zonder invoervak. Selecteer Status en sleep deze naar de plaats op het formulier waar de status moet komen. We hebben nu een veld Status met keuze-lijst. Eventueel kunnen we de plaats van het veld nog veranderen om de lay-out te verfraaien. Controleer de werking in de formulierweergave.

Keuzelijsten met invoervak worden in databases vaak gebruikt om de referentiële 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 (referen-tiële 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 zo’n 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 uit-werken 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: referentiële integriteit afdwingen. Als dus in de tabel Reis een bestemming-code 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.

Page 173: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 161

Pas op: We gaan de Wizard Opzoeken toepassen op velden die gebruikt worden in relaties. Dat is een situatie die het meest wordt toegepast. Maar vanaf Access 2002 kan de wizard alleen toegepast worden als de relatie nog niet bestaat. De wizard legt meteen de relatie tussen de tabellen, helaas zonder referentiële integriteit. De wizard functioneert dus optimaal bij het ontwerpen van de tabel-len.Aangezien wij de relatie al gelegd hebben, moeten we die eerst in het relatievenster verbreken. Vervolgens moeten we de wizard toe-passen en ten slotte de referentiële integriteit herstellen.

Selecteer het relatievenster via Extra, Relaties of direct uit de werkbalk en verwijder de relatie tussen de tabellen Reis en Bestemming. Sluit vervolgens 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 wor-den of in een eerder gemaakte query. Selecteer Tabellen en Bestemming.Geef op welke velden getoond moeten worden in de keuzelijst; zie figuur 6.11. In dit voorbeeld selecteren we ze allemaal.

Figuur 6.11

Page 174: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003162

In het volgende venster kunnen we de sorteervolgorde opgeven; zie figuur 6.12. We kunnen op maximaal vier velden sorteren. Een klantenlijst op volgorde van klantnummer is niet zinvol, op klant-naam 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 figuur 6.13. We kunnen eventueel de kolommen ver-kleinen of vergroten. Tevens staat Sleutelkolom verbergen (aan-bevolen) afgevinkt. Hierdoor wordt het in te voeren sleutelveld verborgen. Negeer die aanbeveling, maak de sleutelkolom wel zichtbaar.

Figuur 6.12

Figuur 6.13

Page 175: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 163

Het scherm van figuur 6.14 geeft de mogelijkheid om het veld uit de keuzelijst te selecteren dat we willen invoeren in de tabel Reis;in ons geval het veld Bestemmingcode. Selecteer dit en ga naar het volgende scherm.

Ga vervolgens door de finish door de labelnaam Bestemmingcodete accepteren.Sla de nieuwe structuur op en dwing – in het relatiescherm – de referentiële integriteit tussen de tabellen Reis en Bestemming weer af. Controleer de werking van de keuzelijst met invoervak in de gegevensbladweergave.

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 veran-deren. Bijvoorbeeld de sorteervolgorde. Klik daartoe op de eigen-schap Rijbron en vervolgens op de drie puntjes. De query van de keuzelijst wordt zichtbaar; zie figuur 6.15. Let hierbij eens op de manier hoe eerst wordt gesorteerd op land en vervolgens op plaats. Het veld Plaats is een tweede keer verborgen toegevoegd!

Figuur 6.14

Page 176: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003164

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 selecte-ren niet toegestaan. Controleer de werking door in het formulier Keuzelijst voorbeeld het veld Kleur toe te voegen.

b. 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 aflopende vertrekdatum en bij gelijke vertrekdatum op plaats.

Figuur 6.15

Page 177: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 165

6.4 Hoofd- en subformulieren

Bij het ontwerpen van een formulier hebben we tot nu toe gebruik-gemaakt van slechts één tabel. Vaak zal echter meer dan één tabel nodig zijn om alle gegevens in te voeren of te tonen. 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 plaat-sen. 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 figuur 6.16.

Open de database Reisbureau en maak een nieuw formulier met Wizard Formulier. In het eerste scherm (figuur 6.17) kunnen we opgeven welke tabellen en welke velden we op het scherm wensen te plaatsen.Selecteer onder Tabellen/query’s 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 figuur 6.16. Op deze manier kunnen we alle benodigde velden uit de verschillende tabellen

Figuur 6.16Tabel VeldBoeking Boekingsnummer

KlantnummerReisnummerBoekdatumAantal VolwassenenAantal Kinderen

Klant NaamAdresPostcodeWoonplaats

Reis VertrekdatumPrijs per persoon

Bestemming PlaatsLand

Page 178: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003166

benaderen. We hadden ook eerst een query kunnen maken met alle benodigde velden. Bij Tabellen/query’s 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 (figuur 6.18) waarin we kunnen opgeven hoe we de gegevens willen zien: volgens Klant, volgens Boeking, volgens Reisof volgens Bestemming.

Figuur 6.17

Figuur 6.18

Page 179: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 167

Access zal zelf – als dat nodig mocht zijn – de gegevens op de juis-te 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 (GSD, 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 bestem-ming. Voor de andere zienswijzen geldt iets dergelijks.

In onze situatie kiezen we volgens Boeking. We gaan immers een boeking tonen.Kies op de gebruikelijke manier de lay-out (Kolomvorm), achter-grond (Standaard) en naam (Boeking gegevens). In figuur 6.19 wordt het resultaat getoond.

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 knop . De gegevens op het formulier worden door de Wizard niet in de door ons gewenste volgorde in het ven-ster 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 invoe-ren, gaan we van enkele besturingselementen de eigenschappen

Figuur 6.19

Page 180: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003168

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 bestu-ringselementen te veranderen.

Plaats het formulier in de ontwerpweergave en selecteer het bestu-ringselement Naam, niet de begeleidende tekst Naam.Klik op de werkbalk op de knop Eigenschappen (of doe dit via het snelmenu, rechtermuisklik). De eigenschappen van het besturings-element worden getoond; zie figuur 6.20.Selecteer het tabblad Gegevens.

We gaan de eigenschappen Ingeschakeld en Vergrendeld gebrui-ken: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 boven-dien wordt het lichter gekleurd.Vergrendeld: Ja of Nee. De besturingstoets functioneert normaal, kan de focus krijgen. Echter het bewerken, toevoegen of verwijde-ren van gegevens kan niet (Ja) of wel (Nee).

Figuur 6.20

Page 181: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 169

De eigenschap Ingeschakeld wordt in toepassingen vaak gebruikt, de eigenschap Vergrendeld iets minder vaak; deze wordt hier voor de volledigheid vermeld.

Selecteer de eigenschap Ingeschakeld en kies Nee. Bekijk het resul-taat in de formulierweergave.

Voor de overige besturingselementen zouden we hetzelfde moe-ten doen. We kunnen echter in één keer alle gewenste besturings-elementen selecteren en vervolgens de eigenschap Ingeschakeld op Nee zetten.

Zet daartoe het formulier in de ontwerpweergave.Klik op de zojuist gesommeerde besturingselementen, waarvan we de eigenschap willen veranderen, en houd daarbij de Shift-toetsingedrukt. We krijgen dan een meervoudige selectie. Staat het eigenschappenvenster, na de meervoudige selectie, nog niet op het scherm, klik dan op de werkbalk op de knop Eigenschappen of doe dit via het snelmenu (rechtermuisklik), zie figuur 6.21.

Kies het tabblad Gegevens en zet de eigenschap Ingeschakeld op Nee. Controleer de werking in de formulierweergave.

Figuur 6.21

Page 182: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003170

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 ontwerp-weergave op het scherm. Maak tevens het eigenschappenvenster actief, via de knop Eigenschappen op de werkbalk of via het snelmenu (rechtermuis-klik).

In de bovenste regel van het eigenschappenvenster, de blauwe balk indien geselecteerd, kunnen we zien waarvan de eigenschappen getoond worden. In ons geval moet daar Formulier staan, zie figuur 6.22. Zo niet, dan worden van een ander deel (of delen) van het formulier – bijvoorbeeld Meervoudige selectie – de eigenschap-pen getoond.

Klik, om het formulier te selecteren, op de formulierkiezer, het vakje links van de liniaal, zie figuur 6.23, of selecteer het object Formulier uit de keuzelijst in het eigenschappenvenster.

Het tabblad Gegevens, van een formulier, bevat de eigenschappen Bewerken toestaan, Verwijderingen toestaan, Toevoegingen toe-staan. Hiermee kunnen mutaties, verwijderingen of toevoegingen wel of niet worden toegestaan.

Figuur 6.22

Page 183: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 171

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 over-zicht. Een klant kan immers meerdere boekingen hebben, zoals blijkt uit het gegevensmodel. We gaan dit als voorbeeld uitwerken.

Selecteer in het overzicht Formulieren de optie Formulier maken met wizard.Selecteer vervolgens dezelfde velden als in het vorige voorbeeld, zie figuur 6.16. Na de selectie komen we in het scherm waarin we kunnen opgeven hoe we de gegevens willen zien. Kies voor volgens Klant, zie figuur 6.24.

Figuur 6.23

Figuur 6.24

Page 184: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003172

Aangezien een klant meerdere boekingen kan hebben, worden nu twee formulieren aangemaakt: een hoofdformulier met daarop de klantgegevens en een subformulier met daarop de boekingsgege-vens. De optie Gekoppelde formulieren laten we vooralsnog buiten beschouwing. Het subformulier wordt zodanig getoond dat meer-dere boekingen (records) getoond kunnen worden.

Geef in het volgende scherm aan hoe het subformulier weer-gegeven moet worden: Als gegevensblad of In tabelvorm. Kies voor Als gegevensblad.Ga naar het volgende scherm en kies voor Standaard. In het laatste scherm, zie figuur 6.25, wordt gevraagd om de for-mulieren een titel (naam) te geven. Het hoofdformulier en sub-formulier 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 boe-kingen 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 naviga-tieknoppen, 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 eenvoudig te verbeteren door het hoofdformulier

Figuur 6.25

Page 185: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 173

in de ontwerpweergave te zetten, het subformulier wordt dan ook getoond. We kunnen nu het kader, van het subformulier, aan de rechterkant vergroten.

Controleer het resultaat in de formulierweergave, maximaliseer eventueel het hoofdformulier.

In de formulierweergave kunnen we diverse kolommen verkleinen zonder dat informatie verloren gaat. De kopjes boven de kolommen zijn dan niet of niet volledig te lezen. We kunnen dit aanpassen.

Open het hoofdformulier in de ontwerpweergave. Hierin wordt ook het subformulier in de ontwerpweergave getoond. Indien het sub-formulier niet in de ontwerpweergave wordt getoond, sluit dan het venster en open het hoofdformulier opnieuw in de ontwerpweer-gave.Selecteer het bijschrift Aantal volwassenen (niet het veld Aantal volwassenen).Maak, via de knop Eigenschappen in de werkbalk, het eigenschap-penvenster actief. Selecteer hieruit het tabblad Opmaak. Zet daar de eigenschap Bijschrift op Volw., zie figuur 6.26. Merk op dat in het subformulier de gegevens in de ontwerpweergave onder elkaar staan, maar in de formulierweergave naast elkaar.

Figuur 6.26

Page 186: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003174

Sluit vervolgens het venster en bevestig de vraag of de wijzigingen bewaard moeten worden. Open vervolgens het hoofdformulier Klant boekingen in de formu-lierweergave en bekijk het resultaat.Pas eventueel nu de kolombreedtes weer aan. Herhaal dit tot alle kolommen volledig op het scherm passen.

Tip: Je kunt het subformulier ook in een afzonderlijk venster openen. Selecteer in de ontwerpweergave met de rechtermuis-knop het subformulier. Kies vervolgens in het snelmenu de optie Subformulier in nieuw venster.

Opgave

6.4 a. Maak een nieuw formulier waarop de reizen per bestemming worden getoond. Per reis bestaan vervolgens meerdere boekin-gen. Selecteer dezelfde velden als in figuur 6.16 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 ge-maakt 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 toepassingspro-gramma’s) wordt veel gebruikgemaakt van tabbladen. Denk maar aan de tabbladen Opmaak, Gegevens, Gebeurtenis, enzovoort uit het eigenschappenvenster van Access, zie figuur 6.26. Het is moge-lijk om zelf tabbladen te maken op formulieren. We maken daarbij gebruik van het tabbesturingselement. We gaan het volgende voor-beeld uitwerken in onze database Reisbureau.

Page 187: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 175

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 zijn 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.

Selecteer het overzicht Formulieren en klik op de knop Nieuw. Kies voor AutoFormulier: in kolomvorm en selecteer de tabel Klant.Klik op OK; het nieuwe formulier wordt getoond. Zet het formulier in de ontwerpweergave. Maximaliseer het venster en vergroot het werkgebied van het for-mulier door de Formuliervoettekst naar beneden te slepen en de rechterkant van het raster naar rechts te slepen. Onder de klantgegevens kunnen we nu de tabbladen plaatsen. Zorg dat het Werksetvenster op het scherm staat en dat de knop Wizards voor besturingselementen ingedrukt is (geactiveerd). Hierdoor wordt bij het plaatsen van verschillende besturingselementen, bij-voorbeeld een afbeelding of keuzelijst, automatisch een Wizard gestart. Klik in de werkset op de knop Tabbesturingselement.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.27 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.

Page 188: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003176

Klik op de tab Vorige boekingen. Kies uit de werkset de knop Subformulier/subrapport.In het werkgebied verandert de muisaanwijzer. Geef door te klik-ken 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/query’s het subformulier gaan ontwerpen. Kies voor Tabel/query en ga naar het volgende scherm. Hier kunnen we een bestaande query selecteren of uit de ver-schillende 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 Bestemmingde velden Plaats en Land.Ga na de veldselecties naar het volgende scherm van de Wizard. Hierin wordt gevraagd hoe het hoofdformulier, onze klantgege-vens, gekoppeld moet worden aan ons subformulier, de boekings-gegevens.

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 figuur 6.28. Bij zelf bepalen kunnen we opgeven welk veld van het hoofdformulier gekoppeld moet worden aan het veld uit het subformulier. Die

Figuur 6.27

Page 189: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 177

mogelijkheid kunnen we gebruiken als een uitzonderlijke koppe-ling 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.Bekijk het voorlopige resultaat van het formulier in de formulier-weergave. De lay-out van het subformulier is nog niet goed verzorgd. Pas in de ontwerpweergave de grootte van het gebied, en in de formulierweergave de kolommen aan, zodat een nette lay-out ont-staat (zie figuur 6.29).

Figuur 6.28

Figuur 6.29

Page 190: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003178

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. Kies uit de werkset de knop Subformulier/subrapport 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 klant-gegevens en de aanbodgegevens, immers bij iedere klant worden dezelfde aanbodgegevens getoond.

Aangezien er geen koppeling is, kunnen we direct naar het vol-gende scherm gaan.Geef dit subformulier de titel (naam) Reisaanbod.Controleer het formulier in de formulierweergave. De lay-out van het subformulier is nog niet goed verzorgd. Pas in de ontwerpweergave de grootte van het gebied en in de formulier-weergave de kolommen aan, zodat een nette lay-out ontstaat (zie figuur 6.30).

Figuur 6.30

Page 191: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 179

Sluit het hoofdformulier en geef dit de titel (naam) Klant met tab-bladen.

Toevoegen/verwijderen tabbladZoals 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.

Plaats het formulier in de ontwerpweergave. Selecteer het tabbesturingselement (klik naast het laatste tabblad, niet in een tabblad) en kies vervolgens in de menubalk Invoegen, Pagina met tabbesturingselement. Selecteer voor het verwijderen het tabblad en druk vervolgens op de Delete-toets.

Volgorde van de tabbladen wijzigenSelecteer het tabbesturingselement in de ontwerpweergave (klik naast het laatste tabblad, niet in een tabblad). 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 Pagina-index 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 wor-den. Verander de eigenschappen zodanig dat dit niet kan gebeu-ren

c. Bij de subformulieren zijn begeleidende teksten afgedrukt, Boekingen van klant en Reisaanbod. Verwijder die teksten.

Page 192: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003180

6.6 Opdrachtknoppen

Een opdrachtknop op een formulier start een actie (opdracht) of een reeks van acties. Zo’n 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 ruim dertig verschillende acties aan een opdrachtknop koppelen. Als we nog meer mogelijkheden met een opdrachtknop wensen uit te voeren, zal een macro gemaakt moe-ten worden. Een macro bestaat uit een aantal acties die na elkaar uitgevoerd worden; bijvoorbeeld een formulier openen, vervolgens dat formulier maximaliseren en tenslotte een filter op het formulier plaatsen. Het maken van macro’s wordt in hoofdstuk 8 besproken. In deze paragraaf maken we opdrachtknoppen met behulp van de Wizard.

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.

Selecteer het overzicht Formulieren en maak met de wizard een nieuw formulier van de tabel Klant in kolomvorm (alle velden tonen). Plaats het formulier in de ontwerpweergave en maak het venster en gebied van de klantgegevens groter, zodat we de opdrachtknoppen kunnen toevoegen.Activeer zonodig de werkset met behulp van de knop Werkset uit de werkbalk. Zorg dat in de werkset de knop ‘Wizards voor bestu-ringselementen’ geactiveerd is. Klik in de werkset met de muis op de knop Opdrachtknop 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 figuur 6.31.

Er wordt gevraagd welke actie uitgevoerd moet worden bij het klikken op de opdrachtknop. Er zijn zes categorieën waaruit geko-zen kan worden, van Recordnavigatie tot en met Overige. Per cate-gorie zijn verschillende acties mogelijk.

Page 193: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 181

Selecteer uit de categorie Recordbewerkingen de actie Record ongedaan maken.

In het volgende venster kunnen we de opdrachtknop voorzien van een afbeelding (pictogram) of van tekst, zie figuur 6.32.

Kiezen we voor Tekst, dan kunnen we in het vakje tekst invoeren of de standaardtekst accepteren. Kiezen we Afbeelding, dan wor-den standaard één of meer afbeeldingen (pictogrammen) getoond die bij die actie horen. Willen we echter alle mogelijke pictogram-men 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 afbeel-ding willen selecteren.

Figuur 6.31

Figuur 6.32

Page 194: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003182

Kies voor Afbeelding, Ongedaan maken. Het bekende pictogram-metje van Office 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 plaat-je – 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 standaardafmetin-gen 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 onge-luk) direct weer gewist! Om vergissingen te voorkomen krijgt de opdrachtknop geen tabstop.

Plaats het formulier in de ontwerpweergave en selecteer de opdrachtknop. Plaats 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 formulierweer-gave. Sla het formulier op onder de titel (naam) Klant met opdrachtknop-pen.

We gaan een nieuwe opdrachtknop maken die een bestaand rap-port gaat afdrukken. Dat rapport gaan we eerst maken.

Selecteer in het databasevenster het overzicht Rapporten. Selecteer Rapport maken met wizard en kies in het eerste venster de tabel Klant.Kies alle velden, geen groepeerniveaus, sorteer op klantnaam, overzicht in tabelvorm, compact opmaakprofiel en kies als titel Klantenlijst. Sluit vervolgens het venster.Selecteer in het databasevenster het overzicht Formulieren en open het formulier Klant met opdrachtknoppen in de ontwerpweergave. Plaats rechts naast de bestaande opdrachtknop een nieuwe opdrachtknop.

Page 195: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 183

Kies in het eerste venster van de Wizard voor categorie Rapportbewerkingen en uit de acties Rapport afdrukken. Selecteer vervolgens het zojuist gemaakte rapport Klantenlijst.Kies voor Tekst en verander de tekst van ‘Rapport afdrukken’ in: Klantenlijst. Maak de naam van de opdrachtknop tevens Klantenlijst.

We gaan ten slotte nog een opdrachtknop op het formulier plaatsen die een bestaand formulier opent.

Zet rechts van de bestaande opdrachtknoppen een nieuwe opdracht-knop 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 specifieke gegevens van het nieuwe formu-lier te tonen of aan te geven dat alle gegevens op het nieuwe for-mulier getoond moeten worden, zie figuur 6.33.

Kies voor ‘Formulier openen en specifieke 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 moe-ten worden; zie figuur 6.34. Kies uit Klant met opdrachtknop-pen het veld Klantnummer en uit Boeking gegevens eveneens Klantnummer.Klik vervolgens op de knop <-->, waardoor de koppeling plaats-vindt.

Figuur 6.33

Page 196: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003184

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 formu-lierweergave.

Wanneer we met de muis op de knop Ongedaan maken gaan staan, komt automatisch de melding ‘record ongedaan maken’ tevoor-schijn. Bij de opdrachtknoppen met tekst wordt die melding niet getoond. We kunnen die eenvoudig aanbrengen door, in de ont-werpweergave, 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 afsluiten.

b. Maak ook in het formulier Boeking gegevens een opdrachtknop om het formulier af te sluiten.

c. Zorg dat de opdrachtknoppen Klantenlijst en Boekingen in het formulier Klant met opdrachtknoppen van een melding worden voorzien als we met de muis op de opdrachtknop gaan staan. De melding moet respectievelijk zijn: Alfabetische klantenlijsten Boekingen van de klant.

Figuur 6.34

Page 197: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 185

6.7 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 over-zicht wordt in rijen en kolommen getoond, zoals in een werkblad van een spreadsheetprogramma. Met een draaigrafiek kunnen de gegevens uit een query of formulier grafisch worden weergegeven. We gaan eerst een draaitabel maken en vervolgens hiervan een draaigrafiek.

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.

Selecteer uit het databasevenster het overzicht Query’s en maak een nieuwe query via de Ontwerpweergave. Selecteer de tabellen Bestemming, Reis en Boeking.Kies de velden Plaats, Land, Vertrekdatum, Bestemmingcode,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 het overzicht Formulieren en klik op de knop Nieuw.Selecteer in het venster Wizard Draaitabellen, kies in het lege vakje de zojuist gemaakte query Draaitabel voorbeeld en klik vervolgens op de knop OK. De wizard toont een voorbeeld van een draaitabel, zie figuur 6.35, en in het kort wordt uitgelegd wat het nut is van een draaitabel.Selecteer in het volgende venster alle velden. Vervolgens klikken we op de knop Voltooien. De knop Volgende is niet te selecteren. Het nieuwe formulier wordt getoond, zie figuur 6.36.

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-,

Page 198: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003186

filter- en detailgebied. De velden die we geselecteerd hebben in de query worden getoond in de Lijst met draaitabelvelden, zie figuur 6.36. Mocht deze lijst niet zichtbaar zijn, dan is deze te selecteren via het snelmenu (rechtermuisknop). 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 figuur 6.37.

Figuur 6.35

Figuur 6.36

Page 199: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 187

Kies je bijvoorbeeld Jaren dan kun je – nadat het geplaatst is in de draaitabel – eerst een jaar selecteren, bijvoorbeeld 2004. Indien de vertrekdatums over verschillende jaren ingevoerd zijn, zal hierna alleen het jaar 2004 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.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 Totaalnaar 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 spread-sheet cellen genaamd – zijn in het detailgebied geplaatst. We laten het filtergebied nog even voor wat het is; we komen hier later op

Figuur 6.37

Page 200: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003188

terug. Het aantal volwassenen, kinderen en totaal aantal personen per plaats per week wordt getoond, zie figuur 6.38.

Als in een bepaalde week verschillende reizen zijn geboekt naar een bepaalde plaats, worden alle gegevens in de rij/kolom getoond. Zie bijvoorbeeld de plaats Gites of Rabat in week 19 in figuur 6.38. Wij zijn niet geïnteresseerd 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.

Klik op Aantal volwassenen. Alle rij/kolomcombinaties waarin een waarde staat, worden lichtblauw gekleurd.Klik in de draaitabelwerkbalk op de knop ( ) 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 tota-len overblijven. Dit kan per plaats, door op het minknopje van een plaats te klikken, of voor alle plaatsen tegelijk. Wij kiezen voor de laatste mogelijkheid.

Selecteer Plaats en klik in de werkbalk van de draaitabel op de knop Details verbergen of direct in het snelmenu. Het voorlopige resultaat staat in figuur 6.39 afgebeeld.

Figuur 6.38

Page 201: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 189

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 figuur 6.39. De veldenlijst is zichtbaar te maken door deze in het snelmenu te selecteren. Verder is te zien dat per kolom en per rij een Eindtotaal wordt weergegeven.Als laatste gaan we het filtergebied gebruiken. Indien we gegevens in de draaitabel willen filteren, kunnen we het veld waarmee we willen filteren naar het filtergebied slepen.

Sleep uit de veldenlijst het veld Land naar het filtergebied. Er ver-andert in eerste instantie niets. Na het slepen wordt namelijk nog niet gefilterd, 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 gefilterd 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 gefilterd 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.

Figuur 6.39

Page 202: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003190

Kies in de draaitabel Som van Aantal volwassenen en activeer het eigenschappenvenster door op de knop Eigenschappen te klikken of via het snelmenu.Verander in het tabblad Bijschriften het bijschrift Som van Aantal volwassenen in Tot. volwassenen. Klik vervolgens in de draaitabel op het veld 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 weer-geven.Sluit het eigenschappenvenster. Het eindresultaat wordt getoond, zie figuur 6.40.Sla het formulier op onder de naam Draaitabel voorbeeld.

Enige opmerkingen over draaitabellen:Als een draaitabel in ontwerpweergave wordt geplaatst, toont Access een standaardformulier met hierin alle velden. De basis van een draaitabel is namelijk een formulier. Om te wisselen van formulierontwerp naar draaitabel kun je gebruikmaken van het snelmenu (rechtermuisknop) of van de knop Beeld op de werkbalk.Het kan voorkomen dat niet alle velden uit de gemaakte query te selecteren zijn in de veldenlijst van de draaitabel. Hoe komt dat en hoe kunnen we dit oplossen? De Wizard Draaitabellen maakt automatisch van de gemaakte query een standaardformulier. Dit formulier wordt hierna getoond in de draaitabelweergave. Het

Figuur 6.40

Page 203: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 191

probleem zit in het automatisch gemaakte formulier. In dit for-mulier kan de wizard automatisch enkele subformulieren hebben gemaakt. Maar in de veldenlijst van de draaitabel worden alleenvelden uit het hoofdformulier getoond en niet de velden uit het sub-formulier. De wizard van de draaitabellen werkt dus niet optimaal. Indien dus niet alle velden uit de gemaakte query getoond worden, kun je geen gebruik maken van de wizard. Ga in dat geval naar het overzicht Formulieren en klik op de knop Nieuw. Selecteer Ontwerpweergave, kies in de keuzelijst voor de gemaakte query en klik op OK. Sleep vervolgens alle velden uit de Lijst met velden naar de sectie Details van het formulier. Wijzig vervolgens de eigenschap Standaardweergave van het formulier in Draaitabel.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.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 versle-pen om een andere lay-out te krijgen, bijvoorbeeld door de rijen en kolommen te wisselen. Ook kun je verschillende velden in het rij-of kolomgebied plaatsen. Zo kun je bijvoorbeeld het veld Land ver-plaatsen van het filtergebied naar het rijgebied. Indien je het sleept vóór 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 eigen-schappen 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 daar-toe in een leeg gebied van de draaitabel. Zo kun je bijvoorbeeld de bijschriften van de gebieden veranderen. Het filtergebied in een draaitabel is optioneel. Stel je maakt een draaitabel waarin een filtergebied niet gewenst is, dan blijft in het filtergebied de tekst Filtervelden hier neerzetten staan. Je kunt die tekst dan verwijde-ren. Ook kun je ervoor zorgen – in het tabblad Rapport – dat lege rijen en kolommen toch getoond worden.

Page 204: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003192

De Wizard Draaitabellen geeft een beperkte ondersteuning. Je kunt ook direct kiezen in het overzicht Formulieren voor Nieuw, Autoformulier: draaitabel. Selecteer in de keuzelijst de toe te pas-sen query, en de draaitabel en lijst met velden worden direct getoond. Ook hier kan het probleem van het genoemde tweede punt optreden.

DraaigrafiekenHiermee kunnen op eenvoudige wijze grafieken van de gegevens uit een query of formulier getoond worden. De verschillende gegevens uit een formulier kunnen snel verplaatst worden naar de verschillende gebieden van de draaigrafiek. Hierdoor is het niet noodzakelijk om voor verschillende grafieken, verschillende formulieren of rapporten te maken. Je kunt ook snel wisselen tus-sen een draaitabel en een draaigrafiek. Hierdoor kunnen gegevens in tabel- of grafiekvorm worden weergegeven. We zullen twee voorbeelden uitwerken, een draaigrafiek maken op basis van een query en een bestaande draaitabel als draaigrafiek tonen. We be-ginnen met een draaigrafiek vanuit een query op te bouwen, zodat de verschillende gebieden van een draaigrafiek toegelicht kunnen worden.

We willen per land, per week het aantal boekingen in grafiekvorm weergeven. Dit moet ook nog per werelddeel uitgesplitst kunnen worden.

Maak een nieuwe query zoals in figuur 6.41 is weergegeven en sla deze op onder de naam Draaigrafiek voorbeeld.Kies vervolgens in het overzicht Formulieren voor Nieuw, Autoformulier: draaigrafiek, selecteer in de keuzelijst de zojuist gemaakte query Draaigrafiek voorbeeld en klik op OK. Er wordt een nieuw draaigrafiekformulier getoond, zie figuur 6.42.

Er zijn vier gebieden waarin de geselecteerde velden geplaatst kun-nen worden: categorie-, reeks-, gegevens- en filtergebied. Er kun-nen verschillende grafiektypen gepresenteerd worden. Standaard wordt een kolomdiagram getoond.

Sleep het veld Land naar het categoriegebied.Sleep het veld Boekingnummer naar het gegevensgebied.

Page 205: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 193

Direct wordt daar getoond Som van Boekingnummer. In het ge-gevensgebied wordt samengevatte informatie getoond. Standaard wordt op numerieke velden de functie Som toegepast en op tekst-of datumvelden de functie Aantal. Aangezien Boekingnummereen 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 kies uit de draaigrafiek-werkbalk Autoberekenen, Aantal of selecteer die optie via het snel-menu. Het voorlopige resultaat – het totaal aantal boekingen per land – wordt getoond in figuur 6.43, zonder veldenlijst.

Figuur 6.41

Figuur 6.42

Page 206: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003194

Merk bovendien op dat niet alle gebieden noodzakelijk zijn. Indien het aantal boekingen per land gewenst is, is deze grafiek voldoen-de. Wij gaan nu de grafiek verder volmaken. Zorg dat de veldenlijst zichtbaar is (snelmenu).

Sleep uit de veldenlijst de optie Weken, uit Vertrekdatum per week,naar het reeksgebied.Kies in de menubalk voor Draaigrafiek, Legenda weergeven of selecteer deze uit de werkbalk van de draaigrafiek. 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 filtergebied.Vouw het werelddeel open, verwijder het vinkje bij Alles en plaats een vinkje bij West-Europa. We hebben nu een filter 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 draaigrafiek kunnen we dat eventueel ongedaan maken, zoals toegelicht bij draaitabellen. We gaan de assen van de grafiek een passend bijschrift geven.

Figuur 6.43

Page 207: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 195

Selecteer de horizontale-astitel en plaats het eigenschappenvenster via de werkbalk van de draaigrafiek of het snelmenu.Verander in het tabblad Opmaak het bijschrift in Landen.Maak van de verticale-astitel Aantal boekingen.Klik in het witte gebied van de grafiek en maak het eigenschap-penvenster actief. We gaan daar een titel boven de grafiek plaatsen.Klik op de knop Titel toevoegen. Selecteer het titelgebied, verander in het tabblad Opmaak het bij-schrift in Aantal boekingen per land en maak die tekst vervolgens vet. Het eindresultaat wordt getoond in figuur 6.44.Sla het formulier op onder de naam Draaigrafiek voorbeeld.

In het tweede voorbeeld van een draaigrafiek gaan we de eerder gemaakte draaitabel weergeven als draaigrafiek.

Open in het overzicht Formulieren de draaitabel Draaitabel voor-beeld. Deze moet getoond worden zoals weergegeven in figuur 6.40.Kies in de menubalk Beeld, Weergave Draaigrafiek of doe dit via het snelmenu van de draaitabel (eerst de blauwe menubalk van de draaitabel selecteren). Direct wordt een draaigrafiek van de draai-tabel getoond.Zorg ervoor dat de legenda zichtbaar wordt en verander de astitels in Plaatsen en Aantal personen, zie figuur 6.45.

Figuur 6.44

Page 208: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003196

De legenda van het reeksgebied is niet duidelijk. Nu hebben we nog gefilterd op Spanje, maar als je alle landen laat zien dan is het overzicht niet echt overzichtelijk. We kunnen dit verbeteren door een grafiek per week te laten zien.

Kies uit de menubalk Draaigrafiek, Meerdere grafieken of selecteer deze optie uit de werkbalk van de draaigrafiek. Er komt een extra gebied bij waarin we per selectie meerdere grafieken krijgen.Verplaats de veldknop Weken naar het nieuwe gebied. We krijgen nu per week een grafiek te zien, zie figuur 6.46.

Figuur 6.45

Figuur 6.46

Page 209: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 197

De instellingen van de draaigrafiek worden automatisch opgesla-gen bij het formulier van de draaitabel. Als je later de draaitabel opent en je toont vervolgens de draaigrafiek hiervan, dan worden de zojuist gemaakte instellingen weergegeven.

Enige opmerkingen over draaigrafieken:Het is mogelijk om direct vanuit een formulier een draaigrafiek te creëren. Plaats het formulier in de ontwerpweergave. Selecteer het formulier door de blauwe menubalk te selecteren en kies vervol-gens in het snelmenu voor Weergave Draaigrafiek.Kies bij een nieuw formulier niet voor Wizard grafieken. Hiermee wordt namelijk een grafiek gemaakt via MS Graph.Je kunt verschillende typen grafieken selecteren. Via de werkbalk van de draaigrafiek of via het snelmenu. Hierbij dient opgemerkt te worden dat per type grafiek niet alle gebieden voorkomen. Zo is bijvoorbeeld bij een cirkeldiagram het reeksgebied niet aanwezig.De reeksgegevens wisselen met de categoriegegevens kan via de menubalk Draaigrafiek, Op rij/op kolom of via die knop op de werkbalk.Naast het filtergebied 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 draaigrafiek en de diver-se gebieden aangepast kunnen worden, zoals toegelicht bij draai-tabellen.

Opgave

6.7 a. Maak de draaitabel zoals weergegeven in figuur 6.47. In het filtergebied is week 20 geselecteerd.

b. Maak de draaigrafiek zoals weergegeven in figuur 6.48

Page 210: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003198 Databaseontwikkeling 4 Access 2003198

6.8 Webpagina’s

Zoals eerder besproken in paragraaf 5.12 is het in Access mogelijk pagina’s te ontwerpen waarmee gegevens uit de database op het World Wide Web getoond en gemuteerd kunnen worden.

In deze paragraaf zal worden besproken hoe gegevens uit meerdere tabellen kunnen worden gepresenteerd. We zullen daarbij steeds gebruikmaken van de wizard. Hoewel het ook mogelijk is om de

Figuur 6.47

Figuur 6.48

Page 211: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 199

door Access gegenereerde HTML-code direct te bewerken, zullen wij dat niet doen omdat dit buiten het bestek van het boek valt.

We ontwerpen een pagina waarmee via het web van iedere klant alle reizen kunnen worden weergegeven.

Kies in het databasevenster het overzicht Pagina’s. Selecteer de optie Data Access-pagina maken met wizard.

De wizard doorloopt een aantal stappen die we bij eerdere gelegen-heden ook al zijn tegengekomen. Als eerste wordt gevraagd uit welke tabellen welke gegevens moeten worden opgenomen.

Selecteer eerst uit de tabel Klant alle velden, vervolgens uit de tabel Boeking de Boekdatum, uit de tabel Reis de Vertrekdatum en ten slotte uit de tabel Bestemming de gegevens Plaats en Land, zie figuur 6.49.

In het volgende scherm van de wizard kan worden opgegeven op welke manier we wensen te groeperen.

We willen per klant de reizen zien; kies voor groeperen op basis van het klantnummer, zie figuur 6.50.

Hierna kunnen we opgeven in welke volgorde de gegevens van een klant moeten worden getoond. Wij willen per klant de reizen gepre-senteerd krijgen in volgorde van vertrekdatum.

Figuur 6.49

Page 212: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003200

Selecteer het veld Vertrekdatum, zie figuur 6.51.Geef in het laatste scherm van de wizard de pagina een naam: Boekingen per klant.

We kunnen in dit laatste scherm ook opgeven of we de pagina direct willen activeren of dat we eerst nog de opmaak willen wij-zigen. In het laatste geval kunnen we ook een thema opgeven. Hiermee bepalen we in grote lijnen de standaardopmaak van de pagina.

Kies ervoor om de pagina te voorzien van een thema. We kiezen er hiermee dus ook voor om de pagina direct te wijzigen, zie figuur 6.52.

Figuur 6.50

Figuur 6.51

Page 213: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 201

Hierna wordt direct het scherm getoond waarin het thema kan worden opgegeven.

Wij hebben gekozen voor het toepasselijke thema Strand, zie figuur 6.53. Mochten de standaardthema’s niet voldoende zijn, dan kun je via internet vast een geschikt thema vinden.

Figuur 6.52

Figuur 6.53

Page 214: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003202

Sluit na het selecteren van het thema het scherm met behulp van de knop OK. We komen in het scherm waarin de pagina kan worden gewijzigd. Sluit dit scherm af, want we willen eerst eens zien hoe de pagina getoond gaat worden. Access vraagt de naam waaronder het be-stand moet worden opgeslagen. Bedenk dat de zojuist ontworpen pagina géén onderdeel is van de database, maar als een apart htm-bestand op schijf wordt opgeslagen.

De zojuist ontworpen webpagina kunnen we op twee manieren bekijken. We kunnen de pagina vanuit Access activeren, maar ook vanuit een willekeurige webbrowser. In het laatste geval kunnen we het beste in de Windows Verkenner dubbelklikken op het pic-togram dat voor de naam van de zojuist ontworpen pagina staat. Hierdoor wordt automatisch de standaardbrowser opgestart en de betreffende pagina wordt opgeslagen. Er volgt nog een melding dat we voor de bestandsnaam geen UNC-code (Universal Naming Convention) hebben toegepast en dat daardoor bij het publiceren waarschijnlijk de gegevens niet gevonden kunnen worden. Negeer die opmerking. Bij het publiceren moeten we wel de naam veran-deren. Met een UNC kunnen we een bestand onafhankelijk van het type computer zoeken. In plaats van een stationsaanduiding en pad geef je de UNC-naam op. De syntax hiervoor is: \\Servernaam\share\pad\bestand, bijvoorbeeld \\Pegasus\Gedeeld\Access2003\Reisbureau.mdb. Je kunt deze later wijzigen in het venster Lijst met velden door op de knop Eigenschappen voor paginaverbindingte klikken.In het overzicht Pagina’s is een snelkoppeling te zien naar onze webpagina.Open deze webpagina. We zien dat het resultaat in eerste instantie nogal tegenvalt, zie figuur 6.54.

We zien een nummer met als bijschrift Klantnummer en daaronder een navigatiebalk. Met de navigatieknoppen kunnen we door de klantnummers lopen. Door op de uitvouwknop te klikken (de knop met het plusteken naast Klantnummer) worden er meer gegevens van de betreffende klant getoond. Als de klant meer dan één reis heeft geboekt, kunnen we met behulp van de tweede navigatiebalk door de afzonderlijke reizen van de geselecteerde klant lopen. Echt fraai is het echter nog niet, zie figuur 6.55.

Page 215: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 203

We zullen minimaal twee verfraaiingen aanbrengen. Allereerst moeten de getoonde teksten worden aangepast. Daarnaast willen we niet alleen het nummer van de klant steeds op het scherm heb-ben, maar ook de NAW-gegevens. Plaats daartoe de pagina in ont-werpweergave, zie figuur 6.56.

Allereerst plaatsen we alle klantgegevens bij elkaar in de sectie Koptekst: Bestemming-Klantnummer, waardoor deze altijd in beeld blijven. Hierdoor wordt het navigeren door de klanten aanzienlijk overzichtelijker. Om dit te kunnen doen moet er in de koptekst meer ruimte worden gemaakt.

Figuur 6.54

Figuur 6.55

Page 216: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003204

Klik éénmaal op de balk van de sectie Koptekst: Bestemming-Klantnummer. Het gebied dat bij de koptekst behoort wordt nu gemarkeerd. Met de muis kunnen we dit gebied groter maken door het naar beneden toe te verlengen.Verplaats de klantgegevens naar de bovenste koptekst: sleep de betreffende velden naar het bovenliggende gebied. Tip: door de witte tekst te verslepen wordt automatisch het begeleidende label meegenomen. Bovendien kun je de Shift-toets ingedrukt houden bij het selecteren of een kader om de velden slepen, zodat je in één keer alle velden kunt verplaatsen.

Na het verslepen verandert wel de tekst in de labels.

Selecteer een label Groep Van Naam: en klik vervolgens opnieuw in het label. Herstel de tekst in Naam:. Voer hetzelfde uit voor het andere label, zie figuur 6.57.

Je kunt ook het label selecteren en vervolgens het eigenschappen-venster actief maken. Selecteer het tabblad Overige en wijzig de eigenschap InnerText in de gewenste waarde. Merk op dat ook in de Nederlandstalige versie de eigenschapnamen in het Engels zijn.

Figuur 6.56

Page 217: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 205

Hierna ontstaat het overzicht zoals weergegeven in figuur 6.57. Let er daarbij op dat we de postcode en woonplaats direct achter elkaar hebben geplaatst en het begeleidende label ‘postcode’ hebben weg-gelaten.

Om snel het resultaat te zien, kunnen we op de knop Beeld in de werkbalk klikken. Door nog een keer op de knop te klikken keren we weer terug in het ontwerpscherm, waar we de overige velden hergroeperen door ze te verslepen. Verklein de ruimte van de sec-tie Koptekst: KlantWiz door op de balk van die sectie te klikken en vervolgens de onderkant van het getoonde gebied naar boven te verslepen. Ook de lengte van het veld Klantnummer is verkleind, zie figuur 6.58.

Verder passen we de teksten in de beide navigatiebalken aan.

Selecteer in de navigatiesectie KlantWiz in de navigatiebalk alleen de tekst KlantWiz |0 van |2. Let op, niet de hele navigatiebalk!

Figuur 6.57

Page 218: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003206

Activeer het eigenschappenvenster en verander de eigenschap RecordsetLabel in de tab Gegevens in de door ons gewenste tekst Selecteer een boeking.Verander op dezelfde manier de tekst Bestemming-Klantnummer |0van |2 – in de tweede navigatiebalk – in Selecteer een klant.Ten slotte plaatsen we nog een duidelijke tekst boven in de pagina, door éénmaal te klikken en vervolgens de gewijzigde tekst in te voeren: Overzicht boekingen. Hierna bekijken we het resultaat, zie figuur 6.59.

Het ontwerp zoals we dat nu hebben, heeft de vervelende eigen-schap dat we bij iedere klant opnieuw de gegevens moeten open-klappen om ook de reisgegevens te zien. Bovendien zien we slechts één reis tegelijkertijd. Wat we eigenlijk zouden willen, is dat stan-daard bij iedere klant direct alle reizen worden getoond. Daartoe passen we het ontwerp op de volgende manier aan.

Groepeer de gegevens door deze te verslepen naar de posities zoals die in figuur 6.60 staan afgebeeld. Daarbij zijn de begeleidende tek-sten van de reis als kopjes één niveau hoger geplaatst en de gegevens van een reis horizontaal op één regel. Verplaats hierbij eerst het veld en daarna het label, anders schuift het label mee met het veld.

Figuur 6.58

Page 219: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 207

Figuur 6.59

Figuur 6.60

Page 220: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003208

Klik met rechtermuisknop op de sectie Koptekst: Bestemming-klantnummer en selecteer Eigenschappen van groepeerniveau. Er verschijnt een venster waarin we de groepeereigenschappen van de sectie kunnen aanpassen, zie figuur 6.61.Wijzig de eigenschap ExpandedByDefault in Waar. Hierdoor wordt de detailsectie standaard uitgevouwen.Activeer op dezelfde manier Eigenschappen van groepeerniveau van de sectie Koptekst: KlantWiz.Wijzig de eigenschap DataPageSize in Alles. Hierdoor worden alle boekingen tegelijk getoond. Zou je daar 5 invoeren, dan worden vijf boekingen tegelijk getoond.

Hierna bekijken we het resultaat en zien een overzicht dat aanzien-lijk in waarde gewonnen heeft, zie figuur 6.62.

We kunnen nog de laatste verfraaiingen aanbrengen door de knop waarmee de gegevens kunnen worden uitgevouwen van de pagina te verwijderen. Deze heeft geen nut meer, alle klantgegevens wor-den nu immers getoond. Hetzelfde geldt voor de navigatiebalk in de sectie Koptekst: KlantWiz. Deze kan verwijderd worden omdat altijd alle boekingen van de klant worden getoond.

Selecteer de uitvouwknop naast Klantnummer en druk op de Delete-toets van het toetsenbord.

Figuur 6.61

Page 221: Databaseontwikkeling Access 2003

6 Uitgebreide formulieren 209

Klik met de muisaanwijzer op de balk Navigatie: KlantWiz en druk op de Delete-toets van het toetsenbord. We eindigen met het volgende overzicht, zie figuur 6.63.

Nog een opmerking over Webpagina’s: ga niet met Access zwoe-gen om een webpagina te maken, tenzij gegevens uit een database

Figuur 6.62

Figuur 6.63

Page 222: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003210

gelinkt moeten worden. Andere toepassingen zoals FrontPage of DreamWeaver kunnen dat veel beter en eenvoudiger.

Ontwerp de pagina zoals die in figuur 6.64 staat weergegeven. Daarin worden per bestemming de reizen getoond. Let erop dat in de navigatiebalk de besturingspictogrammen die toch niet gebruikt kunnen worden achterwege gelaten zijn. Dit is bereikt door de individuele knoppen te selecteren – met de Shift-toets ingedrukt – en vervolgens in het eigenschappenvenster in het tabblad Opmaak de eigenschap Display de waarde None te geven.

Figuur 6.64

Page 223: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten

Bij de bovenstaande opsomming gaan wij ervan uit dat de leer-lingen een case uitwerken waarbij de docent/begeleider de rol van opdrachtgever/gebruiker speelt.

Een rapport kunnen we geheel vanaf het begin met de hand ont-werpen. 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 over-zichten afgedrukt op een HP Laserjet 5000. 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 bestem-minglijst wordt getoond op volgorde van werelddeel, bij gelijk werelddeel op land en bij gelijk land op volgorde van plaats, zie figuur 7.1.

Selecteer het overzicht Rapporten van de database Reisbureau,kies Rapport maken met wizard en selecteer in het eerste venster de tabel Bestemming.Selecteer de velden in de volgorde zoals in figuur 7.2 is afge-beeld, 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.

Page 224: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003212

In dit scherm kunnen we de sorteervolgorde opgeven. Kies eerst een volgorde op Werelddeel, vervolgens op Land en ten slotte op het veld Plaats, zie figuur 7.3. Hierdoor wordt eerst gesorteerd op

Figuur 7.1

Figuur 7.2

Page 225: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 213

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 opge-maakt moet worden. Kies voor de indeling In tabelvorm en Staand. Geef in het volgende scherm een stijl (profiel) van het rapport op. Van iedere stijl wordt een voorbeeld getoond. Selecteer het opmaakprofiel Vet.Kies in het voorlaatste scherm de titel Bestemming per werelddeelen voltooi het rapport. Er wordt direct een voorbeeld van het rap-port op het scherm getoond, zie figuur 7.4.

We zien dat het rapport de informatie toont, echter niet in de vorm zoals weergegeven in figuur 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 ge-toond. Hiervoor zullen we het rapport handmatig gaan aanpassen.

Het rapport moet in de ontwerpweergave worden geplaatst. Selecteer daartoe Ontwerpweergave in het menu Beeld of klik op de knop Beeld. Het rapport wordt nu getoond in de ontwerpweer-gave, zie figuur 7.5.

We kunnen een rapport ook vanuit het databasescherm in de ont-werpweergave plaatsen door het overzicht Rapporten te selecteren. Markeer het betreffende rapport en klik op de knop Ontwerpen.

Figuur 7.3

Page 226: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003214

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.

Figuur 7.4

Figuur 7.5

Page 227: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 215

Paginakoptekst – Deze gegevens worden boven aan iedere blad-zijde afgedrukt, de zogenoemde koptekst.Detail – Hier worden de echte gegevens afgedrukt.Paginavoettekst – Deze voettekst wordt onder aan iedere pagina getoond.Rapportvoettekst – De eenmalige afsluiting van het rapport, vaak gebruikt om eindtotalen op te nemen.

De kop- en voetteksten van de pagina’s en van het rapport zelf kunnen we verwijderen of toevoegen door in het menu te kiezen voor Beeld en vervolgens de betreffende kop-/voetteksten wel of niet aan te vinken. De kop- en voetteksten in ons rapport zijn goed, dus verwijderen we ze niet. Merk verder op dat de rapportvoettekst niet gebruikt is, er wordt dus niets extra’s afgedrukt nadat het gehele rapport is afgedrukt.

De aanpassing die in het rapport uitgevoerd moet worden, is het niet tonen van de duplicaten.

Selecteer in de detailsectie het veld Werelddeel. Kies in het menu Beeld, Eigenschappen of klik direct op de knop Eigenschappen, zie figuur 7.6.

Hiermee kunnen we de eigenschappen van een geselecteerd object aanpassen. We kunnen onder andere de opmaak – bijvoorbeeld het

Figuur 7.6

Page 228: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003216

lettertype of de kleur van de tekst, kader of achtergrond – aanpas-sen.

Selecteer het tabblad Opmaak en verander vervolgens Duplicaten verbergen in Ja. Hierdoor worden duplicaten van het veld Werelddeel niet meer afgedrukt. Controleer de werking door in het menu te kiezen voor Beeld,Afdrukvoorbeeld of door op de knop Beeld te klikken. De duplica-ten worden bij het veld Werelddeel niet meer getoond. Om het rapport af te maken moeten we ook de eigenschappen van het veld Land in het rapport op identieke wijze aanpassen. Plaats daartoe het rapport in de ontwerpweergave en selecteer vervolgens het veld Land in de detailsectie. Plaats de eigenschappen van dit veld op het scherm en verander in het tabblad Opmaak de eigenschap Duplicaten verbergen in Ja.Controleer het rapport als afdrukvoorbeeld. Het rapport is voltooid.

In veel rapporten komen duplicaten voor, die meestal niet worden getoond. We hebben nu geleerd om die duplicaten op eenvoudige wijze te verwijderen.

7.2 Rapport met groepen

Het komt vaak voor dat we in rapporten groepen willen onder-scheiden. Een groep is een verzameling gegevens met een gemeen-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 twee voorbeelden toelichten. In figuur 7.7 worden de klanten per woonplaats getoond.

Bij iedere woonplaats worden de klanten uit die woonplaats afge-drukt. De plaatsen worden alfabetisch weergegeven. Ook de namen van de klanten binnen een woonplaats worden alfabetisch weergegeven. Na een woonplaats wordt het aantal klanten uit die plaats weergegeven. Uit Abbenbroek, Assen en Dalfsen komt maar één klant, uit Eindhoven komen twee klanten, enzovoort. Het over-zicht in figuur 7.7 is maar gedeeltelijk weergegeven, maar als uit een plaats dertig klanten komen, worden die alle dertig binnen die plaats alfabetisch getoond.

Page 229: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 217

Er wordt per woonplaats een groep klanten afgedrukt. Het ge-meenschappelijke kenmerk van die groep is dus de woonplaats. Voor elke nieuwe woonplaats wordt een nieuwe groep gestart. Hierdoor kunnen we snel door het rapport bladeren om de juiste woonplaats te zoeken.

Figuur 7.8 toont de reizigers, met hun bestemming, per vertrek-datum.

Figuur 7.7

Figuur 7.8

Page 230: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003218

We zien dat per vertrekdatum een groep reizigers wordt weer-gegeven. Het gemeenschappelijke kenmerk van die groep is dus de vertrekdatum. Voor elke vertrekdatum wordt een nieuwe groep gestart, hierdoor kunnen we snel door het rapport bladeren om een vertrekdatum op te zoeken. De vertrekdatums zijn aflopend gesorteerd. Binnen de groep zijn de reizigers op naam (oplopend) gesorteerd.

Het grote voordeel van het maken van groepen is dat we voor elke groep berekeningen kunnen uitvoeren. In het rapport van figuur 7.7 wordt het aantal klanten per plaats afgedrukt. In figuur 7.8 wordt het aantal klanten per vertrekdatum weergegeven alsmede het aan-tal passagiers (aantal volwassenen + aantal kinderen). Ook is het mogelijk om berekeningen uit te voeren over alle groepen tezamen, zodat we bijvoorbeeld het totaal aantal klanten kunnen bepalen van alle woonplaatsen tezamen of het totaal aantal reizigers van alle getoonde vertrekdatums, zie figuur 7.8.

We gaan kijken hoe we de twee getoonde voorbeelden in Access kunnen maken.

Voorbeeld 1: klanten per woonplaatsWe maken een eerste opzet van het rapport met de Wizard, daarna gaan we handmatige enige cosmetische aanpassingen aanbrengen om het rapport naar onze persoonlijke smaak aan te passen. Ook de telling van het aantal klanten per plaats is later toegevoegd.

Kies het overzicht Rapporten en Selecteer Rapport maken met wizard.Kies in het eerste venster de tabel Klant en selecteer vervolgens alle velden door op de knop >> te klikken, zie figuur 7.9.In het volgende venster kunnen we verschillende groepeerniveaus opgeven. Aangezien we gaan groeperen op woonplaats, markeren we het veld Woonplaats en klikken we op de knop >, zie figuur 7.10.In het volgende venster van de Wizard kunnen we aangeven hoe de gegevens gesorteerd moeten worden. We kunnen de detailgegevens op maximaal vier verschillende velden tegelijkertijd laten sorteren. Met de knop naast de keuzelijst geven we aan of er oplopend of aflopend gesorteerd moet worden. Selecteer in de keuzelijst het veld Naam, de sorteervolgorde blijft oplopend.

Page 231: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 219

Geef in het volgende scherm de lay-out van het rapport op: kies voor Met interval en Staand. Ken in het voorlaatste scherm een stijl (opmaakprofiel) aan het rapport toe. Selecteer de keuze Vet.Het laatste venster van de Wizard; hierin geven we de titel (naam) van het rapport op. Kies als naam Klanten per woonplaats en vol-tooi het rapport. Er wordt direct een voorbeeld van het rapport op het scherm weergegeven, zie figuur 7.11.

Het verkregen rapport lijkt nog niet op het gewenste rapport van figuur 7.7. We moeten het handmatig aanpassen.

Figuur 7.9

Figuur 7.10

Page 232: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003220

Selecteer in het menu Beeld, Ontwerpweergave of klik direct op de knop Beeld. Het rapport wordt in de ontwerpweergave getoond, zie figuur 7.12.

Als eerste passen we de sectie Paginakoptekst aan. Zoals te zien is in het afdrukvoorbeeld of in figuur 7.12 wordt de tekst Postcode en Telefoonnummer niet goed afgedrukt, ze passen niet volledig in de labelvakjes. Selecteer in de sectie Paginakoptekst het label Telefoonnummer.

Figuur 7.11

Figuur 7.12

Page 233: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 221

Plaats vervolgens de eigenschappen van het geselecteerde label op het scherm door te kiezen voor Beeld, Eigenschappen of door direct op de knop Eigenschappen te klikken. Er verschijnt een ven-ster met de eigenschappen, zie figuur 7.13.

Selecteer het tabblad Opmaak en wijzig de eigenschap Bijschrift in Telefoonnr. Het Bijschrift is de tekst die getoond wordt in het label. Hierdoor wordt in de koptekst wat extra ruimte gecreëerd.Maak in de ontwerpweergave de lengte van het label Telefoonnraan de rechterkant iets kleiner en verplaats het vervolgens een stukje naar rechts. Selecteer het label Postcode en maak het label aan de rechterkant iets groter, zodat het hele woord postcode leesbaar wordt. Bekijk het voorlopige resultaat vervolgens als afdrukvoor-beeld, via de knop Beeld of gebruik het menu door voor Beeld,Afdrukvoorbeeld te kiezen. Als het resultaat nog niet volmaakt is, pas dan in de ontwerpweer-gave de labels opnieuw aan. Keer terug naar de ontwerpweergave voor de volgende aanpassing.

We zien in de ontwerpweergave een nieuwe sectie Koptekst (Woonplaats). De gegevens die in die sectie staan, worden aan het begin van iedere nieuwe groep getoond. In dit voorbeeld dus de nieuwe woonplaats. Die woonplaats wordt in het rapport van de Wizard omkaderd afgedrukt. We willen die omkadering verwijde-ren en ook moet de plaats vet afgedrukt worden.

Figuur 7.13

Page 234: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003222

Selecteer in de sectie Koptekst (Woonplaats) het veld Woonplaats.Activeer het venster met de eigenschappen. Klik op het tabblad Opmaak en verander de eigenschap Randstijlin Transparant en de eigenschap Tekengewicht in Vet.Bekijk eventueel het voorlopige resultaat als afdrukvoorbeeld.

Om het geheel wat te verfraaien zijn wat extra lijnen toegevoegd. In de Paginakoptekst zijn door de Wizard twee lijnen, boven en onder de kopjes, getrokken. De onderste lijn is niet helemaal zicht-baar. Door de Koptekst (Woonplaats) iets naar beneden te slepen wordt die lijn beter weergegeven. Zo’n zelfde lijn gaan we ook onder de koptekst afdrukken. Lijnen zijn te trekken door in de Werkset op de knop Lijn te klikken en vervolgens door klikken en slepen de lijn te trekken. Aangezien we een zelfde lijn willen trek-ken als in de paginakoptekst, kunnen we die lijn eenvoudig kopië-ren en plakken.

Selecteer de lijn uit de Paginakoptekst door erop te klikken. Kies Bewerken, Kopiëren. Klik met de muis in de sectie Koptekst (Woonplaats) en plak de lijn erin via Bewerken, Plakken.Verplaats de gekopieerde lijn vervolgens onder het veld Woonplaats.Controleer in het afdrukvoorbeeld het voorlopige resultaat. Het gaat er al op lijken. Het enige dat we nog moeten toevoegen, is het tellen van het aantal klanten per woonplaats.Plaats het ontwerp in de ontwerpweergave. Kies Beeld, Sorteren en groeperen. Er verschijnt een venster op het scherm waarmee we het groeperen en sorteren kunnen verfijnen, zie figuur 7.14.

Figuur 7.14

Page 235: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 223

Maak in de kolom Veld/expressie kenbaar op welk veld moet worden gegroepeerd. De Wizard heeft dat al voor ons geregeld, er wordt gegroepeerd op het veld Woonplaats. In diezelfde kolom kunnen we ook aangeven waarop we verder willen sorteren. In de Wizard hebben we al kenbaar gemaakt dat we per woonplaats willen sorteren op het veld Naam. Ook dat is in het venster al zichtbaar. Door het bijzondere tekentje voor het veld Woonplaats wordt onderscheid gemaakt tussen groeperen en sorteren. In de kolom Sorteervolgorde kunnen we aangeven of er Oplopend of Aflopend gesorteerd moet worden.

Per groep kunnen we vervolgens de volgende eigenschappen opgeven:Groepskoptekst bepaalt of de koptekst van de betreffende groep wel of niet moet worden getoond.Groepsvoettekst bepaalt of de voettekst van de betreffende groep wel of niet moet worden getoond.Groeperen op is bedoeld om op te geven of er op iedere afzonder-lijke waarde moet worden gegroepeerd of op een andere manier, bijvoorbeeld op de eerste drie letters van het veld. Bij datumvel-den kunnen we bijvoorbeeld kiezen voor het groeperen per week, maand of jaar.Groepeerinterval is bedoeld om in combinatie met de eigenschap Groeperen op te bepalen hoe records op een rapport worden gegroepeerd. De instelling van het groepeerinterval is afhankelijk van het gegevenstype. Als we groeperen op een datumveld en we hebben bij Groeperen op gekozen voor de optie Week, zal de intervalwaarde 2 per twee weken groeperen. Groeperen we op een tekstveld en we hebben bij Groeperen op geselecteerd Begintekens,dan wordt er door de intervalwaarde 3 gegroepeerd op de eerste drie tekens van het veld. De teksten Maleisië, Mali en Malediven worden dan tot dezelfde groep gerekend, de eerste drie letters zijn immers gelijk. De standaardwaarde van deze eigenschap is 1.Bijeenhouden bepaalt welke delen van een groep bijeengehouden moeten worden op dezelfde pagina. Kiezen we voor Hele groep, dan wordt de hele groep, inclusief kop- en voetteksten op dezelfde pagina afgedrukt. Kiezen we voor Met eerste detail, dan wordt de koptekst alleen afgedrukt als ook het eerste detailrecord op dezelf-de pagina kan worden afgedrukt. De standaardwaarde is Nee, kop-en voetteksten worden niet bij elkaar gehouden. Er wordt continu afgedrukt.

Page 236: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003224

Om het aantal klanten per plaats te tonen moeten we een voettekst invoeren. De Wizard heeft deze niet voor ons gemaakt. Na iedere groep worden de gegevens in de voettekst van de groep afgedrukt, in ons voorbeeld moet daar dus het aantal klanten uit die groep komen te staan.

Zet de eigenschap Groepsvoettekst op Ja. In het rapport wordt hier-door een extra sectie gemaakt.Selecteer bij de eigenschap Bijeenhouden de waarde Met eerste detail.Sluit het venster Groeperen en sorteren. In de nieuwe sectie Voettekst (Woonplaats) moet een tekstvak wor-den toegevoegd. Kies uit de Werkset het Tekstvak en plaats deze in de voettekstsectie. Er wordt zowel een label als een tekstvak neer-gezet. Selecteer het label en plaats de eigenschappen hiervan op het scherm. Verander in het tabblad Opmaak de eigenschap Bijschrift in Totaal:.Selecteer vervolgens het tekstvak en kies in het eigenschappen-venster het tabblad Gegevens. Voer bij de eigenschap Besturingselementbron de volgende for-mule in: =Aantal([Klantnummer]). Hierdoor wordt in het rapport het aantal klanten in de groep geteld.

In dit voorbeeld hebben we gekozen voor het veld Klantnummerdat wordt geteld, maar ieder ander veld had ook gekozen kunnen worden. Bijvoorbeeld =Aantal([Adres]) levert hetzelfde resul-taat op. Hierdoor mogen we ook een joker (wildcard) gebruiken =Aantal(*).

Veelvoorkomende functies in de kop- en voetteksten zijn:Som() – deze functie sommeert het opgegeven numerieke veld of expressie, bijvoorbeeld Som([Aantal volwassenen]).Min() – bepaalt de kleinste waarde, bijvoorbeeld Min([Vertrekdatum]).Max() – doet hetzelfde als Min(), maar dan wordt de grootste waarde bepaald, bijvoorbeeld Max([Betaald bedrag]).Gem() – bepaalt het gemiddelde van een numeriek veld of expres-sie, bijvoorbeeld Gem([Aantal volwassenen] + [Aantal kinderen]).

Page 237: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 225

Bekijk het voorlopige resultaat als afdrukvoorbeeld. Wat nog op-valt, is dat het aantal klanten per plaats een aantal centimeters van het label Totaal: wordt afgedrukt. Dit is eenvoudig op te lossen.Keer terug naar de ontwerpweergave en maak het label van Totaal:zo klein mogelijk. Sleep het tekstvak met het aantal klanten dicht tegen het label Totaal: aan. Selecteer het tekstvak met de telling en activeer het eigenschappen-venster. Kies in het tabblad Opmaak de laatste eigenschap Tekstuitlijningen selecteer hierin de optie Links uitlijnen. Numerieke waarden en datumvelden worden standaard rechts in het tekstvak uitgelijnd. Met deze optie kunnen we dat desgewenst aanpassen.Het rapport is nu bijna af. Selecteer de zojuist gekopieerde lijn uit de sectie van de koptekst en kopieer deze op de bekende wijze naar de sectie van de voettekst. Deze wordt nu boven in de voettekst geplaatst. Verplaats het label en het tekstvak zodanig dat het links boven in de sectie van de voettekst komt te staan, net onder de lijn. Verklein als laatste de sectie van de voettekst door de balk van de sectie Paginavoettekst omhoog te slepen. Het volledige resultaat is in figuur 7.15 te zien. Controleer het rapport als afdrukvoorbeeld.

Figuur 7.15

Page 238: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003226

Voorbeeld 2: Reizigers per vertrekdatumWe gaan opnieuw met de Wizard een eerste opzet maken van het rapport dat getoond is in figuur 7.8. Daarna zijn weer handmatig enige cosmetische aanpassingen aangebracht. Ook het tellen van de klanten en het aantal reizigers per groep is later toegevoegd. We zullen laten zien hoe we het rapport hebben gemaakt.

Als eerste hebben we een query gemaakt waarin alle velden voor-komen uit het gewenste rapport. In die query zorgen we ervoor dat voor de vertrekdatum een bereik opgegeven kan worden. Hierdoor worden alleen de vertrekdatums getoond tussen de opgegeven datums.

Selecteer het overzicht Query’s en kies voor Query maken in ont-werpweergave.Selecteer alle tabellen. Kies vervolgens voor de velden Vertrekdatum uit de tabel Reis,Naam en Plaats uit de tabel Klant, de velden Plaats en Land uit de tabel Bestemming en ten slotte uit de tabel Boeking de velden Aantal volwassenen en Aantal kinderen, zie figuur 7.16. Voer als laatste de voorwaarde in, waarmee we een bereik kunnen opgeven voor de vertrekdatum. Klik in de rij Criteria van het veld Vertrekdatum en vul in: >=[Geef startdatum:] And <=[Geef eind-datum:].

De query is op deze manier flexibel gemaakt. Door tussen de vier-kante haken een vraag te stellen, zal bij het uitvoeren van de query om een startdatum en een einddatum worden gevraagd. De inge-voerde datums gelden dan als voorwaarde.

Figuur 7.16

Page 239: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 227

Sla de query op met de naam rptReizigers per vertrekdatum.

Het is handig om een query die voor een rapport wordt gebruikt, dezelfde naam te geven als het rapport, voorafgegaan door de let-ters rpt (rapport). We kunnen dan snel zien welke query bij welk rapport hoort. Nu gaan we het rapport opzetten met de Wizard.

Kies het overzicht Rapporten en selecteer Rapport maken met wizard.Kies in het eerste venster van de Wizard de zojuist gemaakte query rptReizigers per vertrekdatum en selecteer alle velden die afgedrukt worden in het rapport. Dat zijn alle velden behalve de velden Aantal volwassenen en Aantal kinderen. Deze velden wor-den alleen gebruikt om het aantal reizigers per vertrekdatum te bepalen, zie figuur 7.17.

In het volgende scherm van de Wizard wordt gevraagd hoe we het rapport willen weergeven. Op grond van de relaties en de volgorde van de opgegeven velden heeft de Wizard zelf al een bepaalde indeling gemaakt van de verschillende groepeermogelijkheden, volgens Bestemming, volgens Reis of volgens Klant. We willen groepen op het veld Vertrekdatum, dat moet dus bovenaan staan. Kies zodoende voor volgens Reis.Geef in het volgende scherm extra groepeerniveaus op, zie figuur 7.18. Er wordt nu gegroepeerd op Vertrekdatum, Plaats en Land.Dat heeft de Wizard voor ons bepaald.

Figuur 7.17

Page 240: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003228

We willen alleen op Vertrekdatum groeperen; selecteer Vertrekdatum en klik op de knop >. Hierdoor komt het veld Vertrekdatum bovenaan te staan met als toevoeging volgens Maand . Standaard wordt namelijk bij datumvelden per maand gegroepeerd. We willen echter niet per maand maar per dag groeperen, bij iedere vertrekdatum willen we de reizigers zien. Klik daartoe op de knop Opties voor groeperen… en verander in de keuzelijst de groepeeroptie Maand in Normaal, zie figuur 7.19. Zie daarbij tevens alle groepeermogelijkheden voor datumvelden.

Door het selecteren van de vertrekdatum als groepveld is door de Wizard automatisch een tweede groep gemaakt, namelijk op Plaats en Land. Dat kunnen we met de Wizard niet corrigeren. We verbeteren dat nadat de Wizard de opzet van ons rapport heeft gemaakt.

Figuur 7.18

Figuur 7.19

Page 241: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 229

Ga naar het volgende scherm van de Wizard. Hierin kunnen we voor de detailsectie opgeven wat de sorteervolgorde moet zijn, zie figuur 7.20.

Selecteer als sorteervolgorde van de detailsectie het veld Naam(oplopend) en ga naar het volgende scherm. Kies de gewenste opmaak: selecteer Met interval en Staand. Geef in het voorlaatste scherm een opmaakprofiel aan het rapport: selecteer Vet. Geef in het laatste venster de titel (naam) Reizigers per vertrek-datum aan het rapport. Klik op de knop Voltooien; er wordt om een start- en einddatum gevraagd. Vervolgens wordt het rapport als afdrukvoorbeeld op het scherm getoond, zie figuur 7.21.

Het rapport voldoet niet geheel aan onze wensen, zie figuur 7.8. We moeten het rapport dat door de Wizard is gemaakt met de hand wijzigen. We moeten enige cosmetische wijzigingen aanbrengen, het groeperen op Plaats en Land moet worden verwijderd en er moet per vertrekdatum geteld worden hoeveel klanten en reizigers er vertrekken.

Zet het rapport in de ontwerpweergave, zie figuur 7.22.

Figuur 7.20

Page 242: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003230

De Wizard heeft de labels (en de velden) in een andere volgorde weergegeven dan onze bedoeling is. We willen eerst de naam en woonplaats van een klant afdrukken en daarachter de plaats van bestemming en het land. We moeten die labels paarsgewijs ver-plaatsen.

Selecteer het label Naam en klik op het label Woonplaats van de klant met de Shift-toets ingedrukt. Hierdoor worden beide labels geselecteerd.

Figuur 7.21

Figuur 7.22

Page 243: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 231

Versleep ze vervolgens helemaal naar links, over het label Vertrekdatum heen. Selecteer op dezelfde manier de labels Plaats van bestemming en Land en sleep deze naar hun gewenste plaats in de koptekstsectie. Zet vervolgens de labels Naam en Woonplaats van de klant op hun gewenste plaats.

Vanzelfsprekend moeten ook de bijbehorende velden op hun gewenste plaats gezet worden. Maar voor we dat doen, moeten we iets toelichten over het rapport dat de Wizard heeft gemaakt.

In de ontwerpfase kunnen we zien dat de Wizard twee kopteksten heeft gecreëerd, namelijk: Koptekst (Vertrekdatum) en Koptekst(Plaats). Dat betekent dat er twee groepeerniveaus zijn. Er wordt eerst gegroepeerd op het veld Vertrekdatum. Binnen de groep van een vertrekdatum wordt er doorgegroepeerd op Plaats. Wij willen alleen groeperen op vertrekdatum en daarbinnen niet nogmaals op de plaats van bestemming. De Koptekst (Plaats) moet verwij-derd worden. De velden Plaats en Land mogen echter niet verwij-derd worden, die moeten immers afgedrukt worden. Ze moeten verplaatst worden van de sectie Koptekst (Plaats) naar de sectie Detail. Hierdoor worden ze bij ieder detailrecord afgedrukt, zoals gewenst.

Selecteer in de sectie Detail, met behulp van Shift+muisklik, tege-lijkertijd de velden Naam en Woonplaats en sleep deze naar hun gewenste plaats. Selecteer in de sectie Koptekst (Plaats) tegelijkertijd de velden Plaats en Land en sleep deze naar hun gewenste plaats in de sectie Detail. Het voorlopige resultaat staat in figuur 7.23 afgebeeld.De sectie Koptekst (Plaats) kan nu worden verwijderd. Selecteer daartoe in het menu Beeld, Sorteren en groeperen of klik direct op de knop Sorteren en groeperen. Het venster met de verschillende sorteer- en groepeeropties wordt getoond, zie figuur 7.24.

In dit venster is door middel van het symbool voor de eigenschap Veld/expressie te zien dat er op twee velden wordt gegroepeerd en dat op het veld Naam in de sectie Detail wordt gesorteerd.

Selecteer door met de muis op het groepeersymbool te klikken, de rij Plaats.

Page 244: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003232

Druk op de Delete-toets en bevestig de verwijdering.In het rapport is ook een voettekst per groep noodzakelijk. Klik daartoe in het venster Groeperen en sorteren op het veld Vertrekdatum en verander de eigenschap Groepsvoettekst in Ja,waardoor een nieuwe sectie in het rapport wordt gemaakt.Wijzig vervolgens in het venster Groeperen en sorteren de sorteer-volgorde van het veld Vertrekdatum in aflopend. Hierdoor worden de vertrekdatums in het rapport aflopend weergegeven en de na-men van de klanten in de sectie Detail oplopend, zoals gewenst voor het rapport, zie figuur 7.8.Hiermee zijn alle groepeer- en sorteerwensen vervuld, dus sluit het venster Groeperen en sorteren.

We moeten nog enige cosmetische wijzigingen doorvoeren. De landen en de plaatsen van bestemming worden omkaderd weer-gegeven en de vertrekdatum wordt rechts uitgelijnd.

Figuur 7.24

Figuur 7.23

Page 245: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 233

Zet het rapport in de ontwerpweergave. Selecteer met Shift+muisklik de velden Plaats en Land.Zet het eigenschappenvenster op het scherm en verander in het tabblad Opmaak de eigenschap Randstijl in Transparant, zie figuur 7.25.Selecteer het veld Vertrekdatum, klik op de tab Opmaak en wijzig de eigenschap Tekstuitlijning in Links. Hierdoor wordt de vertrek-datum links in het tekstvak weergegeven als het rapport wordt getoond.

De laatste cosmetische verandering is het plaatsen van extra lijnen om het rapport overzichtelijk te maken. Aangezien de gewenste lijnen allemaal hetzelfde zijn, kunnen we door kopiëren en plakken snel de gewenste lijnen in het rapport plaatsen.

Selecteer de bovenste lijn in de Paginakoptekst en kopieer deze op de bekende manier. Klik op de balk van de sectie Koptekst (Vertrekdatum) en plak de lijn erin. Sleep de gekopieerde lijn naar beneden zodat deze tegen de sectie Detail komt te liggen. Selecteer de sectie Voettekst (Vertrekdatum) en plak ook daarin de zojuist gekopieerde lijn.Verklein de grootte van de sectie Voettekst (Vertrekdatum) door de sectie Paginavoettekst tegen de lijn in de sectie Voettekst(Vertrekdatum) te slepen.

Figuur 7.25

Page 246: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003234

De onderste lijn in de sectie Paginakoptekst is niet helemaal zicht-baar. Versleep de sectie Koptekst (Vertrekdatum) een klein stukje naar beneden zodat de hele lijn zichtbaar wordt. Alle cosmetische wijzigingen zijn nu doorgevoerd, zie figuur 7.26. Bekijk als afdrukvoorbeeld het voorlopige resultaat.

Als laatste voegen we de gewenste berekeningen aan het rapport toe. Er moeten vier berekeningen uitgevoerd worden. Het aantal klanten per vertrekdatum, het aantal reizigers per vertrekdatum, het totaal aantal klanten en het totaal aantal reizigers van het gehele rapport. Hiervoor zijn vier tekstvakken nodig, twee in de sectie Koptekst (Vertrekdatum) en twee in de sectie Rapport-voettekst. Die sectie wordt als afsluiting van het rapport afgedrukt en zodoende vaak gebruikt om eindtotalen op te nemen. Die sectie staat wel afgedrukt in de ontwerpweergave van het rapport, maar wordt niet in het afdrukvoorbeeld weergegeven omdat er geen ruimte voor is vrijgemaakt.

Wijs om deze ruimte te maken met de muis naar de onderkant van de balk Rapportvoettekst en sleep deze ongeveer één centimeter naar beneden. De witte achtergrond met het rasterwerk wordt zichtbaar. Alle benodigde tekstvakken kunnen nu geplaatst wor-den.

Figuur 7.26

Page 247: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 235

Klik in de Werkset van het rapport op de knop Tekstvak en sleep en klik het tekstvak in de sectie Koptekst (Vertrekdatum). Hierbij wordt direct een label gemaakt. Verplaats het label en het tekstvak zodanig dat het wordt afgedrukt op de plaats waar het aantal klanten getoond moet worden, zie figuur 7.27.

Klik in het label en plaats het eigenschappenvenster op het scherm. Verander in het tabblad Opmaak de eigenschap Bijschrift in Aantal klanten:.Klik in het bijbehorende tekstvak en verander in het tab-blad Gegevens de eigenschap Besturingselementbron in: =Aantal([Land]). Het veld Land wordt geteld, maar ieder veld uit de sectie Detail had voldaan, aangezien het aantal keren dat een land (of bestemming) wordt afgedrukt geteld wordt. Hierdoor mag ook gebruik worden gemaakt van de joker (wildcard) =Aantal(*).Plaats op identieke wijze nog een label en een tekstvak in deze sectie. Sleep het naar de gewenste plaats en verander van het label de eigenschap Bijschrift in Aantal reizigers: en de eigen-schap Besturingselementbron van het tekstvak in: =Som([Aantal volwassenen]+[Aantal kinderen]). Hiermee wordt het aantal reizigers per klant opgeteld. De velden Aantal volwassenen en Aantal kinderen zijn in de query van het rapport opgenomen, maar

Figuur 7.27

Page 248: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003236

worden uitsluitend gebruikt om deze optelling mogelijk te ma-ken. We kunnen ook op de drie puntjes klikken in de eigenschap Besturingselementbron om de Opbouwfunctie voor expressie te activeren. Hierin is het wat ‘overzichtelijker’ om de formule in te voeren.Zet nog een tekstvak in de sectie Rapportvoettekst. Sleep het eventueel naar de gewenste plaats, zie figuur 7.27, en verander de eigenschap Bijschrift van het label in Totaal aantal klan-ten: en de eigenschap Besturingselementbron van het tekstvak in: =Aantal([Land]). Aangezien deze telling nu in de sectie Rapportvoettekst staat, wordt nu niet per groep geteld, maar voor het hele rapport. Ten slotte wordt het laatste tekstvak geplaatst, in dezelfde sectie waar-in het totaal aantal klanten wordt getoond. Verander van het label de eigenschap Bijschrijft in Totaal aantal reizigers: en in het tekstvak de eigenschap Besturingselementbron in: =Som([Aantal volwassenen]+[Aantal kinderen]).

Nog een opmerking over de berekeningen per groep. Zoals we in het rapport zien, wordt het aantal klanten en het aantal reizigers per vertrekdatum afgedrukt vóórdat de gegevens getoond worden. Dat is iets bijzonders, want hoe weet Access vóóraf hoeveel gege-vens in die groep afgedrukt worden? Access doorloopt hiervoor twee keer het rapport. De eerste keer worden de expressies in de detailregels berekend, de groepstotalen en eindtotalen bepaald en de lengte van het rapport gecontroleerd, zodat het totaal aantal pagina’s bekend is. De tweede keer wordt het rapport afgedrukt en de berekende expressies van de bijbehorende groepen afgedrukt. Doordat Access het rapport twee keer doorloopt, is het ook moge-lijk om percentages uit te rekenen ten opzichte van totaaltellingen. In de volgende paragraaf wordt een voorbeeld toegelicht waarin zo’n percentageberekening wordt toegepast.

7.3 Rapport met meerdere groepen

Als laatste voorbeeld in dit hoofdstuk bespreken we een rapport waarin meerdere groepen zijn opgenomen. Hierin wordt het aan-tal reizigers geteld per land en binnen een land per bestemming. Verder wordt het percentage reizigers naar die bestemmingen afgedrukt ten opzichte van de andere bestemmingen in het reis-programma van het reisbureau, zie figuur 7.28.

Page 249: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 237

We maken eerst een query waarin de betreffende gegevens worden geselecteerd.

Kies het overzicht Query’s en selecteer Query maken in ontwerp-weergave.Kies achtereenvolgens de tabellen Bestemming, Reis en Boeking.Selecteer de velden Land en Plaats uit de tabel Bestemming. Het derde benodigde veld is een rekenveld. Klik met de muis in de derde 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 noodzake-lijk om de gegevens uit de tabel Boeking (Aantal volwassenen en Aantal kinderen) te kunnen benaderen.Kies het overzicht Rapporten en selecteer Rapport maken met wizard.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. In het volgende scherm kunnen we in het groeperen een verdere verfijning aanbrengen. Aangezien we moeten groeperen op het

Figuur 7.28

Page 250: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003238

veld Land en daarbinnen op het veld Plaats moet een extra groe-peerniveau worden geselecteerd. Markeer het veld Land en klik op de knop >. Aan de rechterzijde van het scherm wordt dan een voor-beeld van de groepeerniveaus aangegeven. Eerst wordt gegroe-peerd op het veld Land en daarbinnen op het veld Plaats, zie figuur 7.29.

In het volgende scherm kan van de detailsectie een sorteervolgorde worden aangegeven, zie figuur 7.30. Dat is voor ons rapport niet noodzakelijk.

Figuur 7.29

Figuur 7.30

Page 251: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 239

Als in de detailsectie numerieke waarden voorkomen, wordt in dit scherm tevens een mogelijkheid geboden om totalen weer te geven met de knop Opties voor totalen… In de detailsectie hebben we een numerieke waarde, namelijk het rekenveld Aantal reizigers.Klik op de knop Opties voor totalen… Er wordt een venster getoond waarin we opties kunnen selecteren voor totalen, zie figuur 7.31.

In het gewenste overzicht is het totaal aantal reizigers per land en daarbinnen per plaats noodzakelijk, dus de aantallen reizigers moeten gesommeerd worden. Zet hiervoor een vinkje bij Som. Geef in dit scherm verder aan of de afzonderlijke detailgegevens en totalen getoond moeten worden of alleen de totalen. Wij zijn voor ons rapport niet geïnteresseerd in de individuele reizen, maar alleen in de totalen per land en daarbinnen per plaats. Kies voor Alleen totalen. Plaats in dit venster een vinkje bij Percentage van totaal berekenen voor som. Hierdoor worden de gewenste percentages getoond. Klik op de knop OK en ga naar het volgende scherm. Kies hierin voor Met interval en Staand en ga naar het volgende scherm van de Wizard. Kies de optie Vet en geef in het laatste scherm de naam Landtotalen aan het rapport. Er wordt een voorbeeld van het rap-port op het scherm als afdrukvoorbeeld getoond, zie figuur 7.32.

Figuur 7.31

Page 252: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003240

Het rapport voldoet nog niet geheel aan onze wensen, zie figuur 7.28. We gaan opnieuw enige handmatige aanpassingen aanbren-gen om het gewenste resultaat te krijgen.

Zet het rapport in de ontwerpweergave, zie figuur 7.33.

In de sectie Paginakoptekst moet een nieuw label worden geplaatst. Dit kan via de Werkset of door een willekeurig label uit die sectie te kopiëren.

Selecteer in de sectie Paginakoptekst het label Aantal reizigers en kopieer via Bewerken, Kopiëren en Bewerken, Plakken een nieuw label. Sleep het vervolgens naar de gewenste plaats, naast het label Aantal reizigers.Activeer het eigenschappenvenster van het nieuwe label en veran-der in het tabblad Opmaak de eigenschap Bijschrift in Percentage.Door het kopiëren is de sectie groter geworden, verklein deze weer tot het oorspronkelijke formaat.

Figuur 7.32

Page 253: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 241

In de sectie Voettekst (Plaats) staan de labels Som en Standaard.Verwijder deze door ze te selecteren en vervolgens op de Delete-toets te drukken. Het label Standaard lijkt ons een foutje in Access. Dit moet Percentage zijn.We moeten de twee bijbehorende tekstvakken verplaatsen. Sleep het bovenste tekstvak, =Som([Aantal reizigers]), in de sectie Voettekst (Plaats) naar de sectie Koptekst (Plaats).Doe precies hetzelfde voor het andere tekstvak, =Som([Aantal reizigers])/([Aantal reizigers Eindtotaal Som]), uit de sectie Voettekst (Plaats). Sleep dat tekstvak recht onder het zojuist gemaakte label Percentage.Verklein de sectie Voettekst (Plaats) door de balk van de Voettekst (Land) omhoog te schuiven. Zie het voorlopige resultaat in figuur 7.34.Verwijder in de sectie Voettekst (Land) de labels Som en Standaard.Verplaats vervolgens het onderste tekstvak =Som([Aantal reizigers])/([Aantal reizigers Eindtotaal Som]) in dezelfde sectie naast het bovenliggende tekstvak =Som([Aantal reizigers]).Maak in dezelfde sectie het vak =”Overzicht voor “ & “… aan de rechterkant voor de helft kleiner, zodat de onderliggende tekstvak-ken ernaast geplaatst kunnen worden, zie figuur 7.35. Verplaats de beide tekstvakken naast het zojuist verkleinde vak.

Figuur 7.33

Page 254: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003242

In de sectie Voettekst (Land) plaatsen we nog een lijn onder de tekstvakken, zodat de landen door een lijn van elkaar gescheiden worden.

Figuur 7.34

Figuur 7.35

Page 255: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 243

Selecteer in de sectie Paginakoptekst de onderste lijn en kopieer deze lijn naar de sectie Voettekst (Land). Sleep deze lijn tot net onder de tekstvakken. Verklein deze sectie door de balk van de sectie Paginavoettekst omhoog te schuiven.

Het rapport voldoet nu bijna aan onze eisen. Nog een klein detail gaan we aanpassen.

Selecteer het vak =”Overzicht voor “ & “… in de sectie Voettekst (Plaats).Activeer het eigenschappenvenster en klik op het tabblad Gegevens. Vervang in de eigenschap Besturingselementbron ‘detailrecord’door ‘reis’ en ‘detailrecords’ door ‘reizen’ (zoom eventueel uit met Shift+F2). Doe hetzelfde met het gelijkwaardige vak in de sectie Voettekst (Land).Het rapport is volledig aangepast aan onze wensen, zie figuur 7.35. Bekijk het resultaat als afdrukvoorbeeld.

Nog enige opmerkingen over het rapport:Het rekenveld Aantal reizigers in de sectie Detail wordt in het rapport niet afgedrukt. We tonen immers alleen de totalen. We kunnen echter het rekenveld Aantal reizigers niet verwijderen aan-gezien deze gebruikt wordt om de totalen te bepalen. De gegevens in de detailsectie worden in het rapport niet getoond doordat de eigenschap Zichtbaar van de sectie Detail op Nee is gezet door de Wizard.In de sectie Rapportvoettekst wordt als laatste het totaal aantal reizigers getoond uit alle landen in het rapport. Het percentage is door de Wizard niet geplaatst aangezien het altijd 100% is.Het tekstvak is door de Wizard voorzien van de naam: Aantal rei-zigers Eindtotaal Som. Dit is te zien in de eigenschap Naam, in het tabblad Overige van dit tekstveld.Die naam kan vervolgens gebruikt worden bij berekeningen met dit tekstveld. Op die manier zijn de percentages uitgerekend van de totalen per land en per plaats. Dit is mogelijk in Access aangezien het rapport twee keer wordt doorlopen voordat het wordt afge-drukt.

Page 256: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003244

Als we in een kop- of voettekst een rekenveld, dat in de detail-sectie is bepaald, willen sommeren, is het niet toegestaan om te verwijzen naar het betreffende rekenveld. Een voorbeeld: in de detailsectie hebben we het rekenveld Regelbedrag met hierin de berekening =[Aantal] * [Prijs]. In de kop- of voettekst is het niet toegestaan om =Som([Regelbedrag]) te gebruiken, we moeten de berekening daarin herhalen =Som([Aantal] * [Prijs]). Als het rekenveld in een query is gemaakt, zoals in ons voorbeeld, mag het wel worden toegepast.

Opgaven

7.1 In figuur 7.36 wordt per vertrekdatum de bestemmingen getoond die worden aangedaan inclusief het reisnummer en de prijs per persoon. In het rapport van figuur 7.36 worden de duplicaten niet getoond. Het gebruikte opmaakprofiel is Vet. Maak dit rapport.

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

Figuur 7.36

Page 257: Databaseontwikkeling Access 2003

7 Uitgebreide rapporten 2457 Uitgebreide rapporten 245

7.3 In figuur 7.38 wordt een omzetlijst getoond. Hierin is per reis de omzet berekend. De kinderen betalen voor alle reizen 20% minder dan de volwassenen. Voor de opmaak is gekozen voor Links uitlij-nen 1, het profiel is Vet. Maak dit rapport.

Figuur 7.37

Figuur 7.38

Page 258: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003246 Databaseontwikkeling 4 Access 2003246

7.4 In het overzicht van opdracht 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 opdracht 7.3 zodanig dat alle reizen worden getoond, ook die nog niet geboekt zijn.Tip: verander de joineigenschappen van de gemaakte query zoda-nig dat alle reizen worden getoond, ook de reizen die dus nog niet geboekt zijn.

Page 259: Databaseontwikkeling Access 2003

8 Macro’s

In Access kunnen we macro’s maken voor het automatisch laten uitvoeren van opdrachten die we anders met de muis of het toet-senbord 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 heb-ben 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. Met behulp van macro’s 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 macro’s uit te laten voeren. Hierdoor kunnen we zonder enige kennis van Access de database gebruiken. We spreken dan over een toepassing; een uitwerking van zo’n toepassing staat in hoofdstuk 9.

In dit hoofdstuk worden twee voorbeelden van macro’s gegeven. Het eerste voorbeeld is een eenvoudige macro, die toont wat een macro inhoudt. In het tweede voorbeeld worden geavanceerde macro’s toegepast om de mogelijkheden van macro’s aanschou-welijk te maken. Bedenk dat die geavanceerde macro’s niet altijd nodig zijn voor het maken van een applicatie, maar het kan helpen om een probleem binnen een toepassing op te lossen.

Page 260: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003248

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. Een macro wordt eerst eenmalig ingevoerd; vervolgens wordt de macro gestart en worden alle acties van de macro in de aangegeven volg-orde uitgevoerd. (We spreken wel van het ‘runnen’ van de macro.) We gaan een macro maken die uit de database Reisbureau alle klanten uit Vlaardingen toont.

Open de database Reisbureau en selecteer het overzicht Macro’s. Klik op de knop Nieuw, waarna het macrovenster wordt getoond.

In de eerste kolom, Actie, kunnen de acties die de macro gaat uit-voeren, worden opgegeven. In de tweede kolom, Beschrijving, kan eventueel een toelichting worden gegeven bij de actie. Die toelich-ting 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 voor-beeld 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 argumen-ten 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.

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 Draaigrafiek. Kies de instelling Gegevensblad.

Page 261: Databaseontwikkeling Access 2003

8 Macro’s 249

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 toe-gestaan. 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 tweede actie die de macro voor ons gaat uitvoeren, is het maximaliseren van het venster.

Klik in de tweede regel van de actiekolom en selecteer de actie Maximaliseren.

Deze actie heeft geen argumenten. Het venster zal vergroot worden tot het volledige scherm. Is het venster al gemaximaliseerd, dan gebeurt er niets. Merk op dat het venster niet tijdens het invoeren van de macro wordt gemaximaliseerd. Het vindt pas plaats nadat de macro is gestart.

De derde actie die we de macro laten uitvoeren, is een bericht op het scherm tonen.

Selecteer in de derde 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 Vlaardingen., Ja, Informatie, Berichtje.

De volgende actie is het filteren van de klantentabel om alleen de klanten uit Vlaardingen te tonen.

Page 262: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003250

Selecteer de actie FilterToepassen.

Deze actie heeft twee argumenten. Het eerste argument is Filternaam; hierin kunnen we de naam opgeven van een filter of query waarmee de records in de tabel beperkt worden. Aangezien we geen filter gemaakt hebben, kiezen we voor het tweede argu-ment: WHERE-voorwaarde. Hierin kunnen we een voorwaarde invoeren die de records beperkt tot de klanten uit Vlaardingen.

Voer bij het argument WHERE-voorwaarde in: [Woonplaats] = “Vlaardingen”.

Hierna worden alleen klanten uit Vlaardingen getoond. De vier-kante 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.

Nadat de klanten uit Vlaardingen getoond zijn, in de macro, wordt een melding op het scherm geplaatst dat het klantenbestand wordt gesloten. Deze actie, Berichtvenster, is eerder toegelicht. De argu-menten zijn achtereenvolgens: We gaan de tabel Klanten afsluiten.,Ja, Informatie en Berichtje.

In de voorlaatste actie brengen we het venster terug in zijn oor-spronkelijke grootte. Een eerdere actie was het venster te maxima-liseren.

Selecteer de actie VorigFormaat, zodat het vorige vensterformaat hersteld wordt. Deze actie heeft geen argument.

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; bijvoor-beeld 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

Page 263: Databaseontwikkeling Access 2003

8 Macro’s 251

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 figuur 8.1 staat deze volledig afgebeeld.

Sla de macro op onder de naam Macro voorbeeld en sluit het ven-ster.

We gaan de macro starten.

Selecteer in het databasevenster het overzicht Macro’s. Selecteer de zojuiste gemaakte macro en klik hierna op de knop Starten. De macro wordt dan uitgevoerd en de acties worden in de opgegeven volgorde doorlopen.

Een bestaande macro kunnen we aanpassen aan nieuwe wensen of verbeteren door in het overzicht Macro’s de te wijzigen macro te selecteren en vervolgens op de knop Ontwerpen te klikken. De macro wordt in het macrovenster getoond. Het macrovenster bevat een macrowerkbalk, waarin we bijvoorbeeld een knop vinden om rijen te verwijderen of toe te voegen.

Figuur 8.1

Page 264: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003252

Testen van een macroAls 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 het overzicht Macro’s en klik op de knop Ontwerpen). Klik in de werkbalk op de knop Macrostap of de opdracht Macrostap in het menu Uitvoeren. Starten we hierna de macro, dan worden de acties één voor één uitgevoerd in een dialoogvenster, zie figuur 8.2.Verlaat het macrovenster en klik in het overzicht Macro’s op de knop Starten. In het dialoogvenster zien we de actie en de argu-menten. 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 macro’s uit-schakelen door in de ontwerpfase opnieuw op de knop Macrostap te klikken.

Figuur 8.2

Page 265: Databaseontwikkeling Access 2003

8 Macro’s 253

Opgave

8.1 Maak een macro die de volgende acties uitvoert:openen van de tabel Klant in gegevensbladweergave en alleen lezen;het venster maximaliseren;het laatste record uit de tabel (actie NaarRecordGaan) selecte-ren;een melding op het scherm plaatsen dat dit het laatste record is;vervolgens het eerste record selecteren;ook dit op het scherm melden;het oorspronkelijke vensterformaat herstellen;de tabel met klantgegevens sluiten.

8.2 Geavanceerde macro’s

In de vorige paragraaf hebben we kennisgemaakt met het begrip macro. Tevens hebben we een eenvoudige macro gemaakt en uitge-voerd. Daarna hebben we de macro stap voor stap laten uitvoeren om eventuele fouten op te sporen. Deze macro werd gestart in het overzicht Macro’s. Een macro kan ook gestart worden door op een opdrachtknop te klikken. 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 macro’s 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 macro’s en niet echt een praktische toepassing. In hoofdstuk 9, Het bouwen van een toepassing, worden macro’s 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 wor-den door ‘wizard’-opdrachtknoppen en macro’s uitgevoerd. Maar voordat we die macro’s kunnen maken, moeten we eerst de moge-lijkheden leren kennen – vandaar dit demonstratievoorbeeld.

Page 266: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003254

We gaan twee formulieren maken, genaamd Groenformulier en Roodformulier. In het groene formulier worden boodschappen af-gedrukt en het rode formulier laat, via opdrachtknoppen, de bood-schap verdwijnen en terugkomen (zie figuur 8.3). We maken eerst de formulieren en vervolgens de macro’s.

Omdat dit een demonstratie van macro’s is, gebruiken we de eer-dergemaakte database Oefening. Als deze database niet meer aan-wezig is, creëer deze dan (uit het menu Bestand, Nieuwe database) of maak gebruik van een andere testdatabase.

Selecteer in het databasevenster het overzicht Formulieren en kies voor de optie Formulier maken in ontwerpweergave.Zorg dat de werkset op het scherm staat (knop Werkset in de werk-balk). Selecteer uit de werkset een Tekstvak en verplaats de muiswijzer naar het formulier. Klik en sleep een tekstvak op het formulier. Zet hierna het eigenschappenvenster op het scherm (knop Eigenschappen uit de werkbalk). Selecteer het tekstvak en klik op de tab Overige. Verander de eigenschap Naam in Boodschap.

Figuur 8.3

Page 267: Databaseontwikkeling Access 2003

8 Macro’s 255

Selecteer het label van het tekstvak en verander de eigenschap Bijschrift in de tab Opmaak in Boodschap.

We gaan een tweede tekstvak maken. In dit tekstvak kun je zien hoe vaak een boodschap is getoond. In het tekstvak Teller gaan we de getallen 1 tot en met 4 plaatsen. Afhankelijk van dat getal wordt een boodschap in het tekstvak Boodschap geplaatst.

Voeg nog een tekstvak toe aan het formulier en maak de afmetin-gen daarvan niet te groot. Verwijder het label van dit tekstvak (selecteren en Delete-toets). Selecteer het nieuwe tekstvak en verander de eigenschap Naam, in het tabblad Overige, in Teller.Selecteer met de muiswijzer het tekstvak Teller. Verander in het eigenschappenvenster – tabblad Opmaak – de eigenschap Notatie in Vast en de eigenschap Aantal decimalen in 0. Hiermee geven we aan dat er gehele getallen in worden opgesla-gen.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 eigen-schap Achtergrondkleur en klik vervolgens op de drie puntjes in deze eigenschap. Er wordt een kleurenpalet getoond. Kies de gif-groene 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 eigenschap-penvenster. Verander de eigenschappen zoals in figuur 8.4 wordt getoond.

Verander eventueel de lay-out van het formulier, zodat het onge-veer de lay-out krijgt van het groene formulier uit figuur 8.3.

Figuur 8.4 Eigenschap Instelling

Schuifbalken Geen

Recordkiezers Nee

Navigatieknoppen Nee

Recordbegrenzingslijnen Nee

Page 268: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003256

Sla vervolgens het formulier op en geef het de naam Groenformulier.

We gaan nu het rode formulier maken.

Klik in het overzicht Formulieren op de optie Formulier maken in ontwerpweergave. Dit formulier krijgt drie opdrachtknoppen. Deze worden echter gemaakt zonder de wizard. Schakel de wizard in de werkset hiervoor uit. Selecteer Opdrachtknop uit de werkset 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, in Kom terug. Het &-teken in het bijschrift maakt dat de opdrachtknop ook met de toetsencombinatie Alt+K te selecteren is.Plaats op dezelfde manier nog twee opdrachtenknoppen in het formulier. Verander de eigenschappen Bijschrift en Naam van de tweede opdrachtknop in respectievelijk &Verdwijn en Verdwijn en voor de derde opdrachtknop in &Einde en Einde.De opdrachtknop Kom terug moet in eerste instantie uitgeschakeldzijn, 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.

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 knal-rode 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 eigenschappenven-ster). Verander de eigenschappen zoals in figuur 8.4 wordt getoond.

Page 269: Databaseontwikkeling Access 2003

8 Macro’s 257

Wijzig nog twee extra eigenschappen: de eigenschap Systeemmenu, in tab Opmaak, in Nee, en de eigenschap Modaal,in tabblad Overige, in Ja. Een modaalvenster is een venster dat we alleen kunnen verlaten door het te sluiten, we kunnen geen ander venster de focus geven. Bekijk het formulier in de formulierweergave. We kunnen op de opdrachtknoppen klikken, er gebeurt niets. De acties die uit-gevoerd moeten worden, de macro’s, moeten immers nog gemaakt worden.Verander eventueel de lay-out van het formulier, zodat het onge-veer de lay-out krijgt van het rode formulier uit figuur 8.3. Sla vervolgens het formulier op en geef het de naam Roodformulier.

De formulieren waarvoor we de macro’s gaan maken zijn klaar, dus we gaan nu beginnen met de macro’s. Er zijn in dit voorbeeld vier macro’s nodig, die we alle vier apart kunnen opslaan. Dat doen we echter niet, we plaatsen deze macro’s in een zogenoemde Macrogroep. In een macrogroep kunnen we meerdere macro’s op een overzichtelijke wijze ordenen. In een toepassing hebben we dan niet tientallen macro’s, maar slechts enkele macrogroepen. Alle macro’s die bij één formulier horen, slaan wij op in één macrogroep. Als we wijzigingen in de macro’s van een formulier willen doorvoeren, weten we precies welke macrogroep we moeten bewerken.

Selecteer in het databasevenster het overzicht Macro’s en klik op de knop Nieuw. Het macrovenster wordt getoond. Aangezien we de macro’s als macrogroep gaan opslaan, moet een extra kolom zichtbaar gemaakt worden in het macrovenster. Klik in de werkbalk op de knop Macronamen. In de kolom Macronaam kunnen we de individuele macro’s in deze groep een naam geven. Als eerste gaan we een macro Initieermaken. Voer in de kolom Macronaam de naam Initieer in, zie figuur 8.5.

Om de acties en hun argumenten te tonen plaatsen we deze in tabelvorm, daarna worden alle acties toegelicht. Argumenten die niet nodig zijn, worden in de tabel niet getoond.

Page 270: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003258

Klik met de muis in de kolom met acties en selecteer de actie For-mulierOpenen.Vul de argumenten in zoals beschreven in figuur 8.6. Via de F6-toets kunnen we snel wisselen tussen acties en argumenten. Deze macro-actie opent het groene formulier in formulierweergave.

De tweede actie is WaardeInstellen, een actie die veelvuldig voorkomt in macro’s. Hiermee kun we aan een eigenschap een waarde toekennen. In de tweede actie krijgt het besturings-element Boodschap, dat zich in het groene formulier bevindt, de waarde “Hallo, hier ben ik voor de eerste keer. Druk op de knop Verdwijn.”. Voordat we uitleggen dat deze instelling op een een-voudige manier is in te voeren, geven we enige regels met betrek-king tot het verwijzen naar formulieren.

Figuur 8.5

Figuur 8.6 Macro Initieer

Actie Argument Instelling

FormulierOpenen Formuliernaam Groenformulier

Beeld Formulier

Venstermodus Standaard

WaardeInstellen Item [Formulieren]![Groenformulier]![Boodschap]

Expressie “Hallo, hier ben ik voor de eerste keer.Druk op de knop Verdwijn.”

WaardeInstellen Item [Formulieren]![Groenformulier]![Teller]

Expressie 1

Page 271: Databaseontwikkeling Access 2003

8 Macro’s 259

Verwijzingen naar formulierenOm te verwijzen naar het formulier Groenformulier moeten we het volgende invoeren: [Formulieren]![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 bestu-ringselement Einde op het rode formulier, dan moeten we invoe-ren: [Formulieren]![Roodformulier]![Einde]. Om het nog erger te maken: stel we willen verwijzen naar de eigenschap Zichtbaar van het besturingselement Teller in het groene formulier. De ver-wijzing hiernaar luidt: [Formulieren]![Groenformulier]![Teller].Zichtbaar. Merk op dat de verwijzing naar een eigenschap niet wordt gescheiden door een uitroepteken, maar door een punt. De eigenschap Zichtbaar mag ook tussen vierkante haken ([]) geplaatst worden.

Opmerkingen met betrekking tot verwijzingenDenk erom dat [Formulieren] getypt wordt en niet [Formulier],dat heeft namelijk een heel andere betekenis voor Access (binnen het bestek van dit boek is dit overigens niet van belang).De eigenschappen worden automatisch omgezet naar het Engels. Wanneer we in het Nederlands een eigenschap invoeren, bij-voorbeeld Zichtbaar, wordt dit door Access automatisch naar het Engels vertaald (Visible). Hiermee heeft men bereikt dat Access onafhankelijk van de gebruikte taalversie werkt. De toepassing werkt ook binnen de Spaanstalige versie van Access met een Engelstalige Windows-versie. Als een formulier de focus heeft, is het niet noodzakelijk om de volledige verwijzing in te voeren. Heeft het groene formulier de focus, dan kunnen we volstaan met de verwijzing: [Teller].Zichtbaar in plaats van [Formulieren]![Groenformulier]![Teller].Zichtbaar.De verwijzingen naar rapporten is hetzelfde; we vervangen alleen de uitdrukking [Formulieren] door [Rapporten].

Zoals eerder opgemerkt heeft Access een voorziening gemaakt om het typen van lange verwijzingen te vereenvoudigen. We kunnen gebruikmaken van het dialoogvenster Opbouwfunctie voor expres-sies.

Page 272: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003260

Selecteer het argument Item van de tweede actie uit de macro Initieer.Klik op de drie puntjes van dit argument, waarna het venster Opbouwfunctie voor expressies actief wordt, zie figuur 8.7.

In de eerste kolom van dit venster kunnen we het object selecteren waarnaar we een verwijzing moeten maken. We kunnen tabellen, query’s, formulieren of rapporten selecteren. Selecteren we in de eerste kolom een formulier (eerst dubbelklikken op Formulieren), dan verschijnen in de middelste kolom alle besturingselementen uit dat formulier. In de middelste kolom kiezen we het gewenste bestu-ringselement. In de derde kolom kunnen we voor de <Waarde>van het besturingselement kiezen of een keuze maken uit de eigen-schappen 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. 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 func-ties van Access. Nadat we de juiste expressie hebben geselecteerd, kunnen we op de knop Plakken klikken. De expressie verschijnt in het bovenste gedeelte van het venster. Als berekeningen of ver-gelijkingen 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.

Figuur 8.7

Page 273: Databaseontwikkeling Access 2003

8 Macro’s 261

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 pagi-nanummer bevat of de huidige datum.

Selecteer in de kolom Formulieren het formulier Groenformulier. Hierbij hebben we de mogelijkheid om alle formulieren te selecte-ren of alleen de geladen formulieren.In de tweede kolom worden alle besturingselementen getoond die op het formulier staan. Selecteer in de tweede kolom het bestu-ringselement Boodschap. In de derde kolom worden alle eigenschappen van dat besturings-element 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 ven-ster 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 besturings-element Boodschap getoond.De derde en laatste actie van de macro Initieer is opnieuw Waarde-Instellen. Start voor het argument Item de Opbouwfunctie voor expressies. Selecteer in de eerste kolom het formulier Groenformulier, ver-volgens in de tweede kolom het besturingselement Teller en in de derde kolom <Waarde>. Plak deze instelling in het bovenste venster van Opbouwfunctie voor expressies en sluit het venster af. In het argument Expressie wordt het getal 1 geplaatst.

Deze actie plaatst in het besturingselement (in de formulierweer-gave) de waarde 1. Via het besturingselement Teller kunnen we ‘onthouden’ hoe vaak de boodschap is getoond. In dit voorbeeld laten we de boodschap verdwijnen en terugkomen. Iedere keer dat het opnieuw getoond wordt, laten we een andere boodschap zien. Wordt de boodschap bijvoorbeeld voor de derde keer getoond – wat

Page 274: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003262

we kunnen achterhalen met behulp van het besturingselement Teller – dan tonen we de derde boodschap. De volgende macro’s zullen dit verduidelijken.

De macro Initieer moet gestart worden door de gebeurtenis ‘ope-nen rode formulier’. Hierdoor wordt na het openen van het rode formulier direct het groene formulier geopend; de boodschap wordt in het besturingselement Boodschap geplaatst en het bestu-ringselement Teller krijgt de waarde 1 toegekend. Hoe we dit kunnen realiseren, wordt na het toelichten van de overige macro’s uitgelegd.

De tweede macro heeft binnen de macrogroep dezelfde naam gekregen als de naam van de opdrachtknop die deze macro gaat starten, namelijk Verdwijn. De volledige macro staat afgebeeld in figuur 8.5.

Tussen de macro Initieer en de macro Verdwijn is in het macro-venster een regel overgeslagen om de macro’s van elkaar te schei-den. Die lege regel is niet noodzakelijk, een macro wordt automa-tisch beëindigd zodra een nieuwe macro begint.

De macro Verdwijn wordt gestart door in het rode formulier op de opdrachtknop Verdwijn te klikken. Hoe we dit kunnen realiseren, wordt na het toelichten van de overige macro’s uitgelegd.

De boodschap in het groene formulier wordt van het scherm verwijderd en tevens worden enkele instellingen veranderd. Zo wordt bijvoorbeeld de opdrachtknop Kom terug ingeschakeld, die

Figuur 8.8 Macro Verdwijn

Actie Argument Instelling

WaardeInstellen Item [Formulieren]![Groenformulier]![Boodschap].[Visible]

Expressie Nee

WaardeInstellen Item [Kom terug].[Enabled]

Expressie Ja

NaarBesturingselementGaan Kom terug

WaardeInstellen Item [Verdwijn].[Enabled]

Expressie Nee

Page 275: Databaseontwikkeling Access 2003

8 Macro’s 263

aanvankelijk niet geselecteerd kon worden. Tijdens het ontwerpen van het rode formulier hebben we de eigenschap Ingeschakeld(Enabled) van de opdrachtknop Kom terug de waarde Nee gege-ven.

De eerste actie wijzigt de eigenschap Zichtbaar (Visible) van het besturingselement Boodschap in de waarde Nee. Hierdoor wordt de boodschap onzichtbaar, hij verdwijnt van het scherm. In het venster Opbouwfunctie voor expressies kiezen we uit de middelste kolom het besturingselement Boodschap 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 equivalen-ten.

De volgende actie, opnieuw WaardeInstellen, wijzigt van de opdrachtknop Kom terug de eigenschap Ingeschakeld (Enabled) in de waarde Ja. In eerste instantie is de opdrachtknop Kom terugniet te selecteren. De boodschap wordt ten slotte getoond, er valt niets terug te keren. Nu de boodschap verdwenen is, kunnen we de opdrachtknop Kom terug inschakelen, zodat deze geselecteerd kan worden. Aangezien het rode formulier de focus heeft, is het toe-gestaan om de formuliernaam weg te laten in de verwijzing naar het besturingselement. Maken we gebruik van de Opbouwfunctievoor expressies, dan verschijnt automatisch de volledige syntaxis.

Vervolgens moet de opdrachtknop Verdwijn worden uitgeschakeld, de boodschap is immers al verdwenen. Dit vindt plaats in de twee laatste acties. De opdrachtknop Verdwijn willen we uitschakelen, echter een besturingselement kan alleen uitgeschakeld (of onzicht-baar) 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.

Page 276: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003264

De boodschap is verdwenen. De opdrachtknop Verdwijn is niet meer te selecteren en de opdrachtknop Kom terug kan nu wel gese-lecteerd worden.

Nu kunnen we de derde macro gaan maken. Deze macro wordt gestart als op de opdrachtknop Kom terug wordt geklikt. De bood-schap wordt opnieuw getoond. Vervolgens plaatsen we de tweede boodschap in het besturingselement Boodschap. Hierna moet het ingeschakeld zijn van de opdrachtknoppen Kom terug en Verdwijnopnieuw stuivertje wisselen. Wanneer echter voor de vierde keer de boodschap is getoond, wordt de macro beëindigd.

De macro heeft binnen de macrogroep dezelfde naam gekregen als de naam van de opdrachtknop die deze macro gaat starten, name-lijk Kom terug. De volledige macro is afgebeeld in figuur 8.9.

In de macro 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 macro’s mogelijk te maken moet een vierde kolom in het macrovenster worden geactiveerd. Selecteer in de werkbalk 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.9

Page 277: Databaseontwikkeling Access 2003

8 Macro’s 265

De meeste macrogroepen bevatten wel een macro waarin een voorwaarde zit. Hierdoor is het handig om de twee extra kolom-men, Macronaam en Voorwaarde, in het macrovenster altijd te openen. Access kan dat automatisch voor ons doen.

Selecteer daartoe in de menubalk Extra, Opties en vervolgens het tabblad Weergave.

Figuur 8.10

Macro Kom terug

Voorwaarde Actie Argument Instelling

WaardeInstellen Item [Formulieren]![Groenformulier]![Teller]

Expressie [Formulieren]![Groenformulier]![Teller] + 1

Waarde instellen Item [Formulieren]![Groenformulier]![Boodschap].[Visible]

Expressie Ja

2=[Formulieren]! WaardeInstellen Item [Formulieren]![Groenformulier]![Groenformulier]. [Boodschap][Teller]

Expressie “Hallo, dit is de tweede keer.”

3=[Formulieren]! WaardeInstellen Item [Formulieren]![Groenformulier]![Groenformulier]. [Boodschap][Teller]

Expressie “Hallo, dit is al de derde keer.”

4=[Formulieren]! WaardeInstellen Item [Formulieren]![Groenformulier]![Groenformulier]. [Boodschap][Teller]

Expressie “Sorry, ik laat me niet meer weg-sturen.”

… NaarBesturings- EindeelementGaan

… WaardeInstellen Item [Kom terug].[Enabled]

Expressie Nee

… MacroStoppen

WaardeInstellen Item [Verdwijn].[Enabled]

Expressie Ja

NaarBesturings- VerdwijnelementGaan

WaardeInstellen Item [Kom terug].[Enabled]

Expressie Nee

Page 278: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003266

Vink hierin de vakjes Kolom met namen en Kolom met voorwaar-den af.

In bijlage B worden enkele andere mogelijkheden van het menu-item Opties toegelicht.

De eerste actie verhoogt de waarde van het besturingselement Teller met 1; de waarde wordt nu 2. De volgende keer dat deze macro wordt gestart, gaat de waarde naar 3, enzovoort.

De tweede actie van de macro Kom terug is het zichtbaar maken van de boodschap. De eigenschap Zichtbaar (Visible) van de bood-schap krijgt de waarde Ja. De boodschap wordt weer getoond.

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 het besturingselement Teller de waarde 2 heeft, wordt de derde actie uitgevoerd. Als de waarde van het besturingselement Teller de waarde 3 of 4 heeft, wordt respectievelijk de vierde of vijfde 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 besturings-element 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 het besturingselement Teller de waarde 4 heeft, worden ver-schillende acties uitgevoerd. We moeten voor iedere actie aan-geven dat die alleen uitgevoerd mag worden als het besturings-element 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 vijfde tot en met de achtste actie alleen uitgevoerd als het besturingselement Tellerde waarde 4 heeft.

Page 279: Databaseontwikkeling Access 2003

8 Macro’s 267

De focus wordt verplaatst naar de opdrachtknop Einde. De eigen-schap Ingeschakeld van de opdrachtknop wordt op Nee gezet. Hiermee is die opdrachtknop niet meer te selecteren. Als laatste wordt de macro beëindigd 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 negen tot en met elf uitgevoerd. De opdrachtknop Verdwijn wordt inge-schakeld. Deze krijgt vervolgens de focus. Als laatste actie wordt de opdrachtknop Kom terug uitgeschakeld.

TerzijdeOpmerkingen 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 toetsen-combinatie Shift+F2 te drukken (zoomen).Het is efficiënter 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 geëvalueerd.

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. De macro heeft binnen de macro-groep dezelfde naam gekregen als de naam van de opdrachtknop die deze macro gaat starten, namelijk Einde. De volledige macro is afgebeeld in figuur 8.9.

Actie Argument Instelling

Sluiten Objecttype Formulier

Objectnaam Groenformulier

Opslaan n.v.t

Sluiten Objecttype Formulier

Objectnaam Roodformulier

Opslaan n.v.t

Figuur 8.11

Page 280: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003268

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 macro’s gemaakt. Sla de macrogroep op onder de naam frmRoodformulier. Hiermee geven we aan dat deze groep alle macro’s van het rode formulier bevat. De volledige naam van een macro binnen een macrogroep wordt overigens voorafgegaan door de naam van de macro-groep. De naam van de macrogroep en de macro’s in de groep worden gescheiden door een punt. Zo luidt de volledige macronaam van de macro Initieer bijvoorbeeld: frmRoodformulier.Initieer.

Macro’s koppelen aan gebeurtenissenDe macro’s zijn klaar, nu gaan we ze koppelen aan de opdracht-knoppen en de gebeurtenis ‘openen van het rode formulier’. Als eerste gaan we de macro’s van de opdrachtknoppen koppelen.

Selecteer in het databasevenster het overzicht Formulieren. Kies het formulier Roodformulier en klik op de knop Ontwerpen. Het rode formulier wordt in ontwerpweergave getoond. Selecteer de opdrachtknop Kom terug en plaats vervolgens het eigenschappenvenster op het scherm (via de knop Eigenschappen in de werkbalk). Selecteer in het tabblad Gebeurtenis, uit het eigenschappenvenster, de gebeurtenis Bij klikken, zie figuur 8.12.

Selecteer in de keuzelijst frmRoodformulier.Kom terug. De macro wordt nu gestart als op de opdrachtknop wordt geklikt.

Figuur 8.12

Page 281: Databaseontwikkeling Access 2003

8 Macro’s 269

Selecteer vervolgens de opdrachtknop Verdwijn en selecteer op identieke wijze in het tabblad Gebeurtenis de gebeurtenis Bij klik-ken.Kies de macro frmRoodformulier.Verdwijn.Koppel op dezelfde wijze de macro frmRoodformulier.Einde aan de opdrachtknop Einde.Er moet nog een macro gekoppeld worden aan de gebeurtenis ‘ope-nen van het rode formulier’. Selecteer de eigenschappen van het rode formulier (via de Formulierkiezer, links van de liniaal of uit de keuzelijst van het eigenschappenvenster). Kies in het tabblad Gebeurtenis de gebeurtenis Bij openen en kies in de keuzelijst de macro frmRoodformulier.Initieer.

Als het rode formulier wordt geopend, wordt de macro frmRood-formulier .Initieer gestart. Deze opent onder andere het groene formulier, zodat beide formulieren op het scherm worden getoond.

OpmerkingenIn paragraaf 6.6 hebben we opdrachtknoppen met de Wizard gemaakt. Deze voeren één actie uit, bijvoorbeeld het afdrukken van een rapport of het openen van een formulier. Die actie wordt niet uitgevoerd door een macro, maar door een zogeheten gebeur-tenisprocedure: een programma in VBA-code (Visual Basic for Applications). Door het klikken op een opdrachtknop die door de wizard is gemaakt, wordt een stukje VBA-code uitgevoerd. Als meerdere acties noodzakelijk zijn, en meestal is dat zo, moeten we van macro’s gebruikmaken. Die voeren dan de acties voor ons uit.Het beveiligingsniveau in Access 2003 is aanzienlijk aangescherpt. Een groot aantal macroacties mag niet meer uitgevoerd worden. Bijvoorbeeld het onzichtbaar maken van een formulier of acties die bestanden kunnen verwijderen. U kunt die opdrachten wel uit laten voeren op een lager beveiligingsniveau. Het beveiligings-niveau kunt u wijzigen via de menubalk Extra, Macro, Beveiliging.

Alle macro’s zijn gekoppeld; nu kunnen we ze testen.

Open het rode formulier. Het groene formulier wordt tevens ‘auto-matisch’ geopend. Controleer de werking van de opdrachtknoppen.Als een macro niet naar wens functioneert, controleer dan de macro die niet goed werkt.

Page 282: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003270

Eventueel kunnen we de stap-functie van de macro’s inschakelen. Hiermee worden de acties stap voor stap doorlopen. Deze functie is in paragraaf 8.1 toegelicht. Ook als de macro wel goed functio-neert, kunnen we deze mogelijkheid benutten, want hiermee kunnen we goed waarnemen wat het effect is van iedere actie.

In het volgende hoofdstuk gaan we een toepassingsprogramma maken dat volledig door macro’s wordt gestuurd. Hiermee kunnen we professioneel ogende applicaties maken.

Opgave

8.2 a. Maak de formulieren en macro’s zoals beschreven in deze para-graaf.

b. Wijzig de macro zo dat er nog twee extra meldingen worden getoond, voordat de boodschap niet meer te verwijderen is.

Page 283: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing

In de vorige hoofdstukken hebben we geleerd hoe we tabellen ont-werpen en bouwen, hoe we query’s, formulieren en rapporten ont-wikkelen en hoe we macro’s maken. In dit hoofdstuk zullen we een toepassing (programma/applicatie) maken die gebruikmaakt van alle opgedane kennis. We maken een professionele lay-out en laten alle ingewikkelde gebeurtenissen door opdrachtknoppen en macro’s uitvoeren. Hierdoor ontstaat een toepassing die zonder kennis van Access gebruikt kan worden.

De toepassing die we gaan toelichten, heeft betrekking op onze database Reisbureau. We gaan voor het reisbureau ’t Zonnetje een toepassing ontwikkelen, die in stappen zal worden uitgelegd. De database ’t Zonnetje staat op de cd-rom. Hiermee kunnen we theorie en toepassing direct controleren. Naast database ‘t Zonnetjestaat op de cd-rom de database Basis zonnetje, waarin alleen de gebruikte tabellen uit database ’t Zonnetje zijn opgenomen. In die database kunnen we tijdens het lezen de instructies uitvoeren die tot database ’t Zonnetje hebben geleid.

Voor het ontwikkelen van een toepassing moeten we altijd een aantal stappen doorlopen.

1. De informatiebehoefte moet volledig bekend zijn. We moeten pre-cies weten wat de toepassing moet gaan doen; dit uiteraard in goed overleg met de opdrachtgever.

2. De overzichten, rapporten en formulieren die gewenst zijn, moeten genormaliseerd worden. Hierdoor ontstaat een logisch datamodel.

3. Aan de hand van het logische datamodel worden de tabellen en relaties gedefinieerd.

Page 284: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003272

4. De menustructuur moet ontworpen worden. Hiermee bedoelen we: hoe ziet het openingsscherm eruit (hoofdmenu) en de vervolg-schermen (submenu’s). Deze kunnen we in Access maken met schakelborden. Deze worden in paragraaf 9.5 toegelicht.

5. Vervolgens moeten de benodigde query’s, formulieren, rapporten en macro’s ontworpen worden. Doe dit per formulier of rapport; als een versie naar behoren werkt, kan aan het volgende formulier of rapport begonnen worden.

6. Maak de ontworpen menustructuur uit de vierde stap met behulp van schakelborden.

Deze stappen worden in de volgende paragrafen besproken, waar-bij de eerste twee punten in ons voorbeeld als bekend worden ver-ondersteld. We gaan van ons bestaande datamodel uit.

9.1 Tabellen en relaties

We maken gebruik van de tabellen die in de vorige hoofdstukken zijn gebruikt:

Tabel Klant: hierin liggen de klantgegevens opgeslagen. Klantnummer is de sleutel. Als een nieuwe klant wordt toegevoegd, krijgt die het klantnummer dat één hoger is dan het laatste klant-nummer dat is toegevoegd. De klanten zijn zo doorlopend genummerd met behulp van het gegevenstype Autonummering. Standaard begint het type Autonummering bij de waarde 1 en wordt bij ieder volgend record opgehoogd. Het is mogelijk om de eerstvolgende waarde te veranderen. Dit staat beschreven in bijlage A, onder Veldlengte.

Tabel Boeking: hierin worden de boekingen van reizen opgeslagen, zie figuur 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 figuur 9.1 de eigenschap Rijbron van het veld Klantnummer. In paragraaf

Page 285: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 273

6.3 is uitgelegd hoe dat in zijn werk gaat. Hetzelfde geldt voor het veld Rfeisnummer, dit is ook een vreemde sleutel. Hierop is even-eens een keuzelijst met invoervak gemaakt.

Verder zijn in paragraaf 6.1 de velden Annuleringsverzekering en Betaalwijze toegevoegd. Ten slotte zijn op de vreemde sleutels, dus Klantnummer en Reisnummer, indexen (met duplicaten!) geplaatst. Het zoekproces wordt hierdoor aanzienlijk versneld. In het alge-meen geldt: zet indexen op sleutelvelden (automatisch in Access) en vreemde-sleutelvelden.

Tabel Reis: alle mogelijke reizen worden hierin opgeslagen. Het veld Reisnummer is de sleutel. Op het veld Bestemmingcode,vreemde sleutel, is een index geplaatst (duplicaten toegestaan!) en een keuzelijst met invoervak.

Tabel Bestemming: alle mogelijke bestemmingen worden in deze tabel opgeslagen. Het veld Bestemmingcode is de sleutel. De sleutel is van het type tekst en kan daardoor niet doorgenummerd worden. Immers, bestemmingcodes zijn willekeurig.

Tabel Constant: deze tabel wordt hier voor het eerst geïntrodu-ceerd; in voorgaande hoofdstukken is die tabel niet eerder gebruikt. Waar komt die vandaan? Een constantentabel is bij de

Figuur 9.1

Page 286: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003274

meeste databases aanwezig. Hierin worden namelijk de constanten opgeslagen. Bij het normaliseren worden de constanten verwijderd, zoals de bedrijfsgegevens op een overzicht, de omrekeningsfactor van de euro naar de dollar, het BTW-percentage laag, het BTW-percentage hoog en het percentage van de annuleringsverzekering. We houden dan de tabellen over die onderling gerelateerd zijn. Die constanten moeten echter wel ergens opgeslagen liggen, we hebben ze immers nodig. We hebben bijvoorbeeld het BTW-percentage verwijderd tijdens het normaliseren. Maar tijdens het afdrukken van de facturen moet wel het BTW-percentage gebruikt worden om het BTW-bedrag uit te rekenen. Het is natuurlijk niet handig om dat percentage in een rekenveld van een formulier- of rapport-ontwerp op te nemen. Verandert het BTW-percentage, dan zullen we alle formulieren en rapporten moeten nalopen om te contro-leren of die het BTW-percentage bevatten. Vervolgens moet het gewijzigd worden.

We noemen het in de informatiekunde wel constanten, maar het zijn geen wiskundige constanten. Ze zijn dus alleen maar gedu-rende een beperkte periode constant. Na een bepaalde periode moeten ze makkelijk aan te passen zijn. Die constanten gaan we opslaan in de tabel Constant. Die tabel heeft maar één record en is aan geen enkele andere tabel gerelateerd! In dit ene record staan de gegevens van de constanten, bijvoorbeeld 19% voor het BTW-per-centage. Aangezien de tabel Constant maar één record heeft, is het niet noodzakelijk om een sleutelveld te definiëren. We kunnen nu de waarden eenvoudig aanpassen. We hoeven dan immers alleen maar het betreffende record op het scherm te plaatsen en de nieuwe waarden in te toetsen.

Welke velden hebben we opgeslagen in de tabel Constant? Het veld AnnuleerPerc, hierin staat het percentage waarmee gerekend wordt als we een annuleringsverzekering hebben afgesloten. Verder het veld KinderKortingPerc, hierin staat het kortingspercentage dat aan kinderen wordt gegeven. Voor alle reizen geldt dit tarief. In hoofdstuk 7 hebben we in opdracht 7.3 een omzetlijst gemaakt waarin gerekend werd met een kortingspercentage van 20% voor de kinderen. Als dit percentage wijzigt, moet de bijbehorende query aangepast worden. Voor een gebruiker van de applicatie, die geen kennis heeft van Access, is dat lastig. Door het gebruik van de tabel Constant is geen kennis van Access meer nodig. De

Page 287: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 275

gebruiker van de toepassing kan dan zelf eenvoudig het percentage veranderen. In alle berekeningen wordt vanaf dat moment met dit gewijzigde percentage gerekend. Voor het wijzigen van de constan-ten wordt een formulier ontworpen.

Aangezien we de tabel Constant nog niet eerder hebben gebruikt, tonen we de structuur. Merk op dat in de tabel geen sleutelveld is gedefinieerd.

De percentages moeten als fractie ingevoerd worden. Kies voor het annuleringspercentage de waarde 0,04 en voor het percentage van de kinderkorting de waarde 0,20. Door bij de notatie op te geven dat het percentages zijn, zorgen we ervoor dat de getallen als per-centages worden getoond. In onze berekeningen met de percenta-ges is het dan niet noodzakelijk steeds door 100 te delen. De veld-lengte is Enkele precisie. Met dat type kunnen decimale getallen ingevoerd worden, zie eventueel de extra informatie in bijlage A.

TerzijdeTabel Switchboard Items: deze tabel wordt automatisch aan-gemaakt nadat we de schakelborden hebben gemaakt. Access houdt hierin bij welke schakelborden bij deze toepassing in gebruik zijn. Deze tabel wordt door Access gebruikt en is voor ons niet van belang.

9.2 Menustructuur

Zodra we de database ’t Zonnetje starten, wordt direct een hoofd-menu getoond, waaruit we een keuze kunnen maken. Na het kiezen van sommige opties krijgen we vervolgens een submenu. Voordat we de toepassing gaan maken, moeten we die gewenste menustructuren gaan ontwerpen. Hoe moeten het hoofdmenu en de submenu’s eruit zien? Technisch worden die menu’s in Access

Veldnaam Gegevenstype Veldlengte Notatie Vereist

AnnuleerPerc Numeriek Enkele precisie Percentage Ja

KinderKortingPerc Numeriek Enkele precisie Percentage Ja

Page 288: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003276

gemaakt met schakelborden; dit wordt in paragraaf 9.5 toegelicht. Die schakelborden (menu’s) maken we dus als laatste, wanneer alle formulieren en rapporten af zijn. Verwar deze menu’s niet met de menubalk van Access. Deze menu’s zijn aparte formulieren die we door de toepassing navigeren. Om verwarring over de naamgeving te voorkomen worden ze binnen Access schakelborden genoemd.

HoofdmenuBoekingenOverzichtenOnderhoud

Het hoofdmenu is zeer kort: het bevat drie items. Na de keuze Boekingen kunnen reizen worden geboekt en gemuteerd. Na de keuze Overzichten krijgen we, via een submenu, de keuze uit ver-schillende overzichten. En na de keuze Onderhoud komen we in een submenu waarin de basisgegevens gemuteerd kunnen worden.

Voor twee keuzemogelijkheden, Overzichten en Onderhoud heb-ben we submenu’s gemaakt.

Submenu OverzichtenKlantenlijst VertreklijstOmzetlijst

Dit submenu is gemaakt met een schakelbord. De Klantenlijstdrukt een alfabetisch klantenoverzicht af op de printer. Op de Vertreklijst komen de gegevens te staan van klanten die op reis gaan. De gebruiker kan een datumbereik opgeven. Vervolgens worden van alle klanten die binnen dat datumbereik op reis gaan de relevante gegevens naar de printer gestuurd.De Omzetlijst toont per te boeken reis de omzet, alsmede de bij-drage, als percentage, van die reis aan de totale omzet.

Submenu OnderhoudKlantenReizenBestemmingenConstant

Ook dit submenu is gemaakt met een schakelbord. Na het klikken op een van de items wordt een formulier zichtbaar waarop we

Page 289: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 277

mutaties in de basisgegevens kunnen doorvoeren. Het is niet nood-zakelijk de formulieren en rapporten in de volgorde van de menu’s te maken. Ieder formulier of rapport kan onafhankelijk van de andere gemaakt worden – vooropgesteld dat als twee of meer for-mulieren met elkaar samenwerken, deze ook gelijktijdig gemaakt worden. Als laatste kunnen we dan de gemaakte formulieren en rapporten aan de menu’s toekennen.

Alvorens verder te lezen is het aan te raden om de bijbehorende database ’t Zonnetje te verkennen om een indruk van de toepassing te krijgen. Tijdens de uitleg zal worden gevraagd om het een en ander uit te proberen en te wijzigen.

Let op!Als we de database ’t Zonnetje starten, verschijnt niet het data-basevenster. Er wordt direct een menu getoond waaruit een keuze gemaakt kan worden. Als we de formulieren, rapporten of macro’s willen bestuderen (of kopiëren), moeten we de toepassing starten met de Shift-toets ingedrukt!

Om dit hoofdstuk te volgen moeten we de formulieren, rapporten, enzovoort kunnen bestuderen, dus moeten we met de Shift-toets ingedrukt starten.

9.3 De formulieren

Zorg bij het ontwerpen van de formulieren voor een toepassing voor een consequente lay-out, zodat op ieder formulier dezelfde knoppen voorkomen (indien nodig), in dezelfde volgorde, op dezelfde plaats. Hierdoor kunnen de gebruikers van de toepassing de opdrachtknoppen en overige besturingselementen in de ver-schillende formulieren ‘blindelings’ vinden.

We gaan eerst het formulier maken waarmee klantgegevens gemuteerd kunnen worden. Dit formulier zal gekoppeld worden aan het submenu Onderhoud bij het item Klanten. Het venster Klant mutaties, figuur 9.2, wordt na de keuze getoond. We hebben als eerste voor dit formulier gekozen omdat het duidelijk is en veel verwantschap vertoont met de overige formulieren uit het menu-item Onderhoud. Immers, wat is technisch het verschil tussen een reis muteren of een klant muteren?

Page 290: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003278

Open het formulier Klant en onderzoek de functionaliteit. Hoe is zo’n 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 definitieve ontwerp hebben geleid. Probeer zelf alles uit.

9.3.1 Formulier Klant

Selecteer in het databasevenster het overzicht Formulieren en klik op de knop Nieuw. Kies voor AutoFormulier: in kolomvorm en plaats in de keuzelijst de tabel Klant. Hierna wordt in formulieropmaak de eerste klant getoond. Dit is ons uitgangspunt om het formulier handmatig aan te passen aan onze wensen. Sla dit formulier op onder de naam Klant.

Als eerste gaan we een aantal eigenschappen van het formulier aanpassen.

Toon daartoe het formulier in de ontwerpweergave. Zet vervolgens het eigenschappenvenster van het formulier op het scherm, zie figuur 9.3.

Figuur 9.2

Page 291: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 279

Wijzig hierin de eigenschappen zoals in figuur 9.4 wordt getoond.

Toelichting eigenschappenBijschrift: dit wordt weergegeven in de bovenste regel van het for-muliervenster.Schuifbalken: in ons formulier hebben we geen schuifbalken nodig.Recordkiezers: een recordkiezer is het pijltje dat aan de linkerkant van het record getoond wordt. Handig indien rijen worden weer-gegeven, maar bij een enkelvoudig formulier overbodig.Navigatieknoppen: de standaard navigatieknoppen verwijderen we uit ons formulier. We zetten zelf nieuwe grote navigatieknoppen op ons formulier. Die zien er professioneler uit dan die kleine stan-daardknopjes.

Figuur 9.3

Eigenschap Instelling

Bijschrift Klant mutaties

Schuifbalken Geen

Recordkiezers Nee

Navigatieknoppen Nee

Recordbegrenzingslijnen Nee

Min.- en max.-knop Geen

Figuur 9.4

Page 292: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003280

Recordbegrenzingslijnen: dit zijn de lijnen die bij een doorlopend formulier tussen de verschillende records scheidingslijnen trekken. Er wordt in ons formulier maar één klant (record) tegelijk getoond, dus zijn deze lijnen overbodig.Min.- en max.-knop: hiermee geven we aan of de knoppen Minimaliseren en Maximaliseren in de bovenste regel van het for-mulier worden getoond. Aangezien we niet willen dat het formulier verkleind of vergroot wordt, hebben we deze knoppen uitgescha-keld.

Tip: klik om meer over de eigenschappen te weten te komen met de muis in een eigenschap en druk op functietoets F1. Er verschijnt een scherm met informatie over die eigenschap.

We gaan een vrolijk kleurtje aan ons formulier geven, in plaats van dat saaie grijs.

Klik met de muis op de balk Detail in de ontwerpweergave. Maak het eigenschappenvenster actief, de eigenschappen van de detail-sectie worden getoond. Eventueel kun je de sectie Details uit de getoonde keuzelijst – in het eigenschappenvenster – selecteren. Hierin staan alle objecten uit het formulier.Selecteer vervolgens in het tabblad Opmaak de eigenschap Achter-grondkleur. We hoeven ons geen zorgen te maken over het num-mer dat daar staat, het zou erg lastig zijn als we al die nummers uit ons hoofd moeten leren om een leuk kleurtje te selecteren. Klik op de drie puntjes achter de eigenschap Achtergrondkleur. Er ver-schijnt een venster waaruit we een kleur kunnen kiezen, zie figuur 9.5.Kies hierin de lichtgele kleur en klik op de knop OK. Bekijk het voorlopige resultaat in de formulierweergave.

Vervolgens gaan we enige cosmetische wijzigen aanbrengen om de lay-out te verfraaien. Via de Werkset gaan we lijnen trekken en een label (tekst) boven het formulier plaatsen.

Plaats het formulier weer in de ontwerpweergave. Sleep de balk Detail ongeveer anderhalve centimeter naar beneden, zodat er in de Formulierkoptekst ruimte onstaat. Selecteer in de Werkset het Label, plaats deze met behulp van klik-en-sleep in de Formulierkoptekst.

Page 293: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 281

Druk op de Enter-toets, zodat het label wordt geselecteerd. Plaats het eigenschappenvenster op het scherm en verander in de tab Opmaak de eigenschap Bijschrift in Klant gegevens.Verander tevens in hetzelfde tabblad de eigenschap Tekengroottein 24. Hierdoor wordt de tekst in puntgrootte 24 (groot) weer-gegeven, zie figuur 9.6.

Trek een lijn, via de knop Lijn uit de Werkset, onder het label Klantgegevens in de Formulierkoptekst. De dikte van de lijn kun-nen we veranderen door de eigenschap Randbreedte, in het tabblad Opmaak, te wijzigen in 2 pt.

Figuur 9.5

Figuur 9.6

Page 294: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003282

De achtergrondkleur van de koptekst is nog grijs, deze moet dezelfde kleur krijgen als de detailsectie. Dubbelklik daartoe op de balk Formulierkoptekst of selecteer deze uit de keuzelijst van het eigenschappenvenster en verander in het eigenschappenvenster de eigenschap Achtergrondkleur in lichtgeel.Het telefoonnummer en de postcode zijn niet bij alle klanten vol-ledig zichtbaar, vergroot daarom die tekstvakken een paar milli-meter. Het klantnummer wordt in een te groot tekstvak weer-gegeven, verklein daarom dit tekstvak. Gebruik ook de Formuliervoettekst om daarin de gewenste naviga-tieknoppen te plaatsen en een lijn te tonen. Sleep de onderste rand van de balk Formuliervoettekst ongeveer anderhalve centimeter naar beneden. Hierdoor worden de grijze rasterlijnen van de voet-tekst zichtbaar. Trek ook in de voettekst een lijn, via de knop Lijn uit de Werkset. Plaats deze boven in de Formuliervoettekst. Verander de kleur van de voettekst in lichtgeel door op de balk Formuliervoettekst te klikken en vervolgens de eigenschap Achtergrondkleur te verande-ren.Sleep vervolgens de rechterkant van het formulier een aantal centi-meters naar rechts om ruimte te maken voor de opdrachtknoppen, zie het voorlopige resultaat in figuur 9.6.

We gaan het formulier compleet maken door de gewenste opdracht-knoppen toe te voegen. Het toevoegen van opdrachtknoppen is in paragraaf 6.6 toegelicht. In totaal zijn er acht opdrachtknoppen nodig, zie figuur 9.2. Vijf opdrachtknoppen voor de recordnaviga-tie (eerste record, vorige record, volgende record, laatste record en het zoeken naar een record) en drie opdrachtknoppen voor de recordbewerkingen (nieuw record creëren, record verwijderen en het herstellen van een bewerking). We gaan de eerste opdrachtknop, eerste record selecteren, op het formulier plaatsen.

Selecteer in de Werkset de Opdrachtknop en plaats deze links onder de lijn in de Formuliervoettekst van het formulier. We hoeven nog geen rekening te houden met de afmetingen en de exacte plaats op het formulier, dat corrigeren we later. Er wordt vervolgens een wizard gestart die ons vraagt wat er moet gebeu-ren als op die knop wordt geklikt, zie figuur 9.7. Als de Wizard niet wordt gestart, klik dan op de knop Wizards voor besturings-

Page 295: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 283

elementen in de Werkset en plaats opnieuw een opdrachtknop in het formulier.

Kies uit de Categorieën voor Recordnavigatie en hierin de actie Naar eerste record gaan. Selecteer in het volgende venster Afbeelding en Naar eerste 2. Geef in het volgende scherm de opdrachtknop de naam Eerste en voltooi de wizard. Zet op dezelfde manier de overige zeven opdrachtknoppen, nog drie in de Formuliervoettekst en vier in de sectie Detail, op het scherm, zie figuur 9.8. Zet ze ongeveer op de gewenste plaats, zie figuur 9.2.

Geef als laatste de opdrachtenknoppen de juiste afmetingen en sleep ze naar de gewenste plaatsen.Selecteer om alle opdrachtknoppen dezelfde afmetingen te geven de opdrachtknoppen met behulp van Shift+muisklik; hierdoor kunnen we meerdere elementen tegelijkertijd selecteren.

Figuur 9.7

Categorie Actie Type (Figuur/Picture) Naam

Recordnavigatie Naar vorige record gaan Naar vorige 2 Vorige

Recordnavigatie Naar volgende record gaan Naar volgende 2 Volgende

Recordnavigatie Naar laatste record gaan Naar laatste 2 Laatste

Recordbewerkingen Nieuw record toevoegen Ga naar nieuwe 2 Nieuw

Recordnavigatie Record zoeken Verrekijker 2 Zoek

Recordbewerkingen Record ongedaan maken Ongedaan maken Herstel

Recordbewerkingen Record verwijderen Prullenbak 2 Verwijder

Figuur 9.8

Page 296: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003284

Activeer het eigenschappenvenster en wijzig de eigenschappen Breedte en Hoogte in respectievelijk 1,5 cm en 0,6 cm, zie figuur 9.9. Access kan de afmetingen automatisch wijzigen in een iets afwijkend formaat, zie de waarde 1,501 in figuur 9.9.

De opdrachtknoppen hebben standaard een Tabstop. Dat wil zeg-gen: als we met de Tab-toets door de velden van het formulier ‘stappen’, wordt ook gestopt op de opdrachtknoppen. Dat kunnen we voorkomen door aan te geven dat de opdrachtknoppen geen Tabstop moeten bezitten.

Selecteer alle opdrachtknoppen met behulp van Shift+muisklik. Maak vervolgens het eigenschappenvenster actief en zet de eigen-schap Tabstop, in het tabblad Overige, op Nee.Sleep de opdrachtknoppen naar hun gewenste plek en onderzoek het eindresultaat in de formulierweergave. Controleer de werking van de opdrachtknoppen.

De Zoekknop toont een venster waarin we kunnen opgeven wat we willen zoeken. Er wordt gezocht in het tekstvak dat actief is, voordat geklikt wordt op de Zoekknop. Een volledige beschrijving van dit venster is in paragraaf 5.5.6 toegelicht. Met de herstelknopkunnen we typefouten herstellen. Stel we wissen per ongeluk de

Figuur 9.9

Page 297: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 285

postcode van een klant. Door op de herstelknop te klikken komt de oorspronkelijke postcode weer tevoorschijn.

9.3.2 Formulier Bestemming

Het formulier Bestemming is op precies dezelfde manier gemaakt als het formulier Klant, zie figuur 9.10.

Het enige verschil is dat het Bijschrift Bestemming mutatiesis geworden en dat het formulier is opgeslagen onder de naam Bestemming.

9.3.3 Formulier Reis

Het formulier Reis is op precies dezelfde manier gemaakt als het formulier Klant, zie figuur 9.11.

Het enige verschil is dat het Bijschrift Reis mutaties is geworden en dat het formulier is opgeslagen onder de naam Reis.

Figuur 9.10

Figuur 9.11

Page 298: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003286

9.3.4 Formulier ConstantHet formulier Constant is het eenvoudigste formulier, zie figuur 9.12.

In dit formulier kunnen we onze constante gegevens muteren. Aan-gezien er maar één record in dit formulier zit met de waarden van onze constanten, zijn alle opdrachtknoppen niet nodig. Navigeren door de records is niet nodig. Nieuwe records toevoegen of verwij-deren is niet toegestaan. Het formulier is op dezelfde wijze gemaakt als het formulier Klant, maar dan zonder de opdracht-knoppen. Hierbij zijn de labels langer gemaakt en is de naam voluit geschreven. De tekstvakken moeten hierdoor ook verplaatst wor-den.

Het Bijschrift is Constant mutaties geworden en is opgeslagen onder de naam Constant. Als we met de Tab-toets door de velden van een formulier stappen, wordt automatisch na het laatste veld het volgende record voorgezet. Dat mag in dit formulier niet ge-beuren, aangezien er maar één record is. Een nieuw record zou dan getoond worden. We kunnen voorkomen dat na het laatste veld, via de Tab-toets, een nieuw record wordt geselecteerd.

Plaats het eigenschappenvenster van het formulier op het scherm. Selecteer hierin het tabblad Overige en verander de eigenschap Werking tabtoets in Huidige record.

Tip: Tijdens het werken met een database zul je merken dat de data-base erg groot kan worden. Access slaat namelijk achter de scher-men alles op. Ook als je bijvoorbeeld een record, formulier of rap-port verwijdert, blijft dit in de database – onzichtbaar – aanwezig. Om dit fysiek te verwijderen moet je de database comprimeren: Extra, Database hulpprogramma’s, Database comprimeren en her-

Figuur 9.12

Page 299: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 287

stellen. Soms heeft dit een verbazingwekkende vermindering van wel 90% tot gevolg. Daarnaast kun je deze optie toepassen als er een beschadiging aan de gegevens in de database is opgetreden.

9.3.5 Formulier Boeking

De belangrijkste activiteit van het reisbureau, het boeken van rei-zen, vindt plaats in het formulier Boeking (zie figuur 9.13).

Dit formulier wijkt iets af van de vier voorgaande formulieren. Er is onder andere een extra opdrachtknop in het formulier geplaatst, waarmee een rapport kan worden afgedrukt. Het rapport is de getoonde boeking in factuurvorm. Verder zijn er drie rekenvelden gemaakt. Die rekenvelden maken gebruik van constanten, name-lijk het percentage korting dat aan kinderen wordt gegeven en het percentage van de annuleringsverzekering. Hierdoor dienen ook de gegevens uit de tabel Constant gebruikt te worden. Tevens zijn er enige macro’s gemaakt om de juiste werking van dit formulier mogelijk te maken.

Het ontwerp van het boekingformulier is in overleg met reisbureau ’t Zonnetje totstandgekomen. We moeten dus eerst bepalen wat

Figuur 9.13

Page 300: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003288

op het scherm getoond moet worden. Nadat is vastgelegd wat de gewenste gegevens zijn, kan het formulier ontworpen worden. We kunnen de Wizard Formulier gebruiken om alle gegevens op het scherm te krijgen, door de afzonderlijke tabellen te selecteren en hieruit de gewenste velden. Bij formulieren waarin één tabel gebruikt wordt, is dat een handige methode. Gebruiken we meer tabellen op één formulier, dan is het verstandiger om eerst een query te maken die alle velden bevat die op het formulier moeten komen. We kunnen dan tevens een sorteervolgorde aangeven of gegevens groeperen. In dit voorbeeld hebben we voorafgaand aan het formulierontwerp een query gemaakt. Die is opgeslagen onder de naam frmBoeking in het overzicht Query’s van het databaseven-ster. Aan de naam van de query kunnen we zien bij welk formulier deze gebruikt wordt. De stappen om het formulier te maken wor-den nu toegelicht. Gebruik de database Basis Zonnetje om de han-delingen ‘na te spelen’.

Selecteer in het overzicht Query’s in het databasevenster de optie Query maken in ontwerpweergave.Voor de query hebben we vier databasetabellen nodig, namelijk Boeking, Klant, Reis en Bestemming.Klik op alle velden die we nodig hebben. Van de tabel Boekinghebben we alle velden nodig, selecteer daartoe eenvoudig de * in de tabel Boeking. Er wordt getoond Boeking.*. Selecteer uit de tabel Klant de velden Naam, Adres, Woonplaats en Telefoonnummer; uit de tabel Reis de velden Vertrekdatum, Aantaldagen en Prijs per persoon, en ten slotte uit de tabel Bestemmingde velden Plaats en Land.Sla vervolgens de query op onder de naam frmBoeking. Hierdoor kunnen we later in dit overzicht eenvoudig terugzoeken bij welk formulier ( frm) deze query hoort. Het is verstandig om de query te controleren in de gegevensbladweergave.

De query is gemaakt, nu gaan we het formulier ontwikkelen.

Selecteer in het databasevenster het overzicht Formulieren en klik op de knop Nieuw. Kies Autoformulier: in kolomvorm, selecteer in de keuzelijst de zojuist gemaakte query frmBoeking en klik op de knop OK. Sla dit basisontwerp op onder de naam Boeking.

Page 301: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 289

De lay-out moet aangepast worden aan de wensen van het reis-bureau. Op dezelfde manier als in het formulier Klant zijn een aantal wijzigingen aangebracht. Als eerste zijn de eigenschappen van het formulier gewijzigd, zie figuur 9.4. Alleen de eigenschap Bijschrift is veranderd in Boeking mutaties.In de Formulierkoptekst is een label en een lijn getrokken. Tevens is de achtergrondkleur van die sectie veranderd in lichtgeel.

Sleep de onderste rand van de balk Formuliervoettekst anderhalve centimeter naar beneden en plaats in die sectie bovenin een lijn. Verander ook in de sectie Formuliervoettekst de achtergrondkleur in lichtgeel.Klik hierna op de balk Detail en verander de achtergrondkleur in lichtgeel. Verplaats vervolgens alle velden zodanig dat dezelfde lay-out ont-staat als in figuur 9.13. Vervolgens zijn de tekstvakken waarin geldbedragen worden getoond verkleind. Enkele andere tekstvakken zijn juist vergroot aangezien niet alle gegevens volledig werden weergegeven.

De volgende stap is het plaatsen van de opdrachtknoppen. Op dezelfde wijze als in het formulier Klant kunnen de opdrachtknop-pen op het formulier worden geplaatst. De vier opdrachtknoppen voor de navigatie worden onder de lijn in de Formuliervoettekst geplaatst. De vier opdrachtknoppen die gelijk zijn aan de knoppen in het formulier Klant kunnen aan de rechterkant van het formu-lier, in de sectie Detail, worden geplaatst. Hiervoor moet het for-mulier aan de rechterkant vergroot worden.De opdrachtknop die een factuur (rapport) van de boeking afdrukt op de printer is een bijzondere opdrachtknop. Die is pas op het for-mulier geplaatst nadat het rapport van de factuur is gemaakt. Het maken van dit rapport wordt in de volgende paragraaf toegelicht. Deze opdrachtknop is niet met de Wizard gemaakt. De beschik-bare opdrachtknoppen van de Wizard voldoen niet. We hebben hiervoor een macro gemaakt. Na het klikken op de knop wordt die macro gestart, deze drukt het rapport af.Om die opdrachtknop op het formulier te plaatsen voeren we de volgende acties uit.

Page 302: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003290

Plaats het formulier in de ontwerpweergave. Klik in de Werkset op de knop Wizards voor besturingselementen. Let op, de Wizard wordt nu uitgeschakeld! Plaats een opdrachtknop op het formulier, ongeveer op de gewens-te plaats. Er wordt nu geen Wizard gestart. Als toch de Wizard wordt gestart, annuleer deze dan. Herstel de oorspronkelijke instelling van de Wizards voor besturingselementen, zodat in de Werkset de Wizard weer actief is voor de besturingselementen. Plaats het eigenschappenvenster van de zojuist gemaakte opdracht-knop op het scherm. Verander in het tabblad Overige, de eigen-schappen Naam in Drukaf en Knopinfo in Factuur afdrukken. De tekst van de eigenschap Knopinfo wordt getoond zodra we met de muiswijzer boven de opdrachtknop komen. Selecteer het tabblad Opmaak en klik in de eigenschap Afbeelding op de drie puntjes. Hierdoor wordt een venster getoond met alle mogelijke figuren voor op de opdrachtknop, zie figuur 9.14. Selecteer hieruit de Printer en klik op de knop OK.Wijzig in ditzelfde tabblad de afmetingen van de opdrachtknop (1,5 cm 0,6 cm) en sleep de opdrachtknop naar zijn gewenste plaats.

Als we nu op de opdrachtknop klikken, gebeurt er helemaal niets. Er wordt geen actie uitgevoerd. Die actie gaan we middels een macro maken. Die macro zullen we later in deze paragraaf toelich-ten.Eerst maken we de sectie Detail af. Er zijn drie rekenvelden op het formulier, te weten Subtotaal, Annuleringskosten en Totaal bedrag. Voor Subtotaal en Annuleringskosten zijn onze constanten nodig. Het Subtotaal is het bedrag van de volwassenen tezamen met het bedrag dat voor de kinderen betaald moet worden. Voor kinderen wordt een kortingspercentage gehanteerd, dat in de tabel Constant is opgeslagen. De Annuleringskosten worden bepaald

Figuur 9.14

Page 303: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 291

door een percentage van het subtotaal. Het percentage van de annu-leringsverzekering ligt ook opgeslagen in de tabel Constant. Zoals eerder opgemerkt heeft de tabel Constant geen enkele relatie met de overige tabellen uit de database. Deze wordt alleen gebruikt als de constante gegevens nodig zijn. De constante gegevens staan ook in het formulier Constant. We kunnen dus gebruikmaken van de tabel Constant of van het formulier Constant. Wij maken in al onze voorbeelden gebruik van het formulier Constant. De tabel Constant werkt niet in alle gevallen correct, vandaar onze keuze. Om de gegevens uit het formulier Constant te kunnen benaderen moet het formulier geopend zijn. Dat betekent: als we het formu-lier Boeking openen, moet ook het formulier Constant geopend worden. We kunnen dat met behulp van een macro automatisch laten uitvoeren. Bij het sluiten van het formulier Boeking moet dan uiteraard het formulier Constant ook gesloten worden. Ook hier-voor gaan we een macro maken. Het maken van de macro’s wordt later in deze paragraaf toegelicht. In de ontwerpfase hebben we die macro’s nog niet gemaakt en openen we zelf (handmatig) het for-mulier Constant.

Activeer het databasevenster, terwijl het formulier Boeking in de ontwerpfase actief blijft. Klik op het overzicht Formulieren en open het formulier Constant.Selecteer weer het venster van het formulier Boeking, in de ont-werpfase. Beide formulieren zijn nu geopend! Nu kunnen we de tekstvakken maken en controleren of de berekeningen goed zijn ingevoerd.We plaatsen eerst het tekstvak Subtotaal op het scherm. Klik met de muis op de knop Tekstvak in de Werkset en plaats het tekstvak in de Detailsectie. Plaats het eigenschappenvenster van het bijbehorende label op het scherm en wijzig de eigenschap Bijschrift, in het tabblad Opmaak, in Subtotaal.Klik op het zojuist gemaakte tekstvak en verander de eigenschap Naam, in het tabblad Overige, in Subtotaal.Klik op de tab Gegevens en verander de eigenschap Besturingselementbron in: =[Aantal volwassenen]*[Prijs per persoon]+[Aantal kinderen] *[Prijs per persoon]* (1-[Formulieren]![Constant]![KinderKortingPerc]).Gebruik eventueel de drie puntjes in de eigenschap Besturingselementbron om de Opbouwfunctie voor expressies te starten, zodat deze lange formule wat eenvoudiger is in te voeren.

Page 304: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003292

In deze formule wordt het subtotaal uitgerekend. Het bedrag dat voor de kinderen betaald moet worden, is gelijk aan het aantal kinderen de prijs per persoon (1 minus het kortingspercentage voor de kinderen). Het kortingspercentage voor de kinderen wordt uit het formulier Constant gehaald. Hierdoor wordt er flexibel ge-werkt, we kunnen immers middels het formulier Constant eenvou-dig een wijziging in het kortingspercentage aanbrengen.

Wijzig de laatste eigenschap Notatie van het tekstvak, in het tab-blad Opmaak, in Valuta. We kunnen ook als notatie Euro kiezen. Onafhankelijk van de valuta-instelling in Windows wordt dan al-tijd het euro-symbool getoond.Controleer de formule in de formulierweergave.

Let op: als het formulier Constant niet geopend is, kan deze bere-kening niet uitgevoerd worden en wordt in het tekstvak, in de for-mulierweergave, de volgende foutmelding afgedrukt: #Naam?.

Plaats vervolgens het tweede rekenveld op het formulier met de volgende eigenschappen:Bijschrift: AnnuleringskostenNaam: Annuleringskosten

Besturingselementbron: =IIf([Annuleringsverzekering]; [Formulieren]![Constant]![AnnuleerPerc] *[Subtotaal];0)

Notatie: Valuta (of Euro).

In de berekening wordt het subtotaal vermenigvuldigd met het per-centage dat betaald moet worden voor de annuleringsverzekering. Dat percentage ligt ook opgeslagen als een constante. Echter, als geen annuleringsverzekering is afgesloten, hoeft er ook niet voor betaald te worden. Dat wordt gerealiseerd met de IIf()-functie.Deze is in paragraaf 5.9.3 toegelicht.

Het laatste rekenveld dat toegevoegd moet worden, heeft de vol-gende eigenschappen:Bijschrift: Totaal bedragNaam: Totaal bedragBesturingselementbron: =[Subtotaal]+[Annuleringskosten]Notatie: Valuta (of Euro).Sleep vervolgens de drie rekenvelden naar de gewenste plaats op het formulier en pas hun afmetingen aan.

Page 305: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 293

In het formulier zien we bij het veld Betaalwijze, in formulierweer-gave, de getallen 1, 2 of 3 staan. In paragraaf 6.1 hebben we voor de betaalwijze een groepsvak gemaakt, waarbij er drie mogelijk-heden waren: Contant, Pinnen of Acceptgiro. We gaan hier opnieuw een groepsvak van maken.

Verwijder als eerste het besturingselement Betaalwijze, hiervoor in de plaats komt een groepsvak.Klik met de muis op de knop Groepsvak van de Werkset. De Wizard moet in de werkset actief zijn.Verplaats hierna de muis naar het formulier en plaats het groeps-vak op ongeveer de gewenste plaats. De Wizard wordt actief. Typ de labelnamen Contant, Pinnen en Acceptgiro.Kies in het volgende venster voor Ja, de standaardoptie is: Acceptgiro.Accepteer in het scherm dat hierna verschijnt de standaardwaarden 1, 2 en 3 die met de labelnamen overeenkomen. Achter de scher-men worden niet de labelnamen opgeslagen, maar de bijbehorende getallen. Geef in het volgende venster aan dat de geselecteerde optie opge-slagen moet worden in het veld Betaalwijze. Kies de tweede optie, Opslaan in dit veld, en selecteer het veld Betaalwijze.Selecteer in het voorlaatste venster Selectievakjes en Normaal. Kies als laatste de naam Betaalwijze voor het groepsvak.

Het groepsvak staat in het formulier, de keuzemogelijkheden wor-den onder elkaar afgebeeld, maar we zien ze liever naast elkaar. Ook wordt het kader in het uiteindelijke formulier niet getoond, zie figuur 9.13. De verschillende elementen van het groepsvak moeten verplaatst worden.

Selecteer in de ontwerpweergave het groepsvak. Verplaats alleen het label Betaalwijze naar de gewenste plaats, onder het label Annuleringsverzekering. Let op: als we met de muiswijzer boven het groepsvak komen, verschijnt een handje met vijf vingers of met de wijsvinger. Het handje met de vijf vingers verplaatst alle elementen die geselecteerd zijn en het handje met de wijsvinger alleen het aangewezen element. Om alleen het label Betaalwijze te selecteren moet dus de wijsvinger zichtbaar zijn, anders verplaatsen alle elementen zich.

Page 306: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003294

Selecteer het label Contant en sleep het naar de gewenste plaats (nu wel het handje van de muiswijzer gebruiken, zodat het keuze-vakje én het label tegelijkertijd verplaatst worden). Verplaats ook de overige twee labels. Maak het kader van het groepsvak zo klein mogelijk, zodat de Formuliervoettekst tegen het groepsvak geplaatst kan worden. De laatste verandering die met het groepsvak uitgevoerd moet wor-den, is het onzichtbaar maken van het kader. Denk erom dat het kader niet verwijderd kan worden, anders wordt het gehele groeps-vak verwijderd. Selecteer het kader en activeer het eigenschappen-venster. Klik op de tab Opmaak en wijzig de eigenschap Randstijl in Transparant.

Het formulier nadert zijn eindstadium. Er zijn nog enige wijzigin-gen die aangebracht moeten worden. Met de Tab-toets kunnen alle elementen van het formulier benaderd worden, dat is niet wenselijk. Alleen de velden die ingevoerd moeten worden bij het boeken van een reis moeten een tabstop hebben, dus klantnummer, reisnummer en de boekinggegevens. De andere elementen op het formulier mogen geen tabstop hebben.

Selecteer in de ontwerpweergave van het formulier met behulp van Shift+muisklik de volgende elementen: alle opdrachtknop-pen, de drie rekenvelden, de velden Naam, Adres, Woonplaats,Telefoonnummer, Vertrekdatum, Aantal dagen, Prijs per persoon,Plaats en Land.Activeer het eigenschappenvenster, klik op de tab Overige en ver-ander de eigenschap Tabstop in Nee.

De velden die geen tabstop hebben, kunnen wel benaderd worden met de muis, we kunnen gewoon in het veld klikken. Voor de drie rekenvelden willen we dat voorkomen, er valt immers niets in die velden te veranderen of te zoeken.

Selecteer de drie rekenvelden in de ontwerpweergave (Shift+muisklik) en activeer het eigenschappenvenster. Klik op de tab Gegevens en wijzig de eigenschap Ingeschakeld in Nee. De drie rekenvelden krijgen automatisch een andere achter-grondkleur en zijn niet meer met de muis te benaderen.

De adresgegevens en de reisgegevens zijn ook met de muis te bena-deren. Hierdoor kunnen we per ongeluk gegevens wijzigen. Stel

Page 307: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 295

dat we per ongeluk het veld Prijs per persoon wijzigen, dan geldt dat direct ook voor alle andere boekingen die naar die reis zijn geboekt. Of we wijzigen per ongeluk de vertrekdatum. Alle reizen naar die bestemming hebben dan direct die nieuwe vertrekdatum, met alle gevolgen van dien. Als de vertrekdatum van een reis wel moet worden gewijzigd, moet dat in het formulier Reis veranderd worden. We kunnen die velden niet uitschakelen zoals met de rekenvelden is gebeurd. We zouden dan niet meer kunnen zoeken op onze gegevens. Om te kunnen zoeken op een bepaald waarde, moeten we met de muis in het veld klikken, waarin gezocht moet worden. Vervolgens klikken we op de knop Zoek. Uitschakelen kan om die reden dus niet. Maar Access biedt uitkomst, we kunnen een eigenschap veranderen, waardoor we met de muis wel het veld kunnen selecteren, maar niet kunnen wijzigen.

Selecteer tegelijkertijd, met Shift+muisklik, de velden: Naam,Adres, Woonplaats, Telefoonnummer, Aantal dagen, Prijs per per-soon, Bestemming.Plaats, Land en Vertrekdatum.Activeer het eigenschappenvenster en klik op de tab Gegevens. Wijzig de eigenschap Vergrendeld in Ja.

Er is nog één wijziging nodig in het formulierontwerp. Als we in de formulierweergave met de Tab-toets door de velden lopen, wordt er geen logische volgorde aangehouden. Door het ver-plaatsen van onze velden hebben we geen logische tabvolgorde meer. De tabvolgorde kunnen we veranderen door, in de ontwerp-weergave van het formulier, in het menu te kiezen voor Beeld,Tabvolgorde: dit kan ook met een rechtermuisklik (snelmenu). Er wordt een venster getoond met de tabvolgorde, zie figuur 9.15

Figuur 9.15

Page 308: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003296

Hierin kunnen we door te selecteren en te slepen de tabvolgorde wijzigen. Het klantnummer moet bovenaan komen te staan, dan het reisnummer en vervolgens de boekinggegevens, zie figuur 9.15. De tabvolgorde ná het veld betaalwijze doet niet ter zake. Van die elementen hebben we de tabstop immers uitgeschakeld.

Het ontwerp van het formulier is klaar. Ten slotte gaan we de macro’s die nodig zijn voor de juiste werking van dit formulier maken.

Macro’s van het formulier BoekingHet werken met macro’s is in hoofdstuk 8 toegelicht. De macro’s van onze toepassing zijn ondergebracht in macrogroepen, zie even-tueel hoofdstuk 8. De groepen zijn zo verdeeld dat alle macro’s van één formulier of rapport onder één macrogroep vallen. Willen we een macro van een bepaald formulier of rapport bestuderen, open dan in het databasevenster het overzicht Macro’s. De groepsnaam van de macro heeft dezelfde naam als het formulier of rapport, voorafgegaan door respectievelijk de letters frm of rpt. In ons voor-beeld zijn de macro’s van het formulier Boeking te vinden onder de naam frmBoeking in het overzicht Macro’s van het databaseven-ster.

We gaan de macro’s maken die nodig zijn voor het formulier Boeking.

Klik op het overzicht Macro’s van het databasevenster. Klik op de knop Nieuw. Het macrovenster wordt getoond, zie figuur 9.16.Mocht er in het macrovenster de kolommen Macronaam en Voorwaarde niet voorkomen, klik dan in de werkbalk op de knop-pen Macronamen en Voorwaarden. De kolom Voorwaarde is voor de macro’s van het formulier Boeking niet noodzakelijk.

Er zijn voor het formulier Boeking drie macro’s nodig. Een macro die automatisch het formulier Constant opent als het formulier Boeking wordt geopend. Een macro die uitgevoerd wordt als op de opdrachtknop Printer wordt geklikt. Deze macro moet een rap-port op de printer afdrukken. De laatste macro sluit het formulier Constant als het formulier Boeking wordt gesloten.

Page 309: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 297

Voer de eerste macro in zoals weergegeven in figuur 9.17, en sla de macrogroep op onder de naam frmBoeking.

De macro frmBoeking.Open opent met de actie FormulierOpenen het formulier Constant. Met het argument Venstermodus kunnen we de weergave van het formulier opgeven. Wij hebben geselec-teerd Verborgen, waardoor het formulier wel geopend wordt, maar niet getoond. We zijn immers alleen geïnteresseerd in het formulier Boeking en niet in het formulier Constant.

De tweede macro moet een rapport afdrukken. Er wordt een fac-tuur in rapportvorm naar de printer gestuurd, zie figuur 9.18.

Figuur 9.16

Figuur 9.17

Page 310: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003298

De macro frmBoeking.Afdrukken opent met de actie Rapport-Openen het rapport Boeking. Dit rapport moet al gemaakt zijn. In de volgende paragraaf, De rapporten, wordt het maken van dit rapport toegelicht. Wanneer we echter een rapport van de boeking afdrukken, worden alle boekingen afgedrukt, in dit voorbeeld dus alle facturen. Wij willen alleen de factuur van de actieve boeking, die op het scherm staat, afdrukken. We moeten dus een voorwaarde kunnen invoeren. Met de opdrachtknop-wizard kunnen we dit niet realiseren. We kunnen met de Wizard wel een opdrachtknop maken die een rapport afdrukt, maar dan zonder voorwaarde, dus alle facturen zouden dan afgedrukt wor-den. Bij de actie RapportOpenen kunnen we in het argument WHERE-voorwaarde een criteria opgeven. De voorwaarde luidt: [Boekingnummer]=[Formulieren]![Boeking]![Boekingnummer].Het boekingnummer uit het rapport moet gelijk zijn aan het (zicht-bare) boekingnummer van het formulier Boeking. Hierdoor wordt alleen het rapport van de boeking die op het scherm staat geselec-teerd en afgedrukt.Zoals te zien is in figuur 9.18, zijn er twee extra macro-acties toegevoegd. Indien een nieuw gemaakte boeking direct wordt af-gedrukt, treedt zonder deze extra macro-acties een foutmelding op. Een nieuwe boeking wordt pas opgeslagen in de database nadat de recordwijzer verplaatst is. Drukt men direct op de knop Afdrukken, dan kan het record nog niet gevonden worden in de database en volgt een foutmelding. We hebben dit via een trucje

Figuur 9.18

Page 311: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 299

voorkomen. We verplaatsen tijdelijk de recordwijzer naar het volgende record. De zojuist toegevoegde gegevens worden nu opgeslagen in de database. Vervolgens herstellen we de oorspron-kelijke recordwijzer door naar het vorige record te gaan. Hiervoor dienen twee extra macro- acties toegevoegd te worden voordat de actie RapportOpenen wordt uitgevoerd. De eerste actie is NaarRecordGaan met het argument Volgende en de tweede actie is NaarRecordGaan met het argument Vorige.

De derde macro moet het formulier Constant sluiten, zie figuur 9.19.

De macro frmBoeking.Sluit sluit met de actie Sluiten het formu-lier Constant. Bij het argument Opslaan kunnen we aangeven of tijdens het opslaan de gegevens bewaard moeten worden of niet, eventueel na het vragen van een bevestiging. Aangezien het formu-lier Constant alleen maar gebruikt is om gegevens te lezen, maakt het niet uit wat we hier kiezen, alle drie opties zijn goed.

De macro’s zijn gemaakt, maar nu moeten ze nog gestart worden bij een bepaalde gebeurtenis. Zo moet de macro frmBoeking.Opengestart worden als het formulier Boeking wordt geopend. De macro frmBoeking.Afdrukken moet gestart worden na het klikken op de opdrachtknop met printerpictogram. De laatste macro frmBoeking.Sluit moet geactiveerd worden als het formulier Boeking wordt gesloten.

Figuur 9.19

Page 312: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003300

Selecteer het overzicht Formulieren in het databasevenster en open het formulier Boeking in de ontwerpweergave. Plaats het eigenschappenvenster van het formulier op het scherm. Klik hierin op de tab Gebeurtenis. Selecteer hierin de eigenschap Bij openen. Kies uit de keuzelijst de macro frmBoeking.Open, zie figuur 9.20.

Hierdoor wordt bij het openen van het formulier Boeking de macrogroep frmBoeking geopend en de macro frmBoeking.Opengestart. Die opent vervolgens ‘automatisch’ het formulier Constant,die noodzakelijk is voor het formulier Boeking.Op identieke wijze hebben we in hetzelfde venster in de eigenschap Bij sluiten de macro frmBoeking.Sluit geselecteerd, zie figuur 9.20.

Klik op de opdrachtknop met het printerpictogram en kies in het tabblad Gebeurtenis de eigenschap Bij klikken. Selecteer uit de keuzelijst de macro frmBoeking.Afdrukken. Na het klikken op die knop zal de gewenste macro gestart worden.Het formulier is klaar. Test de macro’s, pas eventueel de afmeting van het formulier aan en sla het formulier op.

9.3.6 Formulier Datumbereik vertreklijst

Dit formulier wordt voor de volledigheid hier toegelicht, zie figuur 9.21.

Figuur 9.20

Page 313: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 301

Het formulier wordt alleen gebruikt voor het afdrukken van de vertreklijst. We kunnen een datumbereik opgeven, waarna het rapport van de Vertreklijst van alle reizen die voldoen aan het inge-voerde bereik wordt afgedrukt. Zo’n voorwaarde hebben we eerder gemaakt met een flexibele query, maar de voorwaarde opvragen in een formulier toont veel professioneler.

Selecteer in het overzicht Formulieren de optie Formulier maken in ontwerpweergave.We moeten een aantal eigenschappen van het formulier wijzigen. Plaats het eigenschappenvenster van het formulier op het scherm en verander de instellingen zoals toegepast in al onze voorgaan-de formulieren, zie eventueel figuur 9.4. Alleen de eigenschap Bijschrift is Datumbereik voor vertreklijst geworden.Plaats vervolgens twee tekstvakken in het venster. De labels krij-gen de teksten Begindatum: en Einddatum:. Selecteer het eerste tekstvak en activeer het eigenschappenvenster. Verander de eigen-schap Naam, tabblad Overige, in Begindatum. Voer dezelfde op-drachten uit voor het tweede tekstvak en kies als naam Einddatum.Om ervoor te zorgen dat datums ingevoerd kunnen worden, veran-deren we de eigenschap Notatie, in het tabblad Opmaak, in Korte datumnotatie voor beide tekstvakken. Er mogen geen ongeldige datums voor het bereik ingevoerd worden. Plaats de volgende eigenschappen in de tab Gegevens van de tekstvakken.

Figuur 9.21

Tekstvak Eigenschap Instelling

Begindatum Standaardwaarde Date()+1Validatieregel <=[Einddatum]Validatietekst Datumbereik is niet correct.

Einddatum Standaardwaarde Date()+8Validatieregel >=[Begindatum]Validatietekst Datumbereik is niet correct.

Page 314: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003302

Versleep de tekstvakken vervolgens naar een geschikte plaats in het venster.Zet twee opdrachtknoppen, zonder de Wizard, in het venster. Klik daartoe op de knop Wizards voor besturingselementen in de Werkset. De Wizard wordt dan (tijdelijk) niet meer automatisch gestart.Activeer na het plaatsen van de twee opdrachtknopen de Wizards voor besturingselementen weer, zodat standaard in de Werkset de Wizard weer wel actief is voor de besturingselementen.Selecteer de eerste opdrachtknop en activeer het eigenschappen-venster. Verander de eigenschap Bijschrift in &OK en verander de eigenschap Naam in OK. Het &-teken (ampersand) dient in de formulierweergave om een streepje onder de O te plaatsen. Hierdoor kan die opdrachtknop ook geselecteerd worden door mid-del van de toetsencombinatie Alt+O, zoals gebruikelijk binnen Windows-toepassingen. Voer dezelfde opdrachten uit voor de tweede opdrachtknop en verander het bijschrift in &Annuleer en de naam in Annuleer. De beide opdrachtknoppen mogen geen tabstop hebben (eigenschap Tabstop). Sleep de opdrachtknoppen vervolgens naar een geschikte plaats.Ten slotte moet de detailsectie van het formulier dezelfde achter-grondkleur krijgen als de overige formulieren. Kies de lichtgele kleur voor de eigenschap Achtergrondkleur, tabblad Opmaak. Pas de afmetingen van het formulier aan in de formulierweergave en sla het formulier op onder de naam Datumbereik vertreklijst.

Macro’s van het formulier Datumbereik vertreklijstOnder de opdrachtknoppen OK en Annuleer worden macro’s gestart. De macro’s van het formulier Datumbereik vertreklijstkrijgen als naam voor de macrogroep frmDatumbereik vertreklijst,zie figuur 9.22.

Klik op de knop Nieuw, in het overzicht Macro’s van het database-venster. Voer de macro’s vervolgens in.

De volledige macro is zichtbaar in figuur 9.22.

De macro laat het rapport Vertreklijst afdrukken. Alleen gegevens die aan de voorwaarden voldoen, worden afgedrukt. Om de

Page 315: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 303

records in dit rapport te beperken tot die welke voldoen aan de waarden van de datums op het formulier Datumbereik vertrek-lijst, moet een voorwaarde ingevoerd worden bij het argument WHERE-voorwaarde. Het besturingselement Vertrekdatum komt uit het rapport Vertreklijst. Vervolgens wordt aangegeven dat de vertrekdatum tussen de twee datums uit de tekstvakken van het formulier Datumbereik vertreklijst moet liggen. We moeten de volledige beschrijving gebruiken voor de verwijzing naar de beide tekstvakken. Deze kunnen eventueel met de opbouwfunctie voorexpressies ingevoerd worden.

TerzijdeMerk op dat Between en And ook in de Nederlandse versie van Access in het Engels ingevoerd moeten worden.

Figuur 9.22

Macro frmDatumbereik vertreklijst.OK

Actie Argument Instelling

RapportOpenen Rapportnaam Vertreklijst

Beeld Afdrukken

WHERE-voorwaarde [Vertrekdatum] Between[Formulieren]![Datumbereikvertreklijst]![BeginDatum] And[Formulieren]![Datumbereikvertreklijst]![Einddatum]

Sluiten Opslaan Nee

Page 316: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003304

De tweede actie sluit direct na het printen automatisch het formu-lier Datumbereik vertreklijst.

De macro is klaar. Hierna moet hij gestart kunnen worden na de gebeurtenis ‘klikken op de opdrachtknop OK van het formulier Datumbereik vertreklijst’.

Selecteer de opdrachtknop OK in de ontwerpweergave en activeer vervolgens het eigenschappenvenster. Kies tab Gebeurtenisen en selecteer in de eigenschap Bij klikkende macro frmDatumbereik vertreklijst.OK.

Nu gaan we de opdrachtknop Annuleer instellen. Hiervoor is één macroactie gemaakt.

De volledige macro is zichtbaar in figuur 9.22. De enige actie van deze macro is het sluiten van het actieve formulier. Deze opdracht-knop had eventueel ook met de Wizard gemaakt kunnen worden.

De macro is klaar, vervolgens moet hij gestart kunnen worden na de gebeurtenis ‘klikken op de opdrachtknop Annuleer van het for-mulier Datumbereik vertreklijst’.

Doe dit op dezelfde wijze zoals besproken bij de opdrachtknop OK, selecteer nu de macro frmDatumbereik vertreklijst.Annuleer.

Het formulier kan nog niet getest worden omdat het aangeroepen rapport nog niet bestaat! Dit gaan we in de volgende paragraaf doen.

9.4 De rapporten

In deze paragraaf gaan we de rapporten toelichten die bij de toe-passing van reisbureau ’t Zonnetje behoren. Er zijn vier rapporten nodig. In de eerste plaats een rapport voor het afdrukken van de boekinggegevens in factuurvorm. Dit rapport kan worden opge-

Macro frmDatumbereik vertreklijst.Annuleer

Actie Argument Instelling

Sluiten Opslaan Nee

Page 317: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 305

roepen vanuit het formulier Boeking. Klikken we in het formulier Boeking op de opdrachtknop met het printericoontje, dan wordt de macro frmBoeking.Afdrukken gestart. Die macro is besproken in de paragraaf van het formulier Boeking. Het ligt voor de hand om eerst het rapport te maken. Is het rapport naar wens, dan kan de macro gemaakt worden.

Het tweede rapport is een alfabetische klantenlijst; het derde een overzicht van vertrekkende reizigers, de Vertreklijst. Als laatste maken we een rapport waaruit we kunnen aflezen wat de omzet per reis is en de totale omzet van het reisbureau. Deze drie rappor-ten kunnen afgedrukt worden vanuit het submenu Overzichten. Dit bevat drie opdrachtknoppen waarmee we de overzichten kunnen afdrukken.

9.4.1 Rapport Boeking

Met dit rapport tonen we het boekingsformulier in factuurvorm op de printer, zie figuur 9.23.

Figuur 9.23

Page 318: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003306

Zoals figuur 9.23 laat zien, staan in het rapport meer gegevens dan in het formulier Boeking. We vinden hier ook de gegevens Postcode, Prijs per kind, Totaal volwassenen, Totaal kinderenen Nog te betalen. Behalve de postcode zijn de andere gegevens zogenoemde procesgegevens: gegevens die op eenvoudige wijze uit andere gegevens berekend kunnen worden. Hierbij dient opge-merkt te worden dat de Prijs per kind gelijk is aan de Prijs per per-soon minus een korting. Het kortingspercentage is voor alle reizen gelijk. Dit percentage is vastgelegd in de tabel Constant, in het veld KinderKortingPerc.

De procesgegevens liggen niet in de database opgeslagen. We kun-nen ze laten berekenen in zogeheten rekenvelden. We gaan in het rapport die berekeningen uitvoeren.

We gaan het rapport ontwerpen. We maken een query voor het rap-port, met de naam rptBoeking, met de gegevens die in het rapport komen, exclusief de procesgegevens. De benodigde velden worden in figuur 9.24 getoond.

Kies in het databasevenster het overzicht Query’s en kies de optie Query maken in ontwerpweergave.Kies de tabellen Boeking, Klant, Reis en Bestemming.Selecteer de benodigde velden, zoals die in figuur 9.24 zijn aan-gegeven. In de tabel Boeking kunnen we het sterretje selecteren, hierdoor worden alle velden uit de tabel Boeking geselecteerd.

Tabel Veld

Boeking * (alle velden)

Klant NaamAdresPostcodeWoonplaatsTelefoonnummer

Reis VertrekdatumAantal dagenPrijs per persoon

Bestemming PlaatsLandWerelddeel

Figuur 9.24

Page 319: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 307

Sla nadat alle velden zijn opgegeven de query op met de naam rptBoeking. Hieraan kunnen we zien dat deze query bij het rapport boeking hoort.

Het rapport is niet een standaardrapport dat snel met de Wizard te maken is. We moeten een eigen lay-out ontwerpen. Wel kun-nen we de Wizard gebruiken om snel alle velden op het rapport te plaatsen. Door die te verplaatsen kunnen we de gewenste lay-out maken.

Kies in het databasevenster het overzicht Rapporten en selecteer de optie Rapport maken met wizard.Selecteer in het eerste scherm van de Wizard de zojuist gemaakte query rptBoeking en selecteer hieruit alle velden.Geef in het volgende scherm op vanuit welke tabel we de gegevens wensen te zien; kies volgens Boeking.In het volgende scherm kunnen we opgeven hoe de gegevens gegroepeerd moeten worden. Dat is niet nodig, ga naar het volgen-de scherm van de Wizard. Hierin kunnen we een sorteervolgorde aangeven. Aangezien maar één afdruk wordt gemaakt, is een volgorde niet van belang. Geef in het volgende scherm aan hoe het rapport opgemaakt moet worden. Kies voor In kolomvorm en Staand. Het scherm hierna dient om het opmaakprofiel te selecteren. Selecteer het opmaakprofiel Vet. Accepteer in het laatste scherm de voorgestelde titel (naam) Boeking. Van het rapport wordt een afdrukvoorbeeld getoond. Plaats het rapport in de ontwerpweergave. Het dient aangepast te worden aan onze wensen. We gaan eerst de detailsectie, het gedeelte waarin de gegevens worden afgedrukt, aanpassen aan onze wensen.Verplaats alle besturingselementen, behalve Boekingnummer,ongeveer tien centimeter naar beneden. Het selecteren van alle besturingselementen, behalve Boekingnummer, kunnen we een-voudig realiseren door met de muis een rechthoek over die velden te trekken. Hierdoor worden alle besturingselementen geselecteerd en kunnen we deze in één keer verslepen. In het bovenste gedeelte van de detailsectie is nu ruimte gecreëerd. Zet alle besturingselementen op hun plaats. Let op: hierbij moe-ten we niet voorbij het raster komen dat wordt getoond in deontwerpweergave. De gegevens passen anders niet, of niet vol-

Page 320: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003308

ledig, binnen de breedte van het papier. De labels van de bestu-ringselementen Postcode en Klantnummer moeten we verwijderen. De labels van Aantal volwassenen en Aantal kinderen moeten we wijzigen in respectievelijk: Volwassenen en Kinderen.De Wizard heeft automatisch een randstijl gekozen voor de bestu-ringselementen van de velden. Tijdens het afdrukken wordt om de waarden van de besturingselementen een kader geplaatst. Die randstijl vinden wij in dit voorbeeld niet geschikt. Selecteer alle besturingselementen van de velden (Shift+muisklik) en plaats vervolgens het eigenschappenvenster op het scherm en kies uit de tab Opmaak de eigenschap Randstijl. Verander de randstijl in Transparant.Hierna gaan we de rekenvelden maken. Als eerste maken we het rekenveld Prijs per kind. Kies in de Werkset voor Tekstvak en verplaats de muis naar de positie op het scherm waar het rekenveld moet komen. Een tekstvak maakt automatisch een label. Verander het bijschrift van het label in Prijs per kind. Selecteer het tekstvak en verander de eigenschap Naam, tabblad Overige, in Prijs per kind.Klik op het tabblad Gegevens en zet de formule =[Prijs per per-soon] * (1 – [Formulieren]![Constant]![KinderKortingPerc]) in de eigenschap Besturingselementbron, zie figuur 9.25. Merk op dat in de tabel Constant het veld KinderKortingPerc als fractie staat (0,20) en dat de notatie van het veld Percentage is.

Deze formule kan ook via de Opbouwfunctie voor expressiesopgebouwd worden, zoals in hoofdstuk 8 is toegelicht. Het kortings-percentage voor kinderen komt uit de tabel Constant. Aangezien

Figuur 9.25

Page 321: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 309

het formulier Constant al geopend is, bij het boeken van de reis, kunnen we dat formulier nu ook gebruiken. Ontwerpen we dit rapport onafhankelijk van het formulier Boeking, dan moet het formulier Constant eerst nog geopend worden om deze berekening te kunnen maken! We kunnen controleren of het rekenveld goed werkt door een afdrukvoorbeeld van het rapport te laten tonen.

Kies uit de menubalk Beeld, Afdrukvoorbeeld of doe dit via de knop Beeld op de werkbalk. Krijgen we een foutmelding zoals #Naam? of #Fout, open dan eerst het formulier Constant. Het rekenveld voor het totale bedrag van de volwassenen wordt op soortgelijke wijze gemaakt.Selecteer opnieuw een tekstvak in de Werkset en verplaats de muis naar de positie waar het besturingselement moet komen. Het label dat automatisch wordt gecreëerd bij het tekstvak kunnen we ver-wijderen (eerst selecteren en vervolgens op de Delete-toets druk-ken). Verander de eigenschappen Naam en Besturingselementbron van het nieuwe tekstvak in respectievelijk Totaal volwassenen en =[Aantal volwassenen] *[Prijs per persoon]. Controleer de wer-king van het besturingselement in het afdrukvoorbeeld.Het maken van de overige rekenvelden gaat op dezelfde manier. Maak de overige vijf rekenvelden en verander de eigenschappen volgens het schema van figuur 9.26.

Voor het berekenen van de annuleringskosten is gebruikgemaakt van de functie IIf(). Als een annuleringsverzekering is afgesloten, worden de annuleringskosten berekend met behulp van het per-centage uit het formulier Constant. Heeft men geen annulerings-verzekering afgesloten, dan zijn er geen kosten. Merk op dat het annuleringspercentage als fractie (0,04) ligt opgeslagen in de tabel Constant en dat het scheidingsteken is ingesteld op puntkomma (;).

Eigenschap: Naam Eigenschap: Besturingselementbron

Totaal kinderen =[Aantal kinderen]*[Prijs per kind]

Subtotaal =[Totaal volwassenen]+[Totaal kinderen]

Annuleerkosten =IIf([Annuleringsverzekering];[Formulieren]![Constant]![AnnuleerPerc]*[Subtotaal];0)

Totaal =[Subtotaal]+[Annuleerkosten]

Nog te betalen =[Totaal]-[Betaald bedrag]

Figuur 9.26

Page 322: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003310

Het veld Annuleringsverzekering is een selectievakje. We willen echter de tekst Ja of Nee zien in plaats van een vinkje.

Verwijder het besturingselement Annuleringsverzekering.Plaats vervolgens via de werkset een tekstvak op de vrijgevallen plaats.Verander de labeltekst van het tekstvak in Annuleringsverzekering.Plaats het eigenschappenvenster van het nieuwe tekstveld op het scherm.Wijzig van het tekstvak de eigenschap Notatie – tabblad Opmaak – in Ja/Nee. Besturingselementbron – tabblad Gegevens – in Annuleringsverzekering en Naam – tabblad Overige – in Annuleringsverzekering.

Alle rekenvelden zijn gemaakt. Echter, het besturingselement Betaalwijze toont de getallen 1, 2 of 3. Het besturingselement Betaalwijze is een groepsvak, waarin we kunnen kiezen voor Constant, Pinnen of Acceptgiro. Het groepsvak slaat niet die tek-sten op, maar de overeenkomstige getallen, hier 1, 2 of 3. Bij het tonen van het veld Betaalwijze worden die getallen afgedrukt en niet de bijbehorende teksten. Als we de bijbehorende tekst wensen te tonen, moeten we een tekstvak maken dat – op basis van de waarde van het veld Betaalwijze – de juiste tekst toont. Hiervoor heeft Access de functie Choose(), die een waarde uit een lijst met argumenten selecteert en deze waarde als resultaat geeft. De volle-dige syntaxis van de functie is: Choose(index; optie-1[; optie-2; ... [; optie-n]]). Het eerste argument Index is een getal. Op basis van dat getal wordt de eerste, tweede, of n-de optie geselecteerd: in ons voorbeeld Choose([Betaalwijze]; ”Contant”; “Pinnen”; “Accept giro”). Is de waarde van Betaalwijze 1, dan wordt het woord Contant afgedrukt; is de waarde van Betaalwijze 2, dan wordt de tekst Pinnen afgedrukt, enzovoort.

Wijzig van het besturingselement Betaalwijze de eigenschap Naam in TekstBetaalwijze.Verander de eigenschap Besturingselementbron in=Choose([Betaalwijze]; “Contant”; “Pinnen”; “Acceptgiro”).Access beschikt ook over de functie Switch(). De volledige syn-taxis van de functie luidt: Switch(expr-1; waarde-1[; expr-2; waar-de-2 ... [; expr-n,waarde-n]]). Hiermee kunnen we paren expressies en waarden opgeven.

Page 323: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 311

Bijvoorbeeld: Switch([SoortRelatie]= “D”; ”Debiteur”;[SoortRela-tie]=”C”; “Crediteur”) of Switch([Betaalwijze] =1; ”Contant”; [Betaalwijze]=2; ”Pinnen”; [Betaalwijze]=3; ”Acceptgiro”).De rekenvelden moeten nog van een juiste opmaak worden voor-zien. Selecteer daartoe alle rekenvelden (Shift+muisklik) en plaats vervolgens het eigenschappenvenster op het scherm. Kies de tab Opmaak en selecteer de eigenschap Notatie. Kies in de keuzelijst de notatie Valuta of Euro.Verfraai ten slotte de detailsectie met enige lijnen. De Wizard heeft één lijn al in de detailsectie geplaatst. Verwijder deze lijn en voeg vier lijnen toe, zie figuur 9.23, waarvan twee over de volledige breedte van de detailsectie. Na het plaatsen van de lijnen kunnen deze iets dikker gemaakt worden door de eigenschap Randbreedte,in de tab Opmaak, de waarde 2 te geven. Voeg ten slotte nog twee lijnen toe die dienen om het subtotaal en totaal te scheiden.

De detailsectie is nu af. We gaan de Paginakoptekst maken. Door de Wizard is geen paginakoptekst gemaakt, wel een rapport-koptekst.

Maak ruimte voor de paginakoptekst door de balk van de detail-sectie omlaag te slepen. In de paginakoptekst worden de gegevens van het reisbureau getoond, zie figuur 9.23. De teksten zijn alle-maal labels. Het label met het bijschrift Boeking kan uit de Rap-portkoptekst naar de Paginakoptekst worden gesleept. Het speciale effect van het label linksboven Reisbureau ’t Zonnetje is gemaakt door de eigenschappen Voorgrondkleur en Achtergrondkleur van het label te veranderen in respectievelijk wit en zwart. Van dat label is ook de grootte van het lettertype veranderd in puntgrootte 20. De paginakoptekst is klaar. De rapportkoptekst kan verwijderd worden. Sleep daartoe de balk van paginakoptekst omhoog.Als laatste veranderen we de Paginavoettekst van het rapport. De Wizard heeft aan de rechterkant in de paginavoettekst een tekstvak geplaatst waarin het actieve paginanummer getoond wordt en het totale aantal pagina’s. Hierin is gebruikgemaakt van de eigen-schappen Pagina en Pagina’s. Aangezien in dit rapport maar één pagina wordt afgedrukt, verwijderen we dat tekstvak.

Page 324: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003312

Willen we op een ander rapport wel die informatie afdrukken, ga dan als volgt te werk. Plaats een tekstvak in de voettekst. Start in de eigenschap Besturingselementbron de Opbouwfunctie voorexpressies. Kies in de linkerkolom van het opbouwfunctievenster voor Gangbare expressies. Maak vervolgens uit de middelste kolom een keuze.

Het rapport is nu bijna klaar en het toont alle gewenste gegevens, hoewel dat er iets te veel kunnen zijn. Als er namelijk geen kinde-ren mee op reis gaan, wordt bij Aantal kinderen de waarde 0 af-gedrukt, de Prijs per kind wordt getoond en Totaal kinderen heeft ook als waarde 0. We willen die regel in het rapport dan niet tonen. Hiervoor moet een macro gemaakt worden; deze maken we onder de groepsnaam rptBoeking, zodat we direct kunnen zien dat die macro bij het rapport Boeking hoort.

Macro van het rapport BoekingWe moeten een macro maken die controleert of in de gemaakte boeking ook kinderen op reis gaan. Als er geen kinderen op de boeking staan vermeld, wordt in het rapport geen informatie over kinderen vermeld. Binnen de macrogroep krijgt die macro de naam ToonKinderen (zie figuur 9.27).

De volledige macro wordt getoond in figuur 9.27.

Figuur 9.27

Page 325: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 313

Gaan er geen kinderen op reis, dan worden de besturingselementen die de kindergegevens tonen onzichtbaar gemaakt. Let op de drie puntjes in de voorwaarde! Hierdoor wordt de voorwaarde voor de volgende actie herhaald. Alle gegevens die op het rapport staan die met kinderen te maken hebben, worden hierdoor onzichtbaar gemaakt. Deze macro zou nu klaar zijn, er wordt namelijk maar één bladzijde door het rapport afgedrukt. Voor ieder nieuw rapport wordt namelijk de standaardinstelling, alle gegevens op het rapport tonen, hersteld.

We hebben de macro uitgebreid door de gegevens van de kinderen opnieuw zichtbaar te maken als er wel kinderen in de boeking staan vermeld. Hierdoor kunnen we het rapport desgewenst ook gebruiken om over een bepaalde periode de boekingen af te druk-ken. Het is dan niet nodig een heel nieuw rapport te maken. Als we bijvoorbeeld in één keer tien boekingen zouden laten afdrukken en op de eerste boeking staan geen kinderen, worden de gegevens

Macro rptBoeking.ToonKinderen

Voorwaarde Actie Argument Instelling

[Aantal kinderen]=0 WaardeInstellen Item [Aantal kinderen].[Visible]Expressie Nee

… WaardeInstellen Item [Aantal kinderen Bijschrift].[Visible]Expressie Nee

… WaardeInstellen Item [Prijs per kind].[Visible]Expressie Nee

… WaardeInstellen Item [Label prijs per kind].[Visible]Expressie Nee

… WaardeInstellen Item [Totaal kinderen].[Visible]Expressie Nee

… MacroStoppen

WaardeInstellen Item [Aantal kinderen].[Visible]Expressie Ja

WaardeInstellen Item [Aantal kinderen Bijschrift].[Visible]Expressie Ja

WaardeInstellen Item [Prijs per kind].[Visible]Expressie Ja

WaardeInstellen Item [Label prijs per kind].[Visible]Expressie Ja

WaardeInstellen Item [Totaal kinderen].[Visible]Expressie Ja

Page 326: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003314

van de kinderen op de boeking onzichtbaar gemaakt. Die instelling blijft echter voor de volgende negen afdrukken ingesteld, zodat op geen enkel volgend overzicht de kindergegevens worden getoond, ook al gaan er wel kinderen mee op reis. Door onze uitbreiding wordt de standaardinstelling na iedere afgedrukte boeking her-steld, zodat weer alle gegevens worden getoond. Het formulier Constant is hierbij wel noodzakelijk, we kunnen dit dan openen op het moment dat het rapport wordt geopend. Via de eigenschap Bij openen van het rapport kan dat gerealiseerd worden. De macro-groep rptBoeking dient in dat geval ook uitgebreid te worden met een macro die het formulier Constant opent.

De macro rptBoeking.ToonKinderen moet uitgevoerd worden op het moment dat de gegevens uit de detailsectie opgemaakt worden, de gebeurtenis ‘Bij opmaken’.

Selecteer het overzicht Rapporten in het databasevenster en open het rapport Boeking in de ontwerpweergave. Klik met de muis op de balk van de detailsectie en plaats het eigen-schappenvenster op het scherm. Kies daarin de tab Gebeurtenis. Selecteer uit de eigenschappen van de detailsectie Bij opmaken.Selecteer uit de keuzelijst rptBoeking.ToonKinderen. Hierdoor wordt bij het opmaken van de detailsectie uit het rapport de macro-groep rptBoeking geopend en de macro rptBoeking.ToonKinderengestart.Open ter controle het formulier Boeking en laat een boeking in factuurvorm op de printer afdrukken.

9.4.2 Rapport Klantenlijst

Nu volgt het eenvoudigste rapport van de toepassing: een alfabeti-sche klantenlijst, zie figuur 9.28.

Dit rapport kunnen we met de Wizard Rapport snel maken. We zullen voor de uniformiteit gebruikmaken van een query.

Klik in het overzicht Query’s van het databasevenster en selecteer de optie Query maken in ontwerpweergave.Selecteer in het venster de tabel Klant.Selecteer alle velden uit de tabel Klant (het sterretje is voldoende). Sla de query op onder de naam rptKlantenlijst.

Page 327: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 315

Activeer in het overzicht Rapporten op de optie Rapport maken met wizard.Selecteer de zojuist gemaakte query rptKlantenlijst en vervolgens alle velden uit die query.In het daaropvolgende venster kunnen we groepeerniveaus aan-geven. In het klantenoverzicht komen die niet voor. In het volgende venster wordt de sorteervolgorde aangegeven, kies voor Naam. Kies hierna de optie In tabelvorm en Staand. In het voorlaatste venster kan een stijl opgegeven worden, kies de stijl Vet. Geef het rapport de titel (naam) Klantenlijst.

Een voorbeeld van de klantenlijst wordt vervolgens op het beeld-scherm getoond. Het kan zijn dat niet alle kopteksten volledig worden weergegeven. Dat heeft te maken met de printer die is aan-gesloten en ingesteld in Windows. Onze lijsten worden afgedrukt met een HP Laserjet 5000 en daarmee zijn de kopteksten Postcodeen Telefoonnummer niet volledig te zien. Mocht dit bij de gebruikte printer ook het geval zijn, dan is dat op de volgende wijze eenvou-dig te verhelpen.

Plaats het rapport in de ontwerpweergave. Maak het label Adresin de Paginakoptekst iets korter. Verplaats hierna het label Postcode iets naar links en maak het iets langer. Het label

Figuur 9.28

Page 328: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003316

Postcode is nu zichtbaar. Doe hetzelfde met de labels Woonplaatsen Telefoonnummer. Eventueel kunnen we de kopteksten ook inkorten, bijvoorbeeld Telefoonnummer wijzigen in Telefoonnr.Controleer vervolgens de wijzigingen in het afdrukvoorbeeld.

Macro van het rapport KlantenlijstHet rapport Klantenlijst is klaar. Als we het rapport openen, wordt het als afdrukvoorbeeld getoond. In de uiteindelijke toepassing moet de klantenlijst direct afgedrukt kunnen worden. Hiervoor hebben we een macro nodig. Die macro wordt gestart vanuit een menu-item dat met schakelborden wordt gemaakt. Meer hierover is te vinden in paragraaf 9.5, Schakelborden. We kunnen hierdoor de macro nog niet testen. Voor de macro is de macrogroep rptKlan-tenlijst gemaakt.

Hiermee wordt het rapport geopend en wordt het direct naar de printer gestuurd, door in het argument Beeld voor de instelling Afdrukken te kiezen.

9.4.3 Rapport Vertreklijst

Het rapport toont per vertrekdatum per reisnummer de klanten die vertrekken, zie figuur 9.29.

Het rapport is gemaakt met de Wizard Rapport. Het afdrukken van het rapport vindt plaats vanuit het formulier Datumbereik vertrek-lijst. In dat formulier worden een begindatum en een einddatum gevraagd. Alle reizen binnen die grenzen worden getoond in het rapport Vertreklijst. Het formulier Datumbereik vertreklijst is bij de formulieren van de toepassing al toegelicht, zie figuur 9.21. Het rapport Vertreklijst is als eerste gemaakt en daarna het formulier Datumbereik vertreklijst.

Maak een query genaamd rptVertreklijst.Kies uit de tabel Reis de velden Vertrekdatum en Reisnummer.Kies uit de tabel Bestemming de velden Plaats en Land, en uit de

Macro rptKlantenlijst.Afdrukken

Actie Argument Instelling

RapportOpenen Rapportnaam KlantenlijstBeeld Afdrukken

Page 329: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 317

tabel Klant de velden Naam en Woonplaats. Als laatste nemen we uit de tabel Boeking de velden Aantal volwassenen en Aantal kin-deren.Hierna gaan we het nieuwe rapport maken. Selecteer in het over-zicht Rapporten de optie Rapport maken met wizard. Kies de zojuist gemaakte query rptVertreklijst en selecteer hiervan alle velden. In het volgende scherm van de Wizard wordt gevraagd hoe we de gegevens willen weergeven, we kiezen volgens Reis.Voeg in het volgende scherm groepeerniveaus toe, zie figuur 9.30.We hebben voor het rapport twee groepeerniveaus nodig, name-lijk op vertrekdatum en daarbinnen op reisnummer. Kies eerst het groepeerniveau Vertrekdatum.

Standaard wordt in Access op datumvelden per maand gegroe-peerd. Dat is in ons voorbeeld niet wenselijk en we gaan dat aan-passen.

Klik op Opties voor groeperen.... Kies bij Groepeerintervallen voor Normaal en klik op OK.

Figuur 9.29

Page 330: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003318

Kies nog een groepeerniveau Reisnummer en ga naar het volgende scherm. Hierin kunnen we een sortering aanbrengen in de detailsectie. Kies voor Naam.Kies de gewenste opmaak: Met interval en Staand. In het voorlaatste scherm kunnen we een profiel aan het rapport geven, selecteer Vet. Geef in het laatste venster de titel (naam) Vertreklijst aan het rap-port. Het resultaat wordt getoond als afdrukvoorbeeld.

De koptekst van het rapport is niet helemaal naar wens. We kun-nen die eenvoudig aanpassen.

Plaats het rapport in de ontwerpweergave. Selecteer in de Paginakoptekst het label Aantal volwassenen.Zet het eigenschappenvenster op het scherm en verander in de tab Opmaak de eigenschap Bijschrift in Volw.. Verander zo ook het bijschrijft van het label Aantal kinderen in Kind..

Afhankelijk van de aangesloten en ingestelde printer dienen de labels van de kopteksten aangepast te worden. Onze lijsten worden afgedrukt met een HP Laserjet 5000 en hiermee wordt het label Woonplaats niet volledig afgedrukt. Dit is eenvoudig te verhelpen.

Figuur 9.30

Page 331: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 319

Maak in dezelfde sectie, Paginakoptekst, het label Volw. aan de linkerkant iets kleiner en maak het label Woonplaats aan de rech-terkant iets groter, zodat het volledig wordt getoond.

Het rapport is bijna gereed, we kunnen nog een verfijning aanbren-gen. Het rapport wordt gestart door het formulier Datumbereikvertreklijst. In dat formulier kunnen we een begin- en een eind-datum opgeven. Hierna wordt het rapport Vertrekdatum afgedrukt met alle reizen die in het opgegeven bereik vallen. Stel echter dat we een bereik opgeven dat geen gegevens oplevert. Er wordt dan een leeg formulier afgedrukt. Dat kunnen we ondervangen met een macro, gemaakt in de macrogroep rptVer-treklijst.

Macro van het rapport VertreklijstWe moeten een macro maken die controleert of er pagina’s getoond worden. Zo niet, dan mag het rapport niet worden afgedrukt. Binnen de macrogroep rptVertreklijst heeft die macro de naam GeenGegevens, zie figuur 9.31.

De volledige macro wordt getoond in figuur 9.31.

Figuur 9.31

Page 332: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003320

Deze macro wordt geactiveerd als er geen gegevens zijn om af te drukken. In de eerste actie van de macro wordt het afdrukken van het rapport geannuleerd, middels de actie GebeurtenisAnnuleren.De tweede actie stelt de gebruiker via een bericht daarvan op te hoogte. De laatste actie, die misschien minder makkelijk te begrijpen is, stopt álle macro’s. Er is immers nog een macro actief, namelijk de macro die het afdrukken heeft gestart, frmDatum-bereik vertreklijst.Ok. Die macro heeft maar twee acties: de eer-ste actie is het openen van het rapport Vertreklijst en de tweede het sluiten van het formulier Datumbereik vertreklijst. Door de actie AlleMacrosStoppen wordt die tweede actie níet uitgevoerd. Hierdoor blijft, na de melding dat er niets valt af te drukken, het formulier Datumbereik vertreklijst op het scherm. Desgewenst kan dan een nieuw bereik ingevoerd worden. De gemaakte macro rpt-Vertreklijst.GeenGegevens wordt gestart via de gebeurtenis ‘geen gegevens’ van het rapport.

Open het rapport Vertreklijst in de ontwerpweergave en plaats het eigenschappenvenster van het rapport op het scherm. Kies het tabblad Gebeurtenis en selecteer uit de keuzelijst van de eigenschap Bij geen gegevens de macro rptVertreklijst.GeenGegevens.Controleer de werking van het rapport Vertreklijst in combinatie met het formulier Datumbereik vertreklijst. Open daartoe het for-mulier Datumbereik vertreklijst.

9.4.4 Rapport Omzetlijst

De omzetlijst laat per reisnummer de behaalde omzet zien. Tevens wordt het totale bedrag dat tot nu toe betaald is voor dat reisnum-mer afgedrukt. Ook het percentage dat het reisnummer heeft bij-gedragen aan de totale omzet wordt weergegeven. Als een reis in het geheel niet is geboekt, wordt die reis getoond zonder omzet, zie figuur 9.32.

Macro rptVertreklijst.GeenGegevens

Actie Argument Instelling

GebeurtenisAnnuleren

Berichtvenster Bericht Bereik levert geen gegevens op.Pieptoon NeeType InformatieTitel Bericht

AlleMacrosStoppen

Page 333: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 321

De omzetlijst is gemaakt met de Wizard Rapport. Hierna zijn enkele kleine cosmetische veranderingen aangebracht. De omzetlijst is als volgt gemaakt. Om de omzet te bepalen is de tabel Constant noodzakelijk. De prijs per kind is namelijk afhankelijk van de korting die wordt gegeven voor een kind. Kinderen krijgen een kortingspercentage op de Prijs per persoon. Dat percentage is vastgelegd in de tabel Constant in het veld KinderKortingPerc. In onze voorbeelden hebben we geen gebruik gemaakt van de tabel Constant, maar van het formulier Constant, dat uiteraard dezelfde gegevens bevat. In onze voorbeelden hebben we hiervoor gekozen omdat de tabel Constant niet in alle situaties is toegestaan. Het formulier Constant kan wel altijd gebruikt worden.

Voor het ontwerpen van het rapport moet het formulier Constantgeopend worden, we hebben immers gegevens uit dat formulier nodig. Als het rapport gereed is, zorgen we er met behulp van macro’s voor dat het formulier Constant automatisch verborgen wordt geopend en gesloten.

Figuur 9.32

Page 334: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003322

Kies in het databasevenster het overzicht Formulieren en open het formulier Constant. Minimaliseer het formulier eventueel. Ga vervolgens naar het overzicht Query’s en kies de optie Query maken in ontwerpweergave. Kies in het venster de tabellen Reis,Bestemming en Boeking. Let op, selecteer eerst de tabel Reis, dan Bestemming en als laatste Boeking.

Als er in de tabel Reis een reis voorkomt waarvoor geen boekingen bestaan, dient die reis, zonder omzet, ook in het overzicht voor te komen. In een ‘standaard’-relatie (inner join) tussen de tabel Reisen een andere tabel worden reisnummers die niet geboekt zijn nietgetoond. Hiervoor moeten we een speciale relatie leggen, een zogeheten left of right outer join.

Dubbelklik op de relatie die getoond wordt op het scherm tussen de tabel Reis en de tabel Boeking. Hierdoor wordt een venster getoond met de Joineigenschappen, zie figuur 9.33.

Selecteer de tweede optie. Hierin staat: alle records uit de tabel Reis opnemen en alleen die records uit de tabel Boeking waarvoor de gekoppelde velden identiek zijn. Nu worden alle reizen getoond, ook als er geen enkele boeking voor bestaat.

Dit noemen we een left outer join, vandaar dat de tabel Reisals eerste geopend moet worden. Hierdoor staat de tabel aan de linkerkant ten opzichte van de overige tabellen. We hadden de tabel Reis ook als laatste kunnen selecteren. De tabel staat dan aan de rechterkant van de andere tabellen. Optie 3 uit het venster Joineigenschappen moet dan geselecteerd worden, een zogenaam-de right outer join.

Figuur 9.33

Page 335: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 323

Hierna selecteren we de velden voor de omzetlijst. Kies uit de tabel Reis de velden Reisnummer en Vertrekdatum. Kies uit de tabel Bestemming de velden Plaats en Land. Kies ten slotte uit de tabel Boeking het veld Betaald bedrag.Maak vervolgens een rekenveld Omzet. Klik met de muis in het eerstvolgende lege vakje van de rij Veld. Plaats daar de volgende formule, eventueel gebruikmakend van Shift-F2 (zoomen): Omzet: [Aantal volwassenen]*[Prijs per persoon] +[Aantal kinderen]*[Prijs per persoon]*(1-[Formulieren]![Constant]![KinderKortingPerc]). We zien dat in deze berekening het formu-lier Constant is gebruikt. Controleer de query in de gegevensblad-weergave.

Hierbij plaatsen we vier kanttekeningen:Bij bepaalde reisnummers wordt geen betaald bedrag en omzet getoond. Dat zijn de reizen die nog geen enkele boeking hebben.De gegevens worden (nog) niet gegroepeerd. Het groeperen voeren we uit in de Wizard Rapport. Die Wizard biedt bij het groeperen een aantal extra opties waarvan we gebruik kunnen maken.De volgorde waarin we de velden in de query plaatsen, is van belang. De Wizard Rapport rangschikt de gegevens zoals ze wor-den aangeboden: in ons voorbeeld eerst het veld Betaald bedrag en dan Omzet.Om niet-gerelateerde records te tonen kan ook gebruikgemaakt worden van een wizard. Kies hiervoor in het overzicht Query’s de optie Nieuw, Wizard Niet-gerelateerde records.

Sluit het venster en sla de query op onder de naam rptOmzetlijst.Kies het overzicht Rapporten en selecteer de optie Rapport maken met wizard.Selecteer de zojuist gemaakte query rptOmzetlijst waarvan alle velden in het rapport dienen te komen.In het volgende scherm van de Wizard kunnen we groepeerniveaus aangeven. Klik op Reisnummer, we moeten namelijk groeperen op reisnummer; we wensen tenslotte per reisnummer de totale omzet.Geef in het volgende scherm een sorteervolgorde op en selecteer opties voor totalen. Aangezien we groeperen op reisnummer, is de standaard sorteervolgorde op reisnummer. Dat hoeven we niet te veranderen. Wel gaan we opties voor totalen opgeven: klik op Opties voor totalen..., zie figuur 9.34.

Page 336: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003324

We willen de som van de velden Betaald bedrag en Omzet.Selecteer in het vak Weergeven de optie Details en totalen en zet een vinkje bij Percentage van totaal berekenen voor som. Hierdoor worden de gewenste percentages getoond. Klik vervolgens op OK.In het volgende scherm kunnen we een indeling van het rapport opgeven. Selecteer Links uitlijnen 1 en Staand. Geef in het voorlaatste scherm een opmaakprofiel op, kies het opmaakprofiel Vet. Geef als laatste een titel (naam) aan het rapport: Omzetlijst. De omzetlijst wordt vervolgens als afdrukvoorbeeld op het scherm getoond. Eventueel kunnen we ter controle een afdruk maken van de omzetlijst.

De omzetlijst is nog niet helemaal naar wens. We zijn alleen geïn-teresseerd in de totalen en niet in de detailgegevens. Als een reis tien keer is geboekt, worden tien keer vertrekdatum, plaats en land getoond. Eén keer lijkt ons voldoende. In het venster Opties voor totalen (zie figuur 9.34) hebben we Details en totalen geselecteerd. Als we in dat venster Alleen totalen hadden geselecteerd, zouden de velden Vertrekdatum, Plaats en Land niet meer getoond wor-den. Beide opties voldoen niet voor het overzicht dat we wensen, maar we kunnen met een kleine aanpassing het overzicht wel naar wens maken.

Plaats de omzetlijst in de ontwerpweergave. Sleep met de muis de balk Detail ongeveer één centimeter naar beneden, zodat het koptekstgebied iets groter wordt.

Figuur 9.34

Page 337: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 325

Verwijder uit de sectie Detail de besturingselementen Betaaldbedrag en Omzet.Selecteer in de sectie Detail tegelijkertijd de besturingselementen Vertrekdatum, Plaats en Land (Shift+muisklik). Sleep ze onder de bijbehorende labels in de sectie Koptekst (Reisnummer).Verwijder de detailsectie door de Voettekst (Reisnummer) omhoog te slepen (voettekstbalk vastzetten tegen detailbalk). Als we de detailbalk, in de eerste actie, te veel naar beneden hebben gesleept, kunnen we deze nu omhoog slepen.Het label behorende bij het percentage heeft als tekst Standaard(foutje in Access). We gaan die tekst veranderen in Percentage.Selecteer het label Standaard in de sectie Voettekst (Reisnummer)en wijzig de eigenschap Bijschrift, in het tabblad Opmaak, in Percentage. Door de langere tekst dient tevens de grootte van het label vergroot te worden.De som van Betaald bedrag en die van Omzet worden niet in de opmaak Valuta getoond. Selecteer het tekstveld Som Van Betaald bedrag en wijzig in de tab Opmaak de eigenschap Notatie in Valuta of Euro. Voer dit tevens uit voor het tekstveld Som Van Omzet.Het totaal betaalde bedrag en de totale omzet, die op de laatste pagina worden getoond, zijn ook niet voorzien van de opmaak Valuta. Die twee tekstvelden staan in het rapport in de sectie Rapportvoettekst. Verander ook voor die twee tekstvelden de eigenschap Notatie in Valuta of Euro.Bekijk het resultaat als afdrukvoorbeeld. Let in het bijzonder op de reizen die meermalen geboekt zijn.

De labels vertrekdatum en Betaald bedrag worden niet volledig getoond (afgedrukt op een HP Laserjet 5000). Ook het euro-sym-bool wordt bij het totale omzetbedrag niet getoond. We kunnen dit eenvoudig veranderen door de labels iets groter te maken.

Plaats het rapport in de ontwerpweergave. Selecteer het label Vertrekdatum en maak het aan de rechterkant iets groter. Selecteer het label Betaald bedrag en maak het aan de linkerkant iets groter.Kies in sectie Rapportvoettekst het tekstvak Omzet Eindtotaal Som en maak het aan de rechterkant iets langer.

Page 338: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003326

Het rapport is, op de macro’s na, klaar. Nog enige opmerkingen over het rapport:De lijst is afgedrukt op een HP Laserjet 5000. Als een andere prin-ter is aangesloten en ingesteld, kan de lay-out van het overzicht iets afwijken.Zijn er bij een bepaalde reis geen boekingen, dan wordt wel een record getoond, het record van de reis, maar totalen worden niet getoond (ook geen nullen).De besturingselementen Betaald bedrag en Omzet hebben we van het rapport verwijderd. We hadden ze, met behulp van hun eigen-schappen (Zichtbaar), ook onzichtbaar kunnen maken.Voor de berekening van de percentages wordt gebruikgemaakt van de eindtotalen Betaald bedrag Eindtotaal Som en Omzet Eindtotaal Som. Deze worden in de voettekst van het rapport getoond. Access doorloopt namelijk twee keer het rapport. De eerste keer worden de expressies in de detailregels berekend, de groepstotalen en eindtotalen bepaald en de lengte van het rapport gecontroleerd, zodat het aantal pagina’s bekend is. De tweede keer worden de expressies opgelost die verwijzen naar groepstotalen en eindtotalen. Hierdoor is het mogelijk in de detailsectie of lagere niveaus verwijzingen te plaatsen naar hogere niveaus. Dit is een zeer krachtige mogelijkheid van rapporten binnen Access.Als we in een groepssectie een rekenveld uit de detailsectie wen-sen te sommeren, is het niet toegestaan om te verwijzen naar het betreffende rekenveld. De gemaakte berekening moet dan herhaald worden. Een voorbeeld: in de detailsectie hebben we een rekenveld Regelbedrag met hierin de berekening =[Aantal] * [Prijs]. In de groepssectie is het niet toegestaan om =Som([Regelbedrag]) te gebruiken, we moeten de berekening herhalen =Som([Aantal] * [Prijs]).Als het wenselijk is om kopteksten en bijbehorende gegevens op één pagina weer te geven, kan een eigenschap van die sectie aan-gepast worden. Verander in het tabblad Opmaak de eigenschap Nieuwe rij of kolom in Voor en Na sectie.In dit rapport wordt gebruikgemaakt van het formulier Constanten niet van de tabel Constant. Het zou in dit rapport een foutmel-ding opleveren. Voor diegene die geïnteresseerd is in het waarom: de tabel Constant heeft geen relaties met de andere tabellen uit de database. Bij inner joins tussen de databasetabellen en de tabel Constant levert dat geen probleem op. Alle geselecteerde records worden verbonden met de tabel Constant. Maken we een left of

Page 339: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 327

right outer join in combinatie met de tabel Constant, dan krijgen we een melding op het scherm dat die relatie niet is toegestaan. Zonder de tabel Constant werkt de left of right outer join goed en kunnen we probleemloos gebruikmaken van de informatie uit het formulier Constant.

Macro’s van het rapport OmzetlijstBij dit rapport hebben we drie macro’s nodig: één om het formulier Constant te openen zodra het rapport wordt opgeroepen; één om het formulier Constant te sluiten nadat het rapport is afgedrukt, en ten slotte een macro om het rapport te openen en direct naar de printer te sturen. Die macro wordt gestart vanuit een menu dat met schakelborden wordt gemaakt. Meer hierover vinden we in para-graaf 9.5, Schakelborden. De macro’s zijn opgeslagen in macrogroep rptOmzetlijst, zie figuur 9.35.

De volledige macro wordt getoond in figuur 9.35. Hiermee wordt het formulier Constant verborgen geopend.

Figuur 9.35

Macro rptOmzetlijst.Open

Actie Argument Instelling

FormulierOpenen Formuliernaam ConstantBeeld FormulierVenstermodus Verborgen

Page 340: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003328

De volledige macro wordt getoond in figuur 9.35. Het formulier Constant wordt gesloten. Opslaan is niet noodzakelijk, er is im-mers niets veranderd.

De volledige macro wordt getoond in figuur 9.35. Hiermee wordt het rapport geopend en direct naar de printer gestuurd, door in het argument Beeld voor de instelling Afdrukken te kiezen.

De eerste macro moet geactiveerd worden tijdens het openen van de omzetlijst en de tweede macro wordt in werking gezet zodra het rapport van de omzetlijst wordt gesloten.

Plaats daartoe de omzetlijst in de ontwerpweergave op het scherm en activeer vervolgens het eigenschappenvenster van het rapport. Klik op het tabblad Gebeurtenis en selecteer in de keuzelijst Bij openen de macro rptOmzetlijst.Open en in de eigenschap Kies bij sluiten voor rptOmzetlijst.Sluiten.

De derde macro zal gestart worden door een optie uit het schakel-bord te selecteren. Meer hierover in de volgende paragraaf.

9.5 Schakelborden

De toepassing is bijna klaar: alle query’s, formulieren en rapporten zijn gemaakt, alleen de menu’s en submenu’s moeten nog gemaakt worden. In paragraaf 9.2 is al toegelicht dat deze menu’s niet ver-ward mogen worden met menubalken. Deze menu’s worden

Macro rptOmzetlijst.Sluiten

Actie Argument Instelling

Sluiten Objecttype FormulierObjectnaam ConstantOpslaan Nee

Macro rptOmzetlijst.Afdrukken

Actie Argument Instelling

RapportOpenen Rapportnaam OmzetlijstBeeld Afdrukken

Page 341: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 329

gemaakt met vensters. Om naamsverwarring te voorkomen wor-den ze binnen Access schakelborden genoemd. Het hoofdmenu van de toepassing wordt door het schakelbord getoond in figuur 9.36.

Menu’s en submenu’s zijn in Access eenvoudig te maken met scha-kelborden. In paragraaf 9.2 zijn deze al vastgelegd.

In onze toepassing hebben we drie menu’s (schakelborden) nodig: een hoofdmenu en twee submenu’s. In het hoofdmenu komen drie items, te weten Boekingen, Overzichten en Onderhoud.Selecteren we het item Boekingen, dan komen we direct in het formulier Boeking. Dit formulier wordt het meest toegepast bin-nen reisbureau ’t Zonnetje, vandaar dat het direct te selecteren is in het hoofdmenu. Kiezen we één van de twee overige items uit het hoofdmenu, dan komen we in de submenu’s. Verder komt in ieder menu een keuzemogelijkheid Sluiten om één menuniveau terug te selecteren. In het hoofdmenu wordt dan de toepassing afgesloten.

HoofdmenuBoekingenOverzichtenOnderhoudSluiten

Figuur 9.36

Page 342: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003330

Kiezen we in het hoofdmenu het item Overzichten, dan komen we in het submenu Overzichten. Hierin wordt een overzicht getoond van alle mogelijke overzichten (rapporten/lijsten) binnen de toe-passing. Na het selecteren worden de rapporten op de printer afgedrukt.

Submenu OverzichtenKlantenlijst VertreklijstOmzetlijstSluiten

Na de keuze Onderhoud uit het hoofdmenu komen we in het sub-menu Onderhoud. Hierin kunnen we een keuze maken uit het onderhouden van de basisgegevens. Zo kunnen we toevoegen, ver-wijderen en wijzigingen doorvoeren in de basisgegevens.

Submenu OnderhoudKlantenReizenBestemmingenConstantenSluiten

Nu we precies weten hoe de verschillende menu’s eruit moeten zien, gaan we de menu’s maken met de optie Schakelbordbeheer van Access.

Kies in de menubalk Extra de optie Databasehulpprogramma’s, 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 menu’s. 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

Page 343: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 331

blijken uit de toelichting, enige persoonlijke aanpassingen aanbren-gen. Het onderdeel schakelbordbeheer opent het dialoogvenster Schakelbordbeheer, zie figuur 9.37.

In dit venster kunnen we menu’s en schakelbordpagina’s opge-ven. Standaard wordt al één hoofdmenu aangemaakt, namelijk Hoofdschakelbord. We gaan twee nieuwe (sub)menu’s (schakel-borden) maken.

Klik op de knop Nieuw. In het venster kunnen we de naam van het nieuwe schakelbord opgeven.Wijzig de naam in Overzichten en klik op OK. Klik nogmaals op de knop Nieuw, wijzig de naam in Onderhouden klik op OK. De drie menu’s (schakelborden) zijn nu gemaakt.Vervolgens moeten de menu’s van items worden voorzien. Selecteer Hoofdschakelbord en klik op Bewerken. In dit dialoog-venster kunnen we de items (onderdelen) van het hoofdmenu opgeven, zie figuur 9.38.

Figuur 9.37

Figuur 9.38

Page 344: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003332

Voordat we de menu-items gaan specificeren, veranderen we eerst de naam van het hoofdschakelbord.

Verander de naam Hoofdschakelbord in Hoofdmenu. Klik hierna op de knop Nieuw. Er volgt een venster waarin we het eerste menu-item kunnen invoeren, zie figuur 9.39.

Typ in het eerste item Tekst de tekst van het eerst menu-item, Boekingen.Geef daarna op wat er moet gebeuren als deze optie wordt gese-lecteerd. De verschillende mogelijkheden worden in de keuzelijst getoond. Aangezien het formulier Boeking moet worden geopend, selecteren we Formulier openen in bewerkingsmodus. Selecteer in de derde keuzelijst het formulier dat geopend moet worden, Boeking. Merk op dat het derde vakje afhankelijk is van het tweede. In dit voorbeeld worden alle formulieren uit de toepas-sing getoond. Klik vervolgens op OK, we komen terug in het vorige venster. We definiëren 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 gedefinieerd worden. Klik opnieuw op de knop Nieuw in het venster Schakelbordpaginabewerken. 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 submenu’s terugkeren naar het hoofdmenu.

Figuur 9.39

Page 345: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 333

Klik voor de laatste keer voor het hoofdmenu op de knop Nieuw. Voer achtereenvolgens in: Sluiten en Toepassing afsluiten. Merk op dat er maar twee items zijn. Klik hierna op de knop OK. Het hoofdmenu is klaar. Klik op de knop Sluiten in het venster Schakelbordpagina bewerken.

Er dient nog opgemerkt te worden dat in dit menu ook items gewij-zigd of verwijderd kunnen worden, of op een andere plaats in het menu gezet kunnen worden met de knoppen Omhoog en Omlaag. Verder is het belangrijk te weten dat er maximaal acht items in één menu passen.

Nu moeten de submenu’s Overzichten en Onderhoud nog gemaakt worden. Dit gaat op dezelfde wijze.

Selecteer in het venster Schakelbordbeheer het item Overzichten en klik hierna op de knop Bewerken. In het volgende venster, Schakelbordpagina bewerken, kunnen we de items van dit menu (schakelbord) opgeven. Klik op de knop Nieuw en kies achtereenvolgens Klantenlijst, Macro uitvoeren en rptKlantenlijst .Afdrukken.

Om de klantenlijst af te drukken hebben we immers voor het rap-port Klantenlijst een macro gemaakt, genaamd rptKlantenlijst.Afdrukken, die de klantenlijst direct naar de printer stuurt. We kunnen in de tweede keuzelijst ook Rapport openen selecteren, maar dan wordt het rapport als afdrukvoorbeeld getoond. We wil-len het rapport echter direct naar de printer sturen, vandaar dat de macro voor het rapport Klantenlijst noodzakelijk is.

Klik na de selecties op de knop OK.Voer de vorige acties nog drie maal uit. Hieronder volgt een beschrijving van de gegevens die moeten worden ingevoerd.

Argument Instelling

Tekst Vertreklijst

Opdracht Formulier openen in bewerkingsmodus

Formulier Datumbereik vertreklijst

Page 346: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003334

De Vertreklijst wordt afgedrukt nadat eerst een formulier, Datumbereik vertreklijst, op het scherm is getoond waarin we een begin- en einddatum kunnen opgeven. Voor de Vertreklijst is het niet noodzakelijk om een macro te maken die het overzicht af-drukt, aangezien dat door de macro van het formulier Datumbereikvertreklijst wordt uitgevoerd.

De omzetlijst dient met een macro gestart te worden, zodat deze direct naar de printer gestuurd kan worden.

Kiezen we deze optie in het menu, dan gaan we één niveau terug, naar het hoofdmenu. De menu-items voor het sub-menu Overzichten zijn gedefinieerd; we kunnen het venster Schakelbordpagina bewerken afsluiten door op de knop Sluiten te klikken.

Het laatste schakelbord (submenu Onderhoud) gaan we op dezelf-de wijze maken.

Selecteer in het venster Schakelbordbeheer de optie Onderhoud en klik op de knop Bewerken. Hierna moeten de vijf items uit het submenu Onderhoud gedefi-nieerd worden. We doen dit op dezelfde wijze als bij het submenu Overzichten. Hieronder volgen de gegevens die ingevoerd moeten worden.

Argument Instelling

Tekst Omzetlijst

Opdracht Macro uitvoeren

Macro rptOmzetlijst.Afdrukken

Argument Instelling

Tekst Sluiten

Opdracht Naar Schakelbord gaan

Schakelbord Hoofdmenu

Argument Instelling

Tekst Klanten

Opdracht Formulier openen in bewerkingsmodus

Formulier Klant

Page 347: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 335

Het formulier Klant wordt geactiveerd onder dit item:

Het formulier Reis wordt geopend onder dit item:

Het formulier Bestemming wordt geactiveerd onder dit item:

Het formulier Constant wordt geopend onder dit item.

Wordt deze optie uit het menu gekozen, dan gaan we één niveau terug, naar het hoofdmenu. De menu-items voor sub-menu Overzichten zijn gedefinieerd, we kunnen het venster Schakelbordpagina bewerken afsluiten door op de knop Sluiten te klikken. De menu’s (schakelborden) zijn gemaakt.

Sluit alle vensters van Schakelbordbeheer en kies in het database-venster het overzicht Formulieren. Open het formulier Schakelbord en controleer de werking van de gemaakte menu’s.

Het formulier Schakelbord wordt in een afwijkende kleur getoond ten opzichte van onze overige formulieren. We gaan het formulier

Argument Instelling

Tekst Reizen

Opdracht Formulier openen in bewerkingsmodus

Formulier Reis

Argument Instelling

Tekst Bestemmingen

Opdracht Formulier openen in bewerkingsmodus

Formulier Bestemming

Argument Instelling

Tekst Constanten

Opdracht Formulier openen in bewerkingsmodus

Formulier Constant

Argument Instelling

Tekst Sluiten

Opdracht Naar Schakelbord gaan

Schakelbord Hoofdmenu

Page 348: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003336

Schakelbord op een aantal punten aanpassen, zodat het overeen-stemt met onze overige formulieren. We kunnen het formulier Schakelbord aanpassen aan onze eigen wensen zolang de detail-sectie, het gedeelte waar de knoppen zitten, niet wordt veranderd.

Plaats het formulier Schakelbord in de ontwerpweergave op het scherm. Open het eigenschappenvenster van het formulier. Het schakelbord is in een aantal secties verdeeld.Selecteer de HorizontalHeaderBox (dat is de bovenste sectie). Verwijder deze sectie (via Knippen).De tekst ’t Zonnetje is met schaduw afgebeeld. Dit is gerealiseerd door twee labels vlak onder elkaar te plaatsen. Selecteer Label2 en verwijder dit label (Delete-toets).Selecteer Label1. Verander in het tabblad Opmaak de eigenschap Voorgrondkleur in zwart (klik op de drie puntjes) en de eigen-schap Tekengewicht in Vet. Nu plaatsen we de gebruikte lichtgele formulierkleur in de detail-sectie. Klik op de balk Detail of selecteer deze uit de keuzelijst en verander in het eigenschappenvenster, tab Opmaak, de eigenschap Achtergrondkleur in lichtgeel door op de drie puntjes te klikken.

De linkerkant van het schakelbord is gereserveerd voor een af-beelding. Met behulp van een tekenprogramma hebben wij voor reisbureau ’t Zonnetje een afbeelding samengesteld, de naam is: ZonLogo.gif.

Selecteer de sectie Picture van het schakelbord en selecteer in het eigenschappenvenster de eigenschap Figuur, in het tabblad Opmaak. Klik op de drie puntjes en kies voor het gif-plaatje Zonlogo.

Verder kunnen we overwegen om de eigenschap Systeemmenu van het formulier Schakelbord uit te schakelen, zodat alleen via de knop Sluiten het formulier beëindigd kan worden. Wij hebben dat niet gedaan, zodat we met de X-knop kunnen sluiten zonder de database af te sluiten. Het schakelbord is aangepast aan onze smaak.

Bekijk het resultaat in de formulierweergave en pas eventueel de afmetingen aan. Klik in de menubalk op de knop Opslaan om die afmetingen vast te leggen.

Page 349: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 337

Om de toepassing volledig te maken moeten we nog een verande-ring aanbrengen. We wensen het formulier Schakelbord meteen te starten zodra de database wordt geopend; we komen dan meteen in het hoofdmenu. Dat kan gerealiseerd worden door een macro te maken met de naam AutoExec, waarin staat dat het formulier Schakelbord geopend moet worden. Er is echter een betere metho-de, waarbij we extra instellingen kunnen aangeven, zoals het onderdrukken van het databasevenster.

Selecteer daartoe in de menubalk Extra de optie Opstarten..., het formulier Opstarten wordt getoond, zie figuur 9.40.

Bij Toepassingsnaam kunnen we eventueel een afwijkende titel opgeven. Kies voor de titel Reisbureau.In de keuzelijst Formulier/pagina weergeven kunnen we opgeven welk formulier geopend moet worden zodra de database wordt gestart. Selecteer het formulier Schakelbord.In het vakje Toepassingspictogram kunnen we een pictogram opgeven voor de toepassing. Wij hebben op de cd-rom een picto-gram voor onze database staan, genaamd ’t Zonnetje.ico. Door te klikken op de drie puntjes kunnen we aangeven waar het picto-gram te vinden is. We moe-ten de map aanwijzen waarin we de gegevens van de cd-rom hebben gekopieeerd. In figuur 9.40 wordt een map geselecteerd waarin we de database en overige bestanden hebben geplaatst. Op de statusbalk van Windows wordt nu het pic-togram, een tropisch eiland, zichtbaar.Verwijder het vinkje bij Databasevenster weergeven. Hierdoor wordt het databasevenster niet meer getoond. Verwijder ook het

Figuur 9.40

Page 350: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003338

vinkje bij Statusbalk weergeven. De Access statusbalk wordt dan niet meer weergegeven.De Menubalk en een Snelmenubalk veranderen we niet. In het onderste deel van het scherm kunnen we een aantal opties met betrekking tot menu- en werkbalken opgeven. Verwijder het vinkje bij Volledige menu’s toestaan, Access gebruikt dan een reeks beknopte ingebouwde menu’s, die bijvoorbeeld geen opmaak-opdrachten bevatten. De standaard snelmenu’s wensen we niet, alle mogelijkheden zitten al in de formulieren en knoppen ingebouwd. Verwijder daartoe het vinkje bij Standaardsnelmenu’s toestaan. De ingebouwde werkbalk mag niet getoond worden in onze toepas-sing. Verwijder het vinkje bij Ingebouwde werkbalken toestaan. Evenmin willen we dat de werkbalken gewijzigd kunnen worden, verwijder daartoe het vinkje bij Wijzigingen in werkbalk/menu toestaan.In het geavanceerde gedeelte: de speciale toetsen, zoals F11 om het databasevenster te tonen of Ctrl+F11 om te kunnen schakelen tus-sen de aangepaste menubalk en de ingebouwde menubalk, zijn niet wenselijk. Vink daartoe Speciale Access-toetsen gebruiken af.Klik op de knop OK en start de toepassing opnieuw. De werkbalk is verdwenen, de menubalk is verkleind en bij de applicatie is een pictogram te zien.

Let op!Iedere keer als de toepassing wordt gestart, wordt de verkleinde menubalk getoond. Het aanbrengen van wijzigingen in de database is niet meer mogelijk. De werkbalk en de ingebouwde menubalk worden niet meer getoond. Om de toepassing te starten zonder de opgegeven instellingen uit het menu Opstarten, starten we de toe-passing met de Shift-toets ingedrukt!

Hiermee is de applicatie voltooid en kunnen we ermee aan de slag. Nu volgen nog enige opmerkingen over het operationeel maken van de applicatie.

Tijdens het bouwen van de applicatie neemt de omvang van de database toe. Allerlei overbodige gegevens worden door Access ‘achter de schermen’ bewaard. Die overbodige gegevens kun-nen verwijderd worden door in het menu Extra te kiezen voor Databasehulpprogramma’s, Database comprimeren en herstellen. De omvang van de database zal aanzienlijk verkleind worden.

Page 351: Databaseontwikkeling Access 2003

9 Het bouwen van een toepassing 339

Iedereen die weet dat een toepassing volledig te benaderen is door deze op te starten met de Shift-toets ingedrukt, kan eenvoudig (ongewenste) wijzigingen aan onze toepassing aanbrengen.We kunnen een compacte versie van de database maken door in het menu Extra voor Databasehulpprogramma’s te kiezen. Selecteer vervolgens Mde-bestand maken. Het hulpprogramma vraagt om een naam en locatie voor het opslaan van onze com-pacte versie. Er wordt een versie gemaakt met de extensie Mde.Deze versie compileert de code, die automatisch is gemaakt door de Wizard van de opdrachtknoppen, en comprimeert de database. Om wijzigingen door te voeren in het ontwerp van onze database, dienen we onze oorspronkelijke versie te gebruiken. Aangezien de Mde-versie compacter is, werkt deze sneller dan de originele ver-sie!Als we de applicatie willen verspreiden onder gebruikers die niet over een volledige versie van Access beschikken, kunnen we een speciaal pakket kopen, genaamd Access Developer Extentions.Hiermee kunnen we een runtime-versie van onze toepassingen maken en deze distribueren.

Page 352: Databaseontwikkeling Access 2003
Page 353: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language

Bij de bovenstaande opsomming gaan we ervan uit dat de leerlin-gen een case uitwerken waarbij de docent/begeleider de rol van opdrachtgever/gebruiker speelt.

10.1 Inleiding

Bij het werken met databases hebben we ons tot nu toe beperkt tot het werken met één standaardpakket op de pc. Er bestaan echter nog vele andere databasepakketten, met name voor toepassingen op grotere computers. Enkele bekende grote databasemanagement-systemen (DBMS’en) zijn Oracle, Ingres, SQLserver en DB2. Een kenmerk van deze pakketten is dat ze geschikt zijn voor het bedie-nen van vele gebruikers tegelijkertijd en het verwerken van grote hoeveelheden gegevens.

Als gebruikers informatie willen opvragen uit de gebruikte database, dienen zij zich te bedienen van de vraagtaal die in het gebruikte pakket is opgenomen. In principe betekent dit dat voor ieder DBMS een andere vraagtaal moet worden gebruikt. Gelukkig ondersteunen vrijwel alle pakketten tegenwoordig een gemeenschappelijke vraagtaal: SQL.

SQL, Structured Query Language, is in eerste aanzet ontwikkeld door IBM, maar intussen geëvolueerd tot een standaard. Kunnen we werken met deze vraagtaal, dan betekent dit dus dat we infor-matie kunnen opvragen uit vele databasesystemen.

Page 354: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003342

In dit hoofdstuk zullen we ons beperken tot het formuleren van query’s. Het toevoegen van gegevens aan de database of het wij-zigen hiervan zal slechts zijdelings worden besproken. De reden daarvoor is het feit dat bij het toevoegen en wijzigen van gegevens vrijwel altijd gebruikgemaakt wordt van een applicatieprogramma, dat de gebruiker op interactieve manier laat werken. Kennis van SQL is daarbij eigenlijk niet noodzakelijk.

Ook voor het formuleren van standaard-query’s zullen vaak appli-caties ontwikkeld worden. Het is echter ondoenlijk om voor iedere informatiebehoefte, zeker voor die welke slechts sporadisch optre-den, een applicatie op te zetten. Dat kost te veel tijd en geld.

Binnen Access kunnen we voor het opvragen van informatie altijd gebruikmaken van de query wizard, waardoor het lijkt alsof we geen kennis van SQL hoeven te hebben. Op de achtergrond vormt Access de query echter wel om tot SQL. Deze code is ook op te vragen.

De reden om in dit boek toch SQL op te nemen is tweeledig. Ener-zijds kunnen we met SQL terecht bij ieder modern DBMS, waar-onder Oracle of DB2. Anderzijds zijn er enkele soorten opvragin-gen en bewerkingen die we binnen Access alleen maar met SQL kunnen uitvoeren. We kunnen dus ook binnen Access niet om SQL heen.

10.2 Begrippen

Ter herinnering enige begrippen. SQL ziet de gegevens alsof deze liggen opgeslagen in tabellen. Tijdens het logisch ontwerp spraken we over entiteittypen. Een tabel bestaat uit een aantal rijen (ofte-wel entiteit-occurrences) en kolommen (oftewel attribuuttypen).

Tabel ARTIKEL

Artikelnummer Omschrijving Verkoopprijs Voorraad Leveranciercode

64447 V-snaar 56,00 5 J363375558 Accu 225,00 2 K377384494 Stuurhoes 23,95 4 P477446644 Binnenspiegel 37,50 1 J3633enzovoort

kolommen

Rijen

Page 355: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 343

Om iedere rij uniek te kunnen identificeren is er een gegeven, of een combinatie van gegevens die iedere rij uniek maken, de pri-maire sleutel. In de tabel Artikel is dat het artikelnummer. In een rij kunnen gegevens voorkomen die verwijzen 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 identificeren met behulp van de code.

Om de betrouwbaarheid van de gegevens te ‘waarborgen’, worden er aan de tabellen enkele eisen gesteld:Een primaire sleutel mag geen overbodige attributen bevatten (minimaliteiteis).Er mogen geen dubbele rijen voorkomen en een primaire sleutel moet altijd een gedefinieerde waarde hebben (identity integrity).Iedere waarde die een vreemde sleutel aanneemt, moet ook als sleutelwaarde voorkomen (referential integrity).Kolommen bevatten alleen elementaire gegevens, samengestelde gegevens dienen dus opgesplitst te worden.

10.3 Opbouw hoofdstuk

In dit hoofdstuk zal worden gewerkt met twee verschillende data-bases. De eerste betreft een database van een bibliotheek, die zal worden gebruikt om de theorie toe te lichten aan de hand van enige voorbeelden. Daarnaast dient een aantal opdrachten te worden gemaakt, waarbij deze database moet worden gebruikt. Deze opdrachten kunnen niet op de computer worden uitgewerkt, omdat de betreffende database alleen op papier bestaat. De antwoorden van de opdrachten staan op de meegeleverde cd-rom bij dit boek.

De tweede database betreft een database van een groothandel in alcoholische dranken. Vraag deze aan de docent. De naam is Alco en hij zal worden gebruikt om je vaardigheden in de praktijk te toetsen. De praktijkgerichte opdrachten moeten worden uitgewerkt met behulp van deze database.

Page 356: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003344

10.4 Database Bibliotheek (theorieopdrachten)

Een grote bibliotheek heeft meerdere filialen. Van alle uitgaven kunnen er meerdere exemplaren aanwezig zijn, zelfs in één filiaal. Een lezer mag alleen maar boeken lenen in het eigen filiaal. Lezers kunnen uitgeleende boeken laten reserveren. Men maakt gebruik van zes verschillende tabellen, met de volgende opbouw:

LEZER UITGAVE UITLENING

Lezernr ISBN * Lezernr

Naam Titel * Exemplaarnr

Adres Schrijver * Huurdatum

Postcode Uitgeverij * Retourdatum (datum waarop

Plaats Prijs * boek is teruggebracht)

Telefoon

Geboortedatum

* Filiaalnr

FILIAAL EXEMPLAAR RESERVERING

Filiaalnr Exemplaarnr * Lezernr

FilAdres * Filiaalnr * ISBN

FilPostcode * ISBN * Datum

FilPlaats

FilTelefoon

De primaire sleutels zijn onderstreept. Vreemde sleutels zijn voor-zien van een sterretje.

Het bijbehorende ER-diagram is weergegeven in figuur 10.1.

o.b.v. ISBN o.b.v. ISBN

o.b.v. lezernr

o.b.v. filiaalnr o.b.v. filiaalnr

o.b.v. lezernr

o.b.v. exemplaarnr

Reservering Uitgave

FiliaalLezer

Uitlening

Exemplaar

Figuur 10.1

Page 357: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 345

10.5 Database Alco (praktijkopdrachten)

Een groothandel in alcoholische dranken maakt onder meer gebruik van de onderstaande tabellen.

ARTIKEL SOORT PRODUCTGROEP

Artikelcode Soortnr Productgroepnr

* Soortnr * Productgroepnr Productnaam

Jaar Naam

Inhoud Kleur

Adviesverkoopprijs Alcoholpercentage

Opvoorraad

FACTUUR FACTUURREGEL AFNEMER

Factuurnummer * Factuurnummer Afnemernummer

* Afnemernummer * Artikelcode Naam

Factuurdatum Verkoopaantal Adres

Verkoopprijs Postcode

Plaats

Regio

De primaire sleutels zijn onderstreept. Vreemde sleutels zijn voor-zien van een sterretje.

Het bijbehorende ER-diagram is weergegeven in figuur 10.2.

10.6 Opvragingen uit één tabel

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

factuurregel factuur afnemer

Artikel Soort Productgroep

o.b.v. artikelcode

o.b.v. productgroepnro.b.v. soortnr

o.b.v. afnemernro.b.v. factuurnr

Figuur 10.2

Page 358: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003346

SELECT <te tonen kolom> [,<te tonen kolom>]FROM <tabelnaam>[ WHERE <voorwaarde> ] ;

De teksten tussen de scherpe haken <> geven aan dat daar de betreffende gegevens dienen te worden ingevuld. Alles tussen rechte haken [] geeft aan dat het gebruik van dat gedeelte toegesta-an, maar niet verplicht is. De afsluitende puntkomma geeft het einde van de opdracht aan. Deze is verplicht, omdat anders wordt gewacht met de uitvoering van het commando.

Het overzicht wordt getoond in rijen. Per geselecteerde rij uit de tabel worden de gevraagde kolommen afgedrukt. De uitvoer bestaat dus ook weer uit een tabel.

De namen van alle lezers uit Rotterdam:

SELECT naamFROM lezerWHERE plaats = ‘Rotterdam’ ; (let op de aanhalingstekens)

Uitvoer :NAAMJansenPietersenGerritsen enzovoort

De titels en prijzen van alle boeken van Hermans:

SELECT titel, prijsFROM uitgaveWHERE schrijver = ‘Hermans’ ;

Uitvoer :TITEL PRIJSOnder professoren 34,95Donkere kamer van Damocles 29,95 enzovoort.

voorbeelden

Page 359: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 347

TerzijdeLet 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 filialen die binnen Breda gelegen zijn:

SELECT filadres, filtelefoonFROM filiaalWHERE filplaats = ‘Breda’ ;

Alle gegevens afdrukken van alle lezers:

SELECT *FROM lezer ;

We zien dat het niet noodzakelijk is om een voorwaarde op te nemen in het SELECT-statement. Tevens zien we het gebruik van het teken ‘*’, wat aangeeft dat alle kolommen van de genoemde tabel moeten worden afgedrukt.

We kunnen bij de WHERE-optie gebruikmaken van meerdere voorwaarden tegelijkertijd. De afzonderlijke voorwaarden kunnen we door de logische operatoren OR of AND met elkaar verbinden. Bij het door elkaar gebruiken van OR en AND is het verstandig met haakjes te werken, om de juiste voorwaarden te combineren.

De titels van de boeken van Wolkers die minder dan 25,– kosten, en de titels van de boeken van Campert die bij uitgeverij ‘de brede letter’ zijn uitgegeven.

SELECT titelFROM uitgaveWHERE (schrijver = ‘Wolkers’

AND prijs < 25 )OR (schrijver = ‘Campert’

AND uitgeverij = ‘de brede letter’) ;

Bij het opgeven van voorwaarden, moeten we teksten omgeven door aanhalingstekens; getallen kunnen we direct opnemen.

voorbeeld

Page 360: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003348

Als we in een voorwaarde een datumaanduiding willen gebrui-ken, moeten we de datum standaard aangeven volgens het formaat mm-dd-jj, omgeven door twee hekjes. De datum 2 april 1955 moeten we dus opgeven als #4-2-55# of als #04-02-55#. De eeuw-aanduiding laten we standaard weg, tenzij we Windows anders hebben ingesteld. Hoe we de datum precies moeten intoetsen, is afhankelijk van de instellingen van Windows. Ga dat dus zelf even na. Ongeacht de datuminstelling van Windows moeten we binnen het SQL-deel van Access altijd met de Amerikaanse notatiewijze te werken, dus eerst de maand- en daarna pas de dagaanduiding! We kunnen ook gebruikmaken van een alternatieve Amerikaanse notatie, te weten: dd-MMM-jj, waarbij de maand wordt aangege-ven door de eerste drie letters. De datum 3 mei 1981 wordt dan #3-MAY-81#. In de Nederlandse versie gebruiken we uiteraard #3-MEI-81#.

TerzijdeDe datumnotatie tussen hekjes is geen standaard SQL-notatie en werkt alleen in Access-SQL. In andere databases wordt een andere datumnotatie gebruikt. Hetzelfde geldt voor de hieronder besproken jokers (wildcards). In standaard SQL worden respec-tievelijk _ en % gebruikt. Standaard werkt Access voor wat betreft SQL met de standaard ANSI 89. Deze wijkt op een aantal punten af van de standaard ANSI 92 die door de meeste andere systemen wordt gebruikt. Om beter aan te sluiten bij de praktijk (MS SQL-server) is het daarom vanaf versie 2000 mogelijk om Access zo in te stellen dat ook dit zich houdt aan de standaard ANSI 92. Maar query’s die gemaakt zijn volgens de ene standaard, kunnen niet zonder meer gebruikt worden in de andere. Vooral bij het gebruik van wildcards zijn er belangrijke verschillen. In dit boek is ervoor gekozen om Access te gebrui-ken volgens de standaard ANSI 89. In bijlage B staat meer infor-matie over hoe je kunt overschakelen naar ANSI 92.

In de voorwaarden kunnen we gebruikmaken van:1. = , > , < , <= , >= en <>

WHERE prijs >= 49

Page 361: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 349

2. BETWEEN ... AND ..... (De grenswaarden voldoen ook!)IN ( waardenverzameling ) NOT LIKE Bij de operator LIKE kunnen we gebruikmaken van de

tekens ‘?’ en/of ‘*’. Het teken ‘?’ geeft aan dat op die positie één willekeurig teken moet staan. Het teken ‘*’ geeft aan dat op die plaats géén teken hoeft te staan, of één willekeurig teken, of een hele serie willekeurige tekens.

IS NULL Vergelijken op een leeg veld. Let op, gebruik niet het teken ‘=’, maar het woord IS.

WHERE prijs BETWEEN 20 AND 30

WHERE prijs IN ( 10, 15, 27, 49 )

WHERE prijs NOT IN ( 10, 15, 27, 49 )

WHERE schrijver LIKE ‘?olk*’De laatste voorwaarde selecteert dus bijvoorbeeld de schrijvers Wolkers, Tolkien en Kolk.

WHERE Geboortedatum LIKE ‘02-03-*’ Welke lezers zijn er op 3 februari jarig? Let op, nu zijn de nullen wel verplicht en de datum moet als tekst zijn opgegeven!

WHERE schrijver <> ‘Wolkers’OR schrijver IS NULLZonder de toevoeging ‘OR schrijver IS NULL’ worden de boeken waarbij geen schrijver is opgenomen niet afgedrukt omdat een vergelijking met een leeg veld altijd de waarde FALSE oplevert. Door een extra voorwaarde op te nemen en dus expliciet te testen op een leeg veld, worden ook deze rijen opgenomen in de uitvoer-tabel.

WHERE DatumRetour - DatumLenen > 7Wie heeft er langer dan een week geleend? Het verschil tussen twee datums levert het aantal dagen dat daartussen ligt. We kun-nen dus gewoon met datums rekenen!

WHERE Geboortedatum BETWEEN ‘05-01-88’ AND ‘05-31-88’Welke lezers zijn er in Mei 1988 geboren?

voorbeelden

Page 362: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003350

Het kan voorkomen dat bij bepaalde opvragingen meerdere keren dezelfde rij zou worden afgedrukt. Als we bijvoorbeeld alle woon-plaatsen van de lezers laten afdrukken, zullen diverse woonplaat-sen zeer waarschijnlijk meerdere keren voorkomen. Als we alle geproduceerde rijen slechts één maal in het overzicht willen opne-men, dan breiden we het SELECT-statement uit met de toevoeging DISTINCT. Door de verwerkingswijze van DISTINCT blijkt dat de uitvoer nu ook automatisch gesorteerd is op volgorde van de te tonen kolommen.

SELECT DISTINCT woonplaatsFROM lezer ;

Om een overzicht van de namen van de schrijvers met de naam van de uitgeverij van het betreffende boek te krijgen, zonder dub-bele combinaties, formuleren we het volgende commando:

SELECT DISTINCT schrijver, uitgeverijFROM uitgave ;

Hierbij kan wel de naam van een schrijver meerdere keren voor-komen, evenals de naam van een uitgeverij, maar iedere combina-tie wordt hoogstens één keer in het overzicht opgenomen.

Opgaven

10.1 Verzorg aan de hand van de tabellen die behoren bij de bibliotheek-database de volgende overzichten:a. Alle gegevens van alle uitgaven.b. De telefoonnummers en postcodes van alle lezers uit Leiden die

nog niet meerderjarig zijn.c. De namen van de schrijvers die ooit een boek hebben uitgege-

ven bij uitgeverij ‘De dunne kaft’.d. De namen van de uitgeverijen die ooit een boek van Wolkers

hebben uitgebracht.e. De datums waarop lezer 64489 boeken heeft geleend, na 1980.f. De nummers van de filialen die minimaal één exemplaar heb-

ben van het boek met ISBN 9062335306.

10.2 Wanneer kan het voorkomen dat in een overzicht meerdere rijen hetzelfde zijn? Gebruik in het antwoord de term ‘primaire sleutel’.

Page 363: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 35110 SQL, Structured Query Language 351

10.3 a. Geef een mening omtrent het opnemen van de kolom ‘Prijs’ in de tabel UITGAVE.

b. Geef een mening omtrent de opbouw van de sleutel in de tabel UITLENING.

10.7 SQL gebruiken in Access

Om binnen Access met SQL te werken moeten we eerst de betref-fende database openen via Bestand, Database openen. Selecteer het overzicht Query’s. Om een nieuwe query te ontwerpen gebrui-ken we de knop Nieuw.

Uit de geboden mogelijkheden in figuur 10.3, Nieuwe query, kie-zen we voor het ontwerpen in de Ontwerpweergave. Op het scherm wordt nu figuur 10.4 getoond, waarin we kunnen opgeven welke tabellen we bij onze query willen gebruiken.

Figuur 10.3

Figuur 10.4

Page 364: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003352

Omdat we in de SQL-query zelf opgeven welke tabellen we wen-sen te gebruiken, sluiten we het venster Tabel toevoegen direct af, via de knop Sluiten, zonder een tabel te selecteren.

Het scherm dat nu gepresenteerd wordt (zie figuur 10.5), is bedoeld om op de Access-manier, dus muisgestuurd, de query’s te ontwer-pen. We kunnen nu het scherm selecteren waarin we zelf SQL-query’s kunnen invoeren (figuur 10.6) door in het menu te kiezen voor Beeld, SQL, of door gebruik te maken van de knop Beeld, links in de werkbalk.

We zien dat het woord SELECT al voor ons is neergezet. We kun-nen nu de query intoetsen, waarna we hem kunnen laten uitvoeren door op de knop Uitvoeren te drukken (de toets met het uitroep-teken). Ook kunnen we in het menu kiezen voor Query, Uitvoeren. Op het scherm wordt de uitvoer van de query getoond, of een fout-melding omdat de query niet juist is opgesteld. In het laatste geval kunnen we na het lezen van de foutmelding kiezen voor OK en de query direct verbeteren.

Als de query foutloos is – en dus wordt uitgevoerd – zal Access het resultaat op het scherm plaatsen. Deze uitvoer kunnen we op de gebruikelijke wijze afdrukken op papier: via Bestand, Afdrukken of door gebruik te maken van de knop Afdrukken.

Figuur 10.5

Page 365: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 353

We keren weer terug naar het ontwerpscherm door in het menu te kiezen voor Beeld, SQL of door weer gebruik te maken van de knop Beeld. In het laatste geval moeten we het bij die knop beho-rende menu even naar beneden trekken door te klikken op de knop

en vervolgens te kiezen voor SQL.

Een eenmaal ontwikkelde query kunnen we bewaren via Bestand, Sluiten. Ook kunnen we het ontwerpscherm afsluiten. In dat geval zal Access ons vragen of we de query wensen te bewaren en zo ja, onder welke naam.

Bestaande query’s openen we door ze in het overzicht Query’s te selecteren en vervolgens te kiezen voor Ontwerpen. Bestaande query’s kunnen we ook direct laten uitvoeren door ze te selecteren en vervolgens te kiezen voor Openen. Ook query’s die zijn ontwor-pen met een wizard, zonder gebruik te maken van SQL, kunnen we altijd in SQL opvragen. Daartoe selecteren we de betreffende query in het ontwerpscherm en kiezen vervolgens Beeld, SQL. Ook het omgekeerde is meestal mogelijk.

Let op! Standaard SQL gaat ervan uit dat de namen van de kolom-men altijd uit één woord bestaan. Bij Access kunnen we echter kolomnamen uit meerdere woorden laten bestaan. Deze namen

Figuur 10.6

Page 366: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003354

kunnen we dan alleen in een SQL-query gebruiken als we de betreffende naam tussen rechte haken plaatsen, dus SELECT [Aantal kamers], [Totale oppervlakte] .... Dit geldt ook voor de namen van de tabellen.

In dit hoofdstuk gebruiken we SQL binnen Access. Om SQL te kunnen gebruiken, hebben we op zich Access niet nodig. Een zelf-standig programma dat toegang verschaft tot de gewenste database voldoet. Een dergelijk programma is het programma S(impel)QL, dat door A.H.J. Kuipers, docent aan de Hogeschool Rotterdam, ontwikkeld is en dat door het onderwijs gratis te gebruiken is. Dit programma maakt via MS JetSQL verbinding met de database en kan zelfs worden gebruikt zonder dat Access op de PC is geïnstal-leerd. Het programma houdt zich aan de officiële SQL-standaard, dit in tegenstelling tot Access dat hier op een aantal plekken net even iets van afwijkt. Je vindt het programma S(impel)QL en een uitvoerige handleiding op de bij dit boek behorende CD.

Opgave

10.4 Voer de volgende opdrachten uit aan de hand van de Alco-data-base.a. Start Access of S(impel)QL en activeer de database Alco.

Gebruik bij de beantwoording de beschrijving van de database zoals je deze terug vindt in paragraaf 10.5.

b. Laat alle gegevens van de afnemers afdrukken.c. Welke productsoorten worden er aangeboden? Laat naam, kleur

en alcoholpercentage afdrukken.d. Welke facturen zijn er verstuurd op 28 of 29 juni 2005? Laat de

factuurnummers afdrukken.e. Welke Artikelen hebben een adviesverkoopprijs onder de

25 euro en een voorraad van meer dan 30 stuks? Laat het soort-nummer en jaartal afdrukken.

f. Welke rode dranken met een alcoholpercentage van 10 of meer kunnen worden geleverd. Laat het productgroepnummer en de naam afdrukken.

g. Bij welke artikelen is geen adviesverkoopprijs opgenomen?h. Op welke dagen hebben we gefactureerd?i. Toon alle artikelen uit de productgroepen wijn, port, rose en

sherry.

Page 367: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 355

10.8 Eenvoudige opvragingen uit meerdere tabellen

In de vorige paragraaf hebben we ons beziggehouden met het uit-voeren van opvragingen uit één enkele tabel. Vaak zullen de gegevens echter uit meerdere tabellen komen. We maken dan gebruik van hetzelfde SELECT-statement, maar geven bij het FROM-gedeelte nu meerdere tabellen op.

SELECT <te tonen kolom> [,<te tonen kolom>]FROM <tabelnaam> [,<tabelnaam>][ WHERE <voorwaarde> ] ;

Als we meerdere tabellen opgeven, wordt iedere rij uit de ene tabel gecombineerd met alle andere rijen uit de andere tabellen. We noemen dit een join. Als we twee tabellen met ieder 100 rijen combineren, ontstaan dus 10.000 rijen! Bij grote tabellen neemt het totale aantal gegenereerde rijen explosief toe. Deze ‘explosie’ dienen we tegen te gaan. Het is vrijwel altijd zinloos om alle rijen uit de ene tabel te combineren met alle rijen uit de andere tabel. We mogen alleen de zinvolle combinaties toestaan. Daartoe maken we gebruik van het WHERE-gedeelte.

We geven een voorbeeld: een overzicht van de namen en num-mers van de lezers die in een filiaal in Breda hun boeken lenen. We vinden de naam van een lezer in de tabel LEZER. Of een filiaal 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 filiaalnummer optreedt. De rij uit de tabel FILIAAL met filiaalnummer 12 combineren we dus alleen met die rijen uit LEZER waar ook filiaalnummer 12 staat vermeld. Bedenk dat filiaalnr in LEZER een vreemde sleutel is, waarbij verwezen wordt naar filiaalnr in FILIAAL.

SELECT lezer.naam, lezer.lezernrFROM lezer , filiaalWHERE lezer.filiaalnr = filiaal.filiaalnrAND filiaal.filplaats = ‘Breda’ ;

Hierbij is allereerst opgegeven wat er in het overzicht moet worden opgenomen. Daarbij moet de kolomnaam voorafgegaan worden

voorbeeld

Page 368: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003356

door de naam van de bijbehorende tabel, van elkaar gescheiden door een punt. De tabelnaam mag achterwege gelaten worden als de kolomnaam uniek is voor de in het FROM-gedeelte opgesomde tabellen. Ook goed is dus:

SELECT naam, lezernrFROM lezer , filiaalWHERE lezer.filiaalnr = filiaal.filiaalnrAND filplaats = ‘Breda’ ;

Vervolgens wordt opgegeven uit welke tabellen gegevens benodigd zijn. Hierna worden de juiste rijen van de tabellen met elkaar ge-combineerd. In dit geval gebeurt dit op basis van gelijk filiaalnum-mer. Bovendien wordt er alleen maar gecombineerd voor de rijen uit FILIAAL waarbij geldt dat in de kolom plaats de waarde Breda staat. Omdat een lezer slechts in één filiaal boeken mag lenen, en omdat de lezernummers uniek zijn, zullen er in het overzicht geen dubbele rijen voorkomen.

We willen een overzicht van de titels van de boeken die lezer 355267 in januari 2001 geleend heeft.De gegevens komen uit de tabellen UITLENING, EXEMPLAAR en UITGAVE. Voor het tot stand brengen van de juiste combina-ties moeten we kijken naar de in de tabellen overeenkomende kolommen. Voor het op de juiste manier combineren komen we dan op de volgende beperkingen:

WHERE uitlening.exemplaarnr = exemplaar.exemplaarnrAND exemplaar.isbn = uitgave.isbn

Daarnaast hebben we nog te maken met beperkingen die uit de vraagstelling volgen, te weten:

AND uitlening.lezernr = 355267AND uitlening.datum >= #1-1-01#AND uitlening.datum <= #1-31-01# ( of BETWEEN )

Om het typewerk te beperken zullen we niet steeds de volledige naam opnemen bij de kolomaanduiding, maar een zogeheten alias.Daarbij geven we in het FROM-gedeelte voor de tabellen een alias-naam op, door de tabelnaam te laten volgen door de door ons

voorbeeld

Page 369: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 357

gewenste alias-naam, gescheiden door een spatie. Bij het aandui-den van de tabellen moeten we vervolgens de alias-naam gebrui-ken.

SELECT DISTINCT u.titelFROM uitgave u , exemplaar e, uitlening ulWHERE ul.exemplaarnr = e.exemplaarnrAND e.isbn = u.isbnAND ul.lezernr = 355267AND ul.datum >= #1-1-01#AND ul.datum <= #1-31-01# ;

In de query is de toevoeging DISTINCT opgenomen omdat een titel meerdere keren kan voorkomen in het overzicht. De lezer kan immers meer dan eens hetzelfde boek lenen!

We kunnen een SQL-query in Access (geen standaard SQL) flexi-bel maken, op dezelfde wijze die we eerder zijn tegengekomen bij het werken met gewone Access-query’s. Daartoe gebruiken we in een voorwaarde een variabele. De naam hiervan mag niet gelijk zijn aan de naam van een kolom uit een van de betrokken tabel-len. Voordat de query wordt uitgevoerd, zal Access om de waarde vragen die aan de variabele moet worden toegekend. We kunnen van de voorgaande query de uitvoer flexibel maken door de laatste twee regels te wijzigen in:

AND ul.datum >= StartdatumAND ul.datum <= Einddatum ;

Access vraagt zowel voor de variabele ‘Startdatum’ als voor de variabele ‘Einddatum’ de waarde. Deze waarde zal in de query worden ingevuld. Daarna wordt de query pas uitgevoerd. We kun-nen nu dus ook een overzicht opvragen over heel 1997, of over de eerste week van mei, of van het derde kwartaal, of...

We kunnen ook een overzicht maken van alle titels waarvoor een reservering bestaat. Merk op dat het opnemen van DISTINCT noodzakelijk is. SELECT DISTINCT u.titelFROM uitgave u , reservering rWHERE u.isbn = r.isbn ;

voorbeeld

Page 370: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003358

Tip: Uit een tabel alle kolommen nodig? Maak dan gebruik van het teken ‘*’. Bijvoorbeeld : lezer.* of exemplaar.filiaalnr, uitgave.* of e.filiaalnr, u.*

Opgaven

10.5 Verzorg aan de hand van de tabellen die behoren bij de bibliotheek-database de volgende overzichten:a. De namen van de lezers die ooit een boek van Wolkers hebben

geleend.b. Een overzicht van alle gegevens van de lezers die lenen bij filia-

len die in Leiden gelegen zijn.c. Alle titels van de boeken die in Rotterdamse filialen aanwezig

zijn.d. Een overzicht van alle boekgegevens van boeken met dezelfde

titel als de door Campert geschreven boeken. (Aanwijzing: we kunnen een tabel ook met zichzelf combineren.)

10.6 Voer de volgende opdrachten uit aan de hand van de Alco-data-base.a. Start Access of S(impel)QL en activeer de database Alco.

Gebruik bij de beantwoording de beschrijving van de database zoals je deze terug vindt in paragraaf 10.5

b. Aan wie is op 29 juni 2005 een factuur verstuurd? Laat naam, adres, postcode en plaats afdrukken.

c. Welke whisky’s hebben een alcoholpercentage hoger dan 40? Laat productnaam, soortnummer en naam afdrukken.

d. Aan wie hebben we op 30 juni 2005 één of meer flessen Riesling des Cigognes gefactureerd? Laat het factuurnummer en afnemernummer afdrukken.

e. Welke wijnen uit het jaar 1996 hebben we in het assortiment? Laat de naam, inhoud en adviesverkoopprijs afdrukken.

Page 371: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 359

10.9 Wijzigen van de volgorde

Tot nu toe is de volgorde waarin de rijen van de uitvoertabel werden getoond willekeurig totstandgekomen. Vaak zal de gebrui-ker behoefte hebben aan een uitvoer die op een bepaalde wijze gesorteerd is. Daartoe kunnen we het SELECT-commando uit-breiden met ORDER BY.

SELECT <te tonen kolom> [,<te tonen kolom>]FROM <tabelnaam> [,<tabelnaam>][ WHERE <voorwaarde> ][ ORDER BY <te tonen kolom> [ASC/DESC] ] ;

De toevoeging ORDER BY zal de uitvoer laten zien in volgorde van de waarden, opgeslagen in de opgegeven kolom. Door meer-dere kolommen op te geven, gescheiden door een komma, wordt bij gelijke waarde in de eerste kolom verder gesorteerd op basis van de daarna opgesomde kolom(men). Met de optie ASC wordt oplopend gesorteerd (standaard), met de optie DESC wordt de uitvoer in aflopende volgorde gesorteerd. Bij sorteren op meerdere kolommen kunnen we per kolom de optie ASC of DESC opgeven.

Een overzicht van de boeken aanwezig in Leiden. Getoond moeten worden: ISBN en titel, gesorteerd op titel.

SELECT DISTINCT u.isbn, titelFROM uitgave u, exemplaar e, filiaal fWHERE u.isbn = e.isbnAND e.filiaalnr = f.filiaalnrAND filplaats = ‘Leiden’ORDER BY titel ;

Opmerkingen1. Omdat de kolomnamen ‘titel’ en ‘filplaats’ uniek zijn voor de

gebruikte tabellen, is het niet noodzakelijk daar een tabelnaam of alias toe te voegen.

2. De toevoeging ASC mag worden weggelaten, omdat dit de stan-daardsorteervolgorde is.

3. De toevoeging DISTINCT is gebruikt omdat van een boek meer dan één exemplaar aanwezig kan zijn. Hiervan hoeft slechts één keer opgave gedaan te worden.

voorbeeld

Page 372: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003360

Een overzicht van alle titels en prijzen. In alfabetische volgorde van titel, bij gelijke titel dalend op prijs.

SELECT titel, prijsFROM uitgaveORDER BY titel, prijs DESC

Opgaven

10.7 Verzorg aan de hand van de tabellen die behoren bij de bibliotheek-database de volgende overzichten:a. Een lijst met alle gegevens van alle lezers, gesorteerd op naam.

Bij gelijke naam moet verder worden gesorteerd op woonplaats.

b. Een lijst van de nu uitgeleende boeken (titel en schrijver), gesor-teerd op exemplaarnummer.

c. Een lijst met daarop alle filiaalgegevens, gesorteerd op post-code.

10.8 Voer de volgende opdrachten uit aan de hand van de Alco-data-base.a. Start Access of S(impel)QL en activeer de database Alco.

Gebruik bij de beantwoording de beschrijving van de database zoals je deze terug vindt in paragraaf 10.5

b. Geef een lijst met alle gegevens van alle klanten, gesorteerd op naam.

c. Geef een lijst met alle door ons te leveren productnamen, gesor-teerd op productnaam.

d. Geef een overzicht van alle artikelen op volgorde van aflopende flesinhoud. Bij gelijke flesinhoud sorteren op oplopend jaartal en bij gelijk jaartal doorsorteren op aflopende adviesverkoop-prijs.

e. Geef een overzicht van namen van de afnemers voor wie we op 29 of 30 juni 2005 een factuur hebben aangemaakt. Laat het factuurnummer, de factuurdatum en de naam van de afnemer afdrukken, op volgorde van naam.

f. Welke rode wijnen kunnen we leveren? Laat de naam, fles-inhoud en adviesverkoopprijs tonen. De duurste fles moet als eerste worden getoond, de goedkoopste als laatste.

voorbeeld

Page 373: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 361

10.10 Rekenkundige bewerkingen

We kunnen de gegevens uit tabellen op een rekenkundige manier laten bewerken. Daartoe staan ons in standaard-SQL de volgende functies ter beschikking:

MIN ( <kolomnaam> ) – Bepaalt de kleinste optredende waarde in de uitvoertabel, voor de opgegeven kolom.MAX ( <kolomnaam> ) – Bepaalt de grootste optredende waarde in de uitvoertabel, voor de opgegeven kolom.AVG ( <numerieke kolom> ) – Bepaalt de gemiddelde waarde in de uitvoertabel aan de hand van de getallen in de opgegeven kolom.COUNT ( * ) – Bepaalt het aantal rijen in de uitvoertabel.COUNT ( <kolomnaam> ) – Bepaalt het aantal rijen met een niet-lege kolomwaarde in de genoemde kolom van de uitvoertabel.COUNT ( DISTINCT <kolomnaam> ) – Bepaalt het aantal ver-schillende waarden dat optreedt in de genoemde kolom van de uitvoertabel. Als we Access hebben ingesteld volgens de standaard ANSI 89 dan wordt deze functie niet ondersteund. Bij het gebruik van de standaard ANSI 92 wel. Voor meer toelichting, zie bijlage B. De op de CD bijgeleverde tool S(imple)QL ondersteunt deze functie (uiteraard) wel.SUM ( <numerieke kolom> ) – Bepaalt de som van de getallen in de opgegeven kolom van de uitvoertabel. Ook hier is (officieel) de toevoeging DISTINCT toegestaan en ook dit wordt door Access, ingesteld op de standaard ANSI 89, niet ondersteund.

Het aantal uitgaven waarbij een schrijver bekend is:

SELECT COUNT (schrijver)FROM uitgave ;

De prijs van het duurste boek.

SELECT MAX(prijs)FROM uitgave ;

Het aantal schrijvers waarvan boeken aanwezig zijn:

SELECT COUNT (DISTINCT schrijver)FROM uitgave ;

voorbeeld

Page 374: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003362

Deze query werkt wel in standaard SQL, maar helaas niet in Access, wel in S(imple)QL!

De gemiddelde prijs van de boeken :

SELECT AVG(prijs) of SELECT SUM(prijs)/COUNT(*)FROM uitgave FROM uitgave ;

In de twee laatstgenoemde query’s kunnen we twee verschillende antwoorden vinden, omdat functies die op velden werken (bijvoor-beeld AVG en SUM), lege velden (NULL) buiten beschouwing laten, en COUNT(*) doet dat niet!

Opmerkingen1. De volgende query zal leiden tot een foutmelding omdat de kolom

‘plaats’ meerdere waarden kan opleveren en de functie slechts één.

Het totale aantal lezers uit Dordrecht:

SELECT plaats , COUNT(*)FROM lezerWHERE plaats = ‘Dordrecht’ ;

We kunnen deze query wel anders formuleren:

SELECT MIN(plaats) , COUNT(*)FROM lezerWHERE plaats = ‘Dordrecht’ ;

Uitvoer:MIN(plaats) COUNT(*)Dordrecht 1283

Omdat in de uitvoertabel alleen de kolomwaarde Dordrecht voor-komt, zal als minimumwaarde ook Dordrecht worden gevonden.

2. Omdat door het opgeven van bewerkingen de kop boven een kolom een vreemd opschrift krijgt, kunnen we expliciet opgeven welke tekst als koptekst moet worden afgedrukt. Dit is niet beperkt tot de resultaten van bewerkingen, we mogen dit ook doen bij gewone kolommen. We geven hiertoe achter de bewerking de toevoeging AS, gevolgd door het door ons gewenste opschrift.

Page 375: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 363

SELECT MIN(plaats) AS Plaats , COUNT(*) AS AantalFROM lezerWHERE plaats = ‘Dordrecht’ ;

Uitvoer:Plaats AantalDordrecht 1283

3. Behalve de eerdergenoemde functies kent Access er nog veel meer, die hier echter niet besproken worden. We kunnen via de ingebou-wde hulp meer informatie opvragen.

Opgaven

10.9 Verzorg aan de hand van de tabellen die behoren bij de bibliotheek-database de volgende overzichten:a. Het aantal uitgeleende exemplaren van Wolkers.b. Het aantal exemplaren van het boek ‘Onder professoren’ van

Hermans dat aanwezig is in de Rotterdamse filialen.c. De gemiddelde prijs van de uitgeleende boeken.d. Het aantal uitgaven waarvan geen prijs bekend is.e. De geboortedatum van de oudste lezer.f. Het aantal uitleningen gedurende de maand januari 2001.g. Het aantal uitgaven dat nu uitgeleend is.

10.10 Voer de volgende opdrachten uit aan de hand van de Alco-data-base.a. Start Access of S(impel)QL en activeer de database Alco.

Gebruik bij de beantwoording de beschrijving van de database zoals je deze terug vindt in paragraaf 10.5

b. Hoeveel klanten hebben we?c. Hoeveel facturen zijn er verstuurd op 29 Juni 2005?d. Hoeveel flessen hebben we op dit moment totaal in voorraad?e. Wat is de gemiddelde adviesverkoopprijs van wijnen uit het jaar

1999?f. Wat kost de duurste rode wijn?g. Van welke whisky hebben we het kleinste aantal flessen op

voorraad? Toon het gevonden aantal.h. Van welke whisky hebben we het grootste aantal liters op voor-

raad? Toon het gevonden aantal.i. Voor welk bedrag is er op 29 Juni 2005 gefactureerd aan klan-

ten die niet uit Rotterdam komen?

Page 376: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003364

10.11 Groeperen

Vaak hebben gebruikers de wens gegevens gegroepeerd op een gemeenschappelijk kenmerk ter beschikking te hebben. Om aan deze wens te voldoen, is het mogelijk het SELECT-statement uit te breiden met de toevoeging GROUP BY.

SELECT <te tonen kolom> [,<te tonen kolom>]FROM <tabelnaam> [,<tabelnaam>]GROUP BY <kolomnaam> [,<kolomnaam>][HAVING <voorwaarde(n)> ] ;

De toevoeging GROUP BY <kolomnaam> zal de rijen groeperen op basis van de waarden in de genoemde kolom. Per gevonden groep wordt vervolgens de uitvoer gegenereerd. Er ontstaat daarbij per gevonden groep slechts één rij, de groepsrij. Als gevolg hiervan mogen in het SELECT-gedeelte dan ook alleen maar de kolom-men worden genoemd die ook in de GROUP BY-regel voorkomen. Andere kolommen zijn niet toegestaan, omdat er in die kolommen verschillende waarden kunnen voorkomen. Welke van die waarden zou moeten worden afgedrukt? In het SELECT-gedeelte mogen wel functies worden gebruikt, omdat een functie altijd precies één waarde oplevert.

Een overzicht van alle schrijvers waarvan boeken aanwezig zijn:

SELECT schrijverFROM uitgaveGROUP BY schrijver ;

Alle schrijvers komen slechts één maal in het overzicht voor.

Een alternatieve oplossing:

SELECT DISTINCT schrijverFROM uitgave ;

De onderstaande query is NIET toegestaan:

SELECT schrijver, titelFROM uitgaveGROUP BY schrijver ;

voorbeeld

voorbeeld

Page 377: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 365

Na het groeperen op schrijver(naam) kan de naam worden afge-drukt. De naam heeft immers in de betreffende groep van uit-gegeven boeken steeds dezelfde waarde. Maar de titel kan niet worden afgedrukt omdat iedere uitgave in principe een andere titel heeft. Welke titel zou moeten worden geselecteerd?

Een overzicht van alle schrijvers, tezamen met het aantal door hen geschreven boeken:

SELECT schrijver, COUNT(*)FROM uitgaveGROUP BY schrijver ;

Van iedere schrijver worden de naam en het aantal aangetroffen titels afgedrukt. Bedenk dat we nu wel een kolom kunnen combi-neren met een functie, omdat beide nu slechts één waarde opleveren. Als we een functie combineren met een GROUP BY, dan werkt de functie per groep!

Met de toevoeging HAVING kunnen we bepalen welke groepen in het overzicht moeten worden opgenomen. Wat WHERE doet met rijen, doet HAVING met groepen. Bij HAVING is echter het gebruik van functies toegestaan.

Een overzicht van de schrijvers die meer dan tien titels op hun naam hebben staan:

SELECT schrijverFROM uitgaveGROUP BY schrijverHAVING COUNT(*) > 10 ;

Een overzicht van de uitgebrachte boeken per schrijver per uit-geverij, tezamen met het aantal uitgebrachte boeken:

SELECT schrijver, uitgeverij, COUNT(*)FROM uitgaveGROUP BY schrijver, uitgeverij ;

Een GROUP BY mag dus bestaan uit meerdere kolommen. Per unieke combinatie wordt in dat geval een rij in de uitvoertabel opgenomen.

voorbeeld

voorbeeld

voorbeeld

Page 378: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003366

Per schrijver de prijs van het duurste boek dat door hem of haar is geschreven:

SELECT schrijver, MAX(prijs)FROM uitgaveGROUP BY schrijver ;

Er gelden enkele specifieke eigenschappen bij het gebruik van GROUP BY:

1. In het SELECT-gedeelte mogen alleen die kolommen worden opgesomd die ook voorkomen in het GROUP BY-gedeelte, als-mede functies. Het is overigens niet verplicht het GROUP BY-argument op te nemen in de SELECT-regel.

2. Functies werken nu per groep en mogen wel kolommen bevatten waarop niet wordt gegroepeerd.

3. Per groep wordt slechts één rij in de uitvoertabel opgenomen.4. We kunnen groeperen aan de hand van meerdere kolommen. Per

unieke combinatie ontstaat een rij.5. We kunnen met HAVING voorwaarden opleggen aan de groepen.

Alleen groepen die voldoen aan de voorwaarde worden opgeno-men in de uitvoertabel. We mogen hier alleen de kolommen gebruiken die ook in het GROUP BY-gedeelte voorkomen, als-mede functies.

Eerder hebben we gezien dat bij een SELECT-commando ook de toevoegingen WHERE en ORDER BY kunnen worden gebruikt. Dat blijft uiteraard zo.

SELECT <te tonen kolom> [,<te tonen kolom>]FROM <tabelnaam> [,<tabelnaam>][ WHERE <voorwaarde(n)> ]GROUP BY <kolomnaam>[ HAVING <voorwaarde(n)> ][ ORDER BY <te tonen kolom> [ASC/DESC] ] ;

De volgorde waarin de diverse stappen worden doorlopen, is nu als volgt:

1. Welke tabellen gebruiken? (FROM)2. Welke rijen selecteren? (WHERE)

voorbeeld

Page 379: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 367

3. Welke groepen maken? (GROUP BY)4. Welke groepen selecteren? (HAVING)5. Welke kolommen in de uitvoer? (SELECT)6. Welke volgorde in de uitvoer? (ORDER BY)

Een overzicht van de filialen met meer dan 1000 leden die voor 1980 geboren zijn. Ook het betreffende aantal moet worden afgedrukt. Het overzicht moet worden gesorteerd op het aantal aangetroffen leden.

SELECT filiaalnr, COUNT(*)FROM lezerWHERE geboortedatum < #1-1-80#GROUP BY filiaalnrHAVING COUNT(*) > 1000ORDER BY COUNT(*) ;

Hier wordt allereerst de tabel lezer geselecteerd. Uit deze tabel worden de leden geselecteerd die voor 1980 geboren zijn. Deze leden worden vervolgens gegroepeerd op filiaalnummer. Per groep wordt bekeken of er meer dan 1000 rijen aanwezig zijn. Als dit zo is, wordt het filiaalnummer, alsmede het aantal aangetrof-fen rijen, opgenomen in de uitvoertabel. (Per groep wordt slechts één maal het filiaalnummer 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 filiaal tonen, dan moeten we even-eens de tabel Filiaal gebruiken en deze op basis van het filiaal-nummer koppelen met de tabel Lezer. Vervolgens moeten we ons realiseren dat we in de SELECT-regel niet zonder meer de kolom filplaats kunnen opnemen, omdat we deze kolom niet noemen in het GROUP BY-gedeelte. Bedenk echter dat na het groeperen op basis van het filiaalnummer in iedere afzonderlijke groep steeds één en dezelfde filiaalnaam is opgenomen. Door hiervan alfa-betisch gezien de kleinste te tonen, met behulp van de functie MIN, krijgen we precies wat we wensen, namelijk de naam van het filiaal. De query ziet er dan als volgt uit:

voorbeeld

Page 380: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003368

SELECT f.filiaalnr, COUNT(*), MIN(filnaam)FROM lezer l, filiaal fWHERE l.filiaalnr = f.filiaalnrAND geboortedatum < #1-1-80#GROUP BY f.filiaalnrHAVING COUNT(*) > 1000ORDER BY COUNT(*) ;

Een alternatieve oplossing is gebaseerd op de gedachte dat na het groeperen op basis van filiaalnummer in iedere groep (per gevonden filiaal) steeds dezelfde plaatsnaam vermeld staat. Door niet alleen te groeperen op filiaalnummer, maar daarnaast op filiaalplaats, vergroot je het aantal groepen dus niet! Maar omdat je nu ook op plaats groepeert, kun je dit gegeven wel opnemen in de SELECT-regel. Je krijgt dan:

SELECT f .filiaalnr, COUNT(*), filnaamFROM lezer l, filiaal fWHERE l.filiaalnr = f.filiaalnrAND geboortedatum < #1-1-80#GROUP BY f.filiaalnr, filnaamHAVING COUNT(*) > 1000ORDER BY COUNT(*) ;

Als algemene regel zouden we kunnen aanhouden: wat in SELECT staat (behalve functies) staat ook bij de GROUP BY.

Een overzicht met daarop het lezernummer, de lezernaam en het aantal door de lezer geleende boeken:

SELECT l.lezernr, naam, count(*)FROM lezer l, uitlening uWHERE l.lezernr = u.lezernrGROUP BY l.lezernr, naam ;

Idem, maar nu alleen voor de lezers uit Rotterdam:

SELECT l.lezernr, naam, count(*)FROM lezer l, uitlening uWHERE l.lezernr = u.lezernrAND plaats = ‘Rotterdam’GROUP BY l.lezernr, naam ;

voorbeeld

voorbeeld

Page 381: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 369

Idem maar nu alleen voor de lezers uit Rotterdam die minder dan 100 boeken hebben geleend:

SELECT l.lezernr, naam, count(*)FROM lezer l, uitlening uWHERE l.lezernr = u.lezernrAND plaats = ‘Rotterdam’GROUP BY l.lezernr, naamHAVING count(*) < 100 ;

Opgaven

10.11 Verzorg aan de hand van de tabellen, behorend bij de bibliotheek-database de volgende overzichten:a. Het aantal boeken per schrijver dat nu is uitgeleend.b. Het aantal leden per woonplaats, gesorteerd per woonplaats;

in het overzicht dienen alleen de plaatsen met meer dan 1000 leden te worden opgenomen.

c. Per filiaal het gemiddelde aantal in 2001 per lezer uitgeleende boeken; het overzicht moet in volgorde van oplopend aantal worden getoond.

d. Per uitgeverij het totaal aantal aanwezige boeken waarvan de aanschafprijs meer dan 25,– bedraagt.

e. Per uitgeverij het aantal uitgegeven boeken, geschreven door Wolkers.

f. Geef per exemplaar het aantal uitleningen in 2005 (huurdatum). Toon exemplaarnummer, ISBN, titel en aantal uitleningen.

10.12 Voer de volgende opdrachten uit aan de hand van de Alco-data-base.a. Start Access of S(impel)QL en activeer de database Alco.

Gebruik bij de beantwoording de beschrijving van de database zoals je deze terug vindt in paragraaf 10.5

b. Geef per plaats het aantal afnemers. Laat plaatsnaam en aantal afdrukken op volgorde van oplopend aantal. Bij gelijk aantal doorsorteren op plaatsnaam.

c. Geef per productgroep het aantal artikelen en de gemiddelde, hoogste en laagste adviesverkoopprijs. Laat naast de berekende waarden ook de productnaam afdrukken.

d. Geef per factuur het totale factuurbedrag, het factuurnummer en de naam van de afnemer.

voorbeeld

Page 382: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003370 Databaseontwikkeling 4 Access 2003370

e. Geef per soort rode wijn het totale aantal flessen en het totale aantal liters dat we op voorraad hebben. Laat ook de naam afdrukken. Het overzicht moet op volgorde van naam worden gepresenteerd.

f. Van welke producten hebben we meer dan 100 liter in voor-raad? Laat de productnaam afdrukken.

g. Van welke soort hebben we in Juni 2005 meer dan 10 flessen verkocht? Laat de naam en het aantal flessen afdrukken, op volgorde van dalend aantal flessen.

10.12 Subquery’s

Soms willen we een SQL-opdracht opgeven waarbij we met een tussenresultaat willen of moeten werken. Bijvoorbeeld bij de vraagstelling: Welke boeken zijn duurder dan de gemiddelde boe-kenprijs? Om die vraag te kunnen beantwoorden zullen we eerst de gemiddelde boekenprijs moeten bepalen. De onderstaande query levert die waarde op.

SELECT AVG(prijs)FROM uitgave ;

Stel dat hier een bedrag van 27,50 wordt gevonden. Dan kunnen we nu met de volgende query de vraag beantwoorden.

SELECT *FROM uitgaveWHERE prijs > 27.5 ;

We hebben nu echter twee query’s ingevoerd en afzonderlijk van elkaar laten uitvoeren. Dit kan ook met één query waarbij we de twee eerder opgestelde query’s 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:

Page 383: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 371

SELECT * FROM uitgaveWHERE prijs > ( SELECT AVG(prijs) FROM uitgave ) ;

We hebben nu gebruik gemaakt van een subquery. Deze subquery, omsloten door ronde haken, wordt als eerste uitgevoerd en als het ware vervangen door de gegenereerde uitvoer, de gemiddelde prijs. Hierna wordt dan de hoofdquery uitgevoerd en worden de boeken bepaald die duurder zijn dan de gemiddelde prijs.

We kunnen gebruik maken van meer dan één subquery tegelijker-tijd. Bijvoorbeeld bij het oplossen van de vraag: van welk boek ligt de prijs het dichtst onder de gemiddelde prijs?

We beginnen weer met het bepalen van de gemiddelde boekprijs.

SELECT AVG(prijs)FROM uitgave ;

Vervolgens gaan we alle prijzen achterhalen die onder deze gemid-delde waarde liggen.

SELECT prijsFROM uitgaveWHERE prijs < ( SELECT AVG(prijs) FROM uitgave ) ;

Van al deze prijzen zijn we eigenlijk alleen maar geïnteresseerd in de grootste waarde omdat die het dichtst onder de gemiddelde aan-koopprijs ligt. We krijgen dan:

SELECT MAX (prijs)FROM uitgaveWHERE prijs < ( SELECT AVG(prijs) FROM uitgave ) ;

Page 384: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003372

Tenslotte willen we nu nog weten voor welk boek (of boeken) deze prijs geldt.

SELECT *FROM uitgaveWHERE prijs = ( SELECT MAX(prijs)

FROM uitgaveWHERE prijs <( SELECT AVG(prijs) FROM uitgave ) );

We hebben nu gebruik gemaakt van twee (geneste) subquery’s die beide zijn omgeven door ronde haken. Bedenk daarbij dat de laat-ste subquery deel uit maakt van de middelste subquery en dat dus de afsluitende ronde haak hiervan achter de laatste subquery moet worden geplaatst.

Als laatste inleidende voorbeeld zullen we de vraag beantwoorden: welke boeken (uitgaven) zijn in 2004 niet uitgeleend?

Om deze vraag te kunnen beantwoorden moeten we bedenken dat een bibliotheek wel bijhoudt welke boeken er worden uitgeleend maar niet welke boeken NIET worden uitgeleend. We moeten daarom de vraag voor ons zelf iets andere formuleren: zoek uit welke boeken er in 2004 wel zijn uitgeleend en bepaal vervolgens welke boeken daar niet bij zitten. Om te bepalen welke boeken er in 2004 zijn uitgeleend kunnen we gebruik maken van de onder-staande query.

SELECT uitgave.*FROM uitgave, exemplaar, uitleningWHERE uitgave.isbn = exemplaar.isbnAND exemplaar.exemplaarnr = uitlening.exemplaarnummer AND huurdatum BETWEEN #1-1-2004# AND #31-12-2004# ;

Deze query levert van de WEL uitgeleende boeken alle gegevens. Nu hoeven we niet alle gegevens te zien, alleen maar dat wat de boeken uniek identificeert, het ISBN dus. We krijgen dan:

Page 385: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 373

SELECT uitgave.isbnFROM uitgave, exemplaar, uitleningWHERE uitgave.isbn = exemplaar.isbnAND exemplaar.exemplaarnr = uitlening.exemplaarnummerAND huurdatum BETWEEN #1-1-2004# AND #31-12-2004# ;

Als uitvoer krijgen we nu een lijst met alle nummers van de wel in 2004 uitgeleende boeken. Nu kunnen we op zoek gaan naar de boeken waarvan het nummer NIET in deze lijst voorkomt. Die boeken zijn dan immers niet in 2004 uitgeleend. We krijgen:

SELECT *FROM uitgaveWHERE 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 uitgaveWHERE isbn NOT IN ( SELECT uitgave.isbn

FROM uitgave, exemplaar, uitleningWHERE uitgave.isbn = exemplaar.isbnAND exemplaar.exemplaarnr =

uitlening.exemplaarnummerAND huurdatum BETWEEN #1-1-2004#

AND #31-12-2004#) ;

Het gebruik van subquery’s is aan te raden voor het beantwoorden van vragen waarvoor de oplossing zich niet zo eenvoudig laat beschrijven. Door het probleem, en dus ook de oplossing, op te splitsen in deelproblemen en deeloplossingen, is het vaak eenvou-diger om tot een correcte oplossing te komen.Bij subquery’s kunnen we onder andere de volgende twee hoofd-constructies tegenkomen. Met deze constructies kunnen vrijwel alle overzichten worden gegenereerd.

Page 386: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003374

1. Een kolomwaarde vergelijken met één waardeGeef 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 exemplaarnrFROM exemplaarWHERE isbn IN (SELECT isbn FROM uitgave WHERE schrijver = ‘Wolkers’ )ORDER BY exemplaarnr ;

Allereerst worden alle isbn’s gegenereerd die te maken hebben met een boek van Wolkers. Vervolgens wordt van ieder exemplaar bekeken of het bijbehorende isbn voorkomt in de zojuist gevonden verzameling.

Geef de titel(s) van het duurste boek(en):

SELECT titel FROM uitgave WHERE prijs >= ALL (SELECT prijs FROM uitgave );

Allereerst wordt een tussentabel gegenereerd met alle prijzen. Vervolgens wordt bij ieder boek nagegaan of de prijs van dat

Page 387: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 375

betreffende boek groter dan of gelijk is aan alle waarden (ALL) die in de zojuist gegenereerde verzameling voorkomen. En alleen voor de grootste waarde geldt dat. Een alternatieve oplossing hier zou zijn:

SELECT titelFROM uitgaveWHERE prijs = (SELECT MAX(prijs)

FROM uitgave ) ;

Daarbij wordt eerst in de subquery de hoogste prijs bepaald. Daarna wordt in de hoofdquery bekeken voor welke uitgave(n) die hoogste prijs geldt.

Geef alle titels van boeken van Wolkers die ook door andere schrij-vers zijn gebruikt:

SELECT titel FROM uitgave WHERE schrijver = ‘Wolkers’ AND titel = IN (SELECT titel FROM uitgave WHERE schrijver <> ‘Wolkers’ ) ;

Ook hier wordt eerst weer een tussentabel gegenereerd, die nu alle titels bevat van boeken geschreven door andere schrijvers. Vervolgens worden alle titels van de boeken van Wolkers met deze verzameling vergeleken; titels die daarin voorkomen, worden afge-drukt.

Opmerkingen met betrekking tot subquery’s1. In een subquery mag in het SELECT-gedeelte slechts één kolom

(zonder DISTINCT) of functie gebruikt worden (standaard SQL).2. Een subquery mag alleen voorkomen als rechterlid van een voor-

waarde.3. Een subquery moet een waarde of een waardenverzameling ople-

veren die overeenstemt met het linkergedeelte van de voorwaarde.4. Een subquery mag alleen voorkomen in een voorwaarde bij

WHERE of bij HAVING (of AND/OR).5. De subquery moet tussen ronde haken worden geplaatst.6. Na een subquery kan de ‘gewone’ query worden voortgezet.

Page 388: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003376

SELECT ......FROM ......WHERE ......AND ... IN (SELECT ...... FROM ...... WHERE ...... AND ...... )GROUP BY .......ORDER BY ....... ;

1. Geef de naam van de schrijver met het grootste aantal titels op zijn naam. Allereerst zullen we dan per schrijver het aantal titels moeten bepalen. Hierbij moeten we de tabel Uitgave gebruiken en hier per schrijver tellen, dus gebruikmaken van GROUP BY.

SELECT COUNT(*) FROM uitgave GROUP BY schrijver

Vervolgens gaan we dit nogmaals doen en zullen we de naam afdrukken van de schrijver waarvoor geldt dat het getelde aantal groter dan of gelijk is aan alle zojuist gevonden waarden. Denk eraan dat we groter of gelijk moeten nemen, omdat de subquery ook het aantal van de schrijver met het grootste aantal vindt!

SELECT schrijver FROM uitgave GROUP BY schrijver HAVING COUNT(*) >= ALL (SELECT COUNT(*) FROM uitgave GROUP BY schrijver ) ;

2. Wie is de oudste lezer?Eerst bepalen we van alle geboortedatums de kleinste waarde (dat wil zeggen het langst geleden, dus het oudst). Vervolgens lopen we alle lezers langs om te kijken of hun geboortedatum gelijk is aan de gevonden kleinste waarde. Van die lezer(s) drukken we de gegevens af.

voorbeelden

Page 389: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 377

SELECT * FROM lezer WHERE geboortedatum = (SELECT MIN ( geboortedatum ) FROM lezer ) ;

3. Welke schrijver heeft het grootste aantal titels op zijn naam?Eerst in de subquery per schrijver (GROUP BY) het aantal titels bepalen. We selecteren alleen de gevonden aantallen. Vervolgens in de hoofdquery nog een keer per schrijver tellen en het gevonden aantal vergelijken met de zojuist gevonden waarden. Is het aantal uit de hoofdquery groter dan of gelijk aan alle gevonden waarden, dan hebben we de grootste. Van deze schrijver selecteren we de naam.

SELECT schrijver FROM uitgave GROUP BY schrijver HAVING COUNT(*) >= ALL ( SELECT COUNT(*) FROM schrijver GROUP BY schrijver ;

4. Welke lezers hebben geen boeken gereserveerd?Een bibliotheek houdt wel bij welke lezer welke boeken leent en reserveert, maar natuurlijk niet welke lezers niet lenen of reserveren. Daarom moeten we het probleem via een omweg bena-deren. Omdat de bibliotheek wel bijhoudt wie er wel een boek heeft gereserveerd, zullen we de nummers van die lezers bepalen. Vervolgens onderzoeken we bij iedere lezer of zijn/haar nummer voorkomt in de zojuist gevonden verzameling. We krijgen dan:

SELECT lezernr, naam FROM lezer WHERE lezernr NOT IN ( SELECT lezernr

FROM reservering ) ;

5. Dezelfde vraag als hiervoor, maar nu alleen van de lezers uit Rotterdam. Bovendien moet de geproduceerde uitvoer op volgorde van naam worden gepresenteerd.

Page 390: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003378

SELECT lezernr, naam FROM lezer WHERE lezernr NOT IN ( SELECT lezernr FROM reservering ) AND Plaats = ‘Rotterdam’ ORDER BY naam ;

6. Welke lezers hebben boeken geleend die ook door andere lezers uit dezelfde woonplaats zijn geleend? We zullen in dit geval eerst uitzoeken welke boeken ook werkelijk door lezers zijn geleend. We stellen dan de volgende query op:

SELECT isbn

FROM lezer l, uitlening ul, exemplaar e WHERE l.lezernr = ul.lezernr AND ul.exemplaarnr = e.exemplaarnr

Nu worden alle geleende boeken getoond. Wij willen echter alleen de boeken die geleend zijn door lezers uit dezelfde woon-plaats als een andere lezer. Stel dat de betroffen lezer woont in Emmen. We zouden dan de query moeten uitbreiden met AND plaats = ‘Emmen’ en krijgen dan:

SELECT isbn FROM lezer l, uitlening ul, exemplaar e WHERE l.lezernr = ul.lezernr AND ul.exemplaarnr = e.exemplaarnr AND plaats = ‘Emmen’

Nu kunnen we de query opstellen die de lezers toont die ook zo’n boek hebben geleend. We krijgen dan:

SELECT l.lezernr, naam FROM lezer l, uitlening ul, exemplaar e

WHERE l.lezernr = ul.lezernr AND ul.exemplaarnr = e.exemplaarnr AND isbn IN (SELECT isbn FROM lezer l, uitlening ul, exemplaar e WHERE l.lezernr = ul.lezernr AND ul.exemplaarnr = e.exemplaarnr AND plaats = ‘Emmen’ )

Page 391: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 379

Er wordt nu steeds gekeken of de lezer uit Emmen komt, wat uiter-aard niet juist is. In de subquery moeten we kijken of de woon-plaats van de lezer uit de subquery gelijk is aan de woonplaats van de lezer uit de hoofdquery. Daartoe geven we de lezertabellen uit beide deelquery’s respectievelijk alias l1 en l2 en verbinden vervolgens de woonplaatsen met elkaar via de voorwaarde: AND l1.plaats = l2.plaats. We krijgen nu uiteindelijk:

SELECT l1.lezernr, naam FROM lezer l1, uitlening ul, exemplaar e WHERE l1.lezernr = ul.lezernr AND ul.exemplaarnr = e.exemplaarnr AND isbn IN ( SELECT isbn FROM lezer l2, uitlening ul, exemplaar e WHERE l2.lezernr = ul.lezernr AND ul.exemplaarnr =

e.exemplaarnr AND l1.plaats = l2.plaats ) ;

We noemen de bovenstaande query gecorreleerd, omdat in de subquery gegevens gebruikt worden uit de hoofdquery. SQL zal nu eerst in de hoofdquery een lezer selecteren en voor deze lezer de subquery gaan uitvoeren. Pas daarna wordt de tweede lezer in de hoofdquery geselecteerd. De subquery wordt nu niet, zoals gebrui-kelijk, slechts één keer doorlopen, maar vele malen, namelijk voor iedere rij uit de hoofdquery. De uitvoering van een gecorreleerde query kan dus wel enige tijd in beslag nemen!

Opgaven

10.13 Verzorg aan de hand van de tabellen die behoren bij de bibliotheek-database de volgende overzichten:a. Een overzicht van de lezers die een boek gelezen hebben dat

nog niet door andere lezers uit hetzelfde filiaal gelezen is.b. Van welke schrijvers er geen boeken gereserveerd zijn.c. Welke uitgeverij het grootste aantal titels heeft uitgebracht.d. Welke schrijvers slechts voor één uitgeverij hebben geschreven.e. Welke exemplaren nog nooit zijn uitgeleend.f. Welke titel het meest is uitgeleend.

Page 392: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003380 Databaseontwikkeling 4 Access 2003380

g. Het boek met de hoogste aanschafprijs.h. Het aantal lezers dat in januari 2001 geen boeken heeft geleend.i. Het boek waarvoor de meeste reserveringen bestaan.

10.14 Voer de volgende opdrachten uit aan de hand van de Alco-data-base.a. Start Access of S(impel)QL en activeer de database Alco.

Gebruik bij de beantwoording de beschrijving van de database zoals je deze terug vindt in paragraaf 10.5

b. Geef een overzicht van de artikelen waarvan het aantal flessen dat op voorraad is boven de gemiddelde voorraad ligt.

c. Wat is de prijs van de duurste fles wijn? Laat ook de naam afdrukken.

d. Wie heeft er in Juni 2005 geen factuur gekregen?e. Welke artikelen zijn in Juni 2005 niet verkocht?f. Wie heeft de factuur met het hoogste factuurbedrag ontvangen?g. Welke Rotterdamse afnemer heeft het grootste aantal facturen

ontvangen?h. Welke artikelen vallen er in dezelfde productgroep als het arti-

kel met de grootste adviesverkoopprijs?i. Wie heeft er een wijn uit 1995 besteld die ook door iemand uit

een andere woonplaats is besteld?j. Welke artikelen zijn duurder dan de gemiddelde artikelprijs in

hun productgroep?

10.13 Speciale joins en views

Normaal gesproken zullen bij het combineren van tabellen alleen rijen uit de ene tabel worden gecombineerd met rijen uit de andere tabel als de verbindende waarde in beide rijen wordt aangetroffen en gelijk is.

De query: SELECT titel, u.isbn, exemplaarnr, filiaalnrFROM uitgave u, exemplaar eWHERE 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

Page 393: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 381

exemplaar in de bibliotheek aanwezig is – waarvan het isbn dus niet in de tabel Exemplaar voorkomt – wordt niet getoond; ook niet alleen de titel, zonder exemplaarnummer en filiaalnummer.

Willen we deze uitgaven toch zien, dan moeten we niet de hiervoor genoemde combinatie gebruiken, de zogenaamde inner join, maar een outer join. Een outer join kent twee varianten, de left join en de right join.

Als we een left join gebruiken, worden alle rijen uit de tabel die aan de linkerkant van de toevoeging left join staat, getoond in de uitvoer – ongeacht het feit of er in de tabel rechts van de toevoe-ging left join een bijbehorende rij is gevonden.

Om in dit voorbeeld ook de titels te krijgen van boeken die nog niet in de bibliotheek aanwezig zijn, wijzigen we de query in:

SELECT titel, u.isbn, e.exemplaarnr, filiaalnrFROM uitgave u LEFT JOIN exemplaar eON u.isbn = e.isbn

Normaal gesproken koppelen we met de regel WHERE. Deze is nu vervangen door de regel ON om duidelijk te maken dat op die voorwaarde gecombineerd moet worden. Van alle uitgaven worden de titel en het ISBN getoond; alleen van uitgaven waarvan exem-plaren aanwezig zijn in de bibliotheek worden ook het bijbehoren-de exemplaarnummer en filiaalnummer getoond.

De right join werkt op soortgelijke wijze. Nu worden alle rijen uit de tabel rechts van de toevoeging right join getoond, ongeacht het feit of er overeenkomstige rijen in de tabel links van de toevoeging right join worden gevonden. Door de tabellen onderling te verwis-selen krijgen we feitelijk weer de eerder besproken left join!

Als tweede voorbeeld formuleren we de query waarmee we kun-nen nagaan welke lezers op dit moment welke boeken hebben geleend. Heeft een lezer op dit moment geen boeken geleend, dan moeten wel zijn/haar nummer en naam worden getoond.

Page 394: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003382

SELECT l.lezernr, naam, exemplaarnr, huurdatumFROM lezer l LEFT JOIN uitlening uON l.lezernr=u.lezernrWHERE retourdatum IS NULL ; De voorwaarde waarop de combinatie (join) is gebaseerd, wordt voorafgegaan door ON. De bijkomende voorwaarde volgt op gebruikelijke wijze achter WHERE.

ViewsBij 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 afleveradres maar niet het factuuradres. Een medewerker van de financiële afdeling ziet juist wel het factuur-adres en waarschijnlijk niet het afleveradres. Een verkoper ziet alleen maar de klanten die tot zijn rayon behoren, terwijl zijn afde-lingschef alle klanten te zien krijgt. Binnen Access kunnen views heel eenvoudig als query gedefinieerd 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 gedefinieerd met het commando CREATE VIEW. Bij het bovenstaande voorbeeld krijgen we:

CREATE VIEW RotterdamseKlanten AS ( SELECT * FROM Afnemer WHERE Plaats = “Rotterdam” ) ;

Hierna kan de verkoper werken met: SELECT * FROM RotterdamseKlanten ;Het bovenstaande CREATE VIEW commando wordt (helaas) door Access niet ondersteund, daar moet je gebruik maken van query’s die immers hetzelfde bewerkstelligen. De tool S(imple)QL, mee-geleverd op de bij het boek behorende CD, ondersteunt views wel volledig.

Page 395: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 383

Een view is dynamisch. Hiermee bedoelen we dat het niet zo is dat tijdens het definiëren van de view eenmalig de SELECT wordt uitgevoerd en dat de dan gegenereerde uitvoer voortaan gebruikt wordt als de view wordt aangeroepen. De view zou dan juist sta-tisch zijn. Met dynamisch bedoelen we dat op het moment dat de view wordt gebruikt, volgens de definitie die er aan te grondslag ligt, de query wordt uitgevoerd. De gegevens zijn dus altijd actueel.

Een view behoeven we niet echt aan te maken (CREATE). We kunnen een view ook direct gebruiken in een SQL-opdracht, ook binnen Access! In paragraaf 10.10 hebben we gezien dat standaard Access geen COUNT ( DISTINCT .. ) kent. Door gebruik te maken van het view-mechanisme kunnen we hier een alternatieve oplossing voor opstellen. De vraag luidt: van hoeveel schrijvers hebben we een boek in huis? Een correcte oplossing die Access echter niet onder-steunt:

SELECT COUNT (DISTINCT schrijver)FROM uitgave, exemplaarWHERE uitgave.isbn = exemplaar.isbn ;

Een alternatieve oplossing met behulp van een ‘view’:

SELECT COUNT (*)FROM (SELECT DISTINCT (schrijver) FROM uitgave, exemplaar WHERE uitgave.isbn = exemplaar.isbn );

Een ander voorbeeld.

Hoeveel lezers hebben in 2004 een boek van J.K. Rowlings geleend? Geef ook het totale aantal uitleendagen.

Als een lezer meerdere keren een boek van Rowlings heeft geleend mag hij toch maar één keer meetellen. We zullen dus ook nu weer gebruik moeten maken van COUNT DISTINCT.Een juiste oplossing binnen standaard SQL:

Page 396: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003384

SELECT COUNT(DISTINCT lezernr), SUM (Retourdatum – Huurdatum + 1)FROM uitgave, exemplaar, uitleningWHERE uitgave.isbn = exemplaar.isbnAND exemplaar.exemplaarnr = uitlening.exemplaarnrAND YEAR(huurdatum) = 2004AND schrijver = ‘J.K. Rowlings’ ;

Met behulp van een ‘view’:

SELECT COUNT(*), SUM (aantalperklant)FROM (SELECT lezernr, SUM (eind – begin + 1) AS aantalperklant

FROM uitgave, exemplaar, uitlening WHERE uitgave.isbn = exemplaar.isbn

AND exemplaar.exemplaarnr = uitlening.exemplaarnr AND YEAR(huurdatum) = 2004 AND schrijver = ‘J.K. Rowlings’ GROUP BY lezernr );

10.14 SQL, meer mogelijkheden

Naast het SELECT-statement kent SQL uiteraard veel meer mogelijkheden. Deze vallen echter buiten het bestek van dit boek, mede omdat men binnen Access dezelfde functionaliteit via andere methodieken heeft geïmplementeerd. Denk daarbij bijvoorbeeld aan het definiëren van een tabel. Toch vinden wij het op zijn plaats om een aantal belangrijke SQL- en Access-mogelijkheden kort toe te lichten.

Toevoegen van gegevensINSERT INTO uitgave (isbn,titel,schrijver,uitgeverij,prijs)VALUES (9062335306,’Korte gras’,’Hennekorf’,

‘Korte Pen’, 45.90);

Hierbij wordt eerst gezegd dat de actie bestaat uit het toevoe-gen van rijen aan de genoemde tabel ( INSERT INTO uitgave). Vervolgens wordt vermeld in welke kolommen een waarde moet worden geplaatst. Het is namelijk niet noodzakelijk om direct alle

Page 397: Databaseontwikkeling Access 2003

10 SQL, Structured Query Language 385

velden een waarde te geven. Ten slotte worden de in te voegen waarden opgenomen (VALUES). Hierbij wordt de eerstgenoemde waarde in het eerstgenoemde veld geplaatst. De tweede waarde in het veld dat als tweede is genoemd, enzovoort. Deze manier van invoegen kun je goed gebruiken om via een web-pagina ingevoerde gegevens toe te voegen aan een tabel. Daarbij moet je dan wel een script/programmeertaal gebruiken die spe-ciaal voor webtoepassingen is ontwikkeld.

Wijzigen van gegevensUPDATE lezerSET naam = ‘Jansen’ , adres = ‘Kerkstraat 23’ , plaats = ‘Delft’WHERE lezernr = 4773;

Allereerst wordt de tabel genoemd waarin de wijziging moet wor-den doorgevoerd (UPDATE). Vervolgens wordt vermeld in welk veld de waarde moet worden aangepast. Ten slotte staat vermeld onder welke voorwaarde dit moet gebeuren. Zonder voorwaarde wordt de wijziging namelijk in alle records doorgevoerd!

Verwijderen van gegevensDELETE FROM reserveringWHERE lezernr = 4773;

Hier wordt eerst de tabel genoemd waaruit moet worden ver-wijderd (DELETE FROM). Vervolgens worden de voorwaarden opgesomd waaronder de verwijdering moet plaatsvinden.

Samenvoegen van uitvoertabellenDit kan alleen via SQL gerealiseerd worden, niet via de standaard-opvraagfaciliteiten van Access!

SELECT lezernrFROM lezerWHERE filiaalnr = 14UNIONSELECT lezernrFROM uitleningWHERE huurdatum = ‘2-15-97’;

Page 398: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003386

Dubbele records in de uitvoer worden automatisch onderdrukt. Willen we deze wel zien, dan moeten we verbinden via UNIONALL.

In ieder van de afzonderlijke deelquery’s mogen andere kolommen worden geselecteerd. Zo kun je de lezernummers uit de tabel lezer zonder probleem combineren met de huurdatums uit de tabel uit-lening. In feite worden er dan gewoon twee afzonderlijke query’s uitgevoerd waarvan de uitvoer aan elkaar geplakt wordt.

Een zinvolle toepassing van een UNION zou kunnen liggen in het afdrukken van een lijst met personen die moeten worden uit-genodigd voor een schoolreünie. Daarbij moeten de gegevens uit de tabel STUDENT worden gecombineerd met de gegevens uit de tabel DOCENT. Om te voorkomen dat iemand twee brieven krijgt (een student die later docent is geworden) maken we gebruik van UNION ALL.

SELECT naam, adres, postcode, woonplaatsFROM studentUNION ALLSELECT naam, adres, postcode, plaatsFROM docent ;

Page 399: Databaseontwikkeling Access 2003

A Veldeigenschappen

Tijdens het ontwerpen van een tabel kunnen we niet alleen opgeven welke velden we in de tabel wensen op te nemen, we kunnen ook de eigenschappen van het veld instellen. Er bestaan in totaal dertien verschillende eigenschappen. Deze kunnen we echter niet altijd instellen omdat ze niet altijd relevant zijn. Afhankelijk van het soort veld kunnen we een eigenschap wel of niet instel-len. We kunnen dit ook achteraf doen door de bestaande tabel te openen in de Ontwerpweergave.

In deze bijlage komen alle eigenschappen kort aan bod.

Figuur A.1

Page 400: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003388

VeldlengteHiermee stellen we de Veldlengte in bij velden van het type Tekst, Numeriek en Autonummering. De lengte voor een tekst-veld staat standaard ingesteld op 50, maar deze kan variëren tussen 0 en 255. Het is zaak de lengte zo in te stellen dat het veld niet te veel ruimte in beslag neemt. Gelet op de ruimte stellen we deze waarde zo laag mogelijk in. Zorg er wel voor dat alle gegevens, ook de gegevens die we in de toekomst nog zullen invoeren, in het veld passen.

Bij een veld van het type numeriek wordt de veldlengte opgegeven door in te stellen welk soort getal we willen kunnen verwerken. Hier kunnen we kiezen uit:

byte – alleen gehele getallen van 0 tot en met 255;integer – alleen gehele getallen, tussen –32768 en +32767;lange integer – alleen gehele getallen tussen –2.147.483.648 en 2.147.483.647;enkele precisie – getal met maximaal 7 decimalen, tussen –3,4 1038 en +3,4 1038;dubbele precisie – getal met maximaal 15 decimalen, tussen –1,797 10308 en +1,797 10308;decimaal – getal met maximaal 28 decimalen, tussen –1028 en +1028. In het veld Precisie kunnen we het totale aantal bij te houden cijfers opgeven. In het veld Schaal geven we op hoeveel cijfers we achter de komma willen kunnen plaatsen;replicatie id – een getal bedoeld voor het uniek identificeren van objecten; wordt hier verder buiten beschouwing gelaten.

Hierbij geldt dat naar beneden toe de benodigde geheugenruimte toe- en de verwerkingssnelheid afneemt. Het is dus zaak het type zo te kiezen dat zo min mogelijk geheugenruime wordt gebruikt maar wel alle gewenste waarden kunnen worden opgenomen. Bij een veld van het type Autonummering kunnen we voor de veld-lengte alleen kiezen uit lange integer en replicatie id. Hoewel Access hier zelf de nummering bijhoudt, kunnen we wel beïnvloe-den wat het eerstvolgende nummer moet worden.

Stel we willen in de database Reisbureau in de tabel Klant de eerstvolgende waarde van het klantnummer op 4000 zetten:

Page 401: Databaseontwikkeling Access 2003

A Veldeigenschappen 389

Open dan eerst de tabel Klant en zorg ervoor dat klantnummer niet langer een sleutelveld is. Creëer een nieuwe tabel en neem in deze tabel één veld op, met eveneens de naam klantnummer, maar nu van het type numeriek, lange integer.Voer in deze tabel vervolgens één record in en geef daarbij aan klantnummer de waarde 3999, dus één minder dan de waarde waarmee we straks willen beginnen. Sluit de tabel vervolgens weer af. Maak nu een query aan, in de ontwerpweergave en baseer deze query op de zojuist gemaakte tabel. Neem het veld klantnummerop. Selecteer vervolgens in de menubalk Query, Toevoegquery en geef op dat we de gegevens willen toevoegen aan de tabel Klant.Laat de query uitvoeren. Open hierna de tabel Klant en verwijder het zojuist toegevoegde record, met de waarde 3999. Zorg er ook voor dat de originele sleutelinstelling weer wordt ingesteld, dus klantnummer weer aan-wijzen als sleutel. Als we nu een nieuw record toevoegen, zullen we zien dat Access automatisch de waarde 4000 toekent als eerstvolgende klantnum-mer.

Het is overigens verstandig om voordat we de vorenstaande actie ondernemen de database te defragmenteren en te comprimeren. Hierbij wordt onder andere alle overtollige ruimte uit de database verwijderd. Tevens wordt het autonummer op de eerstvolgende startwaarde gezet, dat wil zeggen op één hoger dan de hoogste waarde die in gebruik is. Hebben we als test in een database gewerkt en gebruikgemaakt van een autonummer, dan kunnen we na het verwijderen van alle testgegevens het comprimeren gebruiken om de startwaarde van het autonummer weer op 1 te zetten. Om te comprimeren selecteer je achtereenvolgens: Extra, Databasehulpprogramma’s, Database comprimeren en herstellen.

NotatiewijzeMet de eigenschap Notatie kunnen we opgeven hoe gegevens moeten worden gepresenteerd naar buiten toe. Deze eigenschap heeft geen invloed op de waarde van het veld zelf, alleen op de presentatiewijze. Zo kan een tekst, opgeslagen in kleine letters,

Page 402: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003390

op het scherm gepresenteerd worden als een tekst in hoofdletters. Afhankelijk van het soort veld kunnen we de notatiewijze instel-len.

Voor een tekst-veld kunnen we gebruikmaken van:

@ op de positie van dit teken wordt het ingetypte teken of een spa-tie getoond;

& op de positie hiervan wordt het teken getoond; als er niets is ingetoetst, wordt er niets getoond;

< alles wordt in kleine letters weergegeven;> alles wordt in hoofdletters weergegeven.

We kunnen twee secties opgeven. De eerste sectie bevat de notatie voor een veld waarin een waarde staat vermeld, de tweede sectie bevat de opmaak voor een leeg veld, een veld zonder waarde. De secties worden door een puntkomma van elkaar gescheiden.

Om een artikelcode te tonen volgens het formaat twee tekens, punt, vier tekens, punt, één teken, in hoofdletters, kunnen we gebruik-maken van de notatie >@@.@@@@.@;[rood]”onbekend”. Als er geen waarde wordt ingevuld, wordt dit dus met de tekst ‘onbekend’ weergegeven (in het rood). De bovengenoemde eigenschappen gelden ook voor velden van het type memo.

Voor een veld van het type numeriek hebben we de keuze uit een aantal standaardinstellingen:

Standaard getalnotatie – het getal wordt weergegeven zoals het is ingevoerd.Valuta – geldbedrag, het scheidingsteken voor duizendtallen wordt gebruikt; negatieve getallen worden tussen haakjes geplaatst, stan-daard worden er twee decimalen getoond.Euro – de valutanotatie wordt gebruikt, waarbij altijd het eurosym-bool wordt getoond, onafhankelijk van het in Windows ingestelde valutasymbool;Vast – er wordt ten minste één cijfer weergegeven, zonder duizend-talteken, standaard worden er twee decimalen getoond.Standaard – het scheidingsteken voor duizendtallen wordt gebrui-kt; de standaardinstelling van het aantal decimalen is 2.

voorbeeld

Page 403: Databaseontwikkeling Access 2003

A Veldeigenschappen 391

Percentage – de waarde wordt met 100 vermenigvuldigd en er wordt een procentteken (%) toegevoegd; de standaardinstelling van het aantal decimalen is 2.Wetenschappelijk – de standaard wetenschappelijke notatie wordt gebruikt, dus machten van tien.

Naast de standaardinstellingen kunnen we bij getallen ook een eigen presentatiewijze definiëren. We kunnen dan gebruikmaken van:

. (punt) het scheidingsteken voor duizendtallen;, (komma) het decimale scheidingsteken;0 tijdelijke cijferaanduiding; geeft altijd een cijfer

(eventueel 0) weer;# tijdelijke cijferaanduiding; geeft een cijfer of niets

weer;geeft het euroteken weer (alleen in de Nederlandstalige versie)

$ geeft de dollaraanduiding weer (alleen in de Engelstalige versie);

% percentage: de waarde wordt vermenigvuldigd met 100 en er wordt een procentteken toegevoegd;

E– of e– wetenschappelijke notatie, met een minteken (–) bij negatieve exponenten en geen teken bij positieve exponenten; te gebruiken in combinatie met andere symbolen, bijvoorbeeld 0,00E-00 of 0,00E00;

E+ of e+ wetenschappelijke notatie, met een minteken bij negatieve exponenten en een plusteken (+) bij posi-tieve exponenten; te gebruiken in combinatie met andere symbolen, bijvoorbeeld 0,00E+00.

We kunnen bij getallen werken met vier secties, van elkaar geschei-den door een puntkomma. Deze bevatten achtereenvolgens de opmaak voor positieve getallen, voor negatieve getallen, voor de waarde nul (het getal nul) en ten slotte voor de Null-waarde (leeg veld). Voorbeeld : #.##0,00; #.##0,00 “Negatief!”;”Nul”;”Onbekend”. Door deze instelling worden getallen altijd getoond als bedragen, voorafgegaan door het euroteken. Er wordt altijd minimaal één cijfer voor het decimaalteken getoond en altijd twee decimalen. Bij negatieve bedragen (tweede sectie) wordt achter

Page 404: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003392

het bedrag het woord ‘Negatief!’ afgedrukt. De waarde 0 (derde sectie) wordt als woord uitgeschreven. In een leeg veld (sectie vier) wordt de tekst ‘Onbekend’ getoond. De bovengenoemde eigen-schappen gelden ook voor velden van het type valuta.

Voor een veld van het type datum/tijd hebben we de keuze uit een aantal standaardinstellingen:

Standaard datumnotatie – als de waarde alleen uit een datum bestaat, wordt geen tijd weergegeven en als de waarde alleen uit een tijd bestaat, wordt geen datum weergegeven; de instelling is een combinatie van de instellingen Korte datumnotatie en Lange tijdnotatie, bijvoorbeeld: 3-04-98 17:34:00.Lange datumnotatie – lange aanduiding, volgt de instelling van Windows zelf; standaard staat deze op de weergave: Vrijdag 3 april 1998.Middellange datumnotatie – middellange aanduiding, bijvoorbeeld: 3-apr-98.Korte datumnotatie – korte notatie, volgt de instelling van Windows zelf; standaard staat deze op de weergave: 3-4-98. Waarschuwing: bij deze instelling wordt aangenomen dat datums tussen 1-1-00 en 31-12-29 datums uit de eenentwintigste eeuw zijn (dat wil zeggen, er wordt uitgegaan van de jaren van 2000 tot 2029); datums tussen 1-1-30 en 31-12-99 worden verondersteld uit de twintigste eeuw te zijn (dat wil zeggen, er wordt uitgegaan van de jaren van 1930 tot 1999).Lange tijdnotatie – lange aanduiding voor de tijd, volgt de instel-ling van Windows zelf; standaard aangeduid met bijvoorbeeld: 17:34:23.Middellange tijdnotatie – middellange aanduiding, bijvoorbeeld: 5:34 PM.Korte tijdnotatie – korte aanduiding, bijvoorbeeld: 17:34.

Naast de standaardinstellingen kunnen we ook een eigen presenta-tiewijze definiëren. We kunnen dan gebruikmaken van:

: scheidingsteken binnen de tijdaanduiding, aan te passen binnen Windows zelf;

/ scheidingsteken binnen de datum;c als de vooraf gedefinieerde Standaard datumnota-

tie;

Page 405: Databaseontwikkeling Access 2003

A Veldeigenschappen 393

d dag van de maand in één of twee cijfers, afhanke-lijk van wat nodig is (van 1 tot en met 31);

dd dag van de maand (altijd) in twee cijfers;ddd eerste twee letters van de dag;dddd volledige naam van de dag; ddddd als de vooraf gedefinieerde Korte datumnotatie;dddddd als de vooraf gedefinieerde Lange datumnotatie;w dag van de week (van 1 tot en met 7);ww week van het jaar (van 1 tot en met 53);m maand van het jaar in één of twee cijfers;mm maand van het jaar (altijd) in twee cijfers;mmm eerste drie letters van de maand;mmmm volledige naam van de maand;k datum weergegeven als kwartaal van het jaar (van

1 tot en met 4);j dag van het jaar (van 1 tot en met 366);jj laatste twee cijfers van het jaartal (van 01 tot en

met 99);jjjj volledig jaartal in vier cijfers;u uren in één of twee cijfers;uu uren in (altijd) twee cijfers;n minuten in één of twee cijfers;nn minuten in (altijd) twee cijfers;s seconden in één of twee cijfers;ss seconden in (altijd) twee cijfers;ttttt als de vooraf gedefinieerde Lange tijdnotatie;AM/PM tijdaanduiding in maximaal 12 uren, met toevoe-

ging van de hoofdletters AM (’s ochtends) of PM (’s middags);

am/pm maximaal 12 uren, maar nu met toevoeging van de kleine letters am (’s ochtends) of pm (’s middags);

A/P maximaal 12 uren, met toevoeging van de hoofd-letter A (’s ochtends) of P (’s middags);

a/p maximaal 12 uren, met toevoeging van de kleine letter a (’s ochtends) of p (’s middags);

AMPM maximaal 12 uren, met de aanduiding van ochtend of middag, zoals gedefinieerd in Windows zelf.

Page 406: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003394

Voor een veld van het type Ja/nee hebben we de keuze uit drie standaardinstellingen:

Waar/onwaar;Ja/nee;Aan/uit.

We kunnen ook zelf de eigenschappen instellen; daartoe beschik-ken we over drie secties. De eerste sectie blijft ongebruikt, we gaan dus direct met een ; door naar de tweede sectie. Daar geven we op welke waarde getoond moet worden als de waarde Waar, Ja of Aan is. In de derde sectie geven we de waarde op die we wensen te tonen in het geval de waarde van het veld Onwaar, Nee of Uit is. Bijvoorbeeld: de notatie ;”Betalend lid”;”Ere lid” zal de tekst ‘Betalend lid’ tonen als de waarde van het invoer veld op Ja staat. In het andere geval wordt de tekst ‘Ere lid’ getoond.

Omdat een veld van het type Ja/Nee standaard wordt weergegeven als afvinkvakje, wordt de presentatiewijze voornamelijk gebruikt bij het laten uitvoeren van query’s en rapporten.

Bij alle velden, ongeacht het type, kunnen we gebruikmaken van:

het teken !, er wordt dan rechts uitgelijnd in plaats van links;het teken *, de beschikbare ruimte wordt nu opgevuld met het op het *-teken volgende symbool;alle andere tekens worden letterlijk in het veld weergegeven als we ze omsluiten met dubbele aanhalingstekens of (ieder afzonderlijk) laten voorafgaan door het teken \.

We kunnen ook de kleur instellen door deze op te geven tussen rechte haken, bijvoorbeeld [rood]. We kunnen kiezen uit zwart, blauw, groen, lichtblauw, rood, lila, geel en wit.

InvoermaskerMet een Invoermasker kunnen we per teken opgeven welke invoer is toegestaan. Daarbij kunnen we gebruikmaken van de volgende symbolen:

Page 407: Databaseontwikkeling Access 2003

A Veldeigenschappen 395

0 verplichte invoer van een cijfer (0 t/m 9), het plus- en min-teken zijn niet toegestaan;

9 invoer van cijfer (0 t/m 9) of een spatie, niet verplicht, het plus- en minteken zijn niet toegestaan;

# invoer van cijfer (0 t/m 9), spatie of het plus- of minteken, niet verplicht;

L letters A t/m Z, verplichte invoer;? letters A t/m Z, niet verplicht;A letter of cijfer, verplicht;a letter of cijfer, niet verplicht;& willekeurig teken of spatie, verplicht;C willekeurig teken of spatie, niet verplicht;,.:;-/ scheidingstekens voor decimalen, duizendtallen, datum en

tijd, het echte teken is afhankelijk van de instellingen in Windows zelf;

> maakt van alle volgende tekens hoofdletters;< maakt van alle volgende tekens kleine letters;! lijnt rechts uit;\ het hieropvolgende teken wordt letterlijk weergegeven.

We kunnen als masker ook het woord Wachtwoord opgeven. De invoer wordt dan behandeld alsof het een wachtwoord is. Ieder ingevoerd teken wordt weergegeven door een asterisk.

We kunnen bij het werken met een invoermasker gebruikmaken van drie secties. In de eerste sectie geven we het masker zelf op. In de tweede sectie geven we op of we de letterlijke-weergave-tekens (volgend op \) in de tabel willen opslaan wanneer we gegevens invoeren. Als we in deze sectie 0 typen, worden alle letterlijke tekens (bijvoorbeeld de haakjes in een invoermasker voor een tele-foonnummer) samen met de waarde opgeslagen. Als we 1 typen of de sectie leeg laten, worden alleen de tekens opgeslagen die we daadwerkelijk intoetsen. In de derde sectie geven we het teken op waarmee we spaties in het invoermasker wensen weer te geven.

Om een bankrekening in te toetsen volgens het formaat 12.34.56.789, waarbij we de punten zelf niet opslaan, geven we de volgende notatie op: 00\.00\.00\.000;1;. Een postcode kan volgens de layout 0000\ >LL;1 De spatie (tussen de tekens \ en >) wordt nu niet opgenomen in het bestand.

Page 408: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003396

Door niet zelf een masker in te toetsen maar op de knop met de drie puntjes te drukken, starten we een Wizard die het instellen van een masker vereenvoudigt doordat de uitwerking van de instel-ling direct op het scherm wordt getoond, zie figuur A.2. De Wizard start overigens alleen bij invoermaskers voor velden van het type tekst en datum/tijd.

We kunnen hier een eerste keuze maken. Selecteer het masker dat het best aan onze wensen voldoet. Druk daarna op de knop Volgende. Door op de knop Lijst bewerken te drukken, kun je een aantal standaardmaskers bewerken en blijvend veranderen. Je verandert daarmee dus de standaardwaarde zelf. Ook kun je zelfgedefinieerde standaardmaskers toe voegen.

In het scherm van figuur A.3 kunnen we het masker aanpassen voor het veld waarmee we bezig zijn. Een wijziging die we hier aanbrengen, is dus alleen voor dit ene veld geldig. Tevens kunnen we hier aangeven met welk teken we het veld willen vullen. Dit teken wordt later overschreven door de ingetoetste tekens. Hierna kunnen we naar de volgende stap van de Wizard gaan.

We dienen nu (zie figuur A.4) op te geven of de door ons gebruikte symbolen uit het masker ook moeten worden opgeslagen of niet. Hiermee krijgen we de mogelijkheid de veldlengte te verkleinen. We slaan de vaste symbolen immers niet op in de tabel, maar pre-senteren deze wel in de in- en uitvoer doordat we deze symbolen

Figuur A.2

Page 409: Databaseontwikkeling Access 2003

A Veldeigenschappen 397

hebben opgenomen in het masker. Ten slotte voltooien we het masker.

Let op! Als we gebruikmaken van een invoermasker en tegelijker-tijd van de eigenschap Notatie, heeft de eigenschap Notatie prio-riteit bij het weergeven van de gegevens.

Figuur A.3

Figuur A.4

Page 410: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003398

BijschriftNormaal wordt als kolomnaam, of als veldnaam in een formulier, de naam van het betreffende veld gebruikt zoals die is opgegeven bij het definiëren van de tabel. Met de eigenschap Bijschrift kun-nen we een andere tekst opgeven die als bijschrift moet worden gebruikt.

StandaardwaardeMet deze eigenschap kunnen we een veld van een nieuw record automatisch laten vullen met een Standaardwaarde. Dit is handig als we in een veld vaak dezelfde waarde moeten invullen. We kun-nen hier ook gebruikmaken van functies. Bij een datumveld kun-nen we bijvoorbeeld gebruikmaken van de functie DATE() om de huidige datum te noteren. Uiteraard kunnen we tijdens het daad-werkelijk invoeren van gegevens de standaardwaarde wijzigen in een andere waarde.

ValidatieregelMet een Validatieregel kunnen we controleren of de door de gebruiker ingetoetste waarde voldoet aan de beperkingen zoals we die hebben opgegeven. We kunnen een validatieregel direct invoeren, maar ook gebruikmaken van de opbouwfunctie voor expressies zoals we die ook zijn tegengekomen bij het opstellen van query’s.

Door een validatieregel op te geven dient de gebruiker ook altijd iets in te voeren. Het is niet toegestaan het veld leeg te laten, tenzij we dit expliciet opgeven in de validatieregel en bij de eigenschap Vereist.

Om een numerieke waarde te controleren waarvan de waarde moet liggen tussen 10 en 250, geven we de volgende regel op: >=10 AND <=250. Ook in de Nederlandstalige versie dienen we de uit-drukking AND te gebruiken! Een tekst van vijf tekens, waarvan de eerste letter een A is, waarbij het ook is toegestaan om niets in te vullen: LIKE “A????” OR IS NULL. Let erop dat we ook de waarde van Vereist moeten instellen op No!

Page 411: Databaseontwikkeling Access 2003

A Veldeigenschappen 399

ValidatietekstAls we gebruikmaken van een Validatietekst, zal Windows een standaardmelding tonen op het moment dat er onjuiste invoer is ingegeven. Willen we een eigen melding laten tonen, dan kunnen we de tekst hier opgeven.

VereistDe eigenschap Vereist gebruiken we om op te geven of een veld verplicht een waarde moet krijgen of dat men het ook leeg mag laten.

Lengte nul toegestaanDe eigenschap Lengte nul toegestaan bepaalt of we lege invoer toestaan of niet. Deze eigenschap werkt direct samen met de eigen-schap Vereist. Is de eigenschap Vereist op Nee ingesteld, dan is lege invoer (bijvoorbeeld direct op Enter of op de spatiebalk druk-ken) toegestaan. In het veld wordt dan de Null-waarde geplaatst. Staat de waarde van de eigenschap Vereist op Ja, dan hebben we de volgende twee mogelijkheden; deze zijn afhankelijk van de waarde van de eigenschap Lengte Nul Toegestaan:Ja: drukken op Enter is niet toegestaan, drukken op de spatiebalk wel.Nee: geen van de beide bovenstaande acties is toegestaan.

Geïndexeerd Met de eigenschap Geïndexeerd kunnen we opgeven of bij het betreffende veld een index moet worden aangemaakt (en bijgehou-den) of niet. Een index zorgt ervoor dat het zoeken in en sorteren op het betreffende veld aanzienlijk sneller verloopt. Moeten we vaak zoeken naar waarden in een bepaald veld, dan is het ver-standig op dat veld een index te definiëren. Access creëert zelf automatisch een index voor ieder sleutelattribuut. Vanuit een sleu-telwaarde worden vaak gerelateerde gegevens in andere bestanden gezocht. Om dit zoeken te versnellen is het verstandig om in die bestanden, op basis van de betreffende vreemde sleutel, een index te laten genereren. Met name bij grote hoeveelheden gegevens zal het uitvoeren van query’s hierdoor aanzienlijk versneld worden. Het aanbrengen van wijzigingen in de tabel wordt nu wel iets ver-traagd omdat de index steeds opnieuw moet worden bijgewerkt.

Page 412: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003400

We kunnen de eigenschap instellen op drie waarden:Nee – er wordt nu geen index aangemaakt.Ja, (Duplicaten Ok) – er wordt een index gemaakt waarbij dubbele waarden zijn toegestaan. Deze waarde dienen we dus in te stellen bij de index die we aanleggen op basis van een vreemde sleutel. Ja (Geen duplicaten) – er wordt een index gemaakt waarin geen duplicaten mogen worden opgenomen, zoals bij een sleutelveld gebruikelijk is.

Vaak is een index op een enkel veld voldoende, soms echter niet. Bijvoorbeeld: voor het bijhouden van een agenda moet de combi-natie datum en tijd uniek zijn, maar de afzonderlijke velden hoeven dat niet te zijn!

Willen we een index op meerdere velden tegelijkertijd, dan moeten we gebruikmaken van het venster Indexen, te bereiken via de menukeuze Beeld, Indexen.

In het venster (zie figuur A.5) voegen we de gewenste index toe aan de reeds bestaande indexen. We geven eerst de index een naam in de kolom Indexnaam. Hierna geven we in de kolom Veldnaam de verschillende te combineren velden op. Deze velden plaatsen we onder elkaar op verschillende regels, waarbij we bij het tweede en volgende veld de kolom Indexnaam leeg laten. Vervolgens geven we in de kolom Sorteervolgorde, per veld, de gewenste volgorde aan, Oplopend of Aflopend.

Onder in het scherm kunnen we vervolgens nog drie eigenschap-pen opgeven:Primair – moet de index als primaire sleutel dienst doen? Hiermee verwijderen we een eventueel al eerder opgegeven primaire sleutel.Uniek – moet de waarde in het (gecombineerde) veld uniek zijn of niet.Null-waarden negeren – moeten lege velden ook in de index wor-den opgenomen of niet.

In dit scherm kunnen we ook bestaande indexen wijzigen of ver-wijderen. We verwijderen een index door de betreffende regel te markeren en vervolgens op de toets Delete te drukken.

Page 413: Databaseontwikkeling Access 2003

A Veldeigenschappen 401

Unicode compressieAccess ondersteunt, net als de andere Office-modules, het Unicode-schema. Hiermee is het mogelijk in plaats van de gebrui-kelijke 256 tekens ruim 65000 verschillende tekens te gebruiken. Dit betekent echter wel dat velden van het type Tekst, Memo en Hyperlink twee keer zoveel ruimte in beslag nemen als wanneer er geen gebruik gemaakt wordt van Unicode. Indien we de Unicode-compressie bij een veld toestaan worden de normale tekens zoals die voorkomen in de West-Europese talen toch gecomprimeerd opgeslagen. Voor afwijkende tekens, bijvoorbeeld een Grieks of Russisch symbool, wordt dan automatisch de niet-gecomprimeerde opslagwijze gehanteerd. Gelet op een efficiënt gebruik van schij-fruimte is het verstandig om het comprimeren altijd toe te staan. Alleen indien we afwijkende tekens gebruiken en we gegevens willen kunnen uitwisselen met andere 32-bits applicaties (geen Office-modules) die eveneens Unicode ondersteunen, is het ver-standig de compressie uit te schakelen.

IME-modus / IME-zinmodusIME staat voor Input Method Editor. Dit is een programma waar-mee gewone toetsaanslagen, bij het gebruik van de Oost-Aziatische talen, kunnen worden omgezet naar specifieke Oost-Aziatische karakters. Met behulp van de eigenschappen IME-Modus en IME-zinmodus kunnen we instellen hoe er in het betreffende veld moet worden omgegaan met de ingevoerde toetsaanslagen. Het werken met deze twee eigenschappen heeft alleen maar zin als je de IME van de gewenste taal daadwerkelijk hebt geïnstalleerd. Je hebt hier-bij de keuze uit Chinees, Japans en Koreaans. De gewenste IME kun je downloaden vanaf de officiële Windows Officewebpagina.

Figuur A.5

Page 414: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003402

InfolabelsEen infolabel (Smarttag) kun je gebruiken om aan een veld een bepaalde vooraf gedefinieerde standaardactie te koppelen. Microsoft heeft een aantal standaardacties ontwikkeld, gericht op het gebruik van Microsoft Office. Deze acties stellen je bijvoor-beeld in staat om snel een email te versturen, een afspraak te plan-nen of een naam toe te voegen aan de lijst met contactpersonen. Maar er bestaan ook acties die niet zo zeer gericht zijn op Outlook maar op andere zaken, bijvoorbeeld het ophalen van financiële gegevens over een bedrijf. Ook andere partijen dan Microsoft heb-ben standaardacties ontwikkeld. Heb je een infolabel aan een veld gekoppeld dan zal, zodra je het veld selecteert, het infolabelsym-bool verschijnen. Door hier met de rechtermuistoets op te klikken kun je de actie starten.Wil je infolabels bij gebruik van het gegevensblad niet tonen, dan kun je dit bereiken door via Extra, Opties naar het tabblad Gegevensblad te gaan en hier voor de betreffende keuze het vinkje weg te halen.

Page 415: Databaseontwikkeling Access 2003

B Opties

Tijdens het werken met Access zullen we merken dat het program-ma een aantal vooraf ingestelde standaardwaarden kent, bijvoor-beeld de standaardlengte van een tekstveld of de plaats waar de databases worden opgeslagen. Deze waarden kunnen we voor het grootste deel zelf wijzigen. Enkele belangrijke standaardinstellin-gen worden hierna nader toegelicht.

Willen we een standaardwaarde wijzigen, dan kiezen we in het menu voor Extra, Opties. Vervolgens wordt het scherm dat is afge-beeld in figuur B.1 getoond. Verdeeld over elf tabbladen vinden we alle instellingen waarvan we de waarde kunnen wijzigen. De zes belangrijke en voor iedereen bruikbare tabbladen worden hierna kort toegelicht. Dit zijn achtereenvolgens Weergave, Algemeen, Bewerken/zoeken, Toetsenbord, Gegevensblad en Tabellen/que-ry’s. De overige tabbladen worden hier verder buiten beschouwing gelaten omdat deze buiten de doelstellingen van dit boek liggen.

WeergaveIn het tabblad Weergave kunnen we opgeven wat we op het scherm wensen te zien. We regelen dit door het betreffende item wel of niet af te vinken (zie figuur B.1).

Als eerste kunnen we opgeven of we de Statusbalk onder in het scherm wensen te zien. Op deze balk staat onder andere vermeld in welke modus Access zich bevindt. Ook staan daar vaak korte aanwijzingen.

Page 416: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003404

Als tweede kun je opgeven of je het Taakvenster dat Access stan-daard direct na het opstarten van het programma toont, wilt zien of niet. In het taakvenster kun je direct een bestaande database openen of een nieuwe database aanmaken. Ook zie je een kort overzicht van de databases die je het laatst hebt gebruikt. In dit boek gaan we ervan uit dat dit venster wordt getoond.

De derde instelling, Snelkoppeling voor nieuwe objecten, geeft aan of in het databasescherm niet alleen de echte objecten (tabel-len, rapporten, enzovoort) worden getoond maar ook de specifieke snelkoppelingen, bijvoorbeeld Rapport maken in ontwerpweergaveof Rapport maken met wizard.

De vierde instelling, Verborgen objecten, komt soms goed van pas. We kunnen namelijk objecten uit de database (tabellen, query’s, enzovoort) verbergen. Daartoe klikken we er in het data-basescherm met de rechtermuisknop op. Vervolgens kiezen we Eigenschappen en vinken we de instelling Verborgen af. Het object wordt nu niet langer in het databasescherm getoond. Daardoor kunnen we het echter ook niet meer benaderen om de instelling waarmee we het hebben verborgen, te herroepen. Door in dit tab-blad de eigenschap Verborgen objecten af te vinken zorgen we ervoor dat ook de verborgen objecten weer getoond worden, alleen nu voorafgegaan door een lichtgrijs pictogram. Omdat we nu het object weer kunnen selecteren, kunnen we de eigenschap ‘verber-gen’ eventueel weer opheffen.

Figuur B.1

Page 417: Databaseontwikkeling Access 2003

B Opties 405

De vijfde instelling is ‘gevaarlijk’. We kunnen daarmee de sys-teemtabellen zichtbaar maken in het databasescherm. In deze tabellen houdt Access voor zichzelf bij hoe de database is opge-bouwd: welke tabellen, welke relaties, welke query’s, enzovoort deze bevat. Door in deze tabellen wijzigingen aan te brengen kunnen we de database ernstig beschadigen. Vink het kenmerk Systeemobjecten dus niet af, tenzij je daarmee een speciale bedoe-ling hebt.

De zesde instelling bepaalt of er pictogrammen op de taakbalk moeten worden getoond voor iedere geopend object of scherm. Om de pictogrammen te tonen dienen we wel Internet Explorer Active Desktop geïnstalleerd te hebben.

Ten slotte kunnen we ook nog aangeven of we bij het ontwerpen van macro’s een Kolom met namen en/of een Kolom met voor-waarden wensen te zien. Ook de wijze van klikken om objecten in het databasevenster te openen kun je nog opgeven.

AlgemeenIn het tabblad Algemeen, zie figuur B.2, kunnen we de Afdrukmarges instellen. Hiermee bepalen we de vrije ruimte aan de boven-, onder- en zijkant van het papier bij het afdrukken.

Figuur B.2

Page 418: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003406

Tevens kunnen we hier opgeven welke map (folder) we wensen te gebruiken als Standaarddatabasemap. In deze map zullen nieuwe databases worden geplaatst en bestaande databases worden opge-zocht, tenzij we specifiek een andere map opgeven.

Verder kunnen we opgeven welke taal we wensen te gebruiken bij het bepalen van de Sorteervolgorde voor nieuwe database. De sorteervolgorde kan namelijk van land tot land verschillen, mede als gevolg van tekens die in de ene taal wel en in de andere taal niet voorkomen. Deze instelling heeft geen invloed op de sorteer-volgorde van bestaande databases.

Met de instelling Automatische naamcorrectie kunnen we instel-len of Access gegevens moet bijhouden om een verbetering in een naam later ook op andere plaatsen automatisch door te voeren. Tevens kunnen we aangeven of de automatische verbeteringen direct doorgevoerd moeten worden en of hiervan een logboek moet worden bijgehouden. We hebben ook de mogelijk om aan te geven of jaartallen in de geopende database, of zelfs in alle databases, met vier cijfers moeten worden getoond of niet. Deze instelling is onafhankelijk van de datuminstelling zoals die is opgegeven in het configuratiescherm van Windows zelf. In het veld Laatst gebruikte bestanden geven we aan of we bij het openen van het menu-item Bestand de laatst gebruikte bestanden wensen te zien en zo ja, welk aantal. Het item Comprimeren bij sluiten bepaalt of we data-bases bij het opslaan willen laten comprimeren of niet. Access zorgt er zelf voor dat bij het openen van databases eventueel wordt gedecomprimeerd. De compressie die hier wordt gerealiseerd, is bij lange na niet zo goed als de compressie die bij speciale com-pressieprogramma’s zoals PKZIP wordt behaald.

We kunnen ook opgeven of we gebruik wensen te maken van geluidseffecten bij bijvoorbeeld het optreden van fouten of uit-zonderlijke situaties, Feedback met geluid. De te gebruiken gelui-den kunnen we binnen Windows zelf instellen. Wees voorzichtig in het gebruik van geluiden omdat gebruikers zich snel ergeren aan overbodige, steeds terugkerende geluiden.

Met de instelling Persoonlijke gegevens uit dit bestand verwij-deren, kunnen we afdwingen dat de persoonlijke gegevens zoals naam en bedrijf wel of niet worden opgenomen in de algemene

Page 419: Databaseontwikkeling Access 2003

B Opties 407

eigenschappen van een database. De algemene eigenschappen van een database kun je opvragen via Bestand, Eigenschappen. Met de knop Webopties roep je een scherm op waarin je een aantal web-gerelateerde eigenschappen instelt, zoals de kleur waarmee een al dan niet gevolgde weblink moet worden weergegeven.

Serviceopties geeft de mogelijkheid om gebruik te maken van Microsoft Online. Bij het gebruik van de help-functie worden dan niet alleen de hulpbestanden gebruikt die op de PC aanwezig zijn, maar ook de online (op het web) aangeboden hulpbestanden. Tevens krijg je hiermee de beschikking over via het web aan-geboden sjablonen en mediafragmenten. Via deze optie kun je ook aangeven of je wilt meewerken aan het leveren van feedback aan-gaande het gebruik van Microsoft software. Deze feedback ver-loopt geheel geautomatiseerd en in de achtergrond. Op regelmatige tijdstippen worden (niet-persoonsgebonden) gegevens omtrent gebruik, uitzonderingen, foutmeldingen etc. naar Microsoft verstu-urd.

Bewerken/zoekenIn het tabblad Bewerken/zoeken kunnen we als eerste opgeven wat de standaardmethode zoeken/vervangen moet zijn. Deze stan-daardmethode wordt voorgesteld als we gegevens gaan zoeken in een tabel via de menukeuze Bewerken, Zoeken. De standaard-methode kunnen we hier wijzigen, zie figuur B.3.

Verder kunnen we opgeven bij welke bewerkingen er volgens ons om Bevestigen gevraagd moet worden voordat de bewerking daad-werkelijk wordt uitgevoerd.

De andere instellingen hebben te maken met het gebruik van een Formulierfilter. We kunnen dan opgeven bij welk soort veld (wel of niet geïndexeerd) we wel of geen Lijst met waarden wensen aan te bieden. In een dergelijke lijst worden alle in het betreffende veld voorkomende waarden getoond. We kunnen dan de filterwaarde bekend maken door de betreffende waarde te selecteren. Ook kun-nen we hier de waarde instellen die opgeeft: Geen lijsten weer-geven waarvoor meer dan het volgende aantal records is gelezen. Lijsten waarbij minder dan het opgegeven aantal records is betrok-ken, worden getoond. Lijsten waarbij meer dan het opgegeven aan-tal records is betrokken, worden onderdrukt.

Page 420: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003408

ToetsenbordIn het tabblad Toetsenbord kunnen we als eerste opgeven wat de wijze van Verplaatsing met Enter moet zijn op het moment dat we op de toets Enter drukken, zie figuur B.4. We kunnen ervoor kiezen om de cursor niet te verplaatsen, te verplaatsen naar het volgende veld of te verplaatsen naar het volgende record. In het laatste geval zullen we waarschijnlijk met de Tab-toets van veld naar veld springen.

Ook kunnen we opgeven wat de Focus na verplaatsing moet zijn. Moet de cursor na het verplaatsen naar een ander veld aan het begin van het veld staan, aan het einde van het veld, of moet het gehele veld direct zijn geselecteerd (gemarkeerd).

Met de instelling Werking van pijltoetsen geven we op of we met het gebruik van de toetsen en naar het volgende teken of naar het volgende veld wensen te springen. In het laatste geval kunnen we met behulp van de toets F2 binnen een veld toch naar een volgend teken gaan.

De instelling Cursor stopt bij eerste/laatste veld, bepaalt of we met de toetsen en wel of niet door kunnen gaan naar een vorig/volgend record in de lijst.

Figuur B.3

Page 421: Databaseontwikkeling Access 2003

B Opties 409

GegevensbladIn het tabblad Gegevensblad kunnen we de opmaak van de gegevensbladen instellen, zie figuur B.5.

De instellingen voor Standaardkleuren, Standaardlettertype, Standaardweergave van rasterlijnen, Standaardkolombreedte, Standaardceleffect en Animatie weergeven kunnen we aanpassen.

Figuur B.4

Figuur B.5

Page 422: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003410

Met name de instelling voor de standaardbreedte voor kolommen kan waarschijnlijk goed van pas komen. Je kunt hier ook opgeven of je eventuele aanwezige infolabels (smarttags) wel of niet wilt zien bij het werken met tabellen en formulieren. De mogelijkheid kan met name een rol spelen bij het werken met databases die door derden worden aangeleverd en waarbij ongewenste standaardacties aan de infolabels zijn toegekend.

Tabellen/query’sHet tabblad Tabellen/query’s is bedoeld om de standaard bij het ontwerpen van tabellen en query’s in te stellen, zie figuur B.6.

Als eerste kunnen we de Standaardveldlengten opgeven. Voor tekst bedraagt deze 50 tekens, maar het is aan te bevelen deze te verlagen tot 25. De standaardlengte voor getallen is gesteld op lange integer, waarbij we dus gehele getallen van –2.147.483.648 tot en met 2.147.483.647 kunnen invoeren.

Vervolgens kunnen we het Standaardveldtype instellen en onder welke omstandigheden er automatisch indexen moeten worden aangemaakt, AutoIndex bij importeren/maken.

Op formulieren en rapporten maak je gebruik van de velden zoals deze in de tabellen/query’s voorkomen. Neem je een veld uit een

Figuur B.6

Page 423: Databaseontwikkeling Access 2003

B Opties 411

tabel voor het eerst op in het ontwerp van een formulier/rapport, dan worden automatisch alle eigenschappen van dat veld mee-genomen, bijvoorbeeld dat het een numeriek veld is met twee deci-malen. Wijzig je later de eigenschappen van het veld in de onderliggende tabel (je wilt bijvoorbeeld een valutanotatie), dan wil je waarschijnlijk dat deze wijziging ook wordt doorgevoerd in alle formulieren/rapporten waar dit veld gebruikt wordt, of juist niet! Je kunt Access zo instellen dat in dat geval een overzicht wordt getoond van alle formulieren/rapporten waar dit veld gebruikt wordt en je de mogelijkheid wordt gegeven de eigen-schappen ook in die formulieren/rapporten aan te passen. Je moet daartoe aangeven dat de knoppen voor de bijwerkopties voor eigenschappen dienen te worden weergegeven.

Bij de instellingen van het query-ontwerp geven we eerst de instel-ling Tabelnamen weergeven op. Hiermee bepalen we of de namen van de tabellen in het ontwerpraster moeten worden vermeld of niet. De instelling Alle velden weergeven bepaalt of bij het maken van een query alle velden uit de betrokken tabellen moeten worden getoond of alleen de door ons geselecteerde velden. De instelling AutoJoin activeren bepaalt of Access zelf tabellen moet koppelen of dat we dat handmatig moeten doen. Deze instelling zorgt ervoor dat bij het gebruik van meer dan één tabel alleen de juiste combi-naties worden gemaakt, op basis van velden die in beide tabellen voorkomen en in één van de tabellen de sleutel vormen. Je vindt hier ook de mogelijkheid om het lettertype en de tekengrootte op te geven zoals die tijdens het ontwerpen van de query moeten worden gebruikt. De instelling Uitvoeringsmachtigingen bepaalt of alleen de eigenaar van een query wijzigingen in de query mag aanbren-gen of dat ook gebruikers van de query dat mogen, gebaseerd op de aan de gebruiker algemeen toegekende rechten.

De optie Met SQL-Server compatibele syntaxis (ANSI 92) bepaalt of je wilt werken met de standaard ANSI 92 of met de standaard ANSI 89. Access werkt bij SQL met de standaard ANSI 89. Deze standaard is dan ook in dit boek aangehouden. Zolang je werkt met Access-databases geeft dit weinig tot geen beperkingen. Maar als je gegevens wilt ontsluiten die in een professioneel DBMS zoals MS SQL-server liggen opgeslagen, moet je de standaard ANSI 92 gebruiken omdat MS SQL-server volgens die standaard werkt.

Page 424: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003412

Er zitten echter verschillen tussen de beide standaards die direct gevolgen kunnen hebben voor de geproduceerde uitvoer. Een belangrijk detail waarin de beide standaarden van elkaar verschil-len, is bijvoorbeeld het gebruik van wildcards. De een gebruikt een * en de ander een %-teken. De query SELECT plaats FROM Bestemming WHERE plaats LIKE ‘B*’ levert in de ene standaard alle plaatsen op waarvan de naam met de letter B begint. In de andere standaard wordt er geen uitvoer geproduceerd omdat daar letterlijk naar de tekst B* wordt gezocht. En die wordt niet aan-getroffen! Door dit soort verschillen is het dan ook niet mogelijk om beide standaarden door elkaar te gebruiken. Je moet een keuze maken. Bedenk dat bij het overschakelen naar de standaard ANSI 92, door het aanvinken van het betreffende veld, je alle query’s moet controleren op juist functioneren. In dit boek gaan we ervan uit dat er wordt gewerkt volgens de standaard van Access, dus ANSI 89.

Naast de mogelijkheid om makkelijk te werken met bijvoorbeeld MS SQL-server, biedt ANSI 92 ook de mogelijkheid om:rechten toe te kennen / te herroepen met GRANT en REVOKE;DISTINCT te gebruiken bij rekenkundige functies;de omvang van de uitvoer te beperken met LIMIT TO .. ROWS.

Page 425: Databaseontwikkeling Access 2003

C Een grote, uitgewerkteopdracht

In deze bijlage wordt een uitgewerkt voorbeeld gegeven van een opdracht waarin alle aspecten aan de orde komen zoals die in dit boek zijn toegelicht in de hoofdstukken 1 tot en met 7. Er wordt uitgegaan van een gegeven informatiebehoefte. Via de techniek van het normaliseren wordt hieruit de informatiebehoefte bepaald. Vervolgens wordt de informatiebehoefte vertaald naar een Access-database en worden de tabellen gevuld met gegevens. Ten slotte wordt er een aantal query’s, formulieren en rapporten ontwikkeld waarmee de opgeslagen informatie ontsloten wordt. Docenten kun-nen vergelijkbare opgaven verkrijgen bij de auteurs van het boek. Voor meer informatie hierover verwijzen we naar het voorwoord.

De opdrachtEen tweewielcentrum in Almelo verkoopt fietsen, brommers en scooters. Sinds enige jaren heeft men de klanten ook de mogelijk-heid gegeven om brommers en scooters te leasen. Om de gegevens hiervan bij te houden maakt men onder andere gebruik van de vol-gende overzichten.

In figuur C.1 wordt per leasecontract vastgelegd wie welke brom-mer of scooter least, vanaf welke datum en tegen welk bedrag. Tevens wordt na afloop van het contract de datum vastgelegd waar-op het contract eindigt. Men kan een contract per maand opzeg-gen. Er geldt wel een opzegtermijn van twee maanden. Tenslotte houdt men per contract ook de betalingsgegevens bij. De prijs per maand is gebaseerd op het merk en type brommer of scooter dat wordt gehuurd en van het feit of men ook een verzekering via het tweewielcentrum heeft afgesloten. In dat geval ontvangt men een korting van 10% op het standaard leasebedrag per maand.

Page 426: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003414

In figuur C.2 wordt per merk en type de prijs bijgehouden die men per maand in rekening brengt.

a. Logisch ontwerpa.1. Normaliseer beide figuren. Licht de normalisaties toe, denk

daarbij aan het toelichten van proces-, samengestelde en con-stante gegevens. Licht ook de sleutelkeuze toe.

Figuur C.1

Figuur C.2

Page 427: Databaseontwikkeling Access 2003

C Een grote, uitgewerkte opdracht 415

a.2. Integreer de normalisaties tot één geheel en ontwerp het bij-behorende ERD.

a.3. Bij de onderdelen d, e en f kan sprake zijn van nog niet genoemde attributen. Voeg deze (indien van toepassing) toe aan de betreffende objecten.

b. Technisch ontwerpb.1. Ontwerp de tabellen met behulp van Access. Zorg ervoor dat

bij vreemde sleutels alleen uit de bijbehorende sleutelwaarde kan worden gekozen door gebruik te maken van een combo-box (zie hoofdstuk 5). Neem in de kolom Beschrijving een korte omschrijving op.

b.2. Leg tussen de tabellen alle bestaande relaties en dwing daar-bij de controle op referentiële integriteit af.

c. Opbouwen tabellenc.1. Vul de bestanden met gegevens. Zorg ervoor dat de inhoud

van de tabellen een reële afspiegeling van de werkelijkheid is, zonder je te verliezen in het invoeren van een eindeloze reeks van gegevens. Zorg er ook voor dat alle hierna opgenomen opgaven kunnen worden uitgevoerd en getest.

c.2. Maak een invoerformulier waarmee in één van de tabellen, één waarbij geen sprake is van een vreemde sleutel, gegevens kunnen worden ingevoerd. Zorg ervoor dat dit formulier net-jes, overzichtelijk en uitnodigend is.

d. Opvragen gegevensd.1. Verzorg een query waarmee alle klantgegevens worden gepre-

senteerd van klanten die per automatische incasso betalen. Op volgorde van postcode.

d.2. Verzorg een query waarmee een overzicht wordt verkregen met daarop per leasecontract het merk, type, prijs per maand en de naam en de woonplaats van de klant. Het overzicht moet liggen op volgorde van woonplaats. Bij gelijke woon-plaats moet worden doorgesorteerd (oplopend) op merk.

d.3. Hoeveel leasecontracten zijn er in 2002 afgesloten, die nog steeds doorlopen en waarbij ook direct de verzekering via ons is afgesloten?

d.4. Verzorg per plaats het totale aantal afgesloten en nu nog lopen-de leasecontracten. Toon het overzicht op volgorde van plaats-naam.

Page 428: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003416

d.5. Verzorg een query waarmee per contract het totaal aan betaal-de bedragen wordt getoond. Laat ook het aantal betalingen en de naam van de klant tonen. Het overzicht moet liggen op volgorde van dalend totaalbedrag.

e. Manipuleren gegevense.1. Verzorg een query waarmee het bedrag per maand wordt aan-

gepast. Leasebedragen boven de 20,– moeten met 2% wor-den verhoogd. Alle andere moeten met 3% worden verhoogd. Maak voordat je dit test een kopie van je database!

e.2. Verzorg een query waarmee alle contracten, beëindigd op of voor een door de gebruiker op te geven datum, worden ver-wijderd. Maak voordat je dit test een kopie van de database!

f. Rapportenf.1. Verzorg een rapport waarmee figuur C.2 kan worden gegene-

reerd. f.2. Verzorg een rapport waarmee figuur C.1 kan worden gegene-

reerd, nadat het nummer van het betreffende contract is inge-voerd. Tip: maak een flexibele query.

Uitwerking

a. Logisch ontwerp

a.1. Normaliseer beide figuren. Licht de normalisaties toe, denk daar-bij aan het toelichten van proces-, samengestelde en constante gegevens. Licht ook de sleutelkeuze toe.

We beginnen met het normaliseren van figuur C1. In dit overzicht zien we allereerst de gegevens van het tweewielcentrum zelf. Dit zijn vaste, constante gegevens die we niet opnemen. Vervolgens zien we een aantal gegevens van de klant, de gegevens van het geleaste voertuig, gegevens omtrent het contract en tenslotte een aantal keer gegevens omtrent de verrichte betalingen. Dit levert de onderstaande nulde normaalvorm.

0 NV (contractnummer, klantnummer, naam, adres, postcode, plaats, telefoonnummer, geboortedatum, merk, type, ingangsdatum, beëindigingdatum, verzekering, maand-bedrag, RG (betaal-datum, betaald bedrag))

Page 429: Databaseontwikkeling Access 2003

C Een grote, uitgewerkte opdracht 417

Per contract wordt een uniek nummer gebruikt. Het contractnum-mer kan dus als sleutel worden gebruikt. Alle gegevens worden één keer vermeld, met uitzondering van de betaalgegevens, die dus zijn opgenomen in een herhalende groep, repeating group. Omdat er per maand een afwijkend bedrag kan zijn betaald, kan het betaalde bedrag niet worden gezien als een procesgegeven.

1 NV (contractnummer, klantnummer, naam, adres, postcode, plaats, telefoonnummer, geboortedatum, merk, type, in-gangsdatum, beëindigingdatum, verzekering, maandbedrag) (contractnummer, betaaldatum, betaald bedrag)

De herhalende groep is apart genomen. Omdat er per contract meerdere bedragen kunnen zijn betaald, maar nooit twee maal op dezelfde datum, bestaat de sleutel in de nieuwe groep uit de combi-natie contractnummer, betaaldatum.

2 NV = 1 NV

Er is in één groep sprake van een samengestelde sleutel, maar het daarin opgenomen niet-sleutelattribuut is afhankelijk van de gehele sleutel.

3 NV (contractnummer, klantnummer, merk, type, ingangsdatum, beëindigingdatum, verzekering, maandbedrag) (contract-nummer, betaaldatum, betaald bedrag) (klantnummer,naam, adres, postcode, plaats, telefoonnummer, geboorte-datum)

Er is een nieuwe groep ontstaan met daarin de gegevens van de klant. Deze gegevens hebben immers op zich niets te maken met het contractnummer.

Page 430: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003418

We vinden dus uiteindelijk:

CONTRACT (contractnummer, klantnummer, merk, type, ingangsdatum, beëindigingdatum, verzekering, maandbedrag)

BETALING (contractnummer, betaaldatum, betaald bedrag)KLANT (klantnummer, naam, adres, postcode, plaats,

telefoonnummer, geboortedatum)

We zullen nu figuur C.2 normaliseren.

0 NV (merk, type, prijs per maand)

Ook hier geldt dat de gegevens van het tweewielcentrum als con-stanten beschouwd kunnen worden. Er is ook geen sprake van een herhalende groep. Omdat de prijs per maand afhankelijk is van het merk en type, bestaat de sleutel uit de combinatie van deze twee gegevens.

Vervolgens geldt dat de gevonden nulde normaalvorm ook direct de eerste, tweede en derde normaalvorm is. We krijgen dus uitein-delijk:

VOERTUIG (merk, type , prijs per maand)

a.2. Integreer de normalisaties tot één geheel en ontwerp het bij-behorende ERD.

De integratie geeft in eerste instantie de onderstaande vier tabel-len.

CONTRACT (contractnummer, klantnummer, merk, type, ingangsdatum, beëindigingdatum, verzekering, maandbedrag)

BETALING (contractnummer, betaaldatum, betaald bedrag)KLANT (klantnummer, naam, adres, postcode, plaats,

telefoonnummer, geboortedatum)VOERTUIG (merk, type , prijs per maand)

Door de integratie ontstaat er plotseling een procesgegeven. Het maandbedrag in de tabel CONTRACT is na integratie een pro-cesgegeven geworden, omdat dit bedrag ook kan worden afgeleid

Page 431: Databaseontwikkeling Access 2003

C Een grote, uitgewerkte opdracht 419

uit de prijs per maand uit de tabel VOERTUIG, tezamen met het gegeven verzekering uit de tabel CONTRACT. Immers, als er geen verzekering is afgesloten, geldt dat het maandbedrag gelijk is aan de prijs per maand. Als er wel een verzekering bij afgesloten is, wordt er een korting van 10% op de prijs per maand verleend. Dus uit het feit of er wel of niet een verzekering is afgesloten, kan in combinatie met de prijs per maand het maandbedrag worden ber-ekend. We laten het maandbedrag dus achterwege. We krijgen dan:

CONTRACT (contractnummer, klantnummer, merk, type, ingangsdatum, beëindigingdatum, verzekering)

BETALING (contractnummer, betaaldatum, betaald bedrag)KLANT (klantnummer, naam, adres, postcode, plaats,

telefoonnummer, geboortedatum)VOERTUIG (merk, type , prijs per maand)

Dit levert het volgende ERD op:

Bij een contract kunnen nul, een of meer betalingen horen. Een betaling hoort bij precies één contract. Bij een contract hoort pre-cies één klant, maar een klant kan wel meerdere contracten hebben lopen. Omdat we een klantgegeven pas opnemen in de database als er een contract is opgesteld, hoort er bij iedere klant minstens één contract.Bij een contract hoort één type voortuig. Bij een bepaald type voertuig kunnen we nul, één of meer contracten vinden.

a.3. Bij de onderdelen d, e en f kan sprake zijn van nog niet genoemde attributen. Voeg deze (indien van toepassing) toe aan de betref-fende tabellen.

Bij vraag d.1 is sprake van automatische incasso. Dit moeten we toevoegen aan de tabellen. Het gegeven moet worden toegevoegd aan de tabel CONTRACT om het mogelijk te maken dat een klant

o.b.v. contractnummer o.b.v. klantnummer

o.b.v. merk + type

Betaling Contract Klant

Voertuig

Page 432: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003420

per contract bepaalt of hij wel of niet via automatische incasso wil betalen. We krijgen dus uiteindelijk:

CONTRACT (contractnummer, klantnummer, merk, type, ingangsdatum, beëindigingdatum, verzekering, aut incasso)

BETALING (contractnummer, betaaldatum, betaald bedrag)KLANT (klantnummer, naam, adres, postcode, plaats,

telefoonnummer, geboortedatum)VOERTUIG (merk, type , prijs per maand)

b. Technisch ontwerp

b.1. Ontwerp de tabellen met behulp van Access. Zorg ervoor dat bij vreemde sleutels alleen uit de bijbehorende sleutelwaarde kan worden gekozen door gebruik te maken van een combobox (zie hoofdstuk 5). Neem in de kolom Beschrijving een korte omschrij-ving op.

De ontworpen tabellen kun je terugvinden in database TWEEWIEL-CENTRUM. Deze database is te vinden op de cd-rom die bij het boek is geleverd. Een afdruk van de ontworpen tabellen is weer-gegeven in de figuren C.3 tot en met C.6

Figuur C.4

Figuur C.5

Figuur C.3

Page 433: Databaseontwikkeling Access 2003

C Een grote, uitgewerkte opdracht 421

b.2. Leg tussen de tabellen alle bestaande relaties en dwing daarbij de controle op referentiële integriteit af.

De relaties zoals weergegeven in het ERD zijn ook opgenomen in de database TWEEWIELCENTRUM. Een afdruk is te vinden in figuur C.7

c. Opbouwen tabellen

c.1. Vul de bestanden met gegevens. Zorg ervoor dat de inhoud van de tabellen een reële afspiegeling van de werkelijkheid is, zonder je te verliezen in het invoeren van een eindeloze reeks van gegevens. Zorg er ook voor dat alle hierna opgenomen opgaven kunnen wor-den uitgevoerd en getest.

De inhoud van de tabellen kan worden teruggevonden in de data-base TWEEWIELCENTRUM. Voor de overzichtelijkheid is de inhoud van de tabellen ook hier weergegeven in de figuren C.8 tot en met C.11.

Figuur C.6

Figuur C.7

Page 434: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003422

contract- klant- merk type ingangs- beëindigings- verzekering aut incassonummer nummer datum datum

1 6 Asprilla Exclusiv 13-3-2002 Ja Ja

2 4 Garvin Luxe 13-3-2002 Nee Nee

3 9 Asprilla Exclusiv 16-5-2002 Nee Ja

4 3 Vespa GHT 31-5-2002 Ja Ja

5 2 Asprilla Rimi 1-6-2002 Nee Nee

6 1 Garvin Modio 1-6-2002 1-9-2002 Nee Nee

7 1 Vespa Pronto 1-9-2002 Nee Nee

8 5 Garvin Luxe 13-10-2002 Ja Ja

9 7 Vespa GHT 24-1-2003 Ja Ja

10 8 Garvin Luxe 26-1-2002 26-3-2003 Nee Ja

11 4 Asprilla Rimi 3-1-2003 Ja Ja

12 8 Vespa Pronto 26-3-2003 Nee Nee

Figuur C.8

contractnummer betaaldatum betaald bedrag

2 1-4-2002 C 9,00

1 1-4-2002 C 16,00

1 1-5-2002 C 23,40

2 1-5-2002 C 12,50

3 1-6-2002 C 13,00

1 1-6-2002 C 23,40

5 1-7-2002 C 32,00

4 1-7-2002 C 18,00

6 1-7-2002 C 13,75

3 1-7-2002 C 13,00

1 1-7-2002 C 23,40

2 1-7-2002 C 25,00

4 1-8-2002 C 18,00

3 1-8-2002 C 13,00

5 1-8-2002 C 32,00

6 1-8-2002 C 13,75

1 1-8-2002 C 23,40

4 1-9-2002 C 18,00

6 1-9-2002 C 13,75

2 1-9-2002 C 25,00

3 1-9-2002 C 13,00

5 1-9-2002 C 32,00

1 1-9-2002 C 23,40

5 1-10-2002 C 32,00

7 1-10-2002 C 22,50

1 1-10-2002 C 23,40

2 1-10-2002 C 12,50

3 1-10-2002 C 13,00

4 1-10-2002 C 9,00

1 1-11-2002 C 23,40

– zie vervolg –

Page 435: Databaseontwikkeling Access 2003

C Een grote, uitgewerkte opdracht 423

8 1-11-2002 C 5,00

7 1-11-2002 C 22,50

3 1-11-2002 C 13,00

4 1-11-2002 C 9,00

5 1-11-2002 C 32,00

2 1-11-2002 C 12,50

8 1-12-2002 C 12,50

2 1-12-2002 C 12,50

5 1-12-2002 C 32,00

4 1-12-2002 C 36,00

3 1-12-2002 C 13,00

1 1-12-2002 C 23,40

7 1-12-2002 C 22,50

7 1-1-2003 C 22,50

5 1-1-2003 C 32,00

3 1-1-2003 C 13,00

2 1-1-2003 C 12,50

8 1-1-2003 C 12,50

4 1-1-2003 C 18,00

1 1-1-2003 C 23,40

8 1-2-2003 C 12,50

4 1-2-2003 C 18,00

9 1-2-2003 C 6,00

7 1-2-2003 C 22,50

5 1-2-2003 C 25,00

10 1-2-2003 C 3,50

11 1-2-2003 C 26,00

1 1-2-2003 C 23,40

3 1-2-2003 C 13,00

11 1-3-2003 C 28,80

10 1-3-2003 C 12,50

9 1-3-2003 C 18,00

8 1-3-2003 C 12,50

1 1-3-2003 C 23,40

5 1-3-2003 C 25,00

7 1-3-2003 C 22,50

3 1-3-2003 C 13,00

contractnummer betaaldatum betaald bedragFiguur C.9

Page 436: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003424

c.2. Maak een invoerformulier waarmee in één van de tabellen, één waarbij geen sprake is van een vreemde sleutel, gegevens kunnen worden ingevoerd. Zorg ervoor dat dit formulier netjes, overzich-telijk en uitnodigend is.

Er is voor gekozen dit formulier te ontwerpen voor de tabel KLANT. Voor het ontwerp is gebruikgemaakt van de wizard. Een afdruk van het formulier is weergegeven in figuur C.12 en kan in de database worden teruggevonden onder de naam KLANTINVOER.

Figuur C.10 klant- naam adres postcode plaats telefoon- geboorte-nummer nummer datum

1 Jansen, Jan Kerkstraat 2 7607 BS Almelo 0546753796 1-3-1982

2 Walters, Wouter Merelstraat 13 7605 BG Almelo 0546758869 27-12-1981

3 Verploeg, Koen Oranjestraat 164 7461 DK Rijssen 0548442943 31-3-1982

4 Wit, Erica de Almeloseweg 182 7614 LB Mariaparochie 0546433839 15-11-1982

5 Boer, Koen de Eikenlaan 10 7461 XS Rijssen 0548499303 28-3-1979

6 Gerets, Monique 1e lageveldsweg 2 7641 RM Wierden 0546933302 3-12-1981

7 Gerets, Jannie 1e lageveldsweg 2 7641 RM Wierden 0546933302 3-12-1981

8 Hoofd, Eric Hofstraat 13 7607 AB Almelo 0546749941 26-12-1982

9 Mens, Hans Ravelstraat 42 7604 HZ Almelo 0546747732 18-11-1981

merk type prijs per maand

Asprilla Exclusiv C 26,00

Asprilla GT C 29,00

Asprilla Rimi C 32,00

Garvin Luxe C 12,50

Garvin Modio C 13,75

Vespa GHT C 20,00

Vespa Pronto C 22,50

Figuur C.11

Figuur C.12

Page 437: Databaseontwikkeling Access 2003

C Een grote, uitgewerkte opdracht 425

d. Opvragen gegevens

d.1. Verzorg een query waarmee alle klantgegevens worden gepresen-teerd van klanten die per automatische incasso betalen. Op vol-gorde van postcode.

De query is opgeslagen onder de naam Aut-incasso. Figuur C.13 bevat een afdruk van het ontwerpscherm. Figuur C.14 toont de gegenereerde uitvoer.

d.2. Verzorg een query waarmee een overzicht wordt verkregen met daarop per leasecontract het merk, type, prijs per maand en de naam en de woonplaats van de klant. Het overzicht moet liggen op volgorde van woonplaats. Bij gelijke woonplaats moet worden doorgesorteerd (oplopend) op merk.

De query is opgeslagen onder de naam MerkperPlaats. Figuur C.15 bevat een afdruk van het ontwerpscherm. Figuur C.16 toont de gegenereerde uitvoer.

Figuur C.13

Figuur C.14

Page 438: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003426

d.3. Hoeveel leasecontracten zijn er in 2002 afgesloten, die nog steeds doorlopen en waarbij ook direct de verzekering via ons is afgeslo-ten?

De query is opgeslagen onder de naam Aantal2002Verzekering.Figuur C.17 bevat een afdruk van het ontwerpscherm. Figuur C.18 bevat de gegenereerde uitvoer.

Figuur C.15

Figuur C.16

Figuur C.17

Page 439: Databaseontwikkeling Access 2003

C Een grote, uitgewerkte opdracht 427

d.4. Verzorg per plaats het totale aantal afgesloten en nu nog lopende leasecontracten. Toon het overzicht op volgorde van plaatsnaam.

Om dit probleem op te lossen is er eerst een query ontworpen die een overzicht geeft van de lopende contracten. Deze query is opgeslagen onder de naam LopendeContracten. Figuur C.19 bevat een afdruk van het ontwerpscherm. Figuur C.20 bevat de gegener-eerde uitvoer.

Hierna is de uitvoer van de vorige query, met dus alleen de lopende contracten, gebruikt om per plaats het aantal contracten te bepalen. Deze query is opgeslagen onder de naam AantalContractenPer-Plaats. Figuur C.21 bevat een afdruk van het ontwerpscherm. Figuur C.22 bevat de gegenereerde uitvoer.

Figuur C.18

Figuur C.19

Figuur C.20

Page 440: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003428

d.5. Verzorg een query waarmee per contract het totaal aan betaalde bedragen wordt getoond. Laat ook het aantal betalingen en de naam van de klant tonen. Het overzicht moet liggen op volgorde van dalend totaalbedrag.

De query is opgeslagen onder de naam TotaalPerContract. Figuur C.23 bevat een afdruk van het ontwerpscherm. Figuur C.24 bevat de gegenereerde uitvoer.

Figuur C.21

Figuur C.22

Figuur C.23

Page 441: Databaseontwikkeling Access 2003

C Een grote, uitgewerkte opdracht 429

e. Manipuleren gegevens

e.1. Verzorg een query waarmee het bedrag per maand wordt aan-gepast. Leasebedragen boven de 20,– moeten met 2% worden verhoogd. Alle andere moeten met 3% worden verhoogd. Maak voordat je dit test een kopie van de database!

De query is opgeslagen onder de naam VerhoogMaandbedragen.Figuur C.25 bevat een afdruk van het ontwerpscherm. Er is gebrui-kgemaakt van de IIF-functie om de wijziging tot stand te brengen.

e.2. Verzorg een query waarmee alle contracten, beëindigd op of voor een door de gebruiker op te geven datum, worden verwijderd. Maak voordat je dit test een kopie van je database!

De query is opgeslagen onder de naam VerwijderBeeindigdeContracten. Figuur C.26 bevat een afdruk van het ontwerpscherm. Om deze query goed te laten verlopen dient de relatie tussen Contract

Figuur C.24

Figuur C.25

Page 442: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003430

en Betaling te zijn ingesteld op Gerelateerde records trapsgewijs verwijderen. Hierdoor zullen ook de betalingen van de betrokken contracten worden verwijderd!

f. Rapporten

f.1. Verzorg een rapport waarmee figuur C.2 kan worden gegenereerd.

Het rapport is opgeslagen onder de naam Prijslijst. Figuur C.27 bevat een afdruk van het ontwerpscherm. Figuur C.28 bevat de gegenereerde uitvoer.

Figuur C.26

Figuur C.27

Page 443: Databaseontwikkeling Access 2003

C Een grote, uitgewerkte opdracht 431

f.2. Verzorg een rapport waarmee figuur C.1 kan worden gegenereerd, nadat het nummer van het betreffende contract is ingevoerd. Tip: maak een flexibele query.

Om dit rapport te kunnen maken is eerst een query ontworpen waarbij alle benodigde gegevens worden gegenereerd. Er is bij de bouw van de query voor gezorgd dat eerst om een contractnummer wordt gevraagd. De gegevens van het bijbehorende contract wor-den vervolgens gegenereerd. Deze query is opgeslagen onder de naam BetalingenPerContract.Vervolgens is op basis van deze query het rapport opgemaakt. Het rapport is opgeslagen onder de naam OverzichtPerContract.Figuur C.29 bevat een afdruk van het ontwerpscherm. Figuur C.30 bevat de gegenereerde uitvoer.

Figuur C.28

Page 444: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003432

Figuur C.29

Figuur C.30

Page 445: Databaseontwikkeling Access 2003

433

Index

Symbolen&-teken 256

Aachtergrondkleur 255actiekolom 248afbeeldingen 151afdrukken 88afhankelijk kader 152Algemeen 405alias 356Alleen lijst 163AND 347applicatie 5, 271argumenten 248ASC 359attribuut 26, 36, 70attribuutwaarde 36AVG 361

BBack Color 255Backup 123besturingselementnaam 263BETWEEN 348bewerken 407bijeenhouden 223bij geen gegevens 320bij klikken 268bij openen 269bij opmaken 314bijschrift 221, 398bij sluiten 300Border Style 222breedte 284

CCaption 221Check Box 145Combo Box 156Command Button 180Common Expressions 312conceptueel datamodel 14Conditions 264constante gegevens 25constantentabel 273ControlTip Text 184converteren 7COUNT 361

Ddatabase 9

aanmaken 71openen 351selecteren 77

database-administrator 14datadictionary 60datamodel 14DataPageSize 208datumaanduiding 348DELETE FROM 385derde normaalvorm 33DESC 359detail 215DISTINCT 350DividingLines 280draaigrafieken 192draaitabellen 185dubbele repeterende groep 47, 52duplicaten verbergen 216

Page 446: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003434

Eeerste normaalvorm 28elementaire gegevens 25Enabled 168entiteit 36entiteit-occurence 36Entiteit-Relatie-Diagram 36ExpandedByDefault 208Expression Builder 260

Fflexibele query 226Font Size 281Font Weight 222Fore Color 311foreign key 38formaat modus 154

kader niet vullen 154kader vullen 154uitsnede 154

formulier(en) 145autoformulier 135gebruiken 140wizard 137

formulierkiezer 170formulierkoptekst 280formuliervoettekst 282FROM 346functie

Choose() 310IIf() 292Switch() 310

functioneel datamodel 14

Ggangbare expressies 312gebeurtenis 268gegeven 2

manipuleren 416, 429opvragen 415, 425

gegevensanalyse 20

gegevensbank 9gegevensblad 409gegevenstructuur 7groepeerinterval 223groeperen 364groeperen op 223groepskoptekst 223groepsvak 149groepsvoettekst 223GROUP BY 364Group Footer 223Group Header 223Group Interval 223Group On 223

Hhandje met vijf vingers 293handje met wijsvinger 293HAVING 365Height 284Hide Duplicates 216homoniemen 58hoofdformulier 165hoogte 284

Iidentity integrity 343IIF 115IN 349inconsistent 5indexeren 399informatie 2informatie-analyse 20informatiebehoefte 20ingeschakeld 168, 294inner join 322, 381INSERT INTO 384integreren 59integriteit 2invoermasker 394IS NULL 349

Page 447: Databaseontwikkeling Access 2003

I ndex 435

Jjoin 355joineigenschappen 108

Kkandidaat-sleutels 27Keep Together 223keuzelijsten 156

met invoervak 156zonder invoervak 156

klassieke bestandsorganisatie 9knopinfo 184kolombreedte 86kolommen 342

vastzetten 88verbergen 87verplaatsen 87

koptekst 362

Llabel 280left join 381left outer-join 322lengte nul toegestaan 399lettertype 85lijn 222LIKE 349LimitToList 163Line 222List Box 157Locked 168logisch ontwerp 414, 416

Mmacro

AlleMacrosStoppen 320Berichtvenster 249CancelEvent 320FilterToepassen 250FormulierOpenen 258GebeurtenisAnnuleren 320

GoToControle 263MacroStoppen 267Maximaliseren 249NaarBesturingselementGaan 263OpenForm 258OpenReport 298RapportOpenen 298SetValue 258Sluiten 250StopAllMacros 320StopMacro 267TabelOpenen 248VorigFormaat 250WaardeInstellen 258

macrogroep 257macronaam 248Macro Name 248macrostap 252Main Switchboard 331MAX 361Mde-bestand 339meerdere tabellen 355menustructuur 275metagegevens 62MIN 361Min.- en max.-knop 280minimaliteit-eis 343Min Max Buttons 280modaal 257modaalvenster 257Modal 257

Nnaam 290Name 290navigatieknoppen 279NavigationButtons 279NewRowOrCol 326niet-afhankelijk kader 152nieuwe rij of kolom 326normaliseren 23

Page 448: Databaseontwikkeling Access 2003

Databaseontwikkeling 4 Access 2003436

notatiewijze 389nulde normaalvorm 23

OOLE-objecten 151On Open 269ontwerpweergave 351opbouwen tabellen 415opbouwfunctie voor expressies 260opdrachtknoppen 180opmaak 85opstarten 337opties voor groeperen 228opties voor totalen 239OR 347ORDER BY 359outer join 381

PPage Footer 215Page Index 179Pages 311pagina 311pagina-index 179paginakoptekst 215paginavoettekst 215primaire sleutel 343procesgegevens 26programma 271

Qquery

bijwerk~ 119gecorreleerd 379groepeer~ 116selectie~ 100, 112verwijder~ 120

Rrandbreedte 281randstijl 222rapporten 211, 416, 430

afdrukken 134autorapport 124etiketten 131verwijzingen 259wizard 126

rapportkoptekst 214rapportvoettekst 215record 70

~kiezers 279~locking 16filteren 81sorteren 81toevoegen 80vervangen 83verwijderen 81wijzigen 80zoeken 82

recordbegrenzingslijnen 280RecordSelectors 279redundantie 5referential integrity 343referentiële integriteit 90

afdwingen 92rekenkundige bewerkingen 361rekenveld 185relaties 90

toepassen 94toevoegen 91verwijderen 94

relationele database 13repeterende groep 26Report Footer 215right join 381right outer join 322rijen 342rijhoogte 86runtime versie 339

Sschakelbordbeheer 330schakelborden 329schuifbalken 279

Page 449: Databaseontwikkeling Access 2003

I ndex 437

ScrollBars 279SELECT 346selectievakje 145Single Step 252Size Mode 154

Clip 154Zoom 154

sleutelattribuut 27sleutelveld 76speciale joins 380SQL 341standaardwaarde 398starten 251subformulier 165subformulier/subrapport 176subquery’s 370SUM 361Switchboard Manager 330switchboards 329synoniemen 59systeemmenu 257

Ttabbesturingselement 175tabbladen 174tabel 4, 342

aanmaken 73aanpassen 79selecteren 78

tabellen/query’s 410Tab Stop 182tabstop 182tabvolgorde 295technisch ontwerp 415, 420tekengewicht 222tekengrootte 281tekstuitlijning 225Text Align 225toepassing 271toetsenbord 408Toggle Button 147trapsgewijs bijwerken 92

trapsgewijs verwijderen 92tweede normaalvorm 31

Uuitvoeren 352Unbound Object Frame 152UNC 202unieke records 116unieke waarden 116UNION 385UPDATE 385

Vvalidatieregel 398validatietekst 399VBA-code 269veld 70veldlengte 388vereist 399vergrendeld 168, 295view 14Visual Basic for Applications 269volgorde 359voorbeeldopgave 413voorgrondkleur 311voorwaarden 264vreemde sleutel 38, 343

Wwachtwoord 395weergave 403werking tabtoets 286WHERE 346WHERE-voorwaarde 250Where Condition 250wisselknop 147wizard opzoeken 157wizards voor besturingselementen 149

Zzoeken 407