Databaseontwikkeling 4 (Access 2003)
Copyright 2007 Academic Service
Copyright 2007 Academic Service
Databaseontwikkeling 4 (Access 2003)
Ies Korpershoek Ben Groenendijk
Copyright 2007 Academic Service
Meer informatie over deze en andere uitgaven kunt u verkrijgen bij: Sdu Klantenservice Postbus 20014 2500 EA Den Haag tel.: (070) 378 98 80 fax: (070) 378 97 83
Alle rechten voorbehouden. Alle auteursrechten en databankrechten ten aanzien van deze uitgave worden uitdrukkelijk voorbehouden. Deze rechten berusten bij Sdu Uitgevers bv. Behoudens de in of krachtens de Auteurswet 1912 gestelde uitzonderingen, mag niets uit deze uitgave worden verveelvoudigd, opgeslagen in een geautomatiseerd gegevensbestand of openbaar gemaakt in enige vorm of op enige wijze, hetzij elektronisch, mechanisch, door fotokopieën, opnamen of enige andere manier, zonder voorafgaande schriftelijke toestemming van de uitgever.
© 2007 Sdu Uitgevers bv, Den Haag Academic Service is een imprint van Sdu Uitgevers bv 1e druk, juli 2005 2e druk, maart 2007 Vormgeving en omslag: Studio Bassa, Culemborg Zetwerk: Redactiebureau Heijer, Markelo ISBN 978 90 395 2483 1 NUR 124
Voorzover het maken van reprografische verveelvoudigingen uit deze uitgave is toegestaan op grond van artikel 16 h Auteurswet 1912, dient men de daarvoor wettelijk verschuldigde vergoedingen te voldoen aan de Stichting Reprorecht (postbus 3051, 2130 KB Hoofddorp, www.reprorecht.nl). Voor het overnemen van gedeelte(n) uit deze uitgave in bloemlezingen, readers en andere compilatiewerken (artikel 16 Auteurswet 1912) dient men zich te wenden tot de Stichting PRO (Stichting Publicatie- en Reproductierechten Organisatie, Postbus 3060, 2130 KB Hoofddorp, www.cedar.nl/pro). Voor het overnemen van een gedeelte van deze uitgave ten behoeve van commerciële doeleinden dient men zich te wenden tot de uitgever. Hoewel aan de totstandkoming van deze uitgave de uiterste zorg is besteed, kan voor de afwezigheid van eventuele (druk)fouten en onvolledigheden niet worden ingestaan en aanvaarden de auteur(s), redacteur(en) en uitgever deswege geen aansprakelijkheid voor de gevolgen van eventueel voorkomende fouten en onvolledigheden. All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, electronic, mechanical, photocopying, recording or otherwise, without the 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 consequences.
Copyright 2007 Academic Service
Woord vooraf
Dit boek is bestemd voor de niveau 4-opleiding ICT-beheerder op basis van de nieuwe competentiegerichte eindtermen voor MBOICT die vanaf 2007 van kracht zijn. Bij de ontwikkeling van de leerstof voor de nieuwe competentiegerichte eindtermen is ervoor gekozen om de competenties van de kerntaken in samenhang te behandelen. Zeker bij het onderwerp ‘databases’ is het logisch om de competenties van zowel het ontwikkelen (ontwerpen/realiseren) als het beheren/onderhouden van een informatiesysteem aan de hand van de toepassing van de populaire applicatie Access (in dit geval versie 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 afzonderlijke uitgave over informatieanalyse. De kandidaat kan met dit boek over Access 2003 zelfstandig de opdrachten maken en daarvoor terugvallen op de eerder behandelde theorie. De docent kan als begeleider optreden, maar als hij dat verkiest ook klassikaal de theoretische onderdelen behandelen. In ieder geval zal de deelnemer in of buiten het klaslokaal veel tijd aan de computer doorbrengen. Aan het einde van dit deel moet de deelnemer in staat zijn zelfstandig een eenvoudige probleemanalyse uit te voeren en deze uit te werken in een werkende, gebruikersvriendelijke relationele databasetoepassing. In het boek wordt ieder onderwerp eerst besproken en toegelicht, waarbij volop gebruik gemaakt is van relevante schermafdrukken. Vervolgens wordt er bij ieder onderwerp een opgave aangeboden waarin de theoretische kennis direct praktisch kan worden toegepast. In de opgaven wordt een aantal bestaande databases gebruikt. Op de hierin opgeslagen gegevens moeten vervolgens de nodige bewerkingen worden uitgevoerd.
Copyright 2007 Academic Service
vi
Databaseontwikkeling 4 (Access 2003)
Het is niet noodzakelijk eerst het deel Informatieanalyse te behandelen alvorens over te gaan op het deel gegevensanalyse en eventueel te besluiten met SQL. De delen staan los van elkaar en kunnen dus in willekeurige volgorde naast of na elkaar gebruikt worden. Uiteraard moet er bij dit boek gewerkt kunnen worden met Microsoft Access versie 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 opgenomen 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 hoofdstukken 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 passen 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 Ies korpershoek
februari 2007
Copyright 2007 Academic Service
vii
Inhoud Inleiding
xiii
1 1.1 1.2 1.3 1.4 1.5
Gegevens en betrouwbaarheid Gegevens en informatie Integriteit Consistentie en redundantie Klassieke en moderne wijze van gegevensopslag Samenvatting
1 1 2 4 6 10
2 2.1 2.2 2.3
Relationele databases Databasemanagementsysteem Relationele databases Samenvatting
13 13 16 21
3 3.1 3.2 3.3 3.4 3.5 3.6
Normaliseren, inleiding Stap 1, de nulde normaalvorm Stap 2, de eerste normaalvorm Stap 3, de tweede normaalvorm Stap 4, de derde normaalvorm Entiteit Relatie Diagram (ERD) Samenvatting
23 23 28 31 33 36 40
4 4.1 4.2 4.3 4.4 4.5 4.6
Normaliseren, verdieping Dubbele (geneste) repeterende groepen Dubbele (opeenvolgende) repeterende groepen Opmerkingen met betrekking tot normaliseren Integreren Datadictionary Samenvatting
47 47 52 56 57 60 62
5 5.1 5.2 5.3 5.4 5.5
Eenvoudige bewerkingen in Access Inleiding Het programma Access starten De database en de tabel creëren Een bestaande database openen Records manipuleren
69 69 70 71 77 80
Copyright 2007 Academic Service
viii
Databaseontwikkeling 4 (Access 2003)
5.6 5.7 5.8 5.9 5.10 5.11 5.12
De bestandsweergave wijzigen Afdrukken van gegevens Met meerdere tabellen tegelijkertijd werken Gegevens selecteren en manipuleren Rapporten Formulieren Webpagina’s
85 88 90 100 124 135 140
6 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8
Uitgebreide formulieren Keuzemogelijkheden Afbeeldingen – OLE-objecten Keuzelijsten Hoofd- en subformulieren Tabbladen Opdrachtknoppen Draaitabellen/Draaigrafieken Webpagina’s
145 145 151 156 165 174 180 185 198
7 7.1 7.2 7.3
Uitgebreide rapporten Rapport zonder duplicaten Rapport met groepen Rapport met meerdere groepen
211 211 216 236
8 8.1 8.2
Macro’s Een eenvoudige macro Geavanceerde macro’s
247 248 253
9 9.1 9.2 9.3 9.4 9.5
Het bouwen van een toepassing Tabellen en relaties Menustructuur De formulieren De rapporten Schakelborden
271 272 275 277 304 328
10 10.1 10.2 10.3
SQL, Structured Query Language Inleiding Begrippen Opbouw hoofdstuk
341 341 342 343
Copyright 2007 Academic Service
ix
Inhoud
10.4 10.5 10.6 10.7 10.8 10.9 10.10 10.11 10.12 10.13 10.14
Database Bibliotheek (theorieopdrachten) Database Alco (praktijkopdrachten) Opvragingen uit één tabel SQL gebruiken in Access Eenvoudige opvragingen uit meerdere tabellen Wijzigen van de volgorde Rekenkundige bewerkingen Groeperen Subquery’s Speciale joins en views SQL, meer mogelijkheden
344 345 345 351 355 359 361 364 370 380 384
Appendix A
Veldeigenschappen
387
Appendix B
Opties
403
Appendix C
Een grote, uitgewerkteopdracht
413
Index
Copyright 2007 Academic Service
433
Copyright 2007 Academic Service
Inleiding
Datases zijn in het dagelijkse leven niet meer weg te denken. Van een afgestudeerde op MBO-niveau mag worden verwacht dat hij/ zij kennis van en inzicht in databases heeft. Naast de theoretische kennis dienen er ook praktische vaardigheden aanwezig te zijn. Dit boek beoogt de kennis van en vaardigheden met databases aan te reiken. Dat gebeurt door stapsgewijs in te gaan op het totale proces van het (op papier) ontwerpen van een database tot het gebruik van de database (in Microsoft Access) om de benodigde informatie te genereren. Allereerst zal het ontwerpen van databases ter sprake komen. Hierbij wordt de techniek van het normaliseren gehanteerd. Uitgaande van een informatiebehoefte zal via het normalisatieproces de informatiestructuur bepaald worden. Deze structuur wordt vervolgens 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 gegevens opvragen steeds meer geautomatiseerd zal worden. Er zullen formulieren, rapporten en macro’s worden ontworpen en gebruikt.
Copyright 2007 Academic Service
xii
Databaseontwikkeling 4 Access 2003
De ontworpen rapporten, formulieren en macro’s worden vervolgens gebruikt bij het opzetten van een applicatie. Bij het opzetten van de applicatie zal niet worden geprogrammeerd in de zin van het ‘ouderwetse’ coderen. De applicatie wordt gebouwd door op grafische wijze bouwstenen te selecteren, deze iets aan te passen en vervolgens samen te voegen tot professioneel ogende applicaties. Omdat databases algemeen toepasbaar zijn, wordt het boek afgesloten met een hoofdstuk waarin de standaard vraagtaal SQL wordt behandeld. Deze taal wordt niet alleen door Access ondersteund, maar door vrijwel ieder databasemanagementpakket dat op de markt te verkrijgen is. Enige kennis van deze taal is dus onontbeerlijk.
Copyright 2007 Academic Service
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 geautomatiseerd, eerst de afdeling Boekhouding, dan de Inkoopafdeling, vervolgens de afdeling Verkoop en ten slotte het Voorraadbeheer. Dit wordt eilandautomatisering genoemd. Die verschillende eilandjes kunnen niet of slecht gegevens met elkaar uitwisselen. Hierdoor worden er bijvoorbeeld 30 scooters aan een winkel verkocht die helemaal niet in het magazijn staan. Het informatiesysteem wordt dan onbetrouwbaar genoemd. Hiervoor is uiteraard een oplossing gevonden, de database. De ontwikkeling van eilandautomatisering naar database wordt in dit hoofdstuk toegelicht. Verder worden belangrijke begrippen zoals integriteit, consistentie, redundantie en betrouwbaarheid toegelicht.
1.1
Gegevens en informatie
Computers zijn niet meer weg te denken uit onze maatschappij. Ze nemen een steeds belangrijker plaats in. Wij kunnen onder andere met de computer spelletjes spelen, e-mailen, internetten, werkstukken maken met behulp van een tekstverwerker of multimediapresentaties maken. Bedrijven en instellingen kunnen niet meer functioneren zonder computers. Alle gegevens voor de bedrijfsvoering worden opgeslagen in de computer. Denk hierbij aan klantgegevens, artikelgegevens, leveranciergegevens, productiegegevens. Van onszelf liggen ook bij vele instanties gegevens opgeslagen. Van iedere volwassen inwoner van Nederland liggen de persoonsgegevens in honderden computersystemen opgesla-
Copyright 2007 Academic Service
2
Databaseontwikkeling 4 Access 2003
gen. Denk hierbij aan de banken, verzekeringsmaatschappijen, belastingdienst, gemeentelijke instellingen, sportverenigingen, motorrijtuigadministratie, school, krantadministratie, salarisadministratie, enzovoort.
gegevens
informatie
De begrippen gegevens en informatie worden nogal eens door elkaar gehaald. Gegevens zijn feiten of gebeurtenissen die op een bepaalde manier zijn vastgelegd. Bijvoorbeeld adresgegevens op papier, maar ook het vastleggen van diezelfde gegevens op magnetisch materiaal zodat de computer ze kan lezen, valt onder deze definitie, net als foto’s, geluid of beelden. Informatie is de betekenis die aan die gegevens ontleend kan worden. Een telefoonboek staat vol met gegevens. De gegevens daarin worden informatie als we het telefoonnummer van iemand willen opzoeken. Het gevonden telefoonnummer betekent iets voor ons. In dezelfde gegevens kunnen verschillende soorten informatie zitten. Na een repetitieweek worden per klas alle behaalde cijfers van de leerlingen op een lijst weergegeven. Voor de leerling zijn de behaalde cijfers informatie. Voor een docent Engels zijn in hetzelfde overzicht de cijfers die voor het vak Engels zijn behaald informatie.
1.2
muteren
integriteit
Integriteit
Gegevens in computersystemen moeten zo opgeslagen worden dat ze eenvoudig zijn op te vragen en dat ze eenvoudig gemuteerd kunnen worden. Onder muteren verstaan we het toevoegen, wijzigen of verwijderen van gegevens. Tevens mogen die gegevens geen onjuistheden of onduidelijkheden bevatten. We noemen dit de integriteit van het computersysteem. Hiermee bedoelen we dat de gegevens in het computersysteem een juiste weergave moeten zijn van de werkelijkheid. Het cijfer zeven voor een repetitie wiskunde moet ook op de computeruitdraai van de cijferlijst een zeven zijn en niet een vier. Als de computer toont dat het banksaldo 120 euro in het rood is, terwijl het in het zwart moet zijn, is er duidelijk iets mis. Het computersysteem geeft dan niet de werkelijkheid weer, de integriteit van het computersysteem voldoet niet, het is een onbetrouwbaar informatiesysteem. Dit lijkt misschien allemaal logisch, maar dat is in vele praktijkgevallen nog niet het geval. Met twee voorbeelden zullen we dit duidelijk maken.
Copyright 2007 Academic Service
1 Gegevens en betrouwbaarheid
3
Na een verhuizing ontvangen mensen nogal eens onduidelijke brieven zoals in de volgende brief: Basketbalvereniging Dunky Postbus 2050 3070 AB Rotterdam M.C. den Hoed Leiweg 12 2907 TV Capelle a/d IJssel Geachte mevrouw Den Hoed, Hierbij ontvangt u uw nieuwe teamgegevens en het trainingschema voor het komende basketbalseizoen. Hieronder staan de gegevens zoals deze in ons computersysteem liggen opgeslagen. M.C. den Hoed Larenstraat 26 2984 EK Ridderkerk Team: dames 1 Training: maandag van 19.00-20.30, woensdag van 19.30-21.00 Indien er onvolledige of onjuiste gegevens zijn vermeld, kunt u telefonisch contact opnemen met de heer Verkerk (010 – 4830554).
Er is met deze brief iets merkwaardigs aan de hand. Het adres in Capelle aan den IJssel (links bovenin) is het nieuwe en correcte adres. Op diezelfde brief staat ook het oude adres in Ridderkerk. Volgens de basketbalvereniging is dat ook het nieuwe adres. De persoonsgegevens staan dus ten minste twee keer opgeslagen in hun computersysteem, waarbij de adreswijziging maar één keer is doorgevoerd. De gegevens zijn dus op een onjuiste manier opgeslagen. Mevrouw Den Hoed zal ongetwijfeld weten waar zij nu woont, maar de basketbalvereniging heeft nu twee tegenstrijdige adressen geregistreerd en weet het niet meer. Een ander voorbeeld: bij een verhuizing naar een koopwoning wordt vaak ook een nieuwe hypotheek afgesloten. Vanwege het 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 verzekeringsmaatschappij gestuurd. Tot zover geen problemen, maar in de maand januari kwamen er geen overzichten van de levensverzekeringen. Bij navraag naar het uitblijven van deze overzichten werd aan de telefoon gevraagd om de postcode en het huisnummer. Deze bleken
Copyright 2007 Academic Service
4
Databaseontwikkeling 4 Access 2003
echter niet in het systeem van de verzekeringsmaatschappij voor te komen. Toch is er meermalen post op het nieuwe adres ontvangen. Bij verder speurwerk bleek dat de levensverzekeringsoverzichten naar het oude adres gestuurd waren, omdat dat nog steeds in de administratie als juist vermeld stond. Blijkbaar was de adreswijziging wel aangebracht bij de afdeling Hypotheken maar niet in de levensverzekeringadministratie. Na deze constatering en de aanpassing bij de levensverzekeringsmaatschappij kwamen al snel de gegevens van de levensverzekering. De adresgegevens waren dus in twee verschillende computersystemen opgeslagen.
1.3
Consistentie en redundantie
De gegevens zouden opgeslagen kunnen zijn zoals in figuur 1.1. In computertermen noemen we dit bestanden of tabellen. Figuur 1.1
Levensverzekering PolisNaam nummer
Adres
Postcode Plaats
6798316
Hoofdweg 67
1067 RT
R. Ederzeel
Polisbedrag Premie
Amsterdam
191.000,00
62,50
6798317
T. de Vries
Steenstraat 34
1380 VB
Weesp
161.000,00
40,50
6798318
E. van der Wouden
Nieuwendam 67 1621 AP
Hoorn
145.000,00
124,80
6798319
E.R. Spruyt
Ringweg 56
6798320
B.J. Larenstraat 26 Groenendijk
1200 GH
Hilversum
127.000,00
113,90
2984 EK
Ridderkerk
168.000,00
48,50
……….
Hypotheek Hyponummer
Naam
Adres
Postcode Plaats
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 Groenendijk
2907 TV
Capelle a/d IJssel
127.000,00
6,0
33-812351
E. van der Wouden
Nieuwendam 67 1621 AP
Hoorn
181.500,00
5,9
33-812352
R. van Dam
Loefweg 56
Houten
168.000,00
5,5
3965 JJ
……….
Copyright 2007 Academic Service
Hypotheek Rente Bedrag Perc.
1 Gegevens en betrouwbaarheid
5
Merk op dat niet iedereen die een hypotheek afsluit ook voorkomt bij de levensverzekeringen. Men kan namelijk zo’n verzekering al bij een andere maatschappij hebben. Daarnaast kan een levensverzekering afgesloten worden zonder een hypotheek. De gegevens kunnen dus in die beide systemen in een andere volgorde voorkomen. Als een hypotheek gelijktijdig met een levensverzekering wordt afgesloten, komen in beide bestanden nieuwe vermeldingen. De adresgegevens worden dan twee keer opgeslagen. Hierdoor kunnen er problemen ontstaan, zoals in het voorbeeld van 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.
inconsistent
redundantie
In deze voorbeelden zijn de gegevens in tegenspraak met elkaar. Groenendijk woont volgens de computer in Ridderkerk én in Capelle a/d IJssel. Met een moeilijk woord zeggen we dat de gegevens inconsistent (onbetrouwbaar) zijn. Het is dus niet zo gemakkelijk om gegevens in een computersysteem op te slaan en ervoor te zorgen dat de gegevens consistent blijven. We moeten er dan voor zorgen dat dezelfde gegevens niet meerdere keren opgeslagen worden. Het meerdere keren opslaan van gegevens noemt men redundantie. Redundantie betekent overtolligheid. Het is helemaal niet nodig om gegevens meerdere keren in de computer op te slaan, één keer is voldoende. Toch komt het meervoudig opslaan van gegevens vaak voor. In een recent onderzoek bij een niet nader te noemen grote gemeente bleken persoonsgegevens in 37 verschillende computerbestanden opgeslagen te zijn! Hoe kan zoiets ontstaan met onze moderne computers? Of liever, hoe komen we ervan af? Daarvoor moeten we een aantal jaren in de historie teruggaan. De levensverzekeringmaatschappij ging automatiseren. Hiervoor werd een computerprogramma (applicatie) gemaakt waarmee de gegevens ingevoerd, opgeslagen en afgedrukt konden worden. Later ging die levensverzekeringmaatschappij ook hypotheken verstrekken. Hiervoor werd ook een applicatie gemaakt waarmee men de afgesloten hypotheken kon registreren. Bij het verkopen van de hypotheken bemerkte men dat de klanten ook graag een inboe-
Copyright 2007 Academic Service
6
Databaseontwikkeling 4 Access 2003
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. Figuur 1.2 Hypotheek
Levensverzekering
Inboedelverzekering
Opstalverzekering
Hypotheek
Levensverzekering
Inboedelverzekering
Opstalverzekering
De gegevens worden in vier verschillende computersystemen opgeslagen. Dit noemen we ook wel eilandautomatisering. Iedere afdeling werkt op zijn eigen eilandje. Hierdoor worden gegevens meerdere keren opgeslagen. Niet alleen de adresgegevens. Een hypotheek moet een onderpand hebben en hiervoor is onder andere de waarde en het bouwjaar van de woning noodzakelijk. Maar de waarde en het bouwjaar van de woning is ook nodig voor de opstalverzekering. Om aan de nadelen hiervan tegemoet te komen is een oplossing bedacht. De vier applicaties die ze gebruiken, zijn verbeterd door de gezamenlijke gegevens apart op te slaan. Hierdoor kunnen de verschillende afdelingen gebruikmaken van één klantenbestand en één woningbestand, zie figuur 1.3. Gegevens worden nu dus niet meer dubbel opgeslagen (geen redundantie) en inconsistentie (onbetrouwbaarheid) wordt voorkomen.
1.4
Klassieke en moderne wijze van gegevensopslag
Dit lijkt een mooie oplossing, maar er ontstaan nieuwe problemen. Laten we als voorbeeld het klantenbestand nemen. Hierin liggen de klantgegevens opgeslagen. De klantgegevens die opgeslagen liggen zijn klantnummer, naam, adres, postcode en plaats. Van
Copyright 2007 Academic Service
7
1 Gegevens en betrouwbaarheid
Figuur 1.3 Klant
Hypotheek
Levensverzekering
Inboedelverzekering
Opstalverzekering
Hypotheek
Levensverzekering
Inboedelverzekering
Opstalverzekering
Woning
converteren
iedere klant worden die vijf gegevens opgeslagen, dit wordt de gegevensstructuur van het klantenbestand genoemd. Stel dat de afdeling Levensverzekeringen ook graag de geboortedatum van een klant wenst op te slaan. De gegevensstructuur van het klantenbestand moet hiervoor aangepast worden. Er moet een zesde item (geboortedatum) aan toegevoegd worden. Het klantenbestand moet hiervoor geconverteerd worden. Converteren is de oude gegevensstructuur omzetten naar de nieuwe gegevensstructuur: klantnummer, naam, adres, postcode, plaats en geboortedatum. De klantgegevens liggen als een kralenketting opgeslagen. Bijvoorbeeld 10001, T. de Vries, Steenstraat 34, 1380 VB, Weesp, 10002, R. Ederzeel, Hoofdweg 67, 1067 RT, Amsterdam, 10003, B.J. Groenendijk, enzovoort. Aangezien nu ook de geboortedatum erbij moet, worden de eerste vijf gegevens (‘kraal’ klantnummer t/m ‘kraal’ plaats) van het oude klantenbestand gelezen en deze worden op de nieuwe ketting geregen (geschreven). Vervolgens wordt een nieuwe ‘kraal’ geboortedatum aan de nieuwe ketting toegevoegd. Vervolgens worden de volgende vijf gegevens van het oude klantbestand gelezen en naar het nieuwe klantenbestand geschreven.
Copyright 2007 Academic Service
8
Databaseontwikkeling 4 Access 2003
Vervolgens wordt de geboortedatum van die klant aan het nieuwe bestand toegevoegd. Dit proces gaat net zo lang door tot alle klantengegevens geconverteerd zijn.
Het klantenbestand is nu geconverteerd zodat klantnummer, naam, adres, postcode, plaats en geboortedatum van een klant bekend zijn. Het computerprogramma van de afdeling Levensverzekering moet nog aangepast worden aan de nieuwe situatie. De geboortedatum was in het oude computerprogramma niet aanwezig en moet dus worden toegevoegd, zodat deze onder andere ingevoerd en afgedrukt kan worden. Nadat het computerprogramma van de afdeling Levensverzekering is aangepast, verloopt voor de afdeling Levensverzekering alles naar wens. Er werd zelfs een klein feestje georganiseerd. Op het moment dat er feest werd gevierd op de afdeling Levensverzekeringen sloegen schijnbaar de computers van de andere afdelingen op hol. Wat is daar namelijk aan de hand? De applicaties van de overige afdelingen waren niet aangepast, ze zijn immers niet in de geboortedatum 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 klantnummer 10003 opgeroepen moet worden, weet de computer dat het de derde klant is (aangenomen dat 10001 het laagste klantnummer is). Het computerprogramma werkt volgens het principe van de kralenketting. De derde klant betekent, sla twee keer vijf ‘kralen’ (klantnummer, naam, adres, postcode en plaats) over en lees vervolgens ‘kraal’ elf (klantnummer) tot en met ‘kraal’ vijftien (plaats). Echter, door de nieuwe structuur van het klantenbestand is de elfde ‘kraal’ nu de plaats van een klant en de twaalfde ‘kraal’ geen naam, maar de geboortedatum. Hierdoor verschijnt op het
Copyright 2007 Academic Service
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 applicaties van de andere afdelingen ook moet aanpassen aan de nieuwe gegevensstructuur van het klantenbestand, ook al zijn ze niet geinteresseerd in de geboortedatum van een klant. In plaats van vijf gegevens (klantnummer tot en met plaats) moeten in de nieuwe situatie zes gegevens (klantnummer tot en met geboortedatum) per klant verwerkt worden. Als een afdeling meer gegevens van een klant nodig heeft, vergt dat grote aanpassingen aan de computerprogramma’s voor alle andere afdelingen die van het klantenbestand gebruikmaken, ook al zijn ze in die nieuwe gegevens niet geïnteresseerd.
database
De moderne manier van gegevensopslag voorziet in een oplossing van het hiervoor genoemde probleem. Die moderne manier van gegevensopslag noemen we een database (gegevensbank). De oude manier van gegevensopslag noemen we sindsdien klassieke bestandsorganisatie. Er zijn nog veel bedrijven en instellingen die gebruikmaken van die klassieke gegevensopslag. Het zijn veelal bedrijven die in een vroeg stadium zijn gaan automatiseren, zoals banken, financiële instellingen, belastingdienst en oliemaatschappijen. Dit wordt ‘de wet van de remmende voorsprong’ genoemd. Het millenniumprobleem kwam voor een groot deel op rekening van die systemen. En daar werden wereldwijd miljarden 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 gegevensstructuur. Maar ook bij moderne systemen kunnen problemen ontstaan als bijvoorbeeld twee bedrijven fuseren. Ook al hebben
Copyright 2007 Academic Service
10
Databaseontwikkeling 4 Access 2003
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 verbonden. In het volgende hoofdstuk zullen we het begrip database toelichten en in het bijzonder de relationele database.
1.5
Samenvatting
In dit eerste hoofdstuk hebben we besproken wat het verschil is tussen gegevens (feiten) en informatie (betekenis van die gegevens). Bij eilandautomatisering (klassieke bestandsorganisatie) worden dezelfde gegevens meerdere keren opgeslagen (redundantie). Hierdoor moeten wijzigingen in die gegevens meerdere keren doorgevoerd worden. Wordt dit niet consequent gedaan, dan ontstaan er tegenstrijdigheden in het informatiesysteem (inconsistentie). Om die problemen op te lossen zijn databases ontworpen. Hierin kunnen de gegevens voor alle bedrijfsprocessen eenduidig worden opgeslagen en gewijzigd. De mate van juistheid van de informatie die het informatiesysteem produceert, wordt de integriteit van het informatiesysteem genoemd. Opgaven
1. Waarom is in de klassieke bestandsorganisatie de kans op inconsistentie (onbetrouwbaarheid) erg groot? 2. Wat wordt verstaan onder redundantie (overtolligheid)? 3. Wat wordt verstaan onder de integriteit van het computersysteem? 4. Converteren van computergegevens, wat bedoelt men daarmee? 5. Waarom zijn computersystemen die gebruikmaken van de klassieke bestandsorganisatie kostbaar in het onderhoud?
Copyright 2007 Academic Service
1 Gegevens en betrouwbaarheid
11
6. Bij voetbalvereniging HGS wordt de financiële administratie verzorgd door de penningmeester, de heer Van Vliet. De ledenadministratie wordt verzorgd door de heer Rietman. Hiervoor gebruiken ze beiden hun privé-computer. In de ledenadministratie worden de adresgegevens en elftalgegevens vastgelegd. De penningmeester registreert op de computer de adresgegevens en de maandelijkse betalingen. a. Welke gegevens zijn redundant opgeslagen? b. Geef twee voorbeelden waarbij inconsistentie kan ontstaan. c. Welke afspraken moet de penningmeester maken met de ledenadministrateur om de gegevens betrouwbaar te houden? 7. Veel grote ondernemingen maken nog gebruik van de klassieke bestandsorganisatie. Waarom is dat? 8. De afdeling Levensverzekering van de hypotheekmaatschappij wenst voor vrouwen een korting toe te kennen op de maandelijkse premie. Vrouwen blijken langer te leven dan mannen, waardoor een korting op de premie mogelijk is. In de klantgegevens moet hiervoor een nieuw item Geslacht worden toegevoegd, waarin men Man of Vrouw kan invullen. Wat heeft dat voor gevolgen voor de automatiseringsafdeling van de afdeling Levensverzekering en voor de overige afdelingen die van het klantenbestand gebruikmaken?
Copyright 2007 Academic Service
Copyright 2007 Academic Service
2
Relationele databases
In dit hoofdstuk wordt uitgelegd wat een databasemanagementsysteem is. Ook wordt toegelicht wat een datamodel en een relationele database is, en verklaren we enkele begrippen uit de gegevensanalyse.
2.1
DBMS
Databasemanagementsysteem
Een moderne manier van gegevensopslag in een computersysteem is een database. Hierin zijn de problemen bij gegevensopslag zoals in hoofdstuk 1 beschreven, opgelost. Gezamenlijke gegevens worden voor de verschillende afdelingen niet meer dubbel opgeslagen, waardoor redundantie (overtolligheid) en inconsistentie (tegenstrijdigheid) van gegevens wordt voorkomen. Bij een database hoort een databasemanagementsysteem, afgekort DBMS. Zo’n DBMS is afbeeld in figuur 2.1. Dit systeem vormt een sluis tussen diverse computerprogramma’s en de gegevensbestanden. Het DBMS regelt
Figuur 2.1 Hypotheek
Levensverzekering
Inboedelverzekering
Opstalverzekering
DBMS
Hypotheek
Levensverzekering
Klant
Woning
Copyright 2007 Academic Service
Inboedelverzekering
Opstalverzekering
14
Databaseontwikkeling 4 Access 2003
de toevoegingen en wijzigingen in de database en zorgt er dus voor dat er geen redundantie en inconsistentie kan optreden.
conceptueel of functioneel
view databaseadministrator
In het databasemanagementsysteem worden de volledige gegevensstructuren van alle benodigde bestanden vastgelegd. Zo wordt daar de gegevensstructuur voor het klantenbestand vastgelegd, klantnummer, naam, adres, postcode, plaats en geboortedatum. Dit is de verzameling gegevens die de vier afdelingen nodig hebben voor de klantgegevens. Het wil niet zeggen dat een afdeling alle gegevens nodig heeft, maar de gegevens die ze nodig hebben, zitten er wel bij. Zo wordt voor alle bestanden de volledige gegevensstructuur vastgelegd. Dit noemen we het volledige datamodel van de database. Het ontwerpen van het datamodel wordt in hoofdstuk 3 en hoofdstuk 4 uitgelegd. Het datamodel dat op papier is ontworpen, wordt ook wel conceptueel of functioneel datamodel genoemd. Nadat alle volledige gegevensstructuren zijn vastgelegd, wordt vervolgens per afdeling vastgelegd welke gegevens zij nodig hebben uit de verschillende bestanden. Zo wordt voor de afdeling Hypotheken vastgelegd dat zij van het klantenbestand alleen klantnummer, naam, adres, postcode en plaats kunnen oproepen. De geboortedatum hebben zij niet nodig. De geboortedatum wordt als het ware verborgen voor de afdeling Hypotheken. Net zoals in een spreadsheetprogramma kolommen verborgen kunnen worden. Mocht iemand van de klantenadministratie van de afdeling Hypotheken een overzicht wensen van alle bekende klantengegevens, dan krijgt deze van alle klanten alleen klantnummer, naam, adres, postcode en plaats te zien. Ondanks dat die persoon alle gegevens heeft opgevraagd, krijgt deze de geboortedatums van de klanten niet te zien. Voor de afdeling Hypotheken zijn dat immers geen relevante gegevens. De afdeling Hypotheken ziet als het ware van het klantenbestand alleen klantnummer, naam, adres, postcode en plaats. Zo wordt voor iedere afdeling vastgelegd welke gegevens ze uit welke gegevensbestanden mogen ‘zien’. Men noemt dit de view op de database, zoals men tegen de database aankijkt. De volledige structuur van de database is alleen bij het DBMS bekend. Diegene die het DBMS beheert, noemt men de database-administrator. De database-administrator legt de volledige structuur vast en per afdeling de view op de database. Ook kan de databaseadministrator de view per afdeling wijzigen, ‘vergroten’ of ‘verkleinen’.
Copyright 2007 Academic Service
2 Relationele database
15
Als nu de gegevensstructuur van een bestand aangepast moet worden, wordt dat doorgegeven aan de database-administrator. Stel dat de afdeling Inboedelverzekeringen het telefoonnummer van een klant wenst, dan wijzigt de database-administrator de gegevensstructuur van het klantenbestand door het telefoonnummer toe te voegen. Nadat de database-administrator dat heeft gedaan, zal het DBMS vragen om een bevestiging. Hierna wordt door het DBMS de conversie van de gegevens die liggen opgeslagen automatisch uitgevoerd (omzetten van de gegevens naar de nieuwe structuur, zoals is uitgelegd in hoofdstuk 1). De computerprogramma’s van bijvoorbeeld de afdeling Hypotheken ondervinden hier geen enkele hinder van. Het enige dat zij ‘zien’ van het klantenbestand is klantnummer, naam, adres, postcode en plaats. Al zouden er nog tien andere items van klanten zijn vastgelegd, zij weten dat niet, waarom zouden ze het ook moeten weten?
autorisatie
We hebben al gezegd dat de view op de database wordt vastgelegd per afdeling. Het kan zelfs verder gaan. We kunnen zelfs per persoon aangeven wat zijn view op de database is. Veel gegevens zijn privacygevoelig, vertrouwelijke bedrijfsgegevens of volkomen nutteloos op deze werkplek. Eigenlijk hoort een medewerker alleen de beschikking te krijgen over voor hem relevante gegevens. De medewerker heeft een autorisatie voor deze gegevens, oftewel toestemming om deze gegevens te gebruiken. Zo kan bijvoorbeeld alleen de personeelsfunctionaris het salaris van een werknemer zien en de andere personen die gebruikmaken van de werknemergegevens niet. Vertegenwoordigers die in rayons werken, bijvoorbeeld provincies, zien alleen de klantgegevens uit hun rayon. Een overzicht van alle klanten levert dan bijvoorbeeld alleen maar klanten uit de provincie Utrecht. Met autorisatie kunnen we ook vastleggen dat een gebruiker de gegevens alleen mag raadplegen. Het toevoegen, wijzigen of verwijderen van gegevens is dan niet toegestaan. Natuurlijk zijn alle variaties hierop mogelijk, zoals wel toevoegen van nieuwe gegevens maar niet het verwijderen van gegevens. Het DBMS kan nog meer taken uitvoeren, zoals back-ups maken en de database over meerdere computers verspreiden als dat noodzakelijk is, bijvoorbeeld bij grote ondernemingen. Het DBMS zorgt er ook voor dat twee personen niet tegelijkertijd hetzelfde
Copyright 2007 Academic Service
16
Databaseontwikkeling 4 Access 2003
record-locking
gegeven kunnen wijzigen. Dit wordt record-locking genoemd. We zullen dit toelichten met een voorbeeld. Het bedrijf Sunparks verhuurt vakantiehuisjes in Nederland en België. Die vakantiehuisjes moeten geboekt worden door Sunparks te bellen. Er zijn meerdere personen die de reserveringen boeken. De beide verkopers krijgen tegelijkertijd een familie (Jansen en Maertens) aan de lijn, die in dezelfde week twee huisjes willen huren. De twee verkopers toetsen de gewenste vakantieweek in en zien nu beiden op het beeldscherm van hun computer dat er in die week nog precies twee huisjes vrij zijn. Tegen de familie Jansen wordt door de ene verkoper gezegd dat er in die week nog precies twee vakantiehuisjes zijn. De andere verkoper vertelt mevrouw Maertens hetzelfde: er zijn in die week nog precies twee vakantiehuisjes. Er zijn nu vier vakantiewoningen geboekt, terwijl er maar twee vakantiehuisjes in die periode vrij waren. Hierdoor zouden de gegevens in de database niet meer kloppen met de werkelijkheid (integriteit). Uiteraard helpt het DBMS ons met dit probleem. De verkoper die als eerste de gegevens van de vrije vakantiehuisjes via de computer oproept, blokkeert tegelijkertijd die gegevens: record-locking. Iedere andere verkoper kan die gegevens nog wel oproepen, maar niet meer wijzigen. Op het beeldscherm verschijnt dan een extra melding waarin staat dat de gegevens door een andere verkoper zijn geblokkeerd. Nadat deze de boeking heeft afgesloten, wordt de blokkering opgeheven en wordt het beeldscherm van de andere verkoper aangepast aan de nieuwe gegevens (refresh). Die ziet de twee vrije vakantiehuisjes veranderen in nul vrije vakantiehuisjes.
2.2
Relationele databases
Historisch gezien zijn er drie typen databases: eerst kwam de 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 relationele 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 afdeling Levensverzekeringen zijn weer andere gegevens gewenst, zie figuur 2.3, ook op de klassieke manier opgeslagen.
Copyright 2007 Academic Service
17
2 Relationele database
Figuur 2.2
Hypotheek Hyponummer
Naam
Adres
Postcode Plaats
33-812347
R. van Dam
Loefweg 56
3965 JJ
Houten
113.500,00
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. Groenendijk
Leiweg 12
2907 TV
Capelle a/d IJssel
127.000,00
6,0
33-812351
E. van der Wouden
Nieuwendam 67 1621 AP
Hoorn
181.500,00
5,9
33-812352
R. van Dam
Loefweg 56
Houten
168.000,00
5,5
3965 JJ
Hypotheek Rente Bedrag Perc.
……….
Figuur 2.3
Levensverzekering Polisnummer
Naam
Adres
Postcode Plaats
Polisbedrag Premie
6798317
T. de Vries
Steenstraat 34
1380 VB
Weesp
161.000,00
140,50
6798318
E. van der Wouden
Nieuwendam 67 1621 AP
Hoorn
145.000,00
124,80
6798319
E.R. Spruyt
Ringweg 56
1200 GH
Hilversum
127.000,00
113,90
6798320
B.J. Groenendijk
Larenstraat 26
2984 EK
Ridderkerk
168.000,00
148,50
……….
Hierin is duidelijk de redundantie en inconsistentie te zien. Klantgegevens liggen op de verschillende afdelingen dubbel opgeslagen, waardoor inconsistentie kan optreden. Bijvoorbeeld B.J. Groenendijk woont bij de afdeling Levensverzekering in Ridderkerk, terwijl dat Capelle a/d IJssel moet zijn. Ook binnen één afdeling kan redundantie optreden. De klant R. van Dam heeft twee hypotheken, zijn woning en vakantiewoning. Bij relationele databases wordt redundantie en daardoor inconsistentie als volgt opgelost. Men slaat de klantgegevens van alle afdelingen apart op en geeft aan iedere klant een uniek klantnummer. De gegevens van iedere klant worden slechts één keer opgeslagen. De hypotheekgegevens en polisgegevens van de klanten worden daarna via het klantnummer gekoppeld (gerelateerd) aan de klantgegevens, zie figuur 2.4.
Copyright 2007 Academic Service
18
Figuur 2.4
Databaseontwikkeling 4 Access 2003
Klant Klantnr
Naam
Adres
Postcode
Plaats
10001
T. de Vries
Steenstraat 34
1380 VB
Weesp
10002
R. Ederzeel
Hoofdweg 67
1067 RT
Amsterdam
10003
B.J. Groenendijk
Leiweg 12
2907 TV
Capelle a/d IJssel
10004
E. van der Wouden Nieuwendam 67
1621 AP
Hoorn
10005
E.R. Spruyt
Ringweg 56
1200 GH
Hilversum
10006
R. van Dam
Loefweg 56
3965 JJ
Houten
……….
Hypotheek Hyponummer
Hypotheek Bedrag
Rente Perc.
Klantnr
33-812347
113.500,00
6,1
10006
33-812348
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
……….
Er is geen redundantie meer, alle gegevens zijn maar één keer opgeslagen. De relatie tussen de hypotheekgegevens en klantgegevens verloopt via het klantnummer. Voor de levensverzekeringgegevens geldt hetzelfde. Een adreswijziging van een klant wordt in het klantenbestand (tabel Klant) aangebracht. Alle andere afdelingen beschikken nu direct over de juiste adresgegevens. In het DBMS moeten niet alleen de gegevensstructuren vastgelegd worden, maar ook de relaties tussen de verschillende bestanden (tabellen). De relatie tussen de tabel Klant en de tabel Hypotheek
Copyright 2007 Academic Service
19
2 Relationele database
luidt: het klantnummer uit de tabel Klant is gelijk aan het klantnummer uit de tabel Hypotheek. definitie database
Nu kunnen we ook de definitie van een database geven. Een database is een verzameling bij elkaar behorende tabellen inclusief hun onderlinge relaties. Als nu een hypotheek in de database wordt opgezocht, worden automatisch de bijbehorende klantgegevens, via het klantnummer, in de tabel klant opgezocht, zie figuur 2.5.
Figuur 2.5
Hypotheek Hyponummer Hypotheek Bedrag
Rente Perc.
Klantnr
33-812350
127.000,00
6,0
10003
Klantnr
Naam
Adres
Postcode
Plaats
10003
B.J. Groenendijk Leiweg 12
2907 TV
Capelle a/d IJssel
Klant
Maar het kan ook andersom. Als de heer R. van Dam belt voor informatie over zijn hypotheek, worden de gegevens van de heer R. van Dam in de computer opgezocht. Door de relatie met de tabel Hypotheek kunnen die gegevens op het beeldscherm worden getoond, zie figuur 2.6. Figuur 2.6
Klant Klantnr
Naam
Adres
Postcode
Plaats
10006
R. van Dam
Loefweg 56
3965 JJ
Houten
Hyponummer Hypotheek Bedrag
Rente Perc.
Klantnr
33-812347
113.500,00
6,1
10006
33-812352
168.000,00
5,5
10006
Hypotheek
Tegen de heer Van Dam kan direct gezegd worden: “Ik zie dat u twee hypotheken bij ons hebt afgesloten. Wat kan ik voor u doen?”
Copyright 2007 Academic Service
20
Databaseontwikkeling 4 Access 2003
Door het klantnummer van Van Dam (nummeridentificatie) worden automatisch de bijbehorende klant- en hypotheekgegevens gevonden.
informatiebehoefte
informatie-analyse
gegevensanalyse
Hoe wordt een database ontworpen? Welke tabellen hebben we nodig om de gegevens zonder redundantie en inconsistentie op te slaan? Voordat we een database kunnen ontwerpen, moeten we ons eerst afvragen welke gegevens we nodig hebben. Per werkplek moet vastgelegd worden welke informatie daar nodig is, de informatiebehoefte. Dat kan een rapport zijn op papier of bepaalde klantgegevens op het beeldscherm. Dat moet per werkplek bekeken worden. Een inkoper heeft andere informatie nodig dan een verkoper. Een belastingambtenaar die de belastingaangifte van particulieren moet vaststellen, heeft andere informatie nodig dan zijn collega die de belastingaangifte voor bedrijven moet vaststellen. Uiteraard is het vaststellen van die informatiebehoefte een ingewikkelde klus. Niet alleen moet vastgesteld worden welke gegevens waar opgeslagen worden, maar ook vanuit welke invalshoeken er gewerkt wordt. Dit proces wordt informatie-analyse genoemd. Daarna moeten de informatiebehoeften worden ‘vertaald’ naar gegevensstructuren, zodat de gegevens zonder redundantie en inconsistentie worden opgeslagen. We noemen dit gegevensanalyse. We maken daarbij gebruik van een manier die is bedacht door de Amerikaan Edgar Codd. 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, verwijderen of overzichten/rapporten kunnen afdrukken. Er zijn vele databasepakketten te koop. Voor de pc’s zijn de bekendste 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
Copyright 2007 Academic Service
2 Relationele database
front-end/ back-end
21
kunnen die database niet gebruiken als zij geen toegang hebben tot de harde schijf van die computer. De grote databases worden op de hoofdcomputer (server) in het netwerk geplaatst, waardoor honderden personen van de gegevens in de database gebruik kunnen maken. Vaak is dit een ander databasepakket, zoals Oracle of SQL-server. Omdat Access eenvoudig is in het gebruik, vooral bij het maken van allerlei formulieren en rapporten, wordt Access ook toegepast op 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-principe wordt in grotere organisaties voor hun databases veel toegepast. De combinatie van gebruiksgemak aan de front-endkant en degelijkheid aan de back-endkant is dan ook een heel aantrekkelijke. Helaas vergeten vele gebruikers eerst de informatiebehoefte nauwkeurig te bepalen. Het normaliseren van de gegevens wordt dan niet of slechts 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 database een verzameling tabellen is met hun onderlinge relaties. Om de structuur van een database te ontwerpen moet eerst vastgelegd worden wat de informatiebehoefte is. Hierin wordt bepaald wat de gewenste uitvoer van het nieuwe computersysteem is. Die gegevens worden geanalyseerd om tot een datamodel te komen. Dit ontworpen datamodel kan vervolgens toegepast worden in een relationele database. Een database beschikt over een databasemanagementsysteem (DBMS). Hiermee kunnen de tabellen wor-
Copyright 2007 Academic Service
22
Databaseontwikkeling 4 Access 2003
den gemaakt, de relaties worden gelegd, de tabellen gevuld worden, gegevens worden geraadpleegd, gemuteerd, enzovoort. Verder kunnen met behulp van het DBMS rechten worden toegekend en wordt de integriteit van de database bewaakt. De database wordt beheerd door de database-administrator. Er zijn verschillende databasepakketten, zoals Access, Sybase en Oracle. De Accessdatabase is ook te gebruiken aan de gebruikerskant (client) terwijl de gegevens liggen opgeslagen in een grote database, zoals Oracle (server). Access is dan de front-end- en Oracle de back-endkant. Opgaven 1. Omschrijf in het kort de taak van het DBMS. 2. Wat wordt bedoeld met een conceptueel of functioneel datamodel? 3. De 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 boekingen worden door middel van datacommunicatie direct in de Oracle-database verwerkt. De Access-database doet alleen dienst als in- en uitvoermedium. Hoe wordt dit principe genoemd?
Copyright 2007 Academic Service
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.
normaliseren
Voor het bepalen van de indeling van de database bestaan verschillende technieken. Wij zullen gebruikmaken van de techniek van het normaliseren, zoals die door de Amerikaan Edgar Codd in de jaren zeventig is opgesteld. Normaliseren houdt in dat we in een viertal stappen de gegevens uiteenrafelen en indelen in een beperkt aantal, overzichtelijke tabellen. De stappen die we daarbij zullen uitvoeren, zijn klein van omvang en daardoor goed te begrijpen en toe te passen. Hierbij geldt echter wel: oefening baart kunst. Alleen door veel en goed te oefenen kunnen we de kunst van het normaliseren in onze vingers krijgen.
3.1
Stap 1, de nulde normaalvorm
Uitgangspunt van het normaliseren is steeds de informatiebehoefte van de toekomstige gebruiker van de database. De indeling en inhoud van de tabellen wordt bepaald door de informatie die de gebruiker wenst te zien. Stel dat een gebruiker een database wil met daarin de gegevens van zijn muziekcollectie. Als hij aangeeft geïnteresseerd te zijn in het jaar van uitbrengen van de cd, dan zullen we dit jaartal uiteraard moeten opnemen in de database. Als hij aangeeft absoluut niet te willen weten door welke muziekmaatschappij een cd is uitgegeven, heeft het geen zin om dit gegeven
Copyright 2007 Academic Service
24
Databaseontwikkeling 4 Access 2003
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 praten over een uniek, algemeen geldend ontwerp van een database. We zullen ons altijd moeten baseren op de gewenste overzichten, de informatiebehoefte. Deze behoefte kan van gebruiker tot gebruiker verschillen. Het is dus noodzakelijk om tijdens het ontwerpen van een database veel en vaak contact te hebben met de toekomstige gebruiker. Alleen dan kunnen we ervoor zorgen dat de indeling van de database past bij de wensen van de gebruiker. We zullen de theorie uitleggen aan de hand van een praktijkgeval. Paul, DJ bij de lokale radio, verzorgt driemaal per week een twee uur durend programma waarin hij zijn favoriete muziek laat horen en nieuwe cd’s onder de aandacht wil brengen. Hij krijgt hiervoor een kleine onkostenvergoeding die hij gebruikt om zijn cd-collectie langzaam uit te breiden. Aan het einde van iedere maand moet Paul een overzicht inleveren van alle nummers die hij die maand heeft laten horen. Aan de hand van deze overzichten zorgt de stichting BUMA/STEMRA ervoor dat de betreffende artiesten een kleine vergoeding krijgen. Paul weet meestal aan het einde van de maand niet meer precies wat hij aan het begin van de maand allemaal heeft gedraaid. Daarom maakt hij het betreffende overzicht (zie figuur 3.1) direct na afloop van het programma. Daarop staat vermeld welke nummers hij heeft gedraaid. Ieder nummer heeft een eigen code. Deze code is bepaald door een van de medewerkers van het lokale radiostation. Natuurlijk is van ieder nummer ook bekend wat de titel is en wie de uitvoerende artiest(en) is/zijn. Ten slotte noteert men ook of het nummer van een gewone cd afkomstig is of dat het op een single cd staat. Aan het einde van de maand levert hij dan de stapel met deze ‘dagelijkse’ overzichten in. Hij is echter al een paar keer 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
Copyright 2007 Academic Service
3 Normaliseren, inleiding
25
van een of meer overzichten en ervoor zorgen dat de daarop aanwezige 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 gegevens uiteen te rafelen. We krijgen dan de zogenaamde nulde normaalvorm. We bepalen de nulde normaalvorm door alle elementaire, relevante gegevens te bepalen en op te schrijven. Op ons overzicht staat een aantal verschillende gegevens. Figuur 3.1
Allereerst zien we een koptekst boven het overzicht. Deze koptekst is op ieder overzicht van Paul hetzelfde (constant), ongeacht de datum en ongeacht de gedraaide nummers. We zouden deze koptekst kunnen voorbedrukken op het papier. Omdat de koptekst onveranderlijk is, nemen we deze niet op in de database. Constante gegevens nemen we nooit op in de database.
Terzijde We zien op dit moment de naam DJ Paul als een constante. We kunnen ons echter ook afvragen of dit systeem in de toekomst ook door andere 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!
Copyright 2007 Academic Service
26
Databaseontwikkeling 4 Access 2003
Vervolgens zien we een aantal gegevens die iedere keer zullen verschillen: de datum en de gegevens van de gedraaide muziek. Deze gegevens moeten we natuurlijk wel opnemen in de database omdat we ze anders kwijt zijn.
procesgegeven
Ten slotte zien we onder in het overzicht nog een totaal aantal getoond. Dit totaal is af te leiden uit het overzicht door simpelweg het aantal afgedrukte en dus gedraaide nummers te tellen. Als het totaal niet onder in het overzicht zou staan afgedrukt, zouden we het zelf op eenvoudige wijze even kunnen bepalen. Het totaal aantal kunnen we daarom ook weglaten uit de database. We noemen het totaal aantal een procesgegeven. We kunnen het gegeven namelijk bepalen door een rekenproces te laten uitvoeren. Procesgegevens nemen we nooit op in de database.
elementaire gegevens samengestelde gegevens
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.
attributen
We houden nu dus over de elementaire gegevens: datum, code, titel, artiest, soortcode en soortomschrijving. In plaats van gegevens 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 volgende manier: datum, RG (code, titel, artiest, soortcode, soortomschrijving)
repeterende groep
Daarbij staat RG voor repeterende groep (repeating group). Alle gegevens die meerdere keren, repeterend, voorkomen, staan vervolgens tussen ronde haken vermeld.
Copyright 2007 Academic Service
3 Normaliseren, inleiding
sleutelattribuut
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 opmerken. 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 voorkomen 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 mogelijk moet zijn. Als de datum volstaat als sleutel, dan zal ook de combinatie dagaanduiding met datum volstaan. We zouden dan de sleutel datum + dag krijgen (bijvoorbeeld : 23-1-2001 + zaterdag). Omdat we echter ook met een deel hiervan (datum) als sleutel kunnen werken, zijn we verplicht het overtollige deel, de dagaanduiding, weg te laten. We kunnen volstaan met alleen de datum omdat bij iedere datum slechts één dagaanduiding hoort.
kandidaatsleutels
Ten slotte merken we nog even op dat er soms sprake is van meerdere 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 CRInummer waaronder iemand in Groningen bekend is. Ook het CRInummer is op school bekend. Men heeft daar nu om een leerling te kunnen aanwijzen twee mogelijkheden, twee kandidaatsleutels.
Copyright 2007 Academic Service
28
Databaseontwikkeling 4 Access 2003
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 automatisch resulteren in de eerste normaalvorm. Het probleem dat we aanpakken, is het probleem dat optreedt als een nummer meerdere keren door Paul is gedraaid. Iedere keer zal hij steeds alle gegevens van dat nummer noteren, dus code, titel, artiest, soortcode en soortomschrijving. Het lijkt misschien alsof we slechts één keer een code, titel, enzovoort noteren, maar de afkorting RG geeft aan dat we dat herhaaldelijk doen, zo vaak als er nummers gedraaid zijn. Dat betekent dat als Paul het nummer 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 kunnen we niet volstaan met het één keer noteren van alle gegevens? Natuurlijk moeten we dan wel iedere keer even noteren dat we dat nummer hebben gedraaid, maar dat doen we dan kortweg via het noteren van alleen maar de code. In de eerste normaalvorm wordt dit probleem gedeeltelijk opgelost. 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.
Copyright 2007 Academic Service
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 terugzien op het originele overzicht. Dan weten we namelijk wat we proberen aan te wijzen en kunnen we bepalen wat een goede sleutelkeuze is. Kijk eens naar figuur 3.2. 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 uitzending draait. De combinatie van datum en code kan dus fungeren als sleutel. We krijgen dan: (datum, code, titel, artiest, soortcode, soortomschrijving) Omdat de sleutel nu bestaat uit twee 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
Copyright 2007 Academic Service
30
Databaseontwikkeling 4 Access 2003
de datum als sleutel ook voldoet. Dat is natuurlijk niet zo, want bij één datum vinden we meerdere nummers die Paul heeft gedraaid, dus meerdere regels, en we zoeken precies één regel. Kunnen we misschien volstaan met alleen de code van het nummer als sleutel? Dat zou kunnen als Paul een nummer nooit meer dan één keer draait, ook niet op verschillende dagen. Omdat wij weten dat Paul wel degelijk nummers vaker draait, ontstaat het probleem dat we een bepaalde code op meerdere overzichten, van verschillende datums, kunnen terugvinden. Daardoor wijzen we dus niet slechts één, maar meerdere regels aan, hoewel die op verschillende overzichten liggen. Dus alleen de code voldoet ook niet als sleutel. De door ons eerder gekozen, gecombineerde, sleutel is dus de juiste. We hebben nu echter nog niet de eerste normaalvorm. We moeten ons werk nog afmaken. Dat doen we door in de originele nulde normaalvorm de door ons apart genomen repeterende groep te verwijderen en te kijken wat er overblijft. Wat er overblijft, voegen we als aparte groep toe aan de eerste normaalvorm. We hadden als nulde normaalvorm gevonden: (datum, RG (code, titel, artiest, soortcode, soortomschrijving)) 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.
Copyright 2007 Academic Service
3 Normaliseren, inleiding
31
In het toegelichte voorbeeld zien we dat de sleutel uit de nulde normaalvorm (datum) ook in de eerste normaalvorm weer onderdeel van de sleutel is. Vaak is dat zo, maar lang niet altijd. Let dus goed op bij het kiezen van een nieuwe sleutel! Maak opdracht 3.2.
3.3
Stap 3, de tweede normaalvorm
Zoals reeds gezegd heeft de door ons gevonden eerste normaalvorm nog steeds het nadeel dat dezelfde gegevens steeds opnieuw worden opgeslagen. In de volgende stap, de stap naar de tweede normaalvorm, zullen we dit nadeel grotendeels wegwerken. Om te komen tot de tweede normaalvorm onderzoeken we in de eerste normaalvorm of er 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 toelichten. 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 afhankelijk 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 gedraaide 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)
Copyright 2007 Academic Service
32
Databaseontwikkeling 4 Access 2003
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 afhankelijk 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 normaalvorm 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 nummer wordt hierin hooguit één keer opgenomen. Wordt een nummer nu vaker gedraaid, dan wordt het zo vaak als nodig opgenomen in de tweede groep (datum, code). De gegevens van het nummer zelf, zoals de titel, zijn echter al bekend in de eerste groep en worden daar dus niet nog eens opgenomen. Het achteraf corrigeren van een typefout in de naam van de artiest is nu dus eenvoudig, want het behoeft slechts één maal te worden uitgevoerd. Maak opdracht 3.3.
Copyright 2007 Academic Service
3 Normaliseren, inleiding
3.4
33
Stap 4, de derde normaalvorm
We zijn op dit moment gevorderd tot en met de tweede normaalvorm. We nemen nu de laatste stap, het bepalen van de derde normaalvorm. De door ons gevonden tweede normaalvorm zag eruit als: 2 NV
(code, titel, artiest, soortcode, soortomschrijving) (datum, code) (datum)
Er zit in deze tweede normaalvorm nog een vorm van overtolligheid (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 hebben, zal de combinatie S, Single dus 1000 keer zijn opgenomen. Ook hier zouden we met één keer klaar moeten zijn. Wel bij iedere single noteren dat het een single is (soortcode = S), maar slechts één maal noteren dat de code S staat voor de omschrijving Single. Door deze overtolligheid eruit te halen ontstaat de derde normaalvorm. Om de derde normaalvorm te bepalen vragen we ons of er nietsleutelattributen (niet-onderstreepte gegevens) zijn die niet afhangen 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-sleutelattributen. We gaan deze allemaal langs en vragen ons steeds af of ze afhankelijk zijn van de sleutel of van een ander niet-sleutelattribuut. 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
Copyright 2007 Academic Service
34
Databaseontwikkeling 4 Access 2003
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 nummer we precies praten (de code) maar moeten we weten welke soortcode van toepassing is: ‘vertel ons de soortcode en wij vertellen 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: ‘vertel ons de code en wij vertellen u de omschrijving’. Dus: (soortcode, soortomschrijving) In de originele groep laten we het nu het afhankelijke niet-sleutelattribuut (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 andere, niet veranderde groepen uit de tweede normaalvorm, ontstaat de volgende derde normaalvorm: 3 NV
(soortcode, soortomschrijving) (code, titel, artiest, soortcode) (datum, code) (datum)
Deze derde normaalvorm is het uiteindelijke doel geweest van het normalisatieproces. Deze nu gevonden groepen kunnen we later op eenvoudige wijze opnemen in een database. Iedere gevonden groep
Copyright 2007 Academic Service
35
3 Normaliseren, inleiding
zal daarbij worden vertaald in een afzonderlijke tabel. Hierdoor kunnen we later op relatief eenvoudige wijze alle gegevens invoeren en alle gewenste informatie opvragen. We zullen daar in latere hoofdstukken uitgebreid op terugkomen. Eerst moeten we nog een paar afrondende handelingen verrichten. De eerste handeling bestaat uit het toekennen van namen aan de gevonden groepen, aan de gevonden tabellen. De eerste tabel geven we de naam SOORT, omdat daarin de soort muziekdrager 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 programma heeft verzorgd. Deze tabel noemen we DATUM. 3 NV
SOORT TRACK DRAAILIJST DATUM
(soortcode, soortomschrijving) (code, titel, artiest, soortcode) (datum, code) (datum)
We kunnen ons echter afvragen of het zin heeft om deze 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 tabellen 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
Copyright 2007 Academic Service
36
Databaseontwikkeling 4 Access 2003
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 normaalvorm: 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
atribuutwaarde
entiteit
entiteit-occurence
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.
Copyright 2007 Academic Service
37
3 Normaliseren, inleiding
Figuur 3.3
Entiteit : TRACK Attributen Code
Titel
R2734 Coming home B1954 To the limit T5985 CrazySexyCool …….. Entiteit-occurences
Artiest
Soortcode
Romeo Boys II Men TLS
S C C
Attribuutwaarden
In ons voorbeeld zijn in totaal drie entiteiten gevonden. Deze drie entiteiten hangen niet als los zand aan elkaar maar hebben duidelijk met elkaar te maken. 3 NV
SOORT (soortcode, soortomschrijving) TRACK (code, titel, artiest, soortcode) DRAAILIJST (datum, code)
Om te achterhalen welke nummers er op een bepaalde datum gedraaid zijn, dienen we in de 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 codes in DRAAILIJST ook voorkomen in TRACK. In dat geval zouden namelijk de titel en artiest er niet bijgezocht kunnen worden. We kunnen dan ook onze draailijsten niet meer laten afdrukken. Een probleem dus.
vreemde sleutel
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
Copyright 2007 Academic Service
38
Figuur 3.4
Databaseontwikkeling 4 Access 2003
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
B1954
To the limit
Boys II Men C
N2773 He’s my favourite DJ Nance
Soortcode S
R2734
Coming Home
Romeo
S
R4288
Got to be
Romeo
C
……..
…………………..
…………… …
SOORT Soortcode
Soortomschrijving
S
Single
C
CD
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 tabellen. 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-
Copyright 2007 Academic Service
39
3 Normaliseren, inleiding
referentiële integriteit
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 attribuut code in de tabel DRAAILIJST. Een vreemde sleutel kan echter ook een niet-sleutelattribuut zijn. Kijk maar naar het attribuut soortcode in de tabel TRACK.
Entity Relationship Diagram
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 hebben, 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.
Figuur 3.5
TRACK
DRAAILIJST
o.b.v. code
SOORT
o.b.v. soortcode
We zien dat de lijnen aan de ene kant eindigen in een enkelvoudig einde van de lijn en aan de andere kant eindigen in een vertakt einde van de lijn. Als we vanuit de 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
Copyright 2007 Academic Service
40
Databaseontwikkeling 4 Access 2003
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 opgenomen 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 normaliseren geleerd. Daarbij rafelen we de ongestructureerde gegevens, zoals die op een overzicht worden getoond, in een aantal stappen uiteen tot een gestructureerd geheel. Daarbij maken we gebruik van de techniek van het normaliseren. Eerst stellen we de nulde normaalvorm op door alle elementaire gegevens te noteren. Daarbij laten we alle vaste teksten (constanten) en procesgegevens achterwege. We bepalen de sleutel. Het bepalen van de sleutel doen we ook bij iedere volgende stap. Vervolgens bepalen we de eerste normaalvorm door de repeating group te verwijderen.
Copyright 2007 Academic Service
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 integriteit). Opdrachten 3,1 Nulde normaalvorm a. In de nulde normaalvorm mogen geen procesgegevens worden opgenomen. Geef aan waarom dat is en gebruik in het antwoord de termen efficiënt ruimtegebruik en consistentie. b. In een bibliotheek zal men de afzonderlijke boeken moeten kunnen 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 normaalvorm op. Figuur 3.6
Copyright 2007 Academic Service
42 42
Databaseontwikkeling 4 Access 2003
3.2 Eerste normaalvorm a. 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 kortingsbedrag en het eindtotaal niet opgenomen in de nulde normaalvorm? Bepaal uitgaande van de genoemde nulde normaalvorm de eerste normaalvorm. Figuur 3.7
b. Ga uit van de nulde normaalvorm die je eerder bij opdracht 3.1c gevonden hebt en bepaal de daarbij behorende eerste normaalvorm. Controleer goed of de gekozen sleutel niet korter kan. 3.3 Tweede normaalvorm a. Gegeven is het overzicht uit figuur 3.8. Iemand heeft daarbij de volgende eerste normaalvorm gevonden.
Copyright 2007 Academic Service
3 Normaliseren, inleiding
43 43
1 NV (Bestelnummer, naam klant, kortings%) (Bestelnummer, artikelnr, omschrijving, prijs p/s, aantal) Bepaal uitgaande van de bovenstaande eerste normaalvorm de tweede normaalvorm. Figuur 3.8
b. Wat is het wezenlijke verschil tussen de 1 NV zoals die bij opdracht 3.3a is gegeven en zoals die hieronder staat afgedrukt? 1 NV (Bestelnummer, naam klant) (Bestelnummer, artikelnr, omschrijving, prijs p/s, aantal, kortings%) 3.4 Derde normaalvorm a. Iemand heeft de volgende tweede normaalvorm gevonden. Deze hoort bij een order die door een klant is geplaatst. Daarbij geldt dat de korting, het percentage, alleen maar afhankelijk is van het aantal dat men van één artikel koopt. Bij één stuk ontvangt men 2% korting, bij twee stuks 3%, bij drie stuks 5%, enzovoort. Ten slotte geldt dat iedere klant een eigen uniek klantnummer heeft dat altijd voor hem gebruikt wordt.
Copyright 2007 Academic Service
44 44
Databaseontwikkeling 4 Access 2003
2 NV (ordernummer, klantnummer, klantnaam) (ordernummer, artikelnr, aantal, kortings%) (artikelnr, omschrijving, prijs p/s) Bepaal uitgaande van deze tweede normaalvorm de derde normaalvorm. b. Een voetbalvereniging maakt gebruik van (onder andere) het overzicht van 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. Figuur 3.9
Commissie : BC, Barcommissie
Lidnummer
Naam
Telefoon
34
L. Ketelaar
010-4883922
122
V. Borrelaar
0180-499302
307
M. Vervat
010-7559403
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 tegelijkertijd wordt toegekend. Normaliseer dit overzicht tot en met de derde normaalvorm. Figuur 3.10
Camping Zee en Strand, Ouddorp Plaatsnummer 23 Klant
Aankomstdatum Vertrekdatum
8448 6 augustus 2001 20 augustus 2001 P. Livers Kerkweg 23 3109 BF Spijkenisse 3662 R.L.F. Hu Korenstraat 5 8102 BA Raalte
23 juli 2001
Copyright 2007 Academic Service
30 juli 2001
3 Normaliseren, inleiding
45 45
3.5 Entiteit Relatie Diagram a. Gegeven is de volgende genormaliseerde gegevensstructuur. Geef hier de vreemde sleutels aan door deze gestippeld te onderstrepen. Ter informatie: het gaat om een deel van de administratie van een camping. Van een boeking worden de belangrijke gegevens bijgehouden. Bij iedere boeking wordt bijgehouden welke personen er zullen verblijven in verband met het nachtregister. Er kan in twee gedeelten betaald worden. Het eerste deel moet worden betaald binnen vier weken na de boekdatum, het laatste deel moet betaald worden uiterlijk zes weken voor de geplande aankomstdatum. Per boeking wordt er steeds één campingplaats geboekt. GAST BOEKING PLAATS REGISTER BETALING
(gastnummer, naam, adres, postcode, plaats, geboortedatum, telefoonnummer) (boekingnummer, boekdatum, aankomstdatum, vertrekdatum, plaatsnummer) (plaatsnummer, voorzieningen, bedrag per nacht) (gastnummer, boekingnummer) (boekingnummer, betaaldatum, betaald bedrag)
Teken ook het bijbehorende 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 LEIDER LID
(elftalcode, leidercode) (leidercode, leidernaam, telefoonnummer) (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.
Copyright 2007 Academic Service
46 46
Databaseontwikkeling 4 Access 2003
WERKNEMER
o.b.v. werknemernummer
CHEF
AFDELING
o.b.v. chefnummer
Kan een chef meerdere afdelingen onder zijn beheer hebben? Kan een afdeling geleid worden door meerdere chefs? Kan een werknemer bij meerdere afdelingen zijn ingedeeld? Kan er een afdeling zijn zonder werknemers? Kan er een afdeling zijn zonder chef? Kan er een werknemer zijn zonder afdeling? Kan er een chef zijn zonder werknemers?
Copyright 2007 Academic Service
4
Normaliseren, verdieping
Bij de bovenstaande opsomming gaan we ervan uit dat de leerlingen een case uitwerken waarbij de docent/begeleider de rol van opdrachtgever/gebruiker speelt. Dit hoofdstuk is een verdieping van de stof zoals die in hoofdstuk 3 is behandeld. In dit hoofdstuk gaan we moeilijker typen overzichten normaliseren. Dit zijn overzichten waar meer dan één repeterende groep in voorkomt.
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 uiteraard 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 repeterende groep. Bij één datum zien we vervolgens een aantal keer
Copyright 2007 Academic Service
48
Databaseontwikkeling 4 Access 2003
Figuur 4.1
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, waarbij 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
Copyright 2007 Academic Service
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 uiteindelijk in de binnenste doos een heel klein presentje zit. Om bij het presentje te komen zullen we eerst de buitenste doos moeten verwijderen, vervolgens de een na buitenste, vervolgens... We gaan net zolang door met het verwijderen van dozen, van buiten naar binnen, totdat we uiteindelijk bij de binnenste doos zijn aangekomen. Deze tactiek moeten we hier ook toepassen. Om bij de binnenste repeterende groep te komen, zullen we eerst de buitenste groep, in een tussenstap, moeten verwijderen. Daarbij nemen we de grootste repeterende groep, nemen die apart, voegen de sleutelattributen uit de oude groep toe en kiezen vervolgens in de nieuwe groep een sleutel. We nemen dus de repeterende groep (toetsdatum , RG (leerlingnummer, naam, cijfer)) apart en voegen daar de oorspronkelijke 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 welke 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 dezelfde bekende wijze verwijderen. Dus we nemen de repeterende groep apart en voegen de sleutelattributen uit de oude groep toe.
Copyright 2007 Academic Service
50
Databaseontwikkeling 4 Access 2003
(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, toetsdatum 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 klasaanduiding is dus niet opgenomen in de sleutel! Het zoeken naar de tweede en derde normaalvorm gaat op gelijke wijze als in het vorige hoofdstuk is toegelicht. De volgende stap is het bepalen van de tweede normaalvorm. Daarbij zoeken we naar niet-sleutelattributen die niet afhangen van de gehele sleutel maar slechts van een deel van de sleutel. We hoeven 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 hoeven 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 sleuteldeel waarvan ze afhankelijk zijn, het leerlingnummer. We krijgen dan:
Copyright 2007 Academic Service
51
4 Normaliseren, verdieping
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 klasaanduiding 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 LEERLING TOETSDATUM VAK-KLAS
(vak, toetsdatum, leerlingnummer, cijfer) (leerlingnummer, klas, naam) (vak, klas, toetsdatum) (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 informatie 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
Copyright 2007 Academic Service
52
Databaseontwikkeling 4 Access 2003
de klas erbij zoeken. We mogen dus de entiteit TOETSDATUM weglaten. Voor de entiteit VAK-KLAS kunnen we dezelfde redenering 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: Figuur 4.2 RESULTAAT
LEERLING
o.b.v. leerlingnummer
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 voorbeeld. We gaan daarbij uit van een overzicht zoals dat bij een autodealer wordt gebruikt, zie figuur 4.3. Op de bekende manier bepalen we de nulde normaalvorm. Daarbij laten we de procesgegevens (subtotalen, BTW-bedrag en totaalbedrag) achterwege.
Copyright 2007 Academic Service
4 Normaliseren, verdieping
53
Figuur 43
0NV
(factuurnummer, merk, type, kenteken, kmstand, datum, RG (aantal, werknummer, werkomschrijving, werkprijs), RG (aantal onderdelen, onderdeelnummer, onderdeelomschrijving, onderdeelprijs))
Uiteraard geldt dat het factuurnummer hier de sleutel is. We zien hier twee maal een repeterende groep. De tweede groep, met de onderdeelgegevens, komt echter pas nadat de eerste groep, met de werkgegevens, is afgesloten. Deze groepen kunnen we bij de overgang naar de eerste normaalvorm in één keer verwijderen, onafhankelijk van elkaar. We krijgen dan:
Copyright 2007 Academic Service
54
Databaseontwikkeling 4 Access 2003
1 NV
(factuurnummer, merk, type, kenteken, kmstand, datum) (factuurnummer, werknummer, aantal, werkomschrijving, werkprijs) (factuurnummer, onderdeelnummer, aantal onderdelen, onderdeelomschrijving, onderdeelprijs)
De keuze van de sleutels zal voor zich spreken. Ieder nummer komt immers hoogstens één keer op een factuur voor. Als tweede normaalvorm krijgen we: 2 NV
(factuurnummer, merk, type, kenteken, kmstand, datum) (factuurnummer, werknummer, aantal, werkprijs) (factuurnummer, onderdeelnummer, aantal onderdelen, onderdeelprijs) (werknummer, werkomschrijving, adviesprijs) (onderdeelnummer, onderdeelomschrijving, advies onderdeelprijs)
Je ziet dat hier iets speciaals aan de hand is. De prijzen zijn gesplitst in de werkelijk gerekende prijzen en de standaard adviesprijzen. We hebben bij de factuurregelgegevens, de tweede en derde groep in de tweede normaalvorm, de werkelijke prijzen van de factuur staan. Bij de laatste twee groepen van de tweede normaalvorm, waar de gegevens van de algemene werkzaamheden en algemene onderdelen staan vermeld, is de adviesprijs toegevoegd. Dit heeft een simpele reden. 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 prijzen niet hadden gesplitst, zou de klant wel met de te hoge prijzen zijn geconfronteerd, niet echt klantvriendelijk! Tevens kan men nu eventueel afwijken van de adviesprijs, bijvoorbeeld in het geval van garantie of service.
Copyright 2007 Academic Service
55
4 Normaliseren, verdieping
Ten slotte rest ons nog slechts de derde normaalvorm. 3 NV
(factuurnummer, kenteken, kmstand, datum) (factuurnummer, werknummer, aantal, werkprijs) (factuurnummer, onderdeelnummer, aantal onderdelen, onderdeelprijs) (werknummer, werkomschrijving, adviesprijs) (onderdeelnummer, onderdeelomschrijving, adviesonderdeelprijs) (kenteken, merk, type)
Uiteindelijk ontstaan dus de volgende groepen (entiteiten): (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) FACTUUR
Het bijbehorende ERD: Figuur 4.4
AUTO
FACTUUR
FACTUURWERK
FACTUURONDERDEEL
WERK
ONDERDEEL
Copyright 2007 Academic Service
56
Databaseontwikkeling 4 Access 2003
4.3
Opmerkingen met betrekking tot normaliseren
Bij alle stappen van het normalisatieproces is het steeds weer nodig om sleutels te kiezen. Soms komt het voor dat in het gegeven overzicht geen sleutels zijn aan te wijzen. Bijvoorbeeld als wel de naam en het adres van een klant worden getoond, maar niet het klantnummer. In dat soort gevallen kunnen we beter zelf een sleutel bedenken. Gebruik dan nooit een naam of een omschrijving als 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 klantnummers, dus onze medewerker gaat zoeken op naam, maar komt mevrouw Rox niet tegen. Logisch, want hij zocht waarschijnlijk naar de naam Rocks, of Roks, of Rockx, of…… Even later gaat weer de telefoon: “Met copyshop A3, weet u ……” Of was het misschien: “Met 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 voorletters, tussenvoegsel en achternaam. Eventueel kan ook nog apart de voornaam en de titulatuur worden opgenomen. Dit maakt het namelijk mogelijk om met de naam te ‘spelen’. Op een etiket voor een brief kunnen we dan de tekst Drs. J.P. van der Hoeve plaatsen, terwijl we in de aanhef van de brief kunnen beginnen met bijvoor-
Copyright 2007 Academic Service
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. Vlietstra Woonboot Neeltje, tegenover Koelandenweg 1 9534 TB Westdorp Maak opdracht 4.2.
4.4
Integreren
Tot nu toe hebben we steeds gekeken naar één overzicht tegelijkertijd. In de praktijk zal er binnen een bedrijf of organisatie echter altijd sprake zijn van meerdere overzichten die gebruikt worden. Al deze overzichten moeten dan gegenereerd kunnen worden vanuit dezelfde database. Hoe pakken we dat aan? 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. integreren
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)
Copyright 2007 Academic Service
58
Databaseontwikkeling 4 Access 2003
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 opgenomen. Gegevens die in beide tabellen voorkwamen (bijvoorbeeld het telefoonnummer), nemen we uiteraard slechts één keer op. homoniemen synoniemen
Bij het integreren kan er sprake zijn van homoniemen en synoniemen. Een homoniem is een term waarmee we de ene keer dit en de andere keer dat bedoelen. In de Nederlandse taal is een bekend homoniem de term bank. Bedoelen we daarmee een 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 VAK
(leerlingnummer, naam, adres, enzovoort) (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. Homoniemen zijn dus ongewenst en we moeten ze verwijderen. Dat doen we door duidelijke namen te gebruiken, die precies aangeven wat we ermee bedoelen. We vervangen hier dan ook de term ‘naam’ door achtereenvolgens ‘naam leerling’ en ‘vaknaam’. We krijgen dan: LEERLING VAK
(leerlingnummer, naam leerling, adres, enzovoort) (vakcode, vaknaam, coördinator, enzovoort)
Copyright 2007 Academic Service
4 Normaliseren, verdieping
59
Bij het integreren kan ook sprake zijn van synoniemen. Hiermee bedoelen we twee termen waarmee we eigenlijk hetzelfde bedoelen. Ook dat is in het kader van de eenduidigheid ongewenst. Bijvoorbeeld: FACTUUR KLANT
(factuurnummer, debiteurnummer, factuurdatum, enzovoort) (klantnummer, klantnaam, klantadres, enzovoort)
In de voorgaande tabellen is er sprake van een synoniem. De term debiteurnummer is synoniem voor de term klantnummer. We bedoelen daarmee in beide gevallen het nummer van de klant die bij ons iets heeft gekocht. Het is daarom verstandig om in FACTUUR de term ‘debiteurnummer’ te veranderen in ‘klantnummer’. FACTUUR KLANT
(factuurnummer, klantnummer, factuurdatum, enzovoort) (klantnummer, klantnaam, klantadres, enzovoort)
Andersom had natuurlijk ook gekund. Alleen ligt het dan voor de hand ook de andere gegevens uit de klantentabel een andere naam te geven en alles te hernoemen naar DEBITEUR. FACTUUR DEBITEUR
(factuurnummer, debiteurnummer, factuurdatum, enzovoort) (debiteurnummer, debiteurnaam, debiteuradres, enzovoort)
Homoniemen en synoniemen komen met name voor als het normaliseren zoveel werk met zich meebrengt dat dit wordt verdeeld over meerdere personen. Ieder neemt dan een aantal overzichten voor zijn rekening en na 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.
Copyright 2007 Academic Service
60
Databaseontwikkeling 4 Access 2003
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 normaliseren 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 waarden daarbij zijn toegestaan. Zo kan een code bijvoorbeeld altijd opgebouwd zijn uit cijfers. We zouden er dan voor kunnen kiezen om de code als een getal op te slaan. We kunnen dan alleen cijfers invoeren. We kunnen er echter ook voor kiezen om een code als tekst op te slaan. Hierdoor is het dan mogelijk om ook letters op te nemen in de code.
In databasemanagementpakketten kunnen verschillende soorten 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 automatisch voorzien zal worden van het geldsymbool en worden afgerond op twee decimalen. Tekst: Een tekst, die allerlei tekens kan bevatten, bijvoorbeeld een naam of postcode. De maximale lengte is van tevoren vastgelegd. Kladblok: Een tekst waarvan de lengte meestal onbeperkt is, ook wel memo genoemd. Datum: Een datum, bijvoorbeeld een geboortedatum. Soms maakt ook de tijd hier deel van uit. Logisch: Een logisch veld van het type Ja/Nee, Waar/Niet-waar.
Copyright 2007 Academic Service
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 soort gegevens we gaan gebruiken, moeten we ook altijd zoveel mogelijk de grenzen opgeven waarbinnen de waarden van het veld mogen liggen. Dit maakt het mogelijk een hele globale, automatische, controle uit te voeren op de ingevoerde gegevens (consistentie). Als we te maken hebben met een klantcode, moeten we dus eerst opgeven of deze code bestaat uit alleen cijfers (numeriek) of ook uit letters of andere symbolen. In het laatste geval moeten we namelijk kiezen voor het type tekst. Daarnaast moeten we opgeven welke waarden mogen worden ingevoerd. Bestaat de klantcode bijvoorbeeld altijd uit zes cijfers die moeten liggen tussen de 100.000 en 499.999 of bestaat de klantcode uit een code van twee letters gevolgd door een spatie gevolgd door een getal van minimaal één en maximaal drie cijfers? Tevens dient altijd te worden beschreven of een bepaald gegeven wel of niet verplicht moet worden ingevuld. Zo zal de klantcode en de naam van de klant altijd bekend moeten zijn, dus zal het verplicht zijn deze gegevens in te vullen. Het telefoonnummer hoeft niet verplicht te worden ingevoerd, omdat we rekening willen houden met klanten die hun telefoonnummer geheim willen houden. We kunnen dan niets invullen, ook al zouden we het graag willen! De persoon die de database echt gaat bouwen, kan de door ons opgegeven 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-
Copyright 2007 Academic Service
62
Databaseontwikkeling 4 Access 2003
Gegeven
Type
Waardenbereik
Verplicht
Omschrijving
Klantcode
Geheel getal
100.000-499.999
Ja
Identificeert een klant, numeriek, altijd zes cijfers.
Telefoonnummer
Tekst
Precies 10 cijfers
Nee
Moet tekst zijn in verband met voorlopende nul van het kengetal
Klantnaam
Tekst
Maximaal 25 tekens
Ja
Achternaam van de klant
Geboortedatum
Datum
1-1-1860 t/m vandaag
Nee
Geboortedatum van de klant.
Gehuwd
Logisch
Ja / Nee
Nee
Is de klant gehuwd, mag worden leeg gelaten.
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.
metagegevens
In een datadictionary leggen we gegevens vast van de gegevens die wij in onze database (willen gaan) bijhouden. We noemen de gegevens in de datadictionary dan ook wel metagegevens, ofwel gegevens over gegevens. Maak opdracht 4.4.
4.6
Samenvatting
In dit hoofdstuk hebben we moeilijker type overzichten genormaliseerd. Dit zijn overzichten waar meer dan één repeterende groep in voorkomt. Dit zijn echter ook de overzichten zoals ze in de praktijk veelvuldig voorkomen. Door de stappen van het normaliseren consequent toe te passen kunnen dergelijke overzichten op een bijna routinematige manier worden uiteengerafeld. In dit hoofdstuk hebben we ook gekeken naar een aantal problemen en eigenaardigheden zoals die in de praktijk blijken voor te komen. We kunnen eventueel zelfstandig sleutels bedenken en gegevens, vanuit praktisch oogpunt, verder opsplitsen in zinvolle deelgegevens. Vervolgens hebben we geleerd hoe we bij meer dan één overzicht de gevonden derde normaalvormen kunnen integreren tot één eindresultaat. Daarbij spelen homoniemen en synoniemen een rol. Ten slotte hebben we gezien hoe we een datadictionary moeten
Copyright 2007 Academic Service
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 groepen a. Het overzicht van figuur 4.5 is in gebruik op de verkoopafdeling van de firma ZEEP BV. Deze firma levert aan zelfstandige winkelbedrijven en heeft daartoe een twintigtal vertegenwoordigers in dienst die de winkels langsgaan en orders opnemen. Normaliseer dit overzicht tot en met de derde normaalvorm. Ga er daarbij van uit dat een vertegenwoordiger een vast rayon heeft en nooit buiten zijn rayon werkzaam is. Teken ook het bijbehorende ERD. Figuur 4.5
b. Het overzicht van figuur 4.6 is in gebruik bij een MBO-instituut. Dit instituut biedt zijn leerlingen buiten de reguliere lessen de mogelijkheid om tegen zeer gereduceerd tarief extra cursussen te volgen. Daarbij maakt men onder andere gebruik van het overzicht uit 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.
Copyright 2007 Academic Service
64 64
Databaseontwikkeling 4 Access 2003
Figuur 4.6
c. In het overzicht van figuur 4.7 worden de gegevens van de door een vertegenwoordiger afgelegde bezoeken vastgelegd. Per Figuur 4.7
Copyright 2007 Academic Service
4 Normaliseren, verdieping
65 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 groepen Uitzendbureau ’t VolleVat fungeert als tussenpersoon tussen bedrijven die werknemers zoeken en werknemers die bedrijven zoeken. Om iedereen zo goed mogelijk van dienst te kunnen zijn, houdt het van de ingeschreven werknemers een aantal gegevens bij, zie figuur 4.8. Normaliseer dit overzicht tot en met de derde normaal normaalvorm. Ga er daarbij van uit dat een werknemer hoogstens voor één werkgever tegelijkertijd werkt. Iemand kan meerdere keren bij hetzelfde bedrijf worden ingezet. Een werknemer volgt een cursus slechts één keer. Teken ook het bijbehorende ERD. Figuur 4.8
Copyright 2007 Academic Service
66 66
Databaseontwikkeling 4 Access 2003
4.3 Integreren Gegeven is het overzicht zoals dat gebruikt wordt bij een camping, zie figuur 4.9. Daarbij is de volgende derde normaalvorm gevonden. Figuur 4.9
3 NV
PLAATS
VOORZIENING
(plaats, max. aantal tenten, max. aantal personen, prijs laagseizoen, prijs hoogseizoen, voorzieningcode) (voorzieningcode, omschrijving)
Bij dezelfde camping maakt men ook gebruik van het overzicht zoals afgebeeld in figuur 4.10. Daarbij is de volgende derde normaalvorm gevonden. Figuur 4.10
Copyright 2007 Academic Service
67 67
4 Normaliseren, verdieping
3 NV
PLEK KLANT
RESERVERING
NACHTREGISTER
(plaatscode, toelichting plaats) (klantcode, naam, adres, postcode, plaats, bank/gironummer, telefoonnummer) (reserveringcode, plaatscode, datumbegin, datumeind, klantcode, omschrijving, factuurdatum, betaaldatum) (reserveringscode, volgnummer, geslacht, voorletters, naam, geboortedatum)
Integreer de gevonden derde normaalvormen tot één derde normaalvorm. Verwijder daarbij homoniemen en synoniemen. Teken tevens het bijbehorende ERD. 4.4 Datadictionary a. In paragraaf 4.6 hebben we twee normaalvormen geïntegreerd tot één. Maak voor deze geïntegreerde normaalvorm één gezamenlijke 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. (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) FACTUUR
Copyright 2007 Academic Service
68 68
Databaseontwikkeling 4 Access 2003
Figuur 4.11
Copyright 2007 Academic Service
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 databasepakket 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 voorraad zijn, in welke aantallen, wat het verbruik is en welke openstaande bestellingen er nog zijn. Boeknummer
Titel
Schrijver
Aanschafdatum
Etc.
EC466-32
Boekhouden gestaafd
Fuchs e.a.
23-5-1996
..
MM844-02
Marketing Management
Kotler
06-7-1997
..
WK536-78
Basis wiskunde
Van den Hoek
23-5-1996
..
LO466-06
Inleiding logistiek
Schmidt e.a.
12-12-1998
..
Rijen
Om gegevens te kunnen bijhouden moeten deze gestructureerd worden opgeslagen. Hoe gegevens gestructureerd kunnen worden, door te normaliseren, is in de vorige hoofdstukken toegelicht. Het resultaat van het structureren bestaat uit een verzameling entiteit-
Copyright 2007 Academic Service
70
tabel
records
velden of atributen
database
Databaseontwikkeling 4 Access 2003
typen die iets met elkaar te maken hebben – die met elkaar gerelateerd 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 schrijver. 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 vastgelegd wie welke boeken heeft geleend of wenst te lenen. We zullen in de rest van dit boek leren werken met tabellen en databases; we laten zien hoe deze moeten worden gecreëerd, gevuld, gemuteerd en geraadpleegd. Daartoe zal steeds eerst worden besproken welke handelingen we moeten verrichten, waarna er een opdracht volgt waarbij we de zojuist besproken handelingen gaan uitvoeren.
5.2
Het programma Access starten
Om te kunnen werken met Access moeten we eerst op de gebruikelijke manier de computer opstarten en eventueel inloggen op een netwerk. Ga naar de Start-knop en kies achtereenvolgens 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 diskette. Bewerkingen zijn immers alleen mogelijk als er schrijfrech-
Copyright 2007 Academic Service
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 dialoogvenster dat is afgebeeld in figuur 5.1 of figuur 5.2. Figuur 5.1
Het scherm van figuur 5.1 laat aan de rechterkant niet het taakvenster 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
Copyright 2007 Academic Service
72
Databaseontwikkeling 4 Access 2003
Figuur 5.2
scherm Openen oproepen, dat je al kent uit andere Microsoft-applicaties. 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.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
73
Figuur 5.3
Maak het venster eventueel beeldvullend. Figuur 5.4
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.
Copyright 2007 Academic Service
74
Databaseontwikkeling 4 Access 2003
Figuur 5.5
Kies voor de Ontwerpweergave. Klik daarna op OK. We hadden 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 venster 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. Figuur 5.6
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
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
75
Beschrijving. We maken voor het soort veld een keuze uit de keuzelijst (klik op de knop T 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 getallen, 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 decimalen. 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-applicaties opnemen, bijvoorbeeld grafieken, plaatjes, geluiden, enzovoort. Hyperlink – Een adres dat verwijst naar een bestand ergens anders op een computer. Het betreffende bestand kan zelfs benaderd worden 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 tabbladen Algemeen en Opzoeken. We gebruiken hier voorlopig alleen
Copyright 2007 Academic Service
76
Databaseontwikkeling 4 Access 2003
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 sleutelvelden) worden aangewezen. Met behulp van dit sleutelveld kunnen we later gegevens terugzoeken. Om dit te kunnen doen dient een sleutelwaarde altijd uniek te zijn. Als in de tabel Boek het veld Boeknummer de rol van sleutelveld speelt, dan dient ieder boeknummer hooguit één keer voor te komen. Anders kunnen we immers niet bepalen welk boek wordt bedoeld. In hoofdstuk 3 en 4 is hier nader op ingegaan. 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 sleutelsymbool. 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 bovenstaande 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 beschreven. b. Ontwerp een tabel met de indeling die hieronder staat weergegeven. Zorg ervoor dat het veld Volgnummer sleutelveld wordt.
Copyright 2007 Academic Service
77 77
5 Eenvoudige bewerkingen in Access
c. Beëindig het aanmaken van de tabel, sla daarbij de tabel op onder de naam Boeken en sluit de database af. Veldnaam
Gegevenstype
Volgnummer Boeknummer Titel Schrijver Aanschafdatum Aanschafprijs Afgeschreven
Autonummering Tekst Tekst Tekst Datum/tijd Valuta Ja/Nee
5.4
Veldlengte
8 30 30
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. 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 klikken op de betreffende bestandsnaam open je de database. Het kan
Copyright 2007 Academic Service
78
Databaseontwikkeling 4 Access 2003
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 beveiligingsniveau eventueel aanpassen via Extra, Macro, Beveiliging. Door het laagste niveau te kiezen blijft de waarschuwing weliswaar 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-applicaties. Na het openen van de database kunnen we alle in deze database 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 tabel wordt zo getoond dat we direct gegevens kunnen toevoegen of bestaande gegevens kunnen wijzigen (figuur 5.8). 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.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
79
Als de tabel een groot aantal rijen bevat, kunnen deze niet allemaal 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 verplaatsingsknoppen 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 ontwerpen. Selecteer het betreffende veld en breng de gewenste wijziging aan. Het kan gebeuren dat we de melding krijgen dat er gegevens verloren (kunnen) gaan. Dat gebeurt bijvoorbeeld wanneer we de lengte van een veld verkleinen. De tekens die niet meer in het verkleinde veld passen, raken we in dat geval kwijt. Voeg zonodig velden toe door deze er op de bekende manier onder aan de lijst bij te plaatsen. 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 gebruikmaken van de knop Knippen of in het menu kiezen voor Bewerken, Verwijderen. Op soortgelijke wijze passen we de volgorde van de velden onderling aan. Markeer een te verplaatsen veld en versleep het vervolgens naar de nieuwe plaats. Sluit na het aanbrengen van alle wijzigingen op de bekende manier het ontwerpen af met Bestand, Sluiten.
Copyright 2007 Academic Service
80
Databaseontwikkeling 4 Access 2003
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 kunnen ook opgeven wat er precies moet worden gekopieerd, alleen de structuur, zowel de structuur als de gegevens, of dat de gegevens van de tabel moeten worden toegevoegd aan een reeds bestaande tabel. Figuur 5.9
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 hoeven 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.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
5.5.3
81
Records verwijderen
We kunnen records verwijderen door de cursor in het betreffende record te plaatsen en vervolgens in het menu te kiezen voor Bewerken, Record verwijderen. Willen we meerdere records tegelijk verwijderen, dan kunnen we deze markeren door met de muis in de linkerbalk te slepen of door het eerste record in de linkerbalk te markeren, naar het laatste record van de te verwijderen reeks te gaan en dit te markeren met de Shift-toets ingedrukt. Hierna kunnen we met Bewerken, Record verwijderen de selectie laten verwijderen. Gemarkeerde records kunnen we ook verwijderen door op de toets Delete te drukken. Voordat de records definitief verwijderd 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 aanwezig 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 daarmee deze records eruit. De overige records worden niet getoond. Een selectiefilter geven we op door in een veld van een record de
Copyright 2007 Academic Service
82
Databaseontwikkeling 4 Access 2003
gewenste waarde te markeren (er met de muis overheen slepen) en hierna te kiezen voor Records, Filter. Alleen de records die voldoen, 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 waarden 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 voorwaarden 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. 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
Copyright 2007 Academic Service
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 verschil gemaakt moet worden tussen hoofd- en kleine letters en of er ook op de opmaak gelet moet worden. Let erop dat een computer in het algemeen verschil maakt tussen hoofd- en kleine letters. De tekst Popmuziek is voor een computer niet gelijk aan de tekst POPMUZIEK. Het is dus vaak zinvol om de optie Identieke hoofdletters/kleine letters NIET af te vinken. In dat geval zal er namelijk geen verschil gemaakt worden tussen beide teksten omdat Access dan geen onderscheid maakt tussen hoofdletters en kleine letters. De knop Volgende zoeken zoekt steeds naar het eerstvolgende record dat voldoet. Bij het opgeven van de te zoeken waarde kunnen we gebruikmaken van jokers (wildcards). Dit zijn tekens die voor een of meer letters of cijfers staan. Er zijn drie tekens die veel gebruikt worden. Het teken * geeft aan dat een willekeurig aantal tekens voldoet. Het teken ? staat voor één teken. Het teken # komt overeen met één cijfer. Dus bij b*s voldoen bijvoorbeeld: bas, bos, baas, buitenhuis, zolang het woord maar begint met de letter b en eindigt op de letter s. Bij b?s voldoen bas, bos, bis, enzovoort. Tussen de letters b en s mag nu slechts één ander teken voorkomen. Aan het zoekcriterium 19#5 voldoen onder meer 1905, 1915, 1925. Het derde teken moet wel een cijfer zijn. 5.5.7
Records zoeken (en vervangen)
Op soortgelijke wijze als bij het zoeken naar records kunnen we ook de inhoud van velden automatisch laten wijzigen. We laten dan zoeken naar een door ons op te geven veldwaarde en deze laten we vervolgens vervangen door een ook door ons op te geven waarde. Om het zoeken en vervangen uit te laten voeren kiezen we voor Bewerken, Zoeken. Vervolgens selecteren we het tabblad Vervangen. De verdere afhandeling lijkt sterk op wat in de vorige paragraaf is besproken.
Copyright 2007 Academic Service
84 84
Databaseontwikkeling 4 Access 2003
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 dubbelklikken. 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 afwijkend zijn van het formaat zoals we dat hebben ingevoerd. d. Sorteer de gegevens op basis van de aanschafprijs. e. Zoek alle records waarbij de naam van de schrijver begint met de letter W. (Als die er niet is, kies dan een andere beginletter.) f. Verwijder het derde record. g. Voor vrijwel iedere besproken handeling is er ook een knop opgenomen in de werkbalk. Zoek de knoppen voor achtereenvolgens 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 mogelijke manier alle bestemmingen gelegen in dit land. (Zorg er dus voor dat ze direct onder elkaar komen te liggen!) c. Iemand wenst een vakantie te boeken ergens in Zuid-Amerika. Welke bestemmingen kunnen wij aanbieden? Laat alleen deze bestemmingen zien. (Gebruik dus een 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.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
5.6
85
De bestandsweergave wijzigen
Een tabel wordt getoond in een standaard lay-out, die we echter kunnen aanpassen. We zullen kort bespreken hoe we het lettertype, de opmaak van een cel, de kolombreedte en rijhoogte kunnen 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. Figuur 5.11
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 worden 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
Copyright 2007 Academic Service
86
Databaseontwikkeling 4 Access 2003
Figuur 5.12
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 gebruikelijke 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. Figuur 5.13
Figuur 5.14
We kunnen nu de kolombreedte instellen. De breedte wordt ingesteld 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 zetten 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.
Copyright 2007 Academic Service
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 dubbelklikken. De rijhoogte passen we op soortgelijke wijze aan. 5.6.4
Kolommen verplaatsen
De onderlinge volgorde van de kolommen van een tabel kan worden gewijzigd. Hiertoe markeren we eerst een of meer kolommen door erover te slepen. Nadat we dit gedaan hebben, slepen we nogmaals. Hiermee verplaatsen we de gemarkeerde kolommen. Bij het afsluiten van de tabel zal Access vragen of de nieuwe lay-out bewaard moet blijven of niet. In het eerste geval zal de nieuwe volgorde 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 getoond. 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 getoond, waarbij door een vinkje wordt aangegeven welke kolommen wel en welke niet zichtbaar zijn. Door een verborgen kolom af te Figuur 5.15
Copyright 2007 Academic Service
88
Databaseontwikkeling 4 Access 2003
vinken wordt deze weer zichtbaar. We kunnen dit venster overigens 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 kolommen 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 kunnen 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 nieuwe 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.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
89
Figuur 5.16
In het dialoogvenster Afdrukken kunnen we nog een aantal zaken 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 pagina’s of alleen de geselecteerde records. Ten slotte is ook de printvolgorde 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 aangehouden. 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. Copyright 2007 Academic Service
90
Databaseontwikkeling 4 Access 2003
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 relaties tussen de tabellen. Zo zullen we bij een klant op basis van het klantnummer alle boekingen van de klant kunnen (en willen) zoeken. Op basis van de reiscode kunnen we de reis erbij zoeken en op basis van de bestemmingcode kunnen we de gegevens van de bestemming erbij zoeken. De database Reisbureau bevat meerdere tabellen tezamen met de onderlinge relaties. De indeling van de tabellen: KLANT
BOEKING
REIS
BESTEMMING
Klantnummer Naam Adres Postcode Woonplaats Telefoonnummer
Boekingnummer Klantnummer Reisnummer Boekdatum Aantal volwassenen Aantal kinderen Betaald bedrag
Reisnummer Bestemmingcode Vertrekdatum Aantal dagen Prijs per persoon
Bestemmingcode Plaats Land Werelddeel
De bestaande relaties staan weergegeven in het volgende ERD (Entiteit Relatie Diagram): KLANT
BOEKING
o.b.v. klantnummer
REIS
o.b.v. reisnummer
BESTEMMING
o.b.v. bestemmin g code
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:
Copyright 2007 Academic Service
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 bekende relaties vermeld. Figuur 5.17
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.18
Copyright 2007 Academic Service
92
Databaseontwikkeling 4 Access 2003
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. Figuur 5.19
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 afvinken, wordt het mogelijk om in de primaire tabel (de tabel waar het veld de sleutel is) wijzigingen aan te brengen in de sleutelwaarde. Deze wijzigingen worden dan automatisch doorgevoerd in het gerelateerde veld. Bijvoorbeeld: een wijziging in het klantnummer in de klantentabel wordt automatisch ook doorgevoerd bij de overeenkomstige boeking(en). Let op: vinken we deze mogelijkheid niet af, dan kunnen we de sleutelwaarden in de primaire tabel niet wijzigen als deze waarde ook nog in een van de gerelateerde tabellen voorkomt! We kunnen dus bijvoorbeeld in de klantentabel geen klantnummer wijzigen van een klant waarvan nog een boeking bestaat! Geef met de keuze Gerelateerde records trapsgewijs verwijderen op dat we records uit de primaire tabel willen kunnen verwijderen; gerelateerde records worden hierbij automatisch uit de gerelateerde tabellen verwijderd. Hierdoor wordt er bijvoorbeeld door het ver-
Copyright 2007 Academic Service
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 tekening overzichtelijker maken door de tabellen op het scherm zodanig te verslepen dat er nette, rechte lijnen ontstaan (figuur 5.20). Figuur 5.20
Het kan voorkomen dat we een relatie tussen twee tabellen willen definiëren waarbij de relatie is gebaseerd op een meervoudige sleutel. In dat geval selecteren we alle betreffende velden in de tabel waar deze tezamen de gehele sleutel vormen (de primaire tabel). Daartoe houden we tijdens het selecteren de Control-toets ingedrukt. 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 kunnen 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.
Copyright 2007 Academic Service
94
Databaseontwikkeling 4 Access 2003
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 activeren 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.
Terzijde De relatie kan ook verwijderd worden door aanklikken met de linkermuisknop, gevolgd door het indrukken van de Deletetoets.
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 bestemmingen 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 (primaire) 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
Copyright 2007 Academic Service
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 primaire tabel Bestemming zijn ingevoerd (zie figuur 5.21). Hierdoor wordt het voor de persoon die de gegevens moet invoeren makkelijker om de juiste codes op te zoeken en in te voeren. Figuur 5.21
We kunnen een dergelijke keuzelijst op vrij eenvoudige wijze maken nadat we alle relaties tussen de diverse tabellen hebben opgegeven. 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 besturingselement Klik op T en kies voor Keuzelijst met invoervak. We willen gegevens laten opzoeken vanuit een andere tabel. Kies voor Type rijbron dus Tabel/query.
Copyright 2007 Academic Service
96
Databaseontwikkeling 4 Access 2003
Figuur 5.22
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.23
Copyright 2007 Academic Service
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. Figuur 5.24
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.25
Copyright 2007 Academic Service
98
Databaseontwikkeling 4 Access 2003
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 wijzigingen moeten worden bewaard. Beantwoord deze vraag bevestigend. 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 (bestemmingcode), 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 worden? 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.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
99
Wanneer we de tabel Reis hebben geopend in de gegevensbladweergave, 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 worden 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 bijgezocht. 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 relaties worden opgegeven. Voeg de tabellen Boeking en Klant toe aan het relatiescherm. b. Leg de relatie tussen Reis en Boeking en de relatie tussen Boeking en Klant. c. Zorg ervoor dat de referentiële integriteit wordt afgedwongen. Het is niet nodig trapsgewijs wijzigen en trapsgewijs verwijderen 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 invoeren 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
Copyright 2007 Academic Service
100 100
Databaseontwikkeling 4 Access 2003
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 vanuit 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 boeking bestaat! h. Open de tabel Boeking nogmaals en zorg er nu voor dat bij het veld Klantnummer een keuzelijst wordt getoond. Laat het klantnummer, 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 definiëren, alleen de tabel Klant opnemen. 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 tegelijkertijd 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 gebruikmaken van een query (een vraag opgemaakt in een speciale vraagtaal). 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.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
101
Figuur 5.26
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 hebben. Stel we willen weten wie er een reis hebben geboekt naar Azië. Van de betreffende personen willen we de naam, de woonplaats en het telefoonnummer weten, zodat we even contact kunnen opnemen. Klik op de knop Nieuw om de bijbehorende query te maken. We kunnen opgeven hoe we de query willen maken: handmatig met Ontwerpweergave of met behulp van een Wizard Selectiequery; zie figuur 5.27. Figuur 5.27
Kies Wizard Selectiequery. Dit is een hulpprogramma dat ons veel werk uit handen neemt. Klik op de knop OK.
Copyright 2007 Academic Service
102
Databaseontwikkeling 4 Access 2003
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. Figuur 5.28
Selecteer eerst een van de benodigde tabellen. Alle velden uit de betreffende tabel worden links getoond. We kunnen in de linkerhelft 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 hieruit 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 samenvatting 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 kunnen 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.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
103
Figuur 5.29
Figuur 5.30
We kunnen opgeven of we de query direct willen laten uitvoeren, de query openen om gegevens weer te geven, of dat we het ontwerp 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 namelijk nog een selectie kunnen laten uitvoeren (alleen Azië) – en klik op de knop Voltooien. We komen nu terecht in het ontwerpscherm (figuur 5.31).
Copyright 2007 Academic Service
104
Databaseontwikkeling 4 Access 2003
Figuur 5.31
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.32
Copyright 2007 Academic Service
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 databasescherm. 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 aanzienlijk 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. Figuur 5.33
Nu moeten we nog opgeven welke velden we wel en niet wensen 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 weten: bestemming is Azië, of bestemming is West-Europa en de woonplaats is niet Rotterdam, of de prijs van de reis ligt tussen # 500,– en # 1250,–.
Copyright 2007 Academic Service
106
Databaseontwikkeling 4 Access 2003
We geven deze voorwaarden in drie, afzonderlijke, onder elkaar gelegen Criteria-regels. Voorwaarden die we op dezelfde criteriaregel opnemen, moeten tegelijkertijd waar zijn om te voldoen, de zogenaamde EN-constructie. Voorwaarden die we onder elkaar, in afzonderlijke regels opnemen, vormen een OF-constructie: als er aan de (gecombineerde) voorwaarden op één regel wordt voldaan is het goed. Het scherm ziet eruit als in figuur 5.34. 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)
Copyright 2007 Academic Service
107
5 Eenvoudige bewerkingen in Access
Deze bewerkingen werken op alle veldsoorten, dus op getallen en teksten, maar ook op datums. Ook de eerdergenoemde jokers kunnen we gebruiken. Bij datum en tijd kunnen we nog een aantal extra functies gebruiken. Let er daarbij op dat het veld waarop de functie wordt uitgevoerd tussen rechte haken moet staan en dat het argument van de functie zelf tussen ronde haken staat. Functie
Betekenis
Invoeren als
Day
selecteert de dagaanduiding
Day ([Boekdatum]) = 27
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
Terzijde Wat de taal betreft: bij het opgeven van functies kunnen/moeten we van de hiervoor genoemde, Engelstalige functies gebruikmaken 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 gebruiken 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 ontworpen query achteraf aanpassen.
Copyright 2007 Academic Service
108
Databaseontwikkeling 4 Access 2003
Soms wordt een voorwaarde erg lang en hebben we eigenlijk te weinig ruimte om het criterium goed in te voeren. Klik in dat geval met de rechtermuisknop bij het betreffende veld in de criteriumregel. We kunnen dan inzoomen. Er verschijnt een venster waarin we het criterium kunnen plaatsen. We kunnen dit venster ook oproepen door op de betreffende knop in de menubalk te klikken. Hebben we niet alle benodigde velden geselecteerd, dan kunnen we later nog velden toevoegen door ze van het bovenste deel (aanklikken in de betreffende tabel) te slepen naar het onderste deel en ze daar neer te zetten. Een veld dat we achteraf toch niet nodig hebben bij de query, selecteren we door in het dunne balkje direct boven de veldnaam te klikken (de hele kolom wordt nu gemarkeerd). Vervolgens verwijderen we het door op de toets Delete te drukken of door in het 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 betreffende 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 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 de betekenis van de relaties tussen de tabellen aanpassen. Standaard wordt een relatie alleen getoond als de waarde in beide tabellen voorkomt. Een overzicht van alle klanten, met de door hen geboekte reizen, zal alleen klanten tonen die daadwerkelijk een reis geboekt hebben. Klanten zonder boeking worden niet getoond, omdat hun klantnummer niet in beide tabellen voorkomt. Als we die klanten toch wensen te zien, klikken we met de rechtermuisknop op de betreffende relatie tussen Klant en Boeking (op de lijn) en kiezen voor Joineigenschappen. Vervolgens kunnen we de relatie 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
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
109
Figuur 5.35
geldt deze gewijzigde instelling alleen voor die betreffende query. Buiten deze query blijft de algemeen ingestelde relatie gehandhaafd. 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 klanten zonder boeking ook worden getoond (via joineigenschappen) en geef bij de query zelf als criterium dat er in het veld boekingnummer niets mag zijn ingevuld. We vinden – als het goed is – twee klanten, te weten Taks en Brigman.
Copyright 2007 Academic Service
110
Databaseontwikkeling 4 Access 2003
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 Som Gem Min Max Aantal Eerste Laatste
Berekent het totaal van het veld de gemiddelde waarde van het veld de kleinste waarde in het veld de grootste waarde in het veld het aantal keren dat er in het veld iets is ingevuld (niet leeg) de waarde in het eerste record 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 functie, in ons geval de functie Gem, zie figuur 5.36. Figuur 5.36
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
111
De uitvoer wordt nu ietwat slordig getoond, zie figuur 5.37. 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 vervangen 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. Figuur 5.38
De uitvoer ziet er nu netter uit, zie figuur 5.39. 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 meerdere reizen naar Spanje. Dit betekent dat de query dus meerdere keren iets wenst te tonen. Er is echter maar één gemiddelde prijs
Copyright 2007 Academic Service
112
Databaseontwikkeling 4 Access 2003
voor deze reizen. Aan de ene kant moet iets dus vaker worden getoond, 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. 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 aangeboden 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 soortgelijk overzicht te krijgen van de klanten die een reis naar NoordAmerika hebben geboekt, moeten we een nieuwe query aanmaken, met een iets andere voorwaarde. Op deze manier ontstaan er echter erg veel query’s die eigenlijk in niets van elkaar verschillen, alleen een kleine wijziging in een criterium.
Copyright 2007 Academic Service
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 selectiecriterium. Voordat de query wordt uitgevoerd, wordt dan eerst het gewenste werelddeel gevraagd, waarna op basis van het gegeven antwoord de uitvoer wordt gegenereerd. Om een flexibele query te maken moeten we bij de betreffende voorwaarde (het criterium) een vraag opgeven. Tijdens het uitvoeren van de query zal de vraag vervangen worden door een door de gebruiker ingetoetste waarde. De vraag dient tussen rechte haken te worden geplaatst. In 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. Figuur 5.41
Na uitvoering van de query verschijnt eerst het scherm uit figuur 5.42, waarin om het gewenste werelddeel wordt gevraagd. Figuur 5.42
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
Copyright 2007 Academic Service
114
Databaseontwikkeling 4 Access 2003
voorzien van een inhoud. Omdat we de inhoud meestal krijgen via het laten uitvoeren van een berekening, heet een dergelijk veld een rekenveld. Stel dat we bij het reisbureau de regel hanteren dat een reis binnen 30 dagen na de boekdatum moet zijn betaald. We willen deze uiterste betaaldatum opnemen in de query. 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), gevolgd door een punt. In figuur 5.43 is het voorbeeld te zien, let op de vierde kolom van de query. Figuur 5.43
In het zojuist besproken voorbeeld geldt voor iedere reis dat er uiterlijk binnen dertig dagen na de boekdatum moet zijn betaald. Stel
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
115
dat we dit alleen willen hanteren bij reizen waarvan de prijs minder dan #1000,– bedraagt. Voor alle andere reizen willen we een periode van 45 dagen hanteren. Dan geldt dat de uiterste datum afhankelijk is van de prijs. We kunnen 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 voorwaarde wordt voldaan. Er geldt dan dus een periode van 45 dagen. Let erop dat alle veldnamen tussen rechte haken staan vermeld en dat de argumenten van de functie van elkaar worden gescheiden door een puntkomma. Het kan zijn dat bij de gebruikte versie van Access een ander scheidingsteken, bijvoorbeeld de komma, 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 worden 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.
Copyright 2007 Academic Service
116
Databaseontwikkeling 4 Access 2003
Figuur 5.44
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 bijvoorbeeld 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 maximum, enzovoort. Per groepje gegevens laten we dit vervolgens op het scherm tonen. Een dergelijke query maken we als volgt:
Copyright 2007 Academic Service
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 3. 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 gemiddelde 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 bestemming het aantal reizen (reisnummer) bepaald en afgedrukt. Figuur 5.45
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:
Copyright 2007 Academic Service
118
Databaseontwikkeling 4 Access 2003
Functie Som Gem Min Max Aantal Eerste Laatste
Berekent (per groep) het totaal van het veld de gemiddelde waarde van het veld de kleinste waarde in het veld de grootste waarde in het veld het aantal keren dat er in het veld iets is ingevuld (niet leeg) de waarde in het eerste record de waarde in het laatste record
Als we gegevens groeperen (Group By) en een criterium gebruiken, dan geldt dit criterium voor de groep. Dat wil zeggen dat er eerst wordt gegroepeerd en dat er pas op het moment van afdrukken wordt gekeken naar het opgegeven criterium. Alleen groepen die voldoen aan het criterium worden opgenomen in het overzicht. In de query 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. Figuur 5.46
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.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
119
Figuur 5.47
Allereerst worden nu de reizen geselecteerd die voldoen aan de voorwaarde dat deze 21 dagen duren. Vervolgens worden deze reizen per land van bestemming gegroepeerd en worden de gegevens per groepje weergegeven. Tenminste als voor de groep als geheel geldt dat de gemiddelde prijs hoger is dan # 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 groepsgegeven, 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.
Copyright 2007 Academic Service
120
Databaseontwikkeling 4 Access 2003
Figuur 5.48
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) selecteren, 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 verwijderen hebben geactiveerd, zullen indien nodig ook gerelateerde records uit de andere bestanden worden verwijderd, zie ook paragraaf 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-
Copyright 2007 Academic Service
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 vervolgens opnieuw te definiëren. Tijdens het definiëren kun je het trapgewijs verwijderen opgeven. Wordt er nu een record uit de primaire 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 Boeking en Reis is gebaseerd op het gegeven Reisnummer, en Reisnummer is in Reis de sleutel. Zouden de bijbehorende boekingen niet automatisch 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 eigenlijk 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
Copyright 2007 Academic Service
122
Databaseontwikkeling 4 Access 2003
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 gemeenschappelijk 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.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
123 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 volgende gegevens: plaatsnaam, land, vertrekdatum, standaardprijs en prijs inclusief 5% korting. Aanwijzing: gebruik voor de prijs inclusief korting een rekenveld. g. Ten gevolge van politieke spanningen wordt besloten dat op reizen een extra brandstoftoeslag wordt geheven. Buiten WestEuropa bedraagt de toeslag # 35,– per reis per persoon, binnen West-Europa geldt een opslag van # 25,–. Verzorg een overzicht 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 verwijderen 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.
Copyright 2007 Academic Service
124
Databaseontwikkeling 4 Access 2003
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 (snelrapport): dit is een zeer eenvoudige standaard lay-out voor een rapport. Daarnaast kunnen we gebruikmaken van de Wizard Rapport. We worden dan aan de hand meegenomen tijdens het ontwerpen. We kunnen de rapporten grotendeels naar eigen inzicht opmaken. Ten slotte is het ook mogelijk rapporten handmatig te ontwerpen. Daarbij moeten we alle handelingen zelf uitvoeren, maar in dat geval kunnen we alles tot op detailniveau instellen. We kunnen het handmatig ontwerpen ook gebruiken om een via een Wizard gegenereerd rapport later met de hand te vervolmaken. Het zelf aanpassen en ontwerpen van rapporten 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 tabelvorm. 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 worden gebaseerd. Klik op de knop OK; het rapport wordt gegenereerd en op het scherm getoond.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
125
Figuur 5.50
Figuur 5.51
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 voorbeeld 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.)
Copyright 2007 Academic Service
126
Databaseontwikkeling 4 Access 2003
Figuur 5.51
Voordat we het genereren van het rapport volledig afsluiten, zal Access nog vragen of we het rapport willen opslaan en onder welke 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 gebaseerd 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.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
127
Figuur 5.53
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 . Figuur 5.54
Geef in het scherm dat verschijnt op (zie figuur 5.55) of de gegevens 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 indeling 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.
Copyright 2007 Academic Service
128
Databaseontwikkeling 4 Access 2003
Figuur 5.55
Figuur 5.56
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 rapport op te geven. We hebben de keuze uit zes verschillende mogelijkheden.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
129
Figuur 5.57
Figuur 5.58
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.
Copyright 2007 Academic Service
130
Databaseontwikkeling 4 Access 2003
Figuur 5.59
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. Figuur 5.60
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 rapport genereren en het vervolgens tonen in het zojuist gekozen scherm (afdrukvoorbeeld of ontwerpscherm).
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
131
In hoofdstuk 7 wordt uitgebreid ingegaan op het ontwerpen en verfijnen van rapporten. 5.10.3
Etiket ontwerpen
Een etiket is feitelijk niets anders dan een speciaal opgemaakt rapport, afgedrukt op een afwijkend papierformaat. Een etiket ontwerpen 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. 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 etiketten 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 productnummer (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 (laserprinter, 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 puntgrootte, zwarting, tekengewicht en tekenkleur. Geef eventueel ook op of de gegevens cursief en/of onderstreept afgedrukt moet worden.
Copyright 2007 Academic Service
132
Databaseontwikkeling 4 Access 2003
Figuur 5.62
Figuur 5.63
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 linkergedeelte 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
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
133
Figuur 5.64
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. Figuur 5.65
Klik op de knop Volgende, zie figuur 5.66. We kunnen het etiketontwerp 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.
Copyright 2007 Academic Service
134
Databaseontwikkeling 4 Access 2003
Figuur 5.66
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 afdrukvoorbeeld 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 toepassingsmogelijkheden van rapporten vergroten, dan is het verstandig deze te baseren op flexibele query’s. Doordat de gebruiker hier zelf (flexibel) kan opgeven welke selectiecriteria gelden, kan het rapport aan waarde winnen. Met één rapport kan dan zowel een overzicht worden verkregen van de reizen binnen als buiten Europa, of etiketten voor de klanten die met een nader te bepalen reis meegaan. We komen hier later op terug.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
135 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 bestemming, het land en per geplande reis naar deze bestemming de datum van vertrek en de namen en woonplaatsen van de klanten die voor de betreffende reis hebben geboekt. De klanten die op dezelfde reis hebben geboekt moeten op volgorde van naam worden getoond. Zie het voorbeeld in figuur 5.67. d. Bij onderdeel a. van opdracht 5.8 hebben we een query opgesteld voor het afdrukken van de gegevens van de klanten uit een nader op te geven woonplaats. Gebruik deze query om etiketten te verzorgen. Kies een standaardformaat en laat de gebruikelijke gegevens op het etiket tonen.
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 formulieren. Bij het werken met een formulier bepalen we zelf hoe de lay-out van de gegevens op het scherm moet zijn. Bovendien hebben we nu de mogelijkheid om steeds slechts één record tegelijkertijd op het scherm te laten tonen. We kunnen bij het ontwerpen van formulieren weer hulp krijgen van Access. 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.
Copyright 2007 Academic Service
136
Databaseontwikkeling 4 Access 2003
Figuur 5.67
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 autoformulier moet worden opgezet: in kolomvorm, tabelvorm of in de vorm van een gegevensblad. Figuur 5.68
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
Copyright 2007 Academic Service
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 gegevensblad) ook op welke tabel of (uitvoer van de) query benaderd moet worden. Klik op de knop OK. Het formulier wordt ontworpen en we kunnen 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 geboden 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 tabellen 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 werken 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).
Copyright 2007 Academic Service
138
Databaseontwikkeling 4 Access 2003
Figuur 5.69
Figuur 5.70
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 achtergrond het formulier geplaatst moet worden. We hebben de keuze uit tien mogelijkheden. Na het maken van de keuze klikken we weer op Volgende.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
139
Figuur 5.71
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 stellen. Op het laatste komen we later uitgebreid terug. Klik ten slotte op de knop Voltooien. Figuur 5.72
In hoofdstuk 6 wordt uitgebreid ingegaan op het ontwerpen en verfijnen van formulieren.
Copyright 2007 Academic Service
140
Databaseontwikkeling 4 Access 2003
5.11.3
Een formulier gebruiken
Een formulier dat we eerder hebben ontworpen, kunnen we activeren 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 formulierscherm 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 tabelvorm voor het invoeren van reizen en boekingen en kies voor het invoeren van klanten voor de vorm Uitgevuld. Sla de formulieren op onder respectievelijk de naam Reis, Boeking en Klant.
5.12
Webpagina’s
Access biedt de mogelijkheid om Data Access-pagina’s te ontwerpen en te koppelen aan bestaande databases. Met een Data Accesspagina 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 hoger) en een gebruiksrecht voor Microsoft Office 2000 (of hoger). Een Data Access-pagina kan gebruikt worden voor het doorvoeren 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
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
141
alleen maar gebruikt worden om bestaande gegevens te raadplegen. De gegevens worden daarbij over het algemeen gegroepeerd aangeboden, bijvoorbeeld per reis alle namen van de deelnemers 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 willen 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 opgeslagen. 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 vastgelegd 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 opgeslagen 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 wijziging moeten worden doorgevoerd. Het is daarom verstandig om de
Copyright 2007 Academic Service
142
Databaseontwikkeling 4 Access 2003
pagina niet echt te verspreiden over de potentiële gebruikers, maar om deze via het (inter)net aan te bieden. Mochten we noodgedwongen de database moeten verplaatsen, omdat we bijvoorbeeld van provider veranderen, dan hoeven we deze wijziging slechts éénmaal door te voeren in de door ons via internet aangeboden 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 grasduinen 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.
Copyright 2007 Academic Service
5 Eenvoudige bewerkingen in Access
143 143
Herhalingsopdrachten 5.12 Creëren database en bestand a. Ontwerp de database Telefoon. Neem hierin de tabel Telefoon op met daarin de velden: telefoonnummer, naam, adres, postcode en plaats. Zorg ervoor dat het telefoonnummer sleutelveld wordt. Neem voor naam, adres en plaats een lengte van 25 tekens; voor de postcode 7 tekens. Het telefoonnummer moet 10 cijfers kunnen bevatten. b. Voer een aantal personen in. c. Sluit de database weer af. 5.13 Manipuleren/tonen gegevens a. Selecteer de database Reisbureau. Activeer de tabel Klant. b. Gebruik een 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 telefoonnummers. f. Geef het overzicht ook op papier. 5.13 Meerdere tabellen a. 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 zonder stapsgewijs wijzigen en verwijderen wordt. 5.14 Query’s a. Selecteer de database Reisbureau. b. Geef de namen van de personen die geboekt hebben voor een bestemming in Frankrijk.
Copyright 2007 Academic Service
144 144
Databaseontwikkeling 4 Access 2003
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 wijziging 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 / formulier a. Selecteer de database Reisbureau. b. Ontwerp een autorapport met de gegevens van de klanten c. Ontwerp een rapport (gebruik een Wizard) om een overzicht te krijgen met daarin per klant de gemaakte reizen. Laat naast de NAW-gegevens de vertrekdatum en de plaats van bestemming afdrukken. d. Laat voor alle klanten die ooit een reis naar Frankrijk geboekt hebben een etiket afdrukken. Maak daartoe eerst de query die een tabel oplevert met de gegevens van de betreffende klanten en ontwerp hierbij vervolgens een etiket. e. Maak een rapport met daarin per plaats van bestemming het totale aantal personen dat met een reis naar die plaats is meegegaan. f. Ontwerp een formulier om gegevens toe te voegen aan de tabel Klant uit de database Reisbureau. 5.17 Rapport a. Selecteer de database Reisbureau. b. Ontwerp een rapport om per bestemming een overzicht te krijgen van alle reizen. Laat alle relevante gegevens tonen. c. Ontwerp een rapport om per klant een overzicht te krijgen van alle gemaakt boekingen. Toon alle relevante gegevens.
Copyright 2007 Academic Service
6
Uitgebreide formulieren
Bij de bovenstaande opsomming gaan wij ervan uit dat de leerlingen een case uitwerken waarbij de docent/begeleider de rol van opdrachtgever/gebruiker speelt. In dit hoofdstuk gaan we de mogelijkheden van een formulier verder toelichten. Zo wordt het plaatsen van keuzerondjes, selectievakjes en groepsvakken besproken. De keuzelijsten worden verder toegelicht. Ook het opnemen van afbeeldingen in het formulier wordt behandeld. Ten slotte worden subformulieren, tabbladen, opdrachtknoppen en draaitabellen besproken.
6.1
Keuzemogelijkheden
In veel databases komt het gegevenstype Ja/nee – een logisch veld genoemd – veelvuldig voor. Denk aan zaken als: gehuwd?, in bezit van rijbewijs?, zwembad aanwezig?, bevorderd?, bezit mobiele telefoon? Wanneer met de Wizard een formulier is ontworpen, zal het logische veld automatisch een selectievakje zijn. Dat is een vakje waarin we met de muis kunnen klikken om het vakje al of niet ‘af te vinken’. Naast het selectievakje kunnen we voor zo’n veld ook een keuzerondje of wisselknop gebruiken. Om het een en ander toe te lichten gaan we in de tabel Boeking een logisch veld toevoegen. Het moet mogelijk worden om bij een boeking op te geven of men een annuleringsverzekering wenst:
Copyright 2007 Academic Service
146
Databaseontwikkeling 4 Access 2003
Open om de wijziging in de structuur van de tabel aan te brengen 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 Annuleringsverzekering. 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 Boeking ontwerpen: 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. Figuur 6.1
We zien dat bij het besturingselement Annuleringsverzekering een selectievakje staat. We zien ook dat de lay-out niet optimaal is: de tekst Annuleringsverzekering is niet helemaal leesbaar. 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
Copyright 2007 Academic Service
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. Figuur 6.2
Naast de informatie of de klant bij een boeking een annuleringsverzekering 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.
Copyright 2007 Academic Service
148
Databaseontwikkeling 4 Access 2003
Sed gaat van start. Er wordt gevraagd om de namen (labelnamen) van onze opties; zie figuur 6.3. Figuur 6.3
Kies als eerste label Contant. Druk op de Tab-toets en voer vervolgens Pinnen en Acceptgiro in. Ga naar het volgende scherm via de knop Volgende. Het scherm dat verschijnt (zie 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. Figuur 6.4
Selecteer bij Veldlengte, Byte. Bij die veldlengte kunnen de getallen 0-255 worden opgeslagen; ruim voldoende voor onze getallen.
Copyright 2007 Academic Service
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 werkbalk. Activeer eventueel in de werkset de knop Wizards voor besturingselementen. Hierdoor krijgen we hulp bij het maken van een groepsvak. 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 opgeslagen. 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.
Figuur 6.5
In het scherm dat verschijnt (figuur 6.6) wordt gevraagd of we de geselecteerde waarde willen gebruiken voor later gebruik of willen opslaan in de database. Wij willen het geselecteerde opslaan
Copyright 2007 Academic Service
150
Databaseontwikkeling 4 Access 2003
in het veld Betaalwijze uit de tabel Boeking. Klik op het keuzerondje Opslaan in dit veld en selecteer uit de keuzelijst het veld Betaalwijze. Klik weer op de knop Volgende. Figuur 6.6
In het volgende scherm van de Wizard hebben we de keuze uit verschillende opmaakmogelijkheden van het groepsvak; zie figuur 6.7. We kunnen kiezen uit Selectievakjes, Keuzerondjes of Wisselknoppen. Nadat we een keuze hebben gemaakt, wordt direct een voorbeeld getoond. Verder kunnen we opgeven hoe het kader getoond moet worden. We hebben de keuze uit Omkaderd, Normaal, Verhoogd, 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. Figuur 6.7
In het laatste scherm van de Wizard gaan we weer door de finishvlag. Hier kunnen we het groepsvak nog van een bijschrift voorzien. Kies als bijschrift Betaalwijze en klik op de knop Voltooien.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
151
Bekijk vervolgens het nieuwe formulier in de formulierweergave. Merk op dat de vinkjes bij bestaande records nog niet aanwezig zijn. Toen die records werden ingevoerd, bestond het veld Betaalwijze nog niet. Aangezien die standaard de waarde 0 hebben en dus niet 1, 2 of 3 wordt het vinkje niet getoond. We kunnen ze nu wel van een vinkje voorzien. Bij nieuwe records wordt de opgegeven standaardwaarde, 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 aanpassen. Overigens is een groepsvak niet bedoeld om later vaak gewijzigd te worden. Als gegevens wel kunnen veranderen, is het verstandiger om een keuzelijst te maken, zie onder andere paragraaf 6.3, Keuzelijsten. Opgave 6.1 a. Open het formulier Boeking voorbeeld in de formulierweergave. Vul bij iedere boeking in of een annuleringsverzekering gewenst is en de gewenste betaalwijze. b. Wijzig in het formulier Boeking voorbeeld het veld Annuleringsverzekering zodanig dat het getoond wordt als wisselknop. c. Het groepsvak Betaalwijze dient in hetzelfde formulier weergegeven te worden als een verzameling keuzerondjes.
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 kunnen 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 worden opgeslagen, maar ook videofragmenten, Excel-grafieken of
Copyright 2007 Academic Service
152
Databaseontwikkeling 4 Access 2003
-werkbladen, geluidsfragmenten, tekeningen die gemaakt zijn met bijvoorbeeld Paint en nog veel meer. Een OLE-object kan weergegeven worden in een afhankelijk kader of in een niet-afhankelijk kader. We spreken over een afhankelijk en niet-afhankelijk objectkader. In een afhankelijk objectkader worden 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 formulier 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 Kenteken Bouwjaar Foto Status
Gegevenstype Tekst Numeriek OLE-object Tekst
Veldlengte 8 Integer 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 Foto gaan 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 database 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 Invoegen, 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.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
153
Figuur 6.8
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. 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.
Copyright 2007 Academic Service
154
Databaseontwikkeling 4 Access 2003
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 grafiek 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 database. 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, aangezien 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 geplaatst bepaalde afmetingen heeft. Die afmetingen kunnen we vanzelfsprekend 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 aangepast 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 terwijl de beeldverhoudingen intact blijven. De onderkant of rechterkant van het kader kan dan niet gevuld zijn.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
155
Selecteer de opties door in de ontwerpweergave het objectkader 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 afmetingen 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 autohandelaar 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.
Copyright 2007 Academic Service
156
Databaseontwikkeling 4 Access 2003
Om het logo goed in het kader te krijgen dienen we de eigenschappen 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 klembord 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 T te klikken, waardoor een lijst met mo-
Copyright 2007 Academic Service
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 of de waarden zullen worden getypt. Met de eerste optie kunnen we bijvoorbeeld een artiestnummer opzoeken bij het toevoegen van een nieuwe cd in een cd-database, of het artikelnummer opzoeken van een snowboard in een sportzaak. In voorgaande hoofdstukken hebben we van deze mogelijkheid gebruikgemaakt in de Reisbureau-database. Bij de tabel Boeking hebben we toen een keuzelijst met invoervak gemaakt voor het invoeren van een klantnummer. Verderop in deze paragraaf komen we hierop terug. We gebruiken de eerste optie als de waarden uit de keuzelijst kunnen veranderen. Dit geldt bijvoorbeeld voor klant- en artikelgegevens: er kunnen immers klanten of artikelen zijn toegevoegd of verwijderd. Met de tweede optie dienen we de waarden uit de keuzelijst te typen. 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 volgende.
Copyright 2007 Academic Service
158
Databaseontwikkeling 4 Access 2003
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. Figuur 6.10
We hebben maar één kolom met drie items, voer dus bij Aantal kolommen het getal 1 in (standaardwaarde) en klik onder Kol1 om de waarden van de items te typen. Druk na het intoetsen van een waarde steeds op de Tab-toets. Het is tevens mogelijk om de kolombreedte aan te passen. In dit voorbeeld hebben we de breedte iets kleiner gemaakt. Het verkleinen of vergroten kan door met de muis op de rechterrand van de cel Kol1 te staan en daarna naar links of rechts te slepen. We hadden in dit voorbeeld ook kunnen kiezen voor een iets efficië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 voltooi de Wizard. Klik vervolgens op het tabblad Opzoeken; dit bevat onze keuzemogelijkheden bij Rijbron.
Copyright 2007 Academic Service
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 eigenschap zichtbaar. Door hierop te klikken kunt u de gewijzigde eigenschap van het veld Status automatisch doorvoeren in formulieren en rapporten. Er verschijnt dan een extra venster met alle formulieren en rapporten die u kunt bewerken waarop het veld Status voorkomt. Wanneer u dat nu zou uitvoeren krijgt u de mededeling dat geen objecten bijgewerkt te hoeven worden. Omdat in de formulieren die we hebben het veld Status nog als Tekstveld is gedefinieerd en niet als Keuzelijst. Een tekstveld heeft geen opzoekeigenschappen. Sla de nieuwe structuur op en sluit af. Als we nu query’s of formulieren maken, zal het statusveld automatisch een keuzelijst met invoervak zijn. We gaan een nieuw formulier ontwerpen, waarop Status als keuzelijst 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 formulierweergave openen, zien we bij het veld Status geen keuzelijst met invoervak. In de formulieren die al gemaakt zijn, is de keuzelijst voor het veld Status niet bekend. Als we daar een keuzelijst van willen maken, moeten we het formulier aanpassen.
Copyright 2007 Academic Service
160
Databaseontwikkeling 4 Access 2003
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 keuzelijst. 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 (referentië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 uitwerken door gebruik te maken van de Wizard. (Waar zouden we zijn zonder die Wizard?) In de tabel Reis is het veld Bestemmingcode een vreemde sleutel. Het veld is immers niet de sleutel, maar wijst naar de sleutel in de tabel Bestemming. De waarden van het veld Bestemmingcode, in de tabel Reis, mogen alleen die waarden aannemen die in de tabel Bestemming liggen opgeslagen. We hebben dit afgedwongen bij het leggen van de relaties. We hebben toen aangegeven: referentiële integriteit afdwingen. Als dus in de tabel Reis een bestemmingcode wordt ingevoerd die niet in de tabel Bestemming staat, krijgen we een boodschap dat die waarde niet wordt geaccepteerd. Via de keuzelijst kunnen we dan de correcte waarde invoeren.
Copyright 2007 Academic Service
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 tabellen. Aangezien wij de relatie al gelegd hebben, moeten we die eerst in het relatievenster verbreken. Vervolgens moeten we de wizard toepassen en ten slotte de 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 worden 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
Copyright 2007 Academic Service
162
Databaseontwikkeling 4 Access 2003
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 klantnaam wel. Een lijst op volgorde van bestemmingcode is minder handig dan een lijst op volgorde van plaats. Selecteer Land en vervolgend Plaats en laat deze beide oplopend sorteren (standaard waarde). Er wordt nu gesorteerd op land en daarbinnen op plaats. Figuur 6.12
In het venster dat verschijnt, wordt de opmaak van de keuzelijst getoond; zie figuur 6.13. We kunnen eventueel de kolommen verkleinen of vergroten. Tevens staat Sleutelkolom verbergen (aanbevolen) afgevinkt. Hierdoor wordt het in te voeren sleutelveld verborgen. Negeer die aanbeveling, maak de sleutelkolom wel zichtbaar. Figuur 6.13
Copyright 2007 Academic Service
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. Figuur 6.14
Ga vervolgens door de finish door de labelnaam Bestemmingcode te 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 veranderen. Bijvoorbeeld de sorteervolgorde. Klik daartoe op de eigenschap 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!
Copyright 2007 Academic Service
164
Databaseontwikkeling 4 Access 2003
Figuur 6.15
Opgave 6.3 a. Maak in de tabel Auto uit de database Oefening een nieuw veld Kleur (Tekst). Zorg dat het veld als keuzelijst met invoervak wordt getoond. De toegestane kleuren moeten getypt worden. Kies zelf enkele kleuren. Andere kleuren worden bij het selecteren niet toegestaan. Controleer de werking door in het formulier 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.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
6.4
165
Hoofd- en subformulieren
Bij het ontwerpen van een formulier hebben we tot nu toe gebruikgemaakt 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 plaatsen. Hierbij maken we gebruik van onze database Reisbureau. Alvorens het formulier te ontwerpen moeten we eerst weten welke gegevens op het beeldscherm getoond moeten worden, zie figuur 6.16. Figuur 6.16 Tabel Boeking
Klant
Reis Bestemming
Veld Boekingsnummer Klantnummer Reisnummer Boekdatum Aantal Volwassenen Aantal Kinderen Naam Adres Postcode Woonplaats Vertrekdatum Prijs per persoon Plaats Land
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
Copyright 2007 Academic Service
166
Databaseontwikkeling 4 Access 2003
Figuur 6.17
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 Reis of volgens Bestemming. Figuur 6.18
Copyright 2007 Academic Service
6 Uitgebreide formulieren
167
Access zal zelf – als dat nodig mocht zijn – de gegevens op de juiste wijze groeperen. Bij volgens Boeking wordt gekeken vanuit de tabel Boeking. Een boeking is gekoppeld aan één klant en aan één reis. Een reis is weer gekoppeld aan één bestemming. Dit is ook in het gegevensmodel (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 bestemming. 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), achtergrond (Standaard) en naam (Boeking gegevens). In figuur 6.19 wordt het resultaat getoond. Figuur 6.19
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 venster getoond. Uiteraard kunnen we de gegevens naar onze hand zetten door ze te verplaatsen, te vergroten, te verkleinen, enzovoort. Om te voorkomen dat de basisgegevens per ongeluk gemuteerd worden en om sneller de noodzakelijke gegevens te kunnen invoeren, gaan we van enkele besturingselementen de eigenschappen
Copyright 2007 Academic Service
168
Databaseontwikkeling 4 Access 2003
veranderen. We willen dat de gegevens Naam, Adres, Postcode en Plaats uit de tabel Klant niet gewijzigd kunnen worden. Ze worden alleen nog maar getoond. Hetzelfde geldt voor Vertrekdatum en Prijs per persoon uit de tabel Reis, en Plaats en Land uit de tabel Bestemming. Hiertoe dienen we de eigenschappen van die besturingselementen te veranderen. Plaats het formulier in de ontwerpweergave en selecteer het besturingselement 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 besturingselement worden getoond; zie figuur 6.20. Selecteer het tabblad Gegevens. Figuur 6.20
We gaan de eigenschappen Ingeschakeld en Vergrendeld gebruiken: Ingeschakeld: Ja of Nee. Als deze eigenschap op Ja staat, kan dit besturingselement de focus krijgen. Het besturingselement is dan via de muis of de Tab-toets te selecteren. Als we Ingeschakeld op Nee zetten, is het besturingselement niet te selecteren en bovendien wordt het lichter gekleurd. Vergrendeld: Ja of Nee. De besturingstoets functioneert normaal, kan de focus krijgen. Echter het bewerken, toevoegen of verwijderen van gegevens kan niet (Ja) of wel (Nee).
Copyright 2007 Academic Service
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 resultaat in de formulierweergave. Voor de overige besturingselementen zouden we hetzelfde moeten doen. We kunnen echter in één keer alle gewenste besturingselementen 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-toets ingedrukt. 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. Figuur 6.21
Kies het tabblad Gegevens en zet de eigenschap Ingeschakeld op Nee. Controleer de werking in de formulierweergave.
Copyright 2007 Academic Service
170
Databaseontwikkeling 4 Access 2003
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 ontwerpweergave op het scherm. Maak tevens het eigenschappenvenster actief, via de knop Eigenschappen op de werkbalk of via het snelmenu (rechtermuisklik). 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 eigenschappen getoond. Figuur 6.22
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 toestaan. Hiermee kunnen mutaties, verwijderingen of toevoegingen wel of niet worden toegestaan.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
171
Figuur 6.23
In het zojuist behandelde voorbeeld hebben we de gegevens getoond gezien vanuit de tabel Boeking. Als we dezelfde gegevens willen zien vanaf de tabel Klant, krijgen we een geheel ander overzicht. Een klant kan immers meerdere boekingen hebben, zoals blijkt uit het gegevensmodel. We gaan dit als voorbeeld uitwerken. 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.24
Copyright 2007 Academic Service
172
Databaseontwikkeling 4 Access 2003
Aangezien een klant meerdere boekingen kan hebben, worden nu twee formulieren aangemaakt: een hoofdformulier met daarop de klantgegevens en een subformulier met daarop de boekingsgegevens. De optie Gekoppelde formulieren laten we vooralsnog buiten beschouwing. Het subformulier wordt zodanig getoond dat meerdere boekingen (records) getoond kunnen worden. Geef in het volgende scherm aan hoe het subformulier weergegeven moet worden: Als gegevensblad of In tabelvorm. Kies voor Als gegevensblad. Ga naar het volgende scherm en kies voor Standaard. In het laatste scherm, zie figuur 6.25, wordt gevraagd om de formulieren een titel (naam) te geven. Het hoofdformulier en subformulier zijn als twee aparte formulieren gemaakt, die door de onderlinge relatie (op basis van het veld Klantnummer) aan elkaar zijn gekoppeld. Geef het hoofdformulier de titel (naam) Klant boekingen en het subformulier de titel (naam) Subklant boekingen. Bekijk het resultaat. Figuur 6.25
Als we door de klanten navigeren, zien we de boekingen van die klanten in het subformulier. Het subformulier heeft ook navigatieknoppen, die we kunnen gebruiken als het aantal boekingen groter wordt dan in het venster kan worden afgebeeld. Het kader waarin het subformulier, de boekingen, wordt getoond is krap bemeten. Dat is eenvoudig te verbeteren door het hoofdformulier
Copyright 2007 Academic Service
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 subformulier niet in de ontwerpweergave wordt getoond, sluit dan het venster en open het hoofdformulier opnieuw in de ontwerpweergave. Selecteer het bijschrift Aantal volwassenen (niet het veld Aantal volwassenen). Maak, via de knop Eigenschappen in de werkbalk, het eigenschappenvenster 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
Copyright 2007 Academic Service
174
Databaseontwikkeling 4 Access 2003
Sluit vervolgens het venster en bevestig de vraag of de wijzigingen bewaard moeten worden. Open vervolgens het hoofdformulier Klant boekingen in de formulierweergave 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 rechtermuisknop 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 boekingen. 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 gemaakt het onmogelijk wordt om te wijzigen en te verwijderen. Toevoegen moet wel mogelijk blijven. d. Wijzig hoofdformulier Klant boekingen en subformulier Subklant boekingen zodanig dat alle gegevens op een scherm passen en dat de kopteksten in het subformulier toch duidelijk zijn.
6.5
Tabbladen
Binnen het programma Access (en vele andere toepassingsprogramma’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 mogelijk om zelf tabbladen te maken op formulieren. We maken daarbij gebruik van het tabbesturingselement. We gaan het volgende voorbeeld uitwerken in onze database Reisbureau.
Copyright 2007 Academic Service
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 formulier 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, bijvoorbeeld 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.
Copyright 2007 Academic Service
176
Databaseontwikkeling 4 Access 2003
Figuur 6.27
Klik op de tab Vorige boekingen. Kies uit de werkset de knop Subformulier/subrapport. In het werkgebied verandert de muisaanwijzer. Geef door te klikken en te slepen de plaats en de grootte van het subformulier op de tab Vorige boekingen aan. De Wizard wordt actief en vraagt of op het subformulier een bestaand formulier moet worden getoond of dat we op basis van de tabellen/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 verschillende tabellen onze gewenste gegevens kiezen. Kies uit de tabel Boeking het veld Boekdatum, uit de tabel Reis de velden Vertrekdatum en Aantal dagen en tenslotte uit de tabel Bestemming de velden Plaats en Land. Ga na de veldselecties naar het volgende scherm van de Wizard. Hierin wordt gevraagd hoe het hoofdformulier, onze klantgegevens, gekoppeld moet worden aan ons subformulier, de boekingsgegevens. Daarbij hebben we twee mogelijkheden. De Wizard geeft een lijst met mogelijke koppelingen waaruit we een koppeling kunnen selecteren of we bepalen de koppeling zelf, zie figuur 6.28. Bij zelf bepalen kunnen we opgeven welk veld van het hoofdformulier gekoppeld moet worden aan het veld uit het subformulier. Die
Copyright 2007 Academic Service
6 Uitgebreide formulieren
177
mogelijkheid kunnen we gebruiken als een uitzonderlijke koppeling gewenst is die niet door de Wizard wordt geselecteerd. Figuur 6.28
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 formulierweergave. 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 ontstaat (zie figuur 6.29). Figuur 6.29
Copyright 2007 Academic Service
178
Databaseontwikkeling 4 Access 2003
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 klantgegevens en de aanbodgegevens, immers bij iedere klant worden dezelfde aanbodgegevens getoond. Aangezien er geen koppeling is, kunnen we direct naar het volgende scherm gaan. Geef dit subformulier de titel (naam) Reisaanbod. Controleer het formulier in de formulierweergave. 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 ontstaat (zie figuur 6.30). Figuur 6.30
Copyright 2007 Academic Service
6 Uitgebreide formulieren
179
Sluit het hoofdformulier en geef dit de titel (naam) Klant met tabbladen. Toevoegen/verwijderen tabblad Zoals we gezien hebben, geeft het tabbesturingselement standaard twee tabbladen. In ons voorbeeld is dit precies voldoende, maar wat als we meer tabbladen nodig hebben? Op eenvoudige wijze kunnen we het aantal tabbladen vergroten. 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 wijzigen Selecteer 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 Paginaindex wijzigen. Het eerste tabblad heeft indexwaarde 0, het tweede heeft indexwaarde 1, enzovoort. Opgave 6.5 a. Verander de volgorde van de tabbladen en hernoem het tabblad Aanbod in Volledig aanbod. b. De gegevens in de subformulieren mogen niet gewijzigd worden. Verander de eigenschappen zodanig dat dit niet kan gebeuren c. Bij de subformulieren zijn begeleidende teksten afgedrukt, Boekingen van klant en Reisaanbod. Verwijder die teksten.
Copyright 2007 Academic Service
180
Databaseontwikkeling 4 Access 2003
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 moeten 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 besturingselementen’ 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 gekozen kan worden, van Recordnavigatie tot en met Overige. Per categorie zijn verschillende acties mogelijk.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
181
Figuur 6.31
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. Figuur 6.32
Kiezen we voor Tekst, dan kunnen we in het vakje tekst invoeren of de standaardtekst accepteren. Kiezen we Afbeelding, dan worden standaard één of meer afbeeldingen (pictogrammen) getoond die bij die actie horen. Willen we echter alle mogelijke pictogrammen zien, zet dan een vinkje bij Alle afbeeldingen weergeven. Hebben we zelf pictogrammen gemaakt, dan klikken we op de knop Bladeren... om naar de map te gaan waaruit we een afbeelding willen selecteren.
Copyright 2007 Academic Service
182
Databaseontwikkeling 4 Access 2003
Kies voor Afbeelding, Ongedaan maken. Het bekende pictogrammetje 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 plaatje – maar een naam die aan de knop wordt toegekend, zodat later naar die opdrachtknop verwezen kan worden. Kies voor Klant ongedaan maken. Merk op dat de opdrachtknop standaardafmetingen krijgt, pas deze desgewenst aan. Bekijk het resultaat in de formulierweergave. Wijzig enkele gegevens van een klant en klik vervolgens op de zojuist gemaakte opdrachtknop. Deze opdrachtknop heeft standaard een tabstop. Als we met de Enter-toets door het formulier lopen, komen we automatisch op de opdrachtknop terecht. Het zojuist ingevoerde wordt dan (per ongeluk) direct weer gewist! Om vergissingen te voorkomen krijgt de opdrachtknop geen tabstop. 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 formulierweergave. Sla het formulier op onder de titel (naam) Klant met opdrachtknoppen. We gaan een nieuwe opdrachtknop maken die een bestaand rapport 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.
Copyright 2007 Academic Service
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 opdrachtknop op het formulier. Selecteer de categorie Formulierbewerkingen en kies uit de acties Formulier openen. Kies uit de gemaakte formulieren Boeking gegevens. We krijgen nu de mogelijkheid om specifieke gegevens van het nieuwe formulier te tonen of aan te geven dat alle gegevens op het nieuwe formulier getoond moeten worden, zie figuur 6.33. 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 moeten worden; zie figuur 6.34. Kies uit Klant met opdrachtknoppen het veld Klantnummer en uit Boeking gegevens eveneens Klantnummer. Klik vervolgens op de knop <-->, waardoor de koppeling plaatsvindt.
Copyright 2007 Academic Service
184
Databaseontwikkeling 4 Access 2003
Figuur 6.34
Zet Boekingen als tekst op de opdrachtnop. Ook de naam van de opdrachtknop wordt Boekingen. Bekijk en onderzoek het resultaat van het formulier in de formulierweergave. Wanneer we met de muis op de knop Ongedaan maken gaan staan, komt automatisch de melding ‘record ongedaan maken’ tevoorschijn. Bij de opdrachtknoppen met tekst wordt die melding niet getoond. We kunnen die eenvoudig aanbrengen door, in de ontwerpweergave, de eigenschappen van de opdrachtknop te wijzigen: in het tabblad Overige bij de eigenschap Knopinfo. Opgave 6.6 a. Maak op het formulier Klant met opdrachtknoppen nog een opdrachtknop. Deze moet ervoor zorgen dat het formulier wordt gesloten. Kies voor de afbeelding 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 klantenlijst en Boekingen van de klant.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
6.7
185
Draaitabellen/Draaigrafieken
Een draaitabel, ook wel ‘kruistabel’ genoemd, is een speciaal soort tabel waarin een samenvatting wordt getoond van de opgegeven velden uit de database. Als we een query hebben gemaakt waarin op meerdere velden gegroepeerd kan worden, kan die informatie overzichtelijker worden weergegeven in een draaitabel. Het overzicht wordt in rijen en kolommen getoond, zoals in een werkblad van 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-,
Copyright 2007 Academic Service
186
Databaseontwikkeling 4 Access 2003
Figuur 6.35
Figuur 6.36
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.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
187
Figuur 6.37
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 Totaal naar het detailgebied. De kolommen en rijen zijn nu bepaald. De gegevens die we op de kruispunten van de rijen en kolommen willen zien – in een spreadsheet cellen genaamd – zijn in het detailgebied geplaatst. We laten het filtergebied nog even voor wat het is; we komen hier later op
Copyright 2007 Academic Service
188
Databaseontwikkeling 4 Access 2003
terug. Het aantal volwassenen, kinderen en totaal aantal personen per plaats per week wordt getoond, zie figuur 6.38. 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 (3) AutoBerekenen en selecteer Som of selecteer die in het snelmenu (rechtermuisknop). Er komt per plaats een extra rij bij met hierin het gesommeerde aantal volwassenen. Voer hetzelfde uit voor de velden Aantal kinderen en Totaal. We kunnen nu de detailgegevens verbergen, zodat alleen de totalen overblijven. Dit kan per plaats, door op 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.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
189
Figuur 6.39
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 verandert 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.
Copyright 2007 Academic Service
190
Databaseontwikkeling 4 Access 2003
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 weergeven. Sluit het eigenschappenvenster. Het eindresultaat wordt getoond, zie figuur 6.40. Sla het formulier op onder de naam Draaitabel voorbeeld. Figuur 6.40
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
Copyright 2007 Academic Service
6 Uitgebreide formulieren
191
probleem zit in het automatisch gemaakte formulier. In dit formulier kan de wizard automatisch enkele subformulieren hebben gemaakt. Maar in de veldenlijst van de draaitabel worden alleen velden uit het hoofdformulier getoond en niet de velden uit het subformulier. 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 verslepen om een andere lay-out te krijgen, bijvoorbeeld door de rijen en kolommen te wisselen. Ook kun je verschillende velden in het rijof kolomgebied plaatsen. Zo kun je bijvoorbeeld het veld Land verplaatsen van het 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 eigenschappen van de overige gebieden aanpassen. Je kunt bijvoorbeeld het bijschrift Plaats veranderen in Plaatsnaam. Ook de draaitabel zelf heeft eigenschappen die aangepast kunnen worden. Klik daartoe in een leeg gebied van de draaitabel. Zo kun je bijvoorbeeld de bijschriften van de gebieden veranderen. 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 verwijderen. Ook kun je ervoor zorgen – in het tabblad Rapport – dat lege rijen en kolommen toch getoond worden.
Copyright 2007 Academic Service
192
Databaseontwikkeling 4 Access 2003
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 passen query, en de draaitabel en lijst met velden worden direct getoond. Ook hier kan het probleem van het genoemde tweede punt optreden. Draaigrafieken Hiermee 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 tussen 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 beginnen 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 kunnen worden: categorie-, reeks-, gegevens- en filtergebied. Er kunnen verschillende grafiektypen gepresenteerd worden. Standaard wordt een kolomdiagram getoond. Sleep het veld Land naar het categoriegebied. Sleep het veld Boekingnummer naar het gegevensgebied.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
193
Figuur 6.41
Figuur 6.42
Direct wordt daar getoond Som van Boekingnummer. In het gegevensgebied wordt samengevatte informatie getoond. Standaard wordt op numerieke velden de functie Som toegepast en op tekstof datumvelden de functie Aantal. Aangezien Boekingnummer een numeriek veld is, wordt hiervan de som getoond. Wij moeten de boekingnummers tellen om het aantal boekingen per land te bepalen. De nummers moeten dus niet gesommeerd worden, maar geteld. Selecteer Som van Boekingnummer en kies uit de draaigrafiekwerkbalk Autoberekenen, Aantal of selecteer die optie via het snelmenu. Het voorlopige resultaat – het totaal aantal boekingen per land – wordt getoond in figuur 6.43, zonder veldenlijst.
Copyright 2007 Academic Service
194
Databaseontwikkeling 4 Access 2003
Figuur 6.43
Merk bovendien op dat niet alle gebieden noodzakelijk zijn. Indien het aantal boekingen per land gewenst is, is deze grafiek voldoende. 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.
Copyright 2007 Academic Service
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 eigenschappenvenster 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 bijschrift 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. Figuur 6.44
In het tweede voorbeeld van een draaigrafiek gaan we de eerder gemaakte draaitabel weergeven als draaigrafiek. Open in het overzicht Formulieren de draaitabel Draaitabel voorbeeld. 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 draaitabel getoond. Zorg ervoor dat de legenda zichtbaar wordt en verander de astitels in Plaatsen en Aantal personen, zie figuur 6.45.
Copyright 2007 Academic Service
196
Databaseontwikkeling 4 Access 2003
Figuur 6.45
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.46
Copyright 2007 Academic Service
6 Uitgebreide formulieren
197
De instellingen van de draaigrafiek worden automatisch opgeslagen 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 vervolgens 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 diverse gebieden aangepast kunnen worden, zoals toegelicht bij draaitabellen. 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
Copyright 2007 Academic Service
198 198
Databaseontwikkeling 4 Access 2003
Figuur 6.47
Figuur 6.48
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
Copyright 2007 Academic Service
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 gelegenheden 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. 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 gepresenteerd krijgen in volgorde van vertrekdatum.
Copyright 2007 Academic Service
200
Databaseontwikkeling 4 Access 2003
Figuur 6.50
Selecteer het veld Vertrekdatum, zie figuur 6.51. Geef in het laatste scherm van de wizard de pagina een naam: Boekingen per klant. Figuur 6.51
We kunnen in dit laatste scherm ook opgeven of we de pagina direct willen activeren of dat we eerst nog de opmaak willen wijzigen. 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.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
Figuur 6.52
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.53
Copyright 2007 Academic Service
201
202
Databaseontwikkeling 4 Access 2003
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 bestand moet worden opgeslagen. Bedenk dat de zojuist ontworpen pagina géén onderdeel is van de database, maar als een apart htmbestand 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 pictogram 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 veranderen. 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 paginaverbinding te 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.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
203
Figuur 6.54
Figuur 6.55
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 hebben, maar ook de NAW-gegevens. Plaats daartoe de pagina in ontwerpweergave, 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.
Copyright 2007 Academic Service
204
Databaseontwikkeling 4 Access 2003
Figuur 6.56
Klik éénmaal op de balk van de sectie Koptekst: BestemmingKlantnummer. 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 eigenschappenvenster 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.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
205
Figuur 6.57
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 weggelaten. 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 sectie 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!
Copyright 2007 Academic Service
206
Databaseontwikkeling 4 Access 2003
Figuur 6.58
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 |0 van |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 eigenschap dat we bij iedere klant opnieuw de gegevens moeten openklappen om ook de reisgegevens te zien. Bovendien zien we slechts één reis tegelijkertijd. Wat we eigenlijk zouden willen, is dat standaard 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 teksten 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.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
Figuur 6.59
Figuur 6.60
Copyright 2007 Academic Service
207
208
Databaseontwikkeling 4 Access 2003
Klik met rechtermuisknop op de sectie Koptekst: Bestemmingklantnummer 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. Figuur 6.61
Hierna bekijken we het resultaat en zien een overzicht dat aanzienlijk 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 worden 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.
Copyright 2007 Academic Service
6 Uitgebreide formulieren
209
Figuur 6.62
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. Figuur 6.63
Nog een opmerking over Webpagina’s: ga niet met Access zwoegen om een webpagina te maken, tenzij gegevens uit een database
Copyright 2007 Academic Service
210
Databaseontwikkeling 4 Access 2003
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
Copyright 2007 Academic Service
7
Uitgebreide rapporten
Bij de bovenstaande opsomming gaan wij ervan uit dat de leerlingen een case uitwerken waarbij de docent/begeleider de rol van opdrachtgever/gebruiker speelt. Een rapport kunnen we geheel vanaf het begin met de hand ontwerpen. Verstandiger is het echter om met de Wizard een eerste opzet te laten genereren en het gegenereerde rapport met de hand verder aan te passen en te detailleren. In dit hoofdstuk werken we hiervan een aantal voorbeelden uit. In de voorbeelden zijn de overzichten afgedrukt op een HP Laserjet 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 bestemminglijst 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 afgebeeld, dus eerst Werelddeel, dan Land, Plaats en vervolgens Bestemmingcode. In het volgende scherm wordt gevraagd of er groepeerniveaus gewenst zijn. Dat is niet noodzakelijk, ga direct naar het volgende scherm.
Copyright 2007 Academic Service
212
Databaseontwikkeling 4 Access 2003
Figuur 7.1
Figuur 7.2
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
Copyright 2007 Academic Service
7 Uitgebreide rapporten
213
werelddeel, bij gelijk werelddeel op volgorde van land en bij gelijk land op volgorde van plaats. Figuur 7.3
Geef in het scherm dat hierna verschijnt op hoe het rapport opgemaakt moet worden. Kies voor de indeling In tabelvorm en Staand. Geef in het volgende scherm een stijl (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 werelddeel en voltooi het rapport. Er wordt direct een voorbeeld van het rapport 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 getoond. 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 ontwerpweergave, zie figuur 7.5. We kunnen een rapport ook vanuit het databasescherm in de ontwerpweergave plaatsen door het overzicht Rapporten te selecteren. Markeer het betreffende rapport en klik op de knop Ontwerpen.
Copyright 2007 Academic Service
214
Databaseontwikkeling 4 Access 2003
Figuur 7.4
Figuur 7.5
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.
Copyright 2007 Academic Service
7 Uitgebreide rapporten
215
Paginakoptekst – Deze gegevens worden boven aan iedere bladzijde 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. Figuur 7.6
Hiermee kunnen we de eigenschappen van een geselecteerd object aanpassen. We kunnen onder andere de opmaak – bijvoorbeeld het
Copyright 2007 Academic Service
216
Databaseontwikkeling 4 Access 2003
lettertype of de kleur van de tekst, kader of achtergrond – aanpassen. 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 duplicaten 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 onderscheiden. Een groep is een verzameling gegevens met een gemeenschappelijk 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 afgedrukt. 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 overzicht 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.
Copyright 2007 Academic Service
7 Uitgebreide rapporten
217
Figuur 7.7
Er wordt per woonplaats een groep klanten afgedrukt. Het gemeenschappelijke 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 vertrekdatum. Figuur 7.8
Copyright 2007 Academic Service
218
Databaseontwikkeling 4 Access 2003
We zien dat per vertrekdatum een groep reizigers wordt weergegeven. Het gemeenschappelijke kenmerk van die groep is dus de vertrekdatum. Voor elke vertrekdatum wordt een nieuwe groep gestart, 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 aantal 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 woonplaats We 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.
Copyright 2007 Academic Service
7 Uitgebreide rapporten
219
Figuur 7.9
Figuur 7.10
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 voltooi 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.
Copyright 2007 Academic Service
220
Databaseontwikkeling 4 Access 2003
Figuur 7.11
Selecteer in het menu Beeld, Ontwerpweergave of klik direct op de knop Beeld. Het rapport wordt in de ontwerpweergave getoond, zie figuur 7.12. 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.
Copyright 2007 Academic Service
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 venster met de eigenschappen, zie figuur 7.13. 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 Telefoonnr aan 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 afdrukvoorbeeld, 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 ontwerpweergave 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 verwijderen en ook moet de plaats vet afgedrukt worden.
Copyright 2007 Academic Service
222
Databaseontwikkeling 4 Access 2003
Selecteer in de sectie Koptekst (Woonplaats) het veld Woonplaats. Activeer het venster met de eigenschappen. Klik op het tabblad Opmaak en verander de eigenschap Randstijl in 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 zichtbaar. 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 trekken 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
Copyright 2007 Academic Service
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 afzonderlijke waarde moet worden gegroepeerd of op een andere manier, bijvoorbeeld op de eerste drie letters van het veld. Bij datumvelden 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 dezelfde pagina kan worden afgedrukt. De standaardwaarde is Nee, kopen voetteksten worden niet bij elkaar gehouden. Er wordt continu afgedrukt.
Copyright 2007 Academic Service
224
Databaseontwikkeling 4 Access 2003
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 hierdoor 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 worden toegevoegd. Kies uit de Werkset het Tekstvak en plaats deze in de voettekstsectie. Er wordt zowel een label als een tekstvak neergezet. 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 eigenschappenvenster het tabblad Gegevens. Voer bij de eigenschap Besturingselementbron de volgende formule in: =Aantal([Klantnummer]). Hierdoor wordt in het rapport het aantal klanten in de groep geteld. In dit voorbeeld hebben we gekozen voor het veld Klantnummer dat wordt geteld, maar ieder ander veld had ook gekozen kunnen worden. Bijvoorbeeld =Aantal([Adres]) levert hetzelfde resultaat 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 expressie, bijvoorbeeld Gem([Aantal volwassenen] + [Aantal kinderen]).
Copyright 2007 Academic Service
7 Uitgebreide rapporten
225
Bekijk het voorlopige resultaat als afdrukvoorbeeld. Wat nog opvalt, 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 eigenschappenvenster. Kies in het tabblad Opmaak de laatste eigenschap Tekstuitlijning en 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
Copyright 2007 Academic Service
226
Databaseontwikkeling 4 Access 2003
Voorbeeld 2: Reizigers per vertrekdatum We 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 voorkomen 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 ontwerpweergave. 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 einddatum:]. Figuur 7.16
De query is op deze manier flexibel gemaakt. Door tussen de vierkante haken een vraag te stellen, zal bij het uitvoeren van de query om een startdatum en een einddatum worden gevraagd. De ingevoerde datums gelden dan als voorwaarde.
Copyright 2007 Academic Service
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 letters 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 worden alleen gebruikt om het aantal reizigers per vertrekdatum te bepalen, zie figuur 7.17. 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.
Copyright 2007 Academic Service
228
Databaseontwikkeling 4 Access 2003
Figuur 7.18
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. Figuur 7.19
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.
Copyright 2007 Academic Service
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. 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 vertrekdatum 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.
Copyright 2007 Academic Service
230
Databaseontwikkeling 4 Access 2003
Figuur 7.21
Figuur 7.22
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 verplaatsen. Selecteer het label Naam en klik op het label Woonplaats van de klant met de Shift-toets ingedrukt. Hierdoor worden beide labels geselecteerd.
Copyright 2007 Academic Service
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 verwijderd worden. De velden Plaats en Land mogen echter niet verwijderd 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, tegelijkertijd 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.
Copyright 2007 Academic Service
232
Databaseontwikkeling 4 Access 2003
Figuur 7.23
Figuur 7.24
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 sorteervolgorde van het veld Vertrekdatum in aflopend. Hierdoor worden de vertrekdatums in het rapport aflopend weergegeven en de namen 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 weergegeven en de vertrekdatum wordt rechts uitgelijnd.
Copyright 2007 Academic Service
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 vertrekdatum links in het tekstvak weergegeven als het rapport wordt getoond. Figuur 7.25
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.
Copyright 2007 Academic Service
234
Databaseontwikkeling 4 Access 2003
De onderste lijn in de sectie Paginakoptekst is niet helemaal zichtbaar. 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. Figuur 7.26
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 Rapportvoettekst. 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 worden.
Copyright 2007 Academic Service
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. 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 tabblad 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 eigenschap 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
Copyright 2007 Academic Service
236
Databaseontwikkeling 4 Access 2003
worden uitsluitend gebruikt om deze optelling mogelijk te maken. 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 klanten: 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 gegevens 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 mogelijk 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 aantal 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 reisprogramma van het reisbureau, zie figuur 7.28.
Copyright 2007 Academic Service
7 Uitgebreide rapporten
237
Figuur 7.28
We maken eerst een query waarin de betreffende gegevens worden geselecteerd. Kies het overzicht Query’s en selecteer Query maken in ontwerpweergave. 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 noodzakelijk 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
Copyright 2007 Academic Service
238
Databaseontwikkeling 4 Access 2003
veld Land en daarbinnen op het veld Plaats moet een extra groepeerniveau worden geselecteerd. Markeer het veld Land en klik op de knop >. Aan de rechterzijde van het scherm wordt dan een voorbeeld van de groepeerniveaus aangegeven. Eerst wordt gegroepeerd op het veld Land en daarbinnen op het veld Plaats, zie figuur 7.29. 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.30
Copyright 2007 Academic Service
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. 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 rapport op het scherm als afdrukvoorbeeld getoond, zie figuur 7.32.
Copyright 2007 Academic Service
240
Databaseontwikkeling 4 Access 2003
Figuur 7.32
Het rapport voldoet nog niet geheel aan onze wensen, zie figuur 7.28. We gaan opnieuw enige handmatige aanpassingen aanbrengen 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 verander 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.
Copyright 2007 Academic Service
7 Uitgebreide rapporten
241
Figuur 7.33
In de sectie Voettekst (Plaats) staan de labels Som en Standaard. Verwijder deze door ze te selecteren en vervolgens op de Deletetoets 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 tekstvakken ernaast geplaatst kunnen worden, zie figuur 7.35. Verplaats de beide tekstvakken naast het zojuist verkleinde vak.
Copyright 2007 Academic Service
242
Databaseontwikkeling 4 Access 2003
Figuur 7.34
Figuur 7.35
In de sectie Voettekst (Land) plaatsen we nog een lijn onder de tekstvakken, zodat de landen door een lijn van elkaar gescheiden worden.
Copyright 2007 Academic Service
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 aangezien 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 reizigers 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 afgedrukt.
Copyright 2007 Academic Service
244
Databaseontwikkeling 4 Access 2003
Als we in een kop- of voettekst een rekenveld, dat in de detailsectie 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. Figuur 7.36
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.
Copyright 2007 Academic Service
7 Uitgebreide rapporten
245 245
Figuur 7.37
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 uitlijnen 1, het profiel is Vet. Maak dit rapport. Figuur 7.38
Copyright 2007 Academic Service
246 246
Databaseontwikkeling 4 Access 2003
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 zodanig dat alle reizen worden getoond, ook de reizen die dus nog niet geboekt zijn.
Copyright 2007 Academic Service
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 toetsenbord zouden uitvoeren. In een macro kunnen verschillende opdrachten zijn opgenomen, die in de opgegeven volgorde worden uitgevoerd. Een macro kan bijvoorbeeld gestart worden door het klikken op een opdrachtknop, waarna de opdrachten in de macro automatisch voor ons worden uitgevoerd. In paragraaf 6.6 hebben we opdrachtknoppen gemaakt die ook een actie uitvoeren, maar in dat geval gaat het slechts om één actie. Met een macro kunnen we meerdere opeenvolgende acties laten uitvoeren door één opdrachtknop. Het starten van een macro kan ook door een gebeurtenis plaatsvinden. Die gebeurtenis kan het openen van een formulier zijn, het sluiten van een tabel of het verlaten van een besturingselement. Binnen een macro kunnen we voorwaarden opnemen, zodat de waarden in het formulier of rapport bepalen welke opdrachten uitgevoerd worden. 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 aanschouwelijk 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.
Copyright 2007 Academic Service
248
Databaseontwikkeling 4 Access 2003
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 volgorde 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 uitvoeren, worden opgegeven. In de tweede kolom, Beschrijving, kan eventueel een toelichting worden gegeven bij de actie. Die toelichting heeft geen invloed op de macro. Merk op dat het macrovenster nog twee extra kolommen kan tonen: Macronaam en Voorwaarde. Deze kolommen worden in paragraaf 8.2 toegelicht; voor dit voorbeeld zijn ze niet noodzakelijk. Klikken we in de actiekolom, dan kunnen we uit een keuzelijst een van de vele acties selecteren. De eerste actie die de macro moet gaan uitvoeren, is het openen van de tabel Klant. Selecteer de actie TabelOpenen. In het onderste gedeelte van het macrovenster worden de argumenten getoond van die actie, alsmede een korte toelichting van de actie. Druk voor meer informatie over een actie op de F1-toets. De meeste acties vereisen bepaalde instellingen – argumenten – zodat de actie weet welke tabel, welk formulier of welk rapport geopend moet worden. Met de F6-toets kunnen we wisselen tussen het bovenste en onderste gedeelte van het macrovenster. 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.
Copyright 2007 Academic Service
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 toegestaan. Of dat de gegevens alleen gelezen mogen worden: modus Alleen-lezen. Selecteer de instelling Alleen-lezen. De eerste actie van de macro is opgenomen. Hiermee wordt de tabel Klant geopend als gegevensblad en de gegevens mogen niet gemuteerd worden (alleen-lezen). De 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.
Copyright 2007 Academic Service
250
Databaseontwikkeling 4 Access 2003
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 argument: 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 vierkante haakjes om Woonplaats worden door Access toegevoegd. Het is niet noodzakelijk deze zelf in te voeren. Als een veldnaam met spaties is gebruikt, moeten we wel zelf de vierkante haakjes om de naam van het veld plaatsen. 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 argumenten zijn achtereenvolgens: We gaan de tabel Klanten afsluiten., Ja, Informatie en Berichtje. In de voorlaatste actie brengen we het venster terug in zijn oorspronkelijke grootte. Een eerdere actie was het venster te maximaliseren. 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; bijvoorbeeld een tabel, formulier of query. Bij het tweede argument, Objectnaam, moeten we de naam van de tabel, het formulier of de query opgeven. In het derde argument kunnen we aangeven of
Copyright 2007 Academic Service
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. Figuur 8.1
Sla de macro op onder de naam Macro voorbeeld en sluit het venster. 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.
Copyright 2007 Academic Service
252
Databaseontwikkeling 4 Access 2003
Testen van een macro Als we veel acties in een macro opnemen, kan het voorkomen dat we een fout maken waardoor de macro niet functioneert. Het kan lastig zijn die fout op te sporen. Om ons daarbij te helpen heeft Access een mogelijkheid om de macro stap voor stap uit te voeren. Na iedere actie wordt gestopt, zodat we het resultaat van de vorige actie kunnen bekijken. Is deze foutloos, dan kunnen we een opdracht geven om de volgende actie uit te voeren. Het opsporen van fouten gaat hierdoor gemakkelijker. We gaan de zojuist gemaakte macro (Macro voorbeeld) stap voor stap laten uitvoeren. Plaats de macro in het macrovenster (selecteer 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 argumenten. Klik op de knop Stap om de volgende actie van de macro uit te voeren. Op deze manier ‘stappen’ we door de macro om een fout op te sporen. Je kunt het stapsgewijs uitvoeren van de macro’s uitschakelen door in de ontwerpfase opnieuw op de knop Macrostap te klikken. Figuur 8.2
Copyright 2007 Academic Service
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) selecteren; 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 uitgevoerd. 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 worden door ‘wizard’-opdrachtknoppen en macro’s uitgevoerd. Maar voordat we die macro’s kunnen maken, moeten we eerst de mogelijkheden leren kennen – vandaar dit demonstratievoorbeeld.
Copyright 2007 Academic Service
254
Databaseontwikkeling 4 Access 2003
We gaan twee formulieren maken, genaamd Groenformulier en Roodformulier. In het groene formulier worden boodschappen afgedrukt en het rode formulier laat, via opdrachtknoppen, de boodschap verdwijnen en terugkomen (zie figuur 8.3). We maken eerst de formulieren en vervolgens de macro’s. Figuur 8.3
Omdat dit een demonstratie van macro’s is, gebruiken we de eerdergemaakte database Oefening. Als deze database niet meer aanwezig 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 werkbalk). 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.
Copyright 2007 Academic Service
255
8 Macro’s
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 afmetingen 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 opgeslagen. Om dit formulier goed te kunnen onderscheiden van het andere gaan we een gifgroene kleur aan het formulier geven. Klik met de muis op de Detailbalk van het formulier en klik hierna in het eigenschappenvenster op het tabblad Opmaak. Klik op de eigenschap Achtergrondkleur en klik vervolgens op de drie puntjes in deze eigenschap. Er wordt een kleurenpalet getoond. Kies de gifgroene kleur en klik op de knop OK. Ten slotte moeten enkele eigenschappen van het formulier worden gewijzigd. Zet de eigenschappen van het formulier op het scherm; je kunt Formulier selecteren uit de keuzelijst van het eigenschappenvenster. Verander de eigenschappen zoals in figuur 8.4 wordt getoond. Figuur 8.4
Eigenschap
Instelling
Schuifbalken
Geen
Recordkiezers
Nee
Navigatieknoppen
Nee
Recordbegrenzingslijnen
Nee
Verander eventueel de lay-out van het formulier, zodat het ongeveer de lay-out krijgt van het groene formulier uit figuur 8.3.
Copyright 2007 Academic Service
256
Databaseontwikkeling 4 Access 2003
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 uitgeschakeld zijn, wat betekent dat de opdrachtknop niet te selecteren is. Kies daartoe in het eigenschappenvenster, van de opdrachtknop Kom terug, het tabblad Gegevens en verander de eigenschap Ingeschakeld in Nee. Om dit formulier goed te kunnen onderscheiden van het groene formulier gaan we het een knalrode kleur geven. Klik met de muis op de Detailbalk van het formulier en klik in het eigenschappenvenster op het tabblad Opmaak. Klik op de eigenschap Achtergrondkleur en klik vervolgens op de drie puntjes in deze eigenschap. Kies uit het kleurenpalet de knalrode kleur en klik op de knop OK. Ten slotte moeten enige eigenschappen van het formulier gewijzigd worden. Plaats de eigenschappen van het formulier op het scherm (je kunt Formulier selecteren uit de keuzelijst van het eigenschappenvenster). Verander de eigenschappen zoals in figuur 8.4 wordt getoond.
Copyright 2007 Academic Service
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 uitgevoerd moeten worden, de macro’s, moeten immers nog gemaakt worden. Verander eventueel de lay-out van het formulier, zodat het ongeveer 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 Initieer maken. 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.
Copyright 2007 Academic Service
258
Databaseontwikkeling 4 Access 2003
Figuur 8.5
Figuur 8.6
Macro Initieer Actie FormulierOpenen
WaardeInstellen
WaardeInstellen
Argument
Instelling
Formuliernaam
Groenformulier
Beeld
Formulier
Venstermodus
Standaard
Item
[Formulieren]![Groenformulier]! [Boodschap]
Expressie
“Hallo, hier ben ik voor de eerste keer. Druk op de knop Verdwijn.”
Item
[Formulieren]![Groenformulier]![Teller]
Expressie
1
Klik met de muis in de kolom met acties en selecteer de actie FormulierOpenen. Vul de argumenten in zoals beschreven in figuur 8.6. Via de F6toets 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 besturingselement 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 eenvoudige manier is in te voeren, geven we enige regels met betrekking tot het verwijzen naar formulieren.
Copyright 2007 Academic Service
8 Macro’s
259
Verwijzingen naar formulieren Om 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 besturingselement Einde op het rode formulier, dan moeten we invoeren: [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 verwijzing 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 verwijzingen Denk 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, bijvoorbeeld 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 expressies.
Copyright 2007 Academic Service
260
Databaseontwikkeling 4 Access 2003
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. 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 besturingselement. In de derde kolom kunnen we voor de <Waarde> van het besturingselement kiezen of een keuze maken uit de eigenschappen ervan. Naast het verwijzen naar de genoemde objecten kunnen we in dit venster tevens een van de vele functies van Access selecteren. Kies in de eerste kolom Functies. In de middelste kolom verschijnen dan alle functiegroepen van Access, zoals datum/tijd-, statistische en rekenkundige functies. Selecteren we bijvoorbeeld de statistische functies, dan verschijnen in de derde kolom alle statistische functies van Access. Nadat we de juiste expressie hebben geselecteerd, kunnen we op de knop Plakken klikken. De expressie verschijnt in het bovenste gedeelte van het venster. Als berekeningen of vergelijkingen met de selectie uitgevoerd moeten worden, hebben we de keuze uit de knoppen onder het venster. Hierna kan eventueel een functie opgeroepen worden of opnieuw een besturingselement. Nadat de volledige expressie in het venster is geplaatst, kan op de knop OK worden geklikt.
Copyright 2007 Academic Service
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 paginanummer bevat of de huidige datum. Selecteer in de kolom Formulieren het formulier Groenformulier. Hierbij hebben we de mogelijkheid om alle formulieren te selecteren of alleen de geladen formulieren. In de tweede kolom worden alle besturingselementen getoond die op het formulier staan. Selecteer in de tweede kolom het besturingselement Boodschap. In de derde kolom worden alle eigenschappen van dat besturingselement getoond. Selecteer de standaardwaarde van de derde kolom <Waarde>. Hiermee kunnen we aan het besturingselement een waarde toekennen. Klik op de knop Plakken. Hiermee plakken we de gemaakte keuze in het bovenste scherm van de Opbouwfunctie voor expressies. Klik vervolgens op de knop OK. Dit heeft tot gevolg dat het venster wordt gesloten en de gemaakte verwijzing in het argument wordt geplaatst. Verplaats de cursor naar het argument Expressie van de tweede actie. Typ hier de tekst die in het besturingselement komt te staan; deze dient tussen aanhalingstekens geplaatst te worden. De tekst wordt in de formulierweergave van het formulier in het besturingselement Boodschap getoond. De derde en laatste actie van de macro Initieer is opnieuw WaardeInstellen. Start voor het argument Item de Opbouwfunctie voor expressies. Selecteer in de eerste kolom het formulier Groenformulier, vervolgens 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 formulierweergave) 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
Copyright 2007 Academic Service
262
Databaseontwikkeling 4 Access 2003
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 ‘openen 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 besturingselement 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. Figuur 8.8
Macro Verdwijn Actie
Argument Instelling
WaardeInstellen
Item
[Formulieren]![Groenformulier]! [Boodschap].[Visible]
Expressie
Nee
WaardeInstellen
Item
[Kom terug].[Enabled]
Expressie
Ja
NaarBesturingselementGaan WaardeInstellen
Kom terug Item
[Verdwijn].[Enabled]
Expressie
Nee
Tussen de macro Initieer en de macro Verdwijn is in het macrovenster een regel overgeslagen om de macro’s van elkaar te scheiden. Die lege regel is niet noodzakelijk, een macro wordt automatisch 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
Copyright 2007 Academic Service
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 gegeven. 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 equivalenten. 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 terug niet 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 toegestaan om de formuliernaam weg te laten in de verwijzing naar het besturingselement. Maken we gebruik van de Opbouwfunctie voor 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 onzichtbaar) gemaakt worden als het niet de focus heeft. Aangezien op de opdrachtknop is geklikt, heeft die de focus. Om de opdrachtknop Verdwijn uit te schakelen moeten we eerst de focus verplaatsen naar de opdrachtknop Kom terug. De actie NaarBesturingselement Gaan 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.
Copyright 2007 Academic Service
264
Databaseontwikkeling 4 Access 2003
De boodschap is verdwenen. De opdrachtknop Verdwijn is niet meer te selecteren en de opdrachtknop Kom terug kan nu wel geselecteerd worden. Nu kunnen we de derde macro gaan maken. Deze macro wordt gestart als op de opdrachtknop Kom terug wordt geklikt. De boodschap wordt opnieuw getoond. Vervolgens plaatsen we de tweede boodschap in het besturingselement Boodschap. Hierna moet het ingeschakeld zijn van de opdrachtknoppen Kom terug en Verdwijn opnieuw stuivertje wisselen. 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, namelijk Kom terug. De volledige macro is afgebeeld in figuur 8.9. 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.
Copyright 2007 Academic Service
265
8 Macro’s
Macro Kom terug Voorwaarde
Actie
Argument
Instelling
WaardeInstellen
Item
[Formulieren]![Groenformulier]! [Teller]
Expressie
[Formulieren]![Groenformulier]! [Teller] + 1
Item
[Formulieren]![Groenformulier]! [Boodschap].[Visible]
Expressie
Ja
Item
[Formulieren]![Groenformulier]! [ Boodschap ]
Waarde instellen
2=[Formulieren]! [Groenformulier]. [Teller]
WaardeInstellen
3=[Formulieren]! [Groenformulier]. [Teller]
WaardeInstellen
4=[Formulieren]! [Groenformulier]. [Teller]
WaardeInstellen
…
NaarBesturingselementGaan
…
WaardeInstellen
…
Expressie
“Hallo, dit is de tweede keer.”
Item
[Formulieren]![Groenformulier]! [ Boodschap ]
Expressie
“Hallo, dit is al de derde keer.”
Item
[Formulieren]![Groenformulier]! [ Boodschap ]
Expressie
“Sorry, ik laat me niet meer wegsturen.” Einde
Item
[Kom terug].[Enabled]
Expressie
Nee
MacroStoppen WaardeInstellen
Item
[Verdwijn].[Enabled]
Expressie
Ja
NaarBesturingselementGaan WaardeInstellen
Verdwijn Item
[Kom terug].[Enabled]
Expressie
Nee
Figuur 8.10
De meeste macrogroepen bevatten wel een macro waarin een voorwaarde zit. Hierdoor is het handig om de twee extra kolommen, 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.
Copyright 2007 Academic Service
266
Databaseontwikkeling 4 Access 2003
Vink hierin de vakjes Kolom met namen en Kolom met voorwaarden af. In bijlage B worden enkele andere mogelijkheden van het menuitem 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 boodschap 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 besturingselement 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 verschillende acties uitgevoerd. We moeten voor iedere actie aangeven dat die alleen uitgevoerd mag worden als het besturingselement 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 Teller de waarde 4 heeft.
Copyright 2007 Academic Service
267
8 Macro’s
De focus wordt verplaatst naar de opdrachtknop Einde. De eigenschap Ingeschakeld van de opdrachtknop wordt op Nee gezet. Hiermee is die opdrachtknop niet meer te selecteren. Als laatste wordt de macro 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 ingeschakeld. Deze krijgt vervolgens de focus. Als laatste actie wordt de opdrachtknop Kom terug uitgeschakeld.
Terzijde Opmerkingen over voorwaarden Het is niet mogelijk om zogeheten if...then...else-constructies te maken. Wel kunnen we gebruikmaken van de operatoren And, Or en Not. Het nesten van voorwaarden (voorwaarden in voorwaarden) is niet mogelijk. Een voorwaarde in het macrovenster kan uitvergroot worden door de voorwaarde te selecteren en vervolgens op de toetsencombinatie Shift+F2 te drukken (zoomen). Het is 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 macrogroep 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. Figuur 8.11
Actie
Argument
Instelling
Sluiten
Objecttype
Formulier
Objectnaam
Groenformulier
Opslaan
n.v.t
Objecttype
Formulier
Sluiten
Objectnaam
Roodformulier
Opslaan
n.v.t
Copyright 2007 Academic Service
268
Databaseontwikkeling 4 Access 2003
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 gebeurtenissen De macro’s zijn klaar, nu gaan we ze koppelen aan de opdrachtknoppen 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. Figuur 8.12
Selecteer in de keuzelijst frmRoodformulier.Kom terug. De macro wordt nu gestart als op de opdrachtknop wordt geklikt.
Copyright 2007 Academic Service
8 Macro’s
269
Selecteer vervolgens de opdrachtknop Verdwijn en selecteer op identieke wijze in het tabblad Gebeurtenis de gebeurtenis Bij klikken. 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 ‘openen 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 frmRoodformulier .Initieer gestart. Deze opent onder andere het groene formulier, zodat beide formulieren op het scherm worden getoond. Opmerkingen In paragraaf 6.6 hebben we opdrachtknoppen met de Wizard gemaakt. Deze voeren één actie uit, bijvoorbeeld het afdrukken van een rapport of het openen van een formulier. Die actie wordt niet uitgevoerd door een macro, maar door een zogeheten gebeurtenisprocedure: 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 beveiligingsniveau 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 ‘automatisch’ geopend. Controleer de werking van de opdrachtknoppen. Als een macro niet naar wens functioneert, controleer dan de macro die niet goed werkt.
Copyright 2007 Academic Service
270
Databaseontwikkeling 4 Access 2003
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 functioneert, kunnen we deze mogelijkheid benutten, want hiermee kunnen we goed waarnemen wat het effect is van iedere actie. In het volgende hoofdstuk gaan we een toepassingsprogramma maken dat volledig door 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 paragraaf. b. Wijzig de macro zo dat er nog twee extra meldingen worden getoond, voordat de boodschap niet meer te verwijderen is.
Copyright 2007 Academic Service
9
Het bouwen van een toepassing
In de vorige hoofdstukken hebben we geleerd hoe we tabellen ontwerpen en bouwen, hoe we query’s, formulieren en rapporten ontwikkelen 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 Zonnetje staat op de cd-rom de database Basis zonnetje, waarin alleen de gebruikte tabellen uit database ’t Zonnetje zijn opgenomen. In die database kunnen we tijdens het lezen de instructies uitvoeren die tot database ’t Zonnetje hebben geleid. Voor het ontwikkelen van een toepassing moeten we altijd een aantal stappen doorlopen. 1. De informatiebehoefte moet volledig bekend zijn. We moeten precies weten wat de toepassing moet gaan doen; dit uiteraard in goed overleg met de opdrachtgever. 2. De overzichten, rapporten en formulieren die gewenst zijn, moeten genormaliseerd worden. Hierdoor ontstaat een logisch datamodel. 3. Aan de hand van het logische datamodel worden de tabellen en relaties gedefinieerd.
Copyright 2007 Academic Service
272
Databaseontwikkeling 4 Access 2003
4. De menustructuur moet ontworpen worden. Hiermee bedoelen we: hoe ziet het openingsscherm eruit (hoofdmenu) en de vervolgschermen (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, waarbij de eerste twee punten in ons voorbeeld als bekend worden verondersteld. We gaan van ons bestaande datamodel uit.
9.1
Tabellen en relaties
We maken gebruik van de tabellen die in de vorige hoofdstukken zijn gebruikt: Tabel Klant: hierin liggen de klantgegevens opgeslagen. Klantnummer is de sleutel. Als een nieuwe klant wordt toegevoegd, krijgt die het klantnummer dat één hoger is dan het laatste klantnummer dat is toegevoegd. De klanten zijn zo doorlopend genummerd met behulp van het gegevenstype Autonummering. Standaard begint het type Autonummering bij de waarde 1 en wordt bij ieder volgend record opgehoogd. Het is mogelijk om de eerstvolgende waarde te veranderen. Dit staat beschreven in bijlage A, onder Veldlengte. Tabel Boeking: hierin worden de boekingen van reizen opgeslagen, zie 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
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
273
Figuur 9.1
6.3 is uitgelegd hoe dat in zijn werk gaat. Hetzelfde geldt voor het veld Rfeisnummer, dit is ook een vreemde sleutel. Hierop is eveneens 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 algemeen geldt: zet indexen op sleutelvelden (automatisch in Access) en vreemde-sleutelvelden. Tabel Reis: alle mogelijke reizen worden hierin opgeslagen. Het veld Reisnummer is de sleutel. Op het veld Bestemmingcode, vreemde sleutel, is een index geplaatst (duplicaten toegestaan!) en een keuzelijst met invoervak. Tabel Bestemming: alle mogelijke bestemmingen worden in deze tabel opgeslagen. Het veld Bestemmingcode is de sleutel. De sleutel is van het type tekst en kan daardoor niet doorgenummerd worden. Immers, bestemmingcodes zijn willekeurig. Tabel Constant: deze tabel wordt hier voor het eerst geïntroduceerd; in voorgaande hoofdstukken is die tabel niet eerder gebruikt. Waar komt die vandaan? Een constantentabel is bij de
Copyright 2007 Academic Service
274
Databaseontwikkeling 4 Access 2003
meeste databases aanwezig. Hierin worden namelijk de constanten opgeslagen. Bij het normaliseren worden de constanten verwijderd, zoals de bedrijfsgegevens op een overzicht, de omrekeningsfactor van de euro naar de dollar, het BTW-percentage laag, het BTWpercentage hoog en het percentage van de annuleringsverzekering. We houden dan de tabellen over die onderling gerelateerd zijn. Die constanten moeten echter wel ergens opgeslagen liggen, we hebben ze immers nodig. We hebben bijvoorbeeld het BTW-percentage verwijderd tijdens het normaliseren. Maar tijdens het afdrukken van de facturen moet wel het BTW-percentage gebruikt worden om het BTW-bedrag uit te rekenen. Het is natuurlijk niet handig om dat percentage in een rekenveld van een formulier- of rapportontwerp op te nemen. Verandert het BTW-percentage, dan zullen we alle formulieren en rapporten moeten nalopen om te controleren of die het BTW-percentage bevatten. Vervolgens moet het gewijzigd worden. We noemen het in de informatiekunde wel constanten, maar het zijn geen wiskundige constanten. Ze zijn dus alleen maar gedurende een beperkte periode constant. Na een bepaalde periode moeten ze makkelijk aan te passen zijn. Die constanten gaan we opslaan in de tabel Constant. Die tabel heeft maar één record en is aan geen enkele andere tabel gerelateerd! In dit ene record staan de gegevens van de constanten, bijvoorbeeld 19% voor het BTW-percentage. Aangezien de tabel Constant maar één record heeft, is het niet noodzakelijk om een sleutelveld te 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
Copyright 2007 Academic Service
275
9 Het bouwen van een toepassing
gebruiker van de toepassing kan dan zelf eenvoudig het percentage veranderen. In alle berekeningen wordt vanaf dat moment met dit gewijzigde percentage gerekend. Voor het wijzigen van de constanten wordt een formulier ontworpen. Aangezien we de tabel Constant nog niet eerder hebben gebruikt, tonen we de structuur. Merk op dat in de tabel geen sleutelveld is gedefinieerd. Veldnaam
Gegevenstype Veldlengte
Notatie
Vereist
AnnuleerPerc
Numeriek
Enkele precisie
Percentage
Ja
KinderKortingPerc Numeriek
Enkele precisie
Percentage
Ja
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 percentages worden getoond. In onze berekeningen met de percentages is het dan niet noodzakelijk steeds door 100 te delen. De veldlengte is Enkele precisie. Met dat type kunnen decimale getallen ingevoerd worden, zie eventueel de extra informatie in bijlage A.
Terzijde Tabel Switchboard Items: deze tabel wordt automatisch aangemaakt nadat we de schakelborden hebben gemaakt. Access houdt hierin bij welke schakelborden bij deze toepassing in gebruik zijn. Deze tabel wordt door Access gebruikt en is voor ons niet van belang.
9.2
Menustructuur
Zodra we de database ’t Zonnetje starten, wordt direct een hoofdmenu getoond, waaruit we een keuze kunnen maken. Na het kiezen van sommige opties krijgen we vervolgens een submenu. Voordat we de toepassing gaan maken, moeten we die gewenste menustructuren gaan ontwerpen. Hoe moeten het hoofdmenu en de submenu’s eruit zien? Technisch worden die menu’s in Access
Copyright 2007 Academic Service
276
Databaseontwikkeling 4 Access 2003
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. Hoofdmenu Boekingen Overzichten Onderhoud Het hoofdmenu is zeer kort: het bevat drie items. Na de keuze Boekingen kunnen reizen worden geboekt en gemuteerd. Na de keuze Overzichten krijgen we, via een submenu, de keuze uit verschillende overzichten. En na de keuze Onderhoud komen we in een submenu waarin de basisgegevens gemuteerd kunnen worden. Voor twee keuzemogelijkheden, Overzichten en Onderhoud hebben we submenu’s gemaakt. Submenu Overzichten Klantenlijst Vertreklijst Omzetlijst Dit submenu is gemaakt met een schakelbord. De Klantenlijst drukt een alfabetisch klantenoverzicht af op de printer. Op de Vertreklijst komen de gegevens te staan van klanten die op reis gaan. De gebruiker kan een datumbereik opgeven. Vervolgens worden van alle klanten die binnen dat datumbereik op reis gaan de relevante gegevens naar de printer gestuurd. De Omzetlijst toont per te boeken reis de omzet, alsmede de bijdrage, als percentage, van die reis aan de totale omzet.
Submenu Onderhoud Klanten Reizen Bestemmingen Constant Ook dit submenu is gemaakt met een schakelbord. Na het klikken op een van de items wordt een formulier zichtbaar waarop we
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
277
mutaties in de basisgegevens kunnen doorvoeren. Het is niet noodzakelijk 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 formulieren 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 databasevenster. 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 verschillende formulieren ‘blindelings’ vinden. We gaan eerst het formulier maken waarmee klantgegevens gemuteerd kunnen worden. Dit formulier zal gekoppeld worden aan het submenu Onderhoud bij het item 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 menuitem Onderhoud. Immers, wat is technisch het verschil tussen een reis muteren of een klant muteren?
Copyright 2007 Academic Service
278
Databaseontwikkeling 4 Access 2003
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. Figuur 9.2
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.
Copyright 2007 Academic Service
279
9 Het bouwen van een toepassing
Figuur 9.3
Wijzig hierin de eigenschappen zoals in figuur 9.4 wordt getoond. Figuur 9.4
Eigenschap
Instelling
Bijschrift
Klant mutaties
Schuifbalken
Geen
Recordkiezers
Nee
Navigatieknoppen
Nee
Recordbegrenzingslijnen
Nee
Min.- en max.-knop
Geen
Toelichting eigenschappen Bijschrift: dit wordt weergegeven in de bovenste regel van het formuliervenster. 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 weergegeven, maar bij een enkelvoudig formulier overbodig. Navigatieknoppen: de standaard navigatieknoppen verwijderen we uit ons formulier. We zetten zelf nieuwe grote navigatieknoppen op ons formulier. Die zien er professioneler uit dan die kleine standaardknopjes.
Copyright 2007 Academic Service
280
Databaseontwikkeling 4 Access 2003
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 formulier worden getoond. Aangezien we niet willen dat het formulier verkleind of vergroot wordt, hebben we deze knoppen uitgeschakeld. 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 detailsectie 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 Achtergrondkleur. We hoeven ons geen zorgen te maken over het nummer 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 verschijnt 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 kliken-sleep in de Formulierkoptekst.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
281
Figuur 9.5
Druk op de Enter-toets, zodat het label wordt geselecteerd. Plaats het eigenschappenvenster op het scherm en verander in de tab Opmaak de eigenschap Bijschrift in Klant gegevens. Verander tevens in hetzelfde tabblad de eigenschap Tekengrootte in 24. Hierdoor wordt de tekst in puntgrootte 24 (groot) weergegeven, zie figuur 9.6. 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 kunnen we veranderen door de eigenschap Randbreedte, in het tabblad Opmaak, te wijzigen in 2 pt.
Copyright 2007 Academic Service
282
Databaseontwikkeling 4 Access 2003
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 volledig zichtbaar, vergroot daarom die tekstvakken een paar millimeter. Het klantnummer wordt in een te groot tekstvak weergegeven, verklein daarom dit tekstvak. Gebruik ook de Formuliervoettekst om daarin de gewenste navigatieknoppen 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 voettekst 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 veranderen. Sleep vervolgens de rechterkant van het formulier een aantal centimeters 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 opdrachtknoppen 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 recordnavigatie (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 gebeuren als op die knop wordt geklikt, zie figuur 9.7. Als de Wizard niet wordt gestart, klik dan op de knop Wizards voor besturings-
Copyright 2007 Academic Service
283
9 Het bouwen van een toepassing
elementen in de Werkset en plaats opnieuw een opdrachtknop in het formulier. Figuur 9.7
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. Figuur 9.8
Categorie
Actie
Type (Figuur/Picture) Naam
Recordnavigatie
Naar vorige record gaan
Naar vorige 2
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
Vorige
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.
Copyright 2007 Academic Service
284
Databaseontwikkeling 4 Access 2003
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.
Figuur 9.9
De opdrachtknoppen hebben standaard een Tabstop. Dat wil zeggen: als we met de Tab-toets door de velden van het formulier ‘stappen’, wordt ook gestopt op de opdrachtknoppen. Dat kunnen we voorkomen door aan te geven dat de opdrachtknoppen geen Tabstop moeten bezitten. Selecteer alle opdrachtknoppen met behulp van Shift+muisklik. Maak vervolgens het eigenschappenvenster actief en zet de eigenschap Tabstop, in het tabblad Overige, op Nee. Sleep de opdrachtknoppen naar hun gewenste plek en onderzoek het eindresultaat in de formulierweergave. Controleer de werking van de opdrachtknoppen. De Zoekknop toont een venster waarin we kunnen opgeven wat we willen zoeken. Er wordt gezocht in het tekstvak dat actief is, voordat geklikt wordt op de Zoekknop. Een volledige beschrijving van dit venster is in paragraaf 5.5.6 toegelicht. Met de herstelknop kunnen we typefouten herstellen. Stel we wissen per ongeluk de
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
285
postcode van een klant. Door op de herstelknop te klikken komt de oorspronkelijke postcode weer tevoorschijn. 9.3.2
Formulier Bestemming
Het formulier Bestemming is op precies dezelfde manier gemaakt als het formulier Klant, zie figuur 9.10. Figuur 9.10
Het enige verschil is dat het Bijschrift Bestemming mutaties is geworden en dat het formulier is opgeslagen onder de naam Bestemming. 9.3.3
Formulier Reis
Het formulier Reis is op precies dezelfde manier gemaakt als het formulier Klant, zie figuur 9.11. Figuur 9.11
Het enige verschil is dat het Bijschrift Reis mutaties is geworden en dat het formulier is opgeslagen onder de naam Reis.
Copyright 2007 Academic Service
286
Databaseontwikkeling 4 Access 2003
9.3.4 Formulier Constant Het formulier Constant is het eenvoudigste formulier, zie figuur 9.12. Figuur 9.12
In dit formulier kunnen we onze constante gegevens muteren. Aangezien er maar één record in dit formulier zit met de waarden van onze constanten, zijn alle opdrachtknoppen niet nodig. Navigeren door de records is niet nodig. Nieuwe records toevoegen of verwijderen is niet toegestaan. Het formulier is op dezelfde wijze gemaakt als het formulier Klant, maar dan zonder de opdrachtknoppen. Hierbij zijn de labels langer gemaakt en is de naam voluit geschreven. De tekstvakken moeten hierdoor ook verplaatst worden. 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 gebeuren, 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 database erg groot kan worden. Access slaat namelijk achter de schermen alles op. Ook als je bijvoorbeeld een record, formulier of rapport verwijdert, blijft dit in de database – onzichtbaar – aanwezig. Om dit fysiek te verwijderen moet je de database comprimeren: Extra, Database hulpprogramma’s, Database comprimeren en her-
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
287
stellen. Soms heeft dit een verbazingwekkende vermindering van wel 90% tot gevolg. Daarnaast kun je deze optie toepassen als er een beschadiging aan de gegevens in de database is opgetreden. 9.3.5
Formulier Boeking
De belangrijkste activiteit van het reisbureau, het boeken van reizen, vindt plaats in het formulier Boeking (zie figuur 9.13). 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, namelijk 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
Copyright 2007 Academic Service
288
Databaseontwikkeling 4 Access 2003
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 databasevenster. Aan de naam van de query kunnen we zien bij welk formulier deze gebruikt wordt. De stappen om het formulier te maken worden nu toegelicht. Gebruik de database Basis Zonnetje om de handelingen ‘na te spelen’. Selecteer in het 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 Boeking hebben we alle velden nodig, selecteer daartoe eenvoudig de * in de tabel Boeking. Er wordt getoond Boeking.*. Selecteer uit de tabel Klant de velden Naam, Adres, Woonplaats en Telefoonnummer; uit de tabel Reis de velden Vertrekdatum, Aantal dagen en Prijs per persoon, en ten slotte uit de tabel Bestemming de velden Plaats en Land. Sla vervolgens de query op onder de naam frmBoeking. Hierdoor kunnen we later in dit overzicht eenvoudig terugzoeken bij welk formulier ( frm) deze query hoort. Het is verstandig om de query te controleren in de gegevensbladweergave. De query is gemaakt, nu gaan we het formulier ontwikkelen. Selecteer in het databasevenster het overzicht Formulieren en klik op de knop Nieuw. Kies Autoformulier: in kolomvorm, selecteer in de keuzelijst de zojuist gemaakte query frmBoeking en klik op de knop OK. Sla dit basisontwerp op onder de naam Boeking.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
289
De lay-out moet aangepast worden aan de wensen van het reisbureau. 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 ontstaat 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 opdrachtknoppen 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 formulier, in de sectie Detail, worden geplaatst. Hiervoor moet het formulier 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 formulier 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 beschikbare opdrachtknoppen van de Wizard voldoen niet. We hebben hiervoor een macro gemaakt. Na het klikken op de knop wordt die macro gestart, deze drukt het rapport af. Om die opdrachtknop op het formulier te plaatsen voeren we de volgende acties uit.
Copyright 2007 Academic Service
290
Databaseontwikkeling 4 Access 2003
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 gewenste 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 opdrachtknop op het scherm. Verander in het tabblad Overige, de eigenschappen Naam in Drukaf en Knopinfo in Factuur afdrukken. De tekst van de eigenschap Knopinfo wordt getoond zodra we met de muiswijzer boven de opdrachtknop komen. Selecteer het tabblad Opmaak en klik in de eigenschap Afbeelding op de drie puntjes. Hierdoor wordt een venster getoond met alle mogelijke 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 s 0,6 cm) en sleep de opdrachtknop naar zijn gewenste plaats. Figuur 9.14
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 toelichten. 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
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
291
door een percentage van het subtotaal. Het percentage van de annuleringsverzekering 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 formulier 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 hiervoor 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 formulier 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 ontwerpfase. Beide formulieren zijn nu geopend! Nu kunnen we de tekstvakken maken en controleren of de berekeningen goed zijn ingevoerd. We plaatsen eerst het tekstvak Subtotaal op het scherm. Klik met de muis op de knop Tekstvak in de Werkset en plaats het tekstvak in de Detailsectie. Plaats het eigenschappenvenster van het bijbehorende label op het scherm en wijzig de eigenschap Bijschrift, in het tabblad Opmaak, in Subtotaal. Klik op het zojuist gemaakte tekstvak en verander de eigenschap Naam, in het tabblad Overige, in Subtotaal. Klik op de tab Gegevens en verander de eigenschap Besturingselementbron in: =[Aantal volwassenen]*[Prijs per persoon]+[Aantal kinderen] *[Prijs per persoon]* (1-[Formulieren]![Constant]![KinderKortingPerc]). Gebruik eventueel de drie puntjes in de eigenschap Besturingselementbron om de Opbouwfunctie voor expressies te starten, zodat deze lange formule wat eenvoudiger is in te voeren.
Copyright 2007 Academic Service
292
Databaseontwikkeling 4 Access 2003
In deze formule wordt het subtotaal uitgerekend. Het bedrag dat voor de kinderen betaald moet worden, is gelijk aan het aantal kinderen s de prijs per persoon s (1 minus het kortingspercentage voor de kinderen). Het kortingspercentage voor de kinderen wordt uit het formulier Constant gehaald. Hierdoor wordt er flexibel gewerkt, we kunnen immers middels het formulier Constant eenvoudig een wijziging in het kortingspercentage aanbrengen. Wijzig de laatste eigenschap Notatie van het tekstvak, in het tabblad Opmaak, in Valuta. We kunnen ook als notatie Euro kiezen. Onafhankelijk van de valuta-instelling in Windows wordt dan altijd het euro-symbool getoond. Controleer de formule in de formulierweergave. Let op: als het formulier Constant niet geopend is, kan deze berekening niet uitgevoerd worden en wordt in het tekstvak, in de formulierweergave, de volgende foutmelding afgedrukt: #Naam?. Plaats vervolgens het tweede rekenveld op het formulier met de volgende eigenschappen: Bijschrift: Annuleringskosten Naam: Annuleringskosten Besturingselementbron: =IIf([Annuleringsverzekering]; [Formulieren]![Constant]![AnnuleerPerc] *[Subtotaal];0) Notatie: Valuta (of Euro). In de berekening wordt het subtotaal vermenigvuldigd met het percentage 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 volgende eigenschappen: Bijschrift: Totaal bedrag Naam: Totaal bedrag Besturingselementbron: =[Subtotaal]+[Annuleringskosten] Notatie: Valuta (of Euro). Sleep vervolgens de drie rekenvelden naar de gewenste plaats op het formulier en pas hun afmetingen aan.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
293
In het formulier zien we bij het veld Betaalwijze, in formulierweergave, de getallen 1, 2 of 3 staan. In paragraaf 6.1 hebben we voor de betaalwijze een groepsvak gemaakt, waarbij er drie mogelijkheden 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 groepsvak 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 schermen worden niet de labelnamen opgeslagen, maar de bijbehorende getallen. Geef in het volgende venster aan dat de geselecteerde optie opgeslagen 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 worden 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.
Copyright 2007 Academic Service
294
Databaseontwikkeling 4 Access 2003
Selecteer het label Contant en sleep het naar de gewenste plaats (nu wel het handje van de muiswijzer gebruiken, zodat het keuzevakje é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 worden, is het onzichtbaar maken van het kader. Denk erom dat het kader niet verwijderd kan worden, anders wordt het gehele groepsvak verwijderd. Selecteer het kader en activeer het eigenschappenvenster. Klik op de tab Opmaak en wijzig de eigenschap Randstijl in Transparant. Het formulier nadert zijn eindstadium. Er zijn nog enige wijzigingen 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 opdrachtknoppen, 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 verander 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 achtergrondkleur en zijn niet meer met de muis te benaderen. De adresgegevens en de reisgegevens zijn ook met de muis te benaderen. Hierdoor kunnen we per ongeluk gegevens wijzigen. Stel
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
295
dat we per ongeluk het veld Prijs per persoon wijzigen, dan geldt dat direct ook voor alle andere boekingen die naar die reis zijn geboekt. Of we wijzigen per ongeluk de vertrekdatum. Alle reizen naar die bestemming hebben dan direct die nieuwe vertrekdatum, met alle gevolgen van dien. Als de vertrekdatum van een reis wel moet worden gewijzigd, moet dat in het formulier Reis veranderd worden. We kunnen die velden niet uitschakelen zoals met de rekenvelden is gebeurd. We zouden dan niet meer kunnen zoeken op onze gegevens. Om te kunnen zoeken op een bepaald waarde, moeten we met de muis in het veld klikken, waarin gezocht moet worden. Vervolgens klikken we op de knop Zoek. Uitschakelen kan om die reden dus niet. Maar Access biedt uitkomst, we kunnen een eigenschap veranderen, waardoor we met de muis wel het veld kunnen selecteren, maar niet kunnen wijzigen. Selecteer tegelijkertijd, met Shift+muisklik, de velden: Naam, Adres, Woonplaats, Telefoonnummer, Aantal dagen, Prijs per persoon, 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 verplaatsen van onze velden hebben we geen logische tabvolgorde meer. De tabvolgorde kunnen we veranderen door, in de ontwerpweergave 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
Copyright 2007 Academic Service
296
Databaseontwikkeling 4 Access 2003
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 Boeking Het werken met macro’s is in hoofdstuk 8 toegelicht. De macro’s van onze toepassing zijn ondergebracht in macrogroepen, zie eventueel 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 voorbeeld zijn de macro’s van het formulier Boeking te vinden onder de naam frmBoeking in het overzicht Macro’s van het databasevenster. 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 knoppen 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 rapport op de printer afdrukken. De laatste macro sluit het formulier Constant als het formulier Boeking wordt gesloten.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
297
Figuur 9.16
Voer de eerste macro in zoals weergegeven in figuur 9.17, en sla de macrogroep op onder de naam frmBoeking. Figuur 9.17
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 geselecteerd 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 factuur in rapportvorm naar de printer gestuurd, zie figuur 9.18.
Copyright 2007 Academic Service
298
Databaseontwikkeling 4 Access 2003
Figuur 9.18
De macro frmBoeking.Afdrukken opent met de actie RapportOpenen 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 opdrachtknopwizard 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 worden. 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 (zichtbare) boekingnummer van het formulier Boeking. Hierdoor wordt alleen het rapport van de boeking die op het scherm staat geselecteerd en afgedrukt. Zoals te zien is in figuur 9.18, zijn er twee extra macro-acties toegevoegd. Indien een nieuw gemaakte boeking direct wordt afgedrukt, 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
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
299
voorkomen. We verplaatsen tijdelijk de recordwijzer naar het volgende record. De zojuist toegevoegde gegevens worden nu opgeslagen in de database. Vervolgens herstellen we de oorspronkelijke 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. Figuur 9.19
De macro frmBoeking.Sluit sluit met de actie Sluiten het formulier 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 formulier 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.Open gestart worden als het formulier Boeking wordt geopend. De macro frmBoeking.Afdrukken moet gestart worden na het klikken op de opdrachtknop met printerpictogram. De laatste macro frmBoeking. Sluit moet geactiveerd worden als het formulier Boeking wordt gesloten.
Copyright 2007 Academic Service
300
Databaseontwikkeling 4 Access 2003
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. Figuur 9.20
Hierdoor wordt bij het openen van het formulier Boeking de macrogroep frmBoeking geopend en de macro frmBoeking.Open gestart. Die opent vervolgens ‘automatisch’ het formulier Constant, die noodzakelijk is voor het formulier Boeking. Op identieke wijze hebben we in hetzelfde venster in de eigenschap Bij sluiten de macro frmBoeking.Sluit geselecteerd, zie 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.
Copyright 2007 Academic Service
301
9 Het bouwen van een toepassing
Figuur 9.21
Het formulier wordt alleen gebruikt voor het afdrukken van de vertreklijst. We kunnen een datumbereik opgeven, waarna het rapport van de Vertreklijst van alle reizen die voldoen aan het ingevoerde bereik wordt afgedrukt. 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 voorgaande formulieren, zie eventueel figuur 9.4. Alleen de eigenschap Bijschrift is Datumbereik voor vertreklijst geworden. Plaats vervolgens twee tekstvakken in het venster. De labels krijgen de teksten Begindatum: en Einddatum:. Selecteer het eerste tekstvak en activeer het eigenschappenvenster. Verander de eigenschap Naam, tabblad Overige, in Begindatum. Voer dezelfde opdrachten uit voor het tweede tekstvak en kies als naam Einddatum. Om ervoor te zorgen dat datums ingevoerd kunnen worden, veranderen 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. Tekstvak
Eigenschap
Instelling
Begindatum
Standaardwaarde Validatieregel Validatietekst
Date()+1 <=[Einddatum] Datumbereik is niet correct.
Einddatum
Standaardwaarde Validatieregel Validatietekst
Date()+8 >=[Begindatum] Datumbereik is niet correct.
Copyright 2007 Academic Service
302
Databaseontwikkeling 4 Access 2003
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 eigenschappenvenster. 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 middel 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 achtergrondkleur 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 vertreklijst Onder de opdrachtknoppen OK en Annuleer worden macro’s gestart. De macro’s van het formulier Datumbereik vertreklijst krijgen als naam voor de macrogroep frmDatumbereik vertreklijst, zie figuur 9.22. Klik op de knop Nieuw, in het overzicht Macro’s van het databasevenster. 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
Copyright 2007 Academic Service
303
9 Het bouwen van een toepassing
Figuur 9.22
records in dit rapport te beperken tot die welke voldoen aan de waarden van de datums op het formulier Datumbereik vertreklijst, moet een voorwaarde ingevoerd worden bij het argument WHERE-voorwaarde. Het besturingselement Vertrekdatum komt uit het rapport Vertreklijst. Vervolgens wordt aangegeven dat de vertrekdatum tussen de twee datums uit de tekstvakken van het formulier Datumbereik vertreklijst moet liggen. We moeten de volledige beschrijving gebruiken voor de verwijzing naar de beide tekstvakken. Deze kunnen eventueel met de opbouwfunctie voor expressies ingevoerd worden. Macro frmDatumbereik vertreklijst.OK Actie
Argument
Instelling
RapportOpenen
Rapportnaam
Vertreklijst
Beeld
Afdrukken
WHERE-voorwaarde
[Vertrekdatum] Between [Formulieren]![Datumbereik vertreklijst]![BeginDatum] And [Formulieren]![Datumbereik vertreklijst]![Einddatum]
Opslaan
Nee
Sluiten
Terzijde Merk op dat Between en And ook in de Nederlandse versie van Access in het Engels ingevoerd moeten worden.
Copyright 2007 Academic Service
304
Databaseontwikkeling 4 Access 2003
De tweede actie sluit direct na het printen automatisch het formulier 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. Macro frmDatumbereik vertreklijst.Annuleer Actie
Argument
Instelling
Sluiten
Opslaan
Nee
De volledige macro is zichtbaar in figuur 9.22. De enige actie van deze macro is het sluiten van het actieve formulier. Deze opdrachtknop 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 formulier 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 toepassing van reisbureau ’t Zonnetje behoren. Er zijn vier rapporten nodig. In de eerste plaats een rapport voor het afdrukken van de boekinggegevens in factuurvorm. Dit rapport kan worden opge-
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
305
roepen vanuit het formulier Boeking. Klikken we in het formulier Boeking op de opdrachtknop met het printericoontje, dan wordt de macro frmBoeking.Afdrukken gestart. Die macro is besproken in de paragraaf van het formulier Boeking. Het ligt voor de hand om eerst het rapport te maken. Is het rapport naar wens, dan kan de macro gemaakt worden. Het tweede rapport is een alfabetische klantenlijst; het derde een overzicht van vertrekkende reizigers, de Vertreklijst. Als laatste maken we een rapport waaruit we kunnen aflezen wat de omzet per reis is en de totale omzet van het reisbureau. Deze drie rapporten 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
Copyright 2007 Academic Service
306
Databaseontwikkeling 4 Access 2003
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 kinderen en Nog te betalen. Behalve de postcode zijn de andere gegevens zogenoemde procesgegevens: gegevens die op eenvoudige wijze uit andere gegevens berekend kunnen worden. Hierbij dient opgemerkt te worden dat de Prijs per kind gelijk is aan de Prijs per persoon 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 kunnen 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 rapport, met de naam rptBoeking, met de gegevens die in het rapport komen, exclusief de procesgegevens. De benodigde velden worden in figuur 9.24 getoond. Figuur 9.24
Tabel
Veld
Boeking
* (alle velden)
Klant
Naam Adres Postcode Woonplaats Telefoonnummer
Reis
Vertrekdatum Aantal dagen Prijs per persoon
Bestemming
Plaats Land Werelddeel
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 aangegeven. In de tabel Boeking kunnen we het sterretje selecteren, hierdoor worden alle velden uit de tabel Boeking geselecteerd.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
307
Sla nadat alle velden zijn opgegeven de query op met de naam rptBoeking. Hieraan kunnen we zien dat deze query bij het rapport boeking hoort. Het rapport is niet een standaardrapport dat snel met de Wizard te maken is. We moeten een eigen lay-out ontwerpen. Wel kunnen 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 volgende 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 eenvoudig 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 moeten we niet voorbij het raster komen dat wordt getoond in de ontwerpweergave. De gegevens passen anders niet, of niet vol-
Copyright 2007 Academic Service
308
Databaseontwikkeling 4 Access 2003
ledig, binnen de breedte van het papier. De labels van de besturingselementen 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 besturingselementen 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 persoon] * (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.
Figuur 9.25
Deze formule kan ook via de Opbouwfunctie voor expressies opgebouwd worden, zoals in hoofdstuk 8 is toegelicht. Het kortingspercentage voor kinderen komt uit de tabel Constant. Aangezien
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
309
het formulier Constant al geopend is, bij het boeken van de reis, kunnen we dat formulier nu ook gebruiken. Ontwerpen we dit rapport onafhankelijk van het formulier Boeking, dan moet het formulier Constant eerst nog geopend worden om deze berekening te kunnen maken! We kunnen controleren of het rekenveld goed werkt door een afdrukvoorbeeld van het rapport te laten tonen. Kies uit de menubalk Beeld, Afdrukvoorbeeld of doe dit via de knop Beeld op de werkbalk. Krijgen we een foutmelding zoals #Naam? of #Fout, open dan eerst het formulier Constant. Het rekenveld voor het totale bedrag van de volwassenen wordt op soortgelijke wijze gemaakt. Selecteer opnieuw een tekstvak in de Werkset en verplaats de muis naar de positie waar het besturingselement moet komen. Het label dat automatisch wordt gecreëerd bij het tekstvak kunnen we verwijderen (eerst selecteren en vervolgens op de Delete-toets drukken). Verander de eigenschappen Naam en Besturingselementbron van het nieuwe tekstvak in respectievelijk Totaal volwassenen en =[Aantal volwassenen] *[Prijs per persoon]. Controleer de werking 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. Figuur 9.26
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]
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 percentage uit het formulier Constant. Heeft men geen annuleringsverzekering 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 (;).
Copyright 2007 Academic Service
310
Databaseontwikkeling 4 Access 2003
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 teksten 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 volledige 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 syntaxis van de functie luidt: Switch(expr-1; waarde-1[; expr-2; waarde-2 ... [; expr-n,waarde-n]]). Hiermee kunnen we paren expressies en waarden opgeven.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
311
Bijvoorbeeld: Switch([SoortRelatie]= “D”; ”Debiteur”;[SoortRelatie]=”C”; “Crediteur”) of Switch([Betaalwijze] =1; ”Contant”; [Betaalwijze]=2; ”Pinnen”; [Betaalwijze]=3; ”Acceptgiro”). De rekenvelden moeten nog van een juiste opmaak worden voorzien. 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 rapportkoptekst. Maak ruimte voor de paginakoptekst door de balk van de detailsectie omlaag te slepen. In de paginakoptekst worden de gegevens van het reisbureau getoond, zie figuur 9.23. De teksten zijn allemaal labels. Het label met het bijschrift Boeking kan uit de Rapportkoptekst 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 eigenschappen Pagina en Pagina’s. Aangezien in dit rapport maar één pagina wordt afgedrukt, verwijderen we dat tekstvak.
Copyright 2007 Academic Service
312
Databaseontwikkeling 4 Access 2003
Willen we op een ander rapport wel die informatie afdrukken, ga dan als volgt te werk. Plaats een tekstvak in de voettekst. Start in de eigenschap Besturingselementbron de Opbouwfunctie voor expressies. Kies in de linkerkolom van het opbouwfunctievenster voor Gangbare expressies. Maak vervolgens uit de middelste kolom een keuze. Het rapport is nu bijna klaar en het toont alle gewenste gegevens, hoewel dat er iets te veel kunnen zijn. Als er namelijk geen kinderen mee op reis gaan, wordt bij Aantal kinderen de waarde 0 afgedrukt, de Prijs per kind wordt getoond en Totaal kinderen heeft ook als waarde 0. We willen die regel in het rapport dan niet tonen. Hiervoor moet een macro gemaakt worden; deze maken we onder de groepsnaam rptBoeking, zodat we direct kunnen zien dat die macro bij het rapport Boeking hoort. Macro van het rapport Boeking We moeten een macro maken die controleert of in de gemaakte boeking ook kinderen op reis gaan. Als er geen kinderen op de boeking staan vermeld, wordt in het rapport geen informatie over kinderen vermeld. Binnen de macrogroep krijgt die macro de naam ToonKinderen (zie figuur 9.27). De volledige macro wordt getoond in figuur 9.27. Figuur 9.27
Copyright 2007 Academic Service
313
9 Het bouwen van een toepassing
Macro rptBoeking.ToonKinderen Voorwaarde
Actie
Argument
Instelling
[Aantal kinderen]=0
WaardeInstellen
Item Expressie
[Aantal kinderen].[Visible] Nee
…
WaardeInstellen
Item Expressie
[Aantal kinderen Bijschrift].[Visible] Nee
…
WaardeInstellen
Item Expressie
[Prijs per kind].[Visible] Nee
…
WaardeInstellen
Item Expressie
[Label prijs per kind].[Visible] Nee
…
WaardeInstellen
Item Expressie
[Totaal kinderen].[Visible] Nee
…
MacroStoppen WaardeInstellen
Item Expressie
[Aantal kinderen].[Visible] Ja
WaardeInstellen
Item Expressie
[Aantal kinderen Bijschrift].[Visible] Ja
WaardeInstellen
Item Expressie
[Prijs per kind].[Visible] Ja
WaardeInstellen
Item Expressie
[Label prijs per kind].[Visible] Ja
WaardeInstellen
Item Expressie
[Totaal kinderen].[Visible] Ja
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 drukken. 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
Copyright 2007 Academic Service
314
Databaseontwikkeling 4 Access 2003
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 hersteld, 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 macrogroep 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 eigenschappenvenster 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 macrogroep rptBoeking geopend en de macro rptBoeking.ToonKinderen gestart. Open ter controle het formulier Boeking en laat een boeking in factuurvorm op de printer afdrukken. 9.4.2
Rapport Klantenlijst
Nu volgt het eenvoudigste rapport van de toepassing: een alfabetische 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.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
315
Figuur 9.28
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 aangeven. In het klantenoverzicht komen die niet voor. In het volgende venster wordt de sorteervolgorde aangegeven, kies voor Naam. Kies hierna de optie In tabelvorm en Staand. In het voorlaatste venster kan een stijl opgegeven worden, kies de stijl Vet. Geef het rapport de titel (naam) Klantenlijst. Een voorbeeld van de klantenlijst wordt vervolgens op het beeldscherm getoond. Het kan zijn dat niet alle kopteksten volledig worden weergegeven. Dat heeft te maken met de printer die is aangesloten en ingesteld in Windows. Onze lijsten worden afgedrukt met een HP Laserjet 5000 en daarmee zijn de kopteksten Postcode en Telefoonnummer niet volledig te zien. Mocht dit bij de gebruikte printer ook het geval zijn, dan is dat op de volgende wijze eenvoudig te verhelpen. Plaats het rapport in de ontwerpweergave. Maak het label Adres in de Paginakoptekst iets korter. Verplaats hierna het label Postcode iets naar links en maak het iets langer. Het label
Copyright 2007 Academic Service
316
Databaseontwikkeling 4 Access 2003
Postcode is nu zichtbaar. Doe hetzelfde met de labels Woonplaats en Telefoonnummer. Eventueel kunnen we de kopteksten ook inkorten, bijvoorbeeld Telefoonnummer wijzigen in Telefoonnr. Controleer vervolgens de wijzigingen in het afdrukvoorbeeld. Macro van het rapport Klantenlijst Het rapport Klantenlijst is klaar. Als we het rapport openen, wordt het als afdrukvoorbeeld getoond. In de uiteindelijke toepassing moet de klantenlijst direct afgedrukt kunnen worden. Hiervoor hebben we een macro nodig. Die macro wordt gestart vanuit een menu-item dat met schakelborden wordt gemaakt. Meer hierover is te vinden in paragraaf 9.5, Schakelborden. We kunnen hierdoor de macro nog niet testen. Voor de macro is de macrogroep rptKlantenlijst gemaakt. Macro rptKlantenlijst.Afdrukken Actie
Argument
Instelling
RapportOpenen
Rapportnaam Beeld
Klantenlijst Afdrukken
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 vertreklijst. 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
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
317
Figuur 9.29
tabel Klant de velden Naam en Woonplaats. Als laatste nemen we uit de tabel Boeking de velden Aantal volwassenen en Aantal kinderen. Hierna gaan we het nieuwe rapport maken. Selecteer in het overzicht 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, namelijk op vertrekdatum en daarbinnen op reisnummer. Kies eerst het groepeerniveau Vertrekdatum. Standaard wordt in Access op datumvelden per maand gegroepeerd. Dat is in ons voorbeeld niet wenselijk en we gaan dat aanpassen.
Klik op Opties voor groeperen.... Kies bij Groepeerintervallen voor Normaal en klik op OK.
Copyright 2007 Academic Service
318
Databaseontwikkeling 4 Access 2003
Figuur 9.30
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 rapport. Het resultaat wordt getoond als afdrukvoorbeeld. De koptekst van het rapport is niet helemaal naar wens. We kunnen 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.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
319
Maak in dezelfde sectie, Paginakoptekst, het label Volw. aan de linkerkant iets kleiner en maak het label Woonplaats aan de rechterkant iets groter, zodat het volledig wordt getoond. Het rapport is bijna gereed, we kunnen nog een verfijning aanbrengen. Het rapport wordt gestart door het formulier Datumbereik vertreklijst. In dat formulier kunnen we een begin- en een einddatum 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 rptVertreklijst. Macro van het rapport Vertreklijst We 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
Copyright 2007 Academic Service
320
Databaseontwikkeling 4 Access 2003
Macro rptVertreklijst.GeenGegevens Actie
Argument
Instelling
Bericht Pieptoon Type Titel
Bereik levert geen gegevens op. Nee Informatie Bericht
GebeurtenisAnnuleren Berichtvenster
AlleMacrosStoppen
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, frmDatumbereik vertreklijst.Ok. Die macro heeft maar twee acties: de eerste 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 rptVertreklijst.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 formulier 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 reisnummer afgedrukt. Ook het percentage dat het reisnummer heeft bijgedragen 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.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
321
Figuur 9.32
De omzetlijst is gemaakt met de Wizard Rapport. Hierna zijn enkele kleine cosmetische veranderingen aangebracht. De omzetlijst is als volgt gemaakt. Om de omzet te bepalen is de tabel Constant noodzakelijk. De prijs per kind is namelijk afhankelijk van de korting die wordt gegeven voor een kind. Kinderen krijgen een kortingspercentage op de Prijs per persoon. Dat percentage is vastgelegd in de tabel Constant in het veld KinderKortingPerc. In onze voorbeelden hebben we geen gebruik gemaakt van de tabel Constant, maar van het formulier Constant, dat uiteraard dezelfde gegevens bevat. In onze voorbeelden hebben we hiervoor gekozen omdat de tabel Constant niet in alle situaties is toegestaan. Het formulier Constant kan wel altijd gebruikt worden. Voor het ontwerpen van het rapport moet het formulier Constant geopend worden, we hebben immers gegevens uit dat formulier nodig. Als het rapport gereed is, zorgen we er met behulp van macro’s voor dat het formulier Constant automatisch verborgen wordt geopend en gesloten.
Copyright 2007 Academic Service
322
Databaseontwikkeling 4 Access 2003
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 Reis en een andere tabel worden reisnummers die niet geboekt zijn niet getoond. Hiervoor moeten we een speciale relatie leggen, een zogeheten left of right outer join. Dubbelklik op de relatie die getoond wordt op het scherm tussen de tabel Reis en de tabel Boeking. Hierdoor wordt een venster getoond met de Joineigenschappen, zie figuur 9.33. 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 Reis als eerste geopend moet worden. Hierdoor staat de tabel aan de linkerkant ten opzichte van de overige tabellen. We hadden de tabel Reis ook als laatste kunnen selecteren. De tabel staat dan aan de rechterkant van de andere tabellen. Optie 3 uit het venster Joineigenschappen moet dan geselecteerd worden, een zogenaamde right outer join.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
323
Hierna selecteren we de velden voor de omzetlijst. Kies uit de tabel Reis de velden Reisnummer en Vertrekdatum. Kies uit de tabel Bestemming de velden Plaats en Land. Kies ten slotte uit de tabel Boeking het veld Betaald bedrag. Maak vervolgens een rekenveld Omzet. Klik met de muis in het eerstvolgende lege vakje van de rij Veld. Plaats daar de volgende formule, eventueel gebruikmakend van Shift-F2 (zoomen): Omzet: [Aantal volwassenen]*[Prijs per persoon] +[Aantal kinderen]*[Prijs per persoon]*(1-[Formulieren]![Constant]! [KinderKortingPerc]). We zien dat in deze berekening het formulier Constant is gebruikt. Controleer de query in de gegevensbladweergave. 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 worden 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.
Copyright 2007 Academic Service
324
Databaseontwikkeling 4 Access 2003
Figuur 9.34
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ïnteresseerd 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 worden. 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.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
325
Verwijder uit de sectie Detail de besturingselementen Betaald bedrag en Omzet. Selecteer in de sectie Detail tegelijkertijd de besturingselementen Vertrekdatum, Plaats en Land (Shift+muisklik). Sleep ze onder de bijbehorende labels in de sectie Koptekst (Reisnummer). Verwijder de detailsectie door de Voettekst (Reisnummer) omhoog te slepen (voettekstbalk vastzetten tegen detailbalk). Als we de detailbalk, in de eerste actie, te veel naar beneden hebben gesleept, kunnen we deze nu omhoog slepen. Het label behorende bij het percentage heeft als tekst Standaard (foutje in Access). We gaan die tekst veranderen in Percentage. Selecteer het label Standaard in de sectie Voettekst (Reisnummer) en wijzig de eigenschap Bijschrift, in het tabblad Opmaak, in Percentage. Door de langere tekst dient tevens de grootte van het label vergroot te worden. De som van Betaald bedrag en die van Omzet worden niet in de opmaak Valuta getoond. Selecteer het tekstveld Som Van Betaald bedrag en wijzig in de tab Opmaak de eigenschap Notatie in Valuta of Euro. Voer dit tevens uit voor het tekstveld Som Van Omzet. Het totaal betaalde bedrag en de totale omzet, die op de laatste pagina worden getoond, zijn ook niet voorzien van de opmaak Valuta. Die twee tekstvelden staan in het rapport in de sectie Rapportvoettekst. Verander ook voor die twee tekstvelden de eigenschap Notatie in Valuta of Euro. Bekijk het resultaat als afdrukvoorbeeld. Let in het bijzonder op de reizen die meermalen geboekt zijn. De labels vertrekdatum en Betaald bedrag worden niet volledig getoond (afgedrukt op een HP Laserjet 5000). Ook het euro-symbool wordt bij het totale omzetbedrag niet getoond. We kunnen dit eenvoudig veranderen door de labels iets groter te maken. Plaats het rapport in de ontwerpweergave. Selecteer het label Vertrekdatum en maak het aan de rechterkant iets groter. Selecteer het label Betaald bedrag en maak het aan de linkerkant iets groter. Kies in sectie Rapportvoettekst het tekstvak Omzet Eindtotaal Som en maak het aan de rechterkant iets langer.
Copyright 2007 Academic Service
326
Databaseontwikkeling 4 Access 2003
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 printer 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 eigenschappen (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 wensen 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 aangepast worden. Verander in het tabblad Opmaak de eigenschap Nieuwe rij of kolom in Voor en Na sectie. In dit rapport wordt gebruikgemaakt van het formulier Constant en niet van de tabel Constant. Het zou in dit rapport een foutmelding 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
Copyright 2007 Academic Service
327
9 Het bouwen van een toepassing
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 Omzetlijst Bij 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 paragraaf 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 Beeld Venstermodus
Constant Formulier Verborgen
Copyright 2007 Academic Service
328
Databaseontwikkeling 4 Access 2003
Macro rptOmzetlijst.Sluiten Actie
Argument
Instelling
Sluiten
Objecttype Objectnaam Opslaan
Formulier Constant Nee
De volledige macro wordt getoond in figuur 9.35. Het formulier Constant wordt gesloten. Opslaan is niet noodzakelijk, er is immers niets veranderd. Macro rptOmzetlijst.Afdrukken Actie
Argument
Instelling
RapportOpenen
Rapportnaam Beeld
Omzetlijst Afdrukken
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 schakelbord 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 verward mogen worden met menubalken. Deze menu’s worden
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
329
gemaakt met vensters. Om naamsverwarring te voorkomen worden ze binnen Access schakelborden genoemd. Het hoofdmenu van de toepassing wordt door het schakelbord getoond in figuur 9.36. Figuur 9.36
Menu’s en submenu’s zijn in Access eenvoudig te maken met schakelborden. 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 binnen reisbureau ’t Zonnetje, vandaar dat het direct te selecteren is in het hoofdmenu. Kiezen we één van de twee overige items uit het hoofdmenu, dan komen we in de submenu’s. Verder komt in ieder menu een keuzemogelijkheid Sluiten om één menuniveau terug te selecteren. In het hoofdmenu wordt dan de toepassing afgesloten.
Hoofdmenu Boekingen Overzichten Onderhoud Sluiten
Copyright 2007 Academic Service
330
Databaseontwikkeling 4 Access 2003
Kiezen we in het hoofdmenu het item Overzichten, dan komen we in het submenu Overzichten. Hierin wordt een overzicht getoond van alle mogelijke overzichten (rapporten/lijsten) binnen de toepassing. Na het selecteren worden de rapporten op de printer afgedrukt.
Submenu Overzichten Klantenlijst Vertreklijst Omzetlijst Sluiten Na de keuze Onderhoud uit het hoofdmenu komen we in het submenu Onderhoud. Hierin kunnen we een keuze maken uit het onderhouden van de basisgegevens. Zo kunnen we toevoegen, verwijderen en wijzigingen doorvoeren in de basisgegevens.
Submenu Onderhoud Klanten Reizen Bestemmingen Constanten Sluiten 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
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
331
blijken uit de toelichting, enige persoonlijke aanpassingen aanbrengen. Het onderdeel schakelbordbeheer opent het dialoogvenster Schakelbordbeheer, zie figuur 9.37. Figuur 9.37
In dit venster kunnen we menu’s en schakelbordpagina’s opgeven. Standaard wordt al één hoofdmenu aangemaakt, namelijk Hoofdschakelbord. We gaan twee nieuwe (sub)menu’s (schakelborden) maken. Klik op de knop Nieuw. In het venster kunnen we de naam van het nieuwe schakelbord opgeven. Wijzig de naam in Overzichten en klik op OK. Klik nogmaals op de knop Nieuw, wijzig de naam in Onderhoud en klik op OK. De drie menu’s (schakelborden) zijn nu gemaakt. Vervolgens moeten de menu’s van items worden voorzien. Selecteer Hoofdschakelbord en klik op Bewerken. In dit dialoogvenster kunnen we de items (onderdelen) van het hoofdmenu opgeven, zie figuur 9.38. Figuur 9.38
Copyright 2007 Academic Service
332
Databaseontwikkeling 4 Access 2003
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. 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 geselecteerd. 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 toepassing 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 Schakelbordpagina bewerken. Voer achtereenvolgens in: Onderhoud, Naar Schakelbord gaan en Onderhoud. Klik vervolgens op de knop OK. Ten slotte is het de bedoeling dat een menu afgesloten kan worden. Het hoofdmenu wordt afgesloten terwijl de submenu’s terugkeren naar het hoofdmenu.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
333
Klik voor de laatste keer voor het hoofdmenu op de knop Nieuw. Voer achtereenvolgens in: Sluiten en Toepassing afsluiten. Merk op dat er maar twee items zijn. Klik hierna op de knop OK. Het hoofdmenu is klaar. Klik op de knop Sluiten in het venster Schakelbordpagina bewerken. Er dient nog opgemerkt te worden dat in dit menu ook items gewijzigd of verwijderd kunnen worden, of op een andere plaats in het menu gezet kunnen worden met de knoppen Omhoog en Omlaag. Verder is het belangrijk te weten dat er maximaal acht items in één menu passen. Nu moeten de 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 rapport 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 willen het rapport echter direct naar de printer sturen, vandaar dat de macro voor het rapport Klantenlijst noodzakelijk is. Klik na de selecties op de knop OK. Voer de vorige acties nog drie maal uit. Hieronder volgt een beschrijving van de gegevens die moeten worden ingevoerd. Argument
Instelling
Tekst
Vertreklijst
Opdracht
Formulier openen in bewerkingsmodus
Formulier
Datumbereik vertreklijst
Copyright 2007 Academic Service
334
Databaseontwikkeling 4 Access 2003
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 afdrukt, aangezien dat door de macro van het formulier Datumbereik vertreklijst wordt uitgevoerd. Argument
Instelling
Tekst
Omzetlijst
Opdracht
Macro uitvoeren
Macro
rptOmzetlijst.Afdrukken
De omzetlijst dient met een macro gestart te worden, zodat deze direct naar de printer gestuurd kan worden. Argument
Instelling
Tekst
Sluiten
Opdracht
Naar Schakelbord gaan
Schakelbord
Hoofdmenu
Kiezen we deze optie in het menu, dan gaan we één niveau terug, naar het hoofdmenu. De menu-items voor het submenu Overzichten zijn gedefinieerd; we kunnen het venster Schakelbordpagina bewerken afsluiten door op de knop Sluiten te klikken. Het laatste schakelbord (submenu Onderhoud) gaan we op dezelfde wijze maken. Selecteer in het venster Schakelbordbeheer de optie Onderhoud en klik op de knop Bewerken. Hierna moeten de vijf items uit het submenu Onderhoud gedefinieerd worden. We doen dit op dezelfde wijze als bij het submenu Overzichten. Hieronder volgen de gegevens die ingevoerd moeten worden. Argument
Instelling
Tekst
Klanten
Opdracht
Formulier openen in bewerkingsmodus
Formulier
Klant
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
335
Het formulier Klant wordt geactiveerd onder dit item: Argument
Instelling
Tekst
Reizen
Opdracht
Formulier openen in bewerkingsmodus
Formulier
Reis
Het formulier Reis wordt geopend onder dit item: Argument
Instelling
Tekst
Bestemmingen
Opdracht
Formulier openen in bewerkingsmodus
Formulier
Bestemming
Het formulier Bestemming wordt geactiveerd onder dit item: Argument
Instelling
Tekst
Constanten
Opdracht
Formulier openen in bewerkingsmodus
Formulier
Constant
Het formulier Constant wordt geopend onder dit item. Argument
Instelling
Tekst
Sluiten
Opdracht
Naar Schakelbord gaan
Schakelbord
Hoofdmenu
Wordt deze optie uit het menu gekozen, dan gaan we één niveau terug, naar het hoofdmenu. De menu-items voor submenu Overzichten zijn 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 databasevenster 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
Copyright 2007 Academic Service
336
Databaseontwikkeling 4 Access 2003
Schakelbord op een aantal punten aanpassen, zodat het overeenstemt met onze overige formulieren. We kunnen het formulier Schakelbord aanpassen aan onze eigen wensen zolang de detailsectie, 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 eigenschap Tekengewicht in Vet. Nu plaatsen we de gebruikte lichtgele formulierkleur in de detailsectie. 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 afbeelding. 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.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
337
Om de toepassing volledig te maken moeten we nog een verandering 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 methode, 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. 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 pictogram voor onze database staan, genaamd ’t Zonnetje.ico. Door te klikken op de drie puntjes kunnen we aangeven waar het pictogram 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 pictogram, een tropisch eiland, zichtbaar. Verwijder het vinkje bij Databasevenster weergeven. Hierdoor wordt het databasevenster niet meer getoond. Verwijder ook het
Copyright 2007 Academic Service
338
Databaseontwikkeling 4 Access 2003
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 opmaakopdrachten 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 toepassing. 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 tussen 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 toepassing 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 kunnen 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.
Copyright 2007 Academic Service
9 Het bouwen van een toepassing
339
Iedereen die weet dat een toepassing volledig te benaderen is door deze op te starten met de Shift-toets ingedrukt, kan eenvoudig (ongewenste) wijzigingen aan onze toepassing aanbrengen. We kunnen een compacte versie van de database maken door in het menu Extra voor Databasehulpprogramma’s te kiezen. Selecteer vervolgens Mde-bestand maken. Het hulpprogramma vraagt om een naam en locatie voor het opslaan van onze compacte 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 versie! Als we de applicatie willen verspreiden onder gebruikers die niet over een volledige versie van Access beschikken, kunnen we een speciaal pakket kopen, genaamd Access Developer Extentions. Hiermee kunnen we een runtime-versie van onze toepassingen maken en deze distribueren.
Copyright 2007 Academic Service
Copyright 2007 Academic Service
10
SQL, Structured Query Language
Bij de bovenstaande opsomming gaan we ervan uit dat de leerlingen 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 databasemanagementsystemen (DBMS’en) zijn Oracle, Ingres, SQLserver en DB2. Een kenmerk van deze pakketten is dat ze geschikt zijn voor het bedienen van vele gebruikers tegelijkertijd en het verwerken van grote hoeveelheden gegevens. Als gebruikers informatie willen opvragen uit de gebruikte database, dienen zij zich te bedienen van de vraagtaal die in het gebruikte pakket is opgenomen. In principe betekent dit dat voor ieder DBMS een andere vraagtaal moet worden gebruikt. Gelukkig ondersteunen vrijwel alle pakketten tegenwoordig een gemeenschappelijke vraagtaal: SQL. SQL, Structured Query Language, is in eerste aanzet ontwikkeld door IBM, maar intussen geëvolueerd tot een standaard. Kunnen we werken met deze vraagtaal, dan betekent dit dus dat we informatie kunnen opvragen uit vele databasesystemen.
Copyright 2007 Academic Service
342
Databaseontwikkeling 4 Access 2003
In dit hoofdstuk zullen we ons beperken tot het formuleren van query’s. Het toevoegen van gegevens aan de database of het wijzigen hiervan zal slechts zijdelings worden besproken. De reden daarvoor is het feit dat bij het toevoegen en wijzigen van gegevens vrijwel altijd gebruikgemaakt wordt van een applicatieprogramma, 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 applicaties ontwikkeld worden. Het is echter ondoenlijk om voor iedere informatiebehoefte, zeker voor die welke slechts sporadisch optreden, een applicatie op te zetten. Dat kost te veel tijd en geld. Binnen Access kunnen we voor het opvragen van informatie altijd gebruikmaken van 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. Enerzijds kunnen we met SQL terecht bij ieder modern DBMS, waaronder Oracle of DB2. Anderzijds zijn er enkele soorten opvragingen en bewerkingen die we binnen Access alleen maar met SQL kunnen uitvoeren. We kunnen dus ook binnen Access niet om SQL heen.
10.2
Begrippen
Ter herinnering enige begrippen. SQL ziet de gegevens alsof deze liggen opgeslagen in tabellen. Tijdens het logisch ontwerp spraken we over entiteittypen. Een tabel bestaat uit een aantal rijen (oftewel entiteit-occurrences) en kolommen (oftewel attribuuttypen). kolommen
Tabel ARTIKEL Rijen
Artikelnummer
Omschrijving
Verkoopprijs
Voorraad
Leveranciercode
64447 75558 84494 46644 enzovoort
V-snaar Accu Stuurhoes Binnenspiegel
56,00 225,00 23,95 37,50
5 2 4 1
J3633 K3773 P4774 J3633
Copyright 2007 Academic Service
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 primaire sleutel. In de tabel Artikel is dat het artikelnummer. In een rij kunnen gegevens voorkomen die verwijzen naarde sleutel van een (andere) tabel. Deze gegevens (of combinatie ervan) worden vreemde sleutel (foreign key) genoemd. Een voorbeeld hiervan is de leveranciercode. Die verwijst immers naar een soortgelijke tabel waarin de gegevens van de leveranciers liggen opgeslagen en waar we een leverancier kunnen 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 databases. De eerste betreft een database van een bibliotheek, die zal worden gebruikt om de theorie toe te lichten aan de hand van enige voorbeelden. Daarnaast dient een aantal opdrachten te worden gemaakt, waarbij deze database moet worden gebruikt. Deze opdrachten kunnen niet op de computer worden uitgewerkt, omdat de betreffende database alleen op papier bestaat. De antwoorden van de opdrachten staan op de meegeleverde cd-rom bij dit boek. De tweede database betreft een database van een groothandel in alcoholische dranken. Vraag deze aan de docent. De naam is Alco en hij zal worden gebruikt om je vaardigheden in de praktijk te toetsen. De praktijkgerichte opdrachten moeten worden uitgewerkt met behulp van deze database.
Copyright 2007 Academic Service
344
Databaseontwikkeling 4 Access 2003
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 Lezernr Naam Adres Postcode Plaats Telefoon Geboortedatum * Filiaalnr FILIAAL Filiaalnr FilAdres FilPostcode FilPlaats FilTelefoon
UITGAVE ISBN Titel Schrijver Uitgeverij Prijs
UITLENING * Lezernr * Exemplaarnr * Huurdatum * Retourdatum (datum waarop * boek is teruggebracht)
EXEMPLAAR Exemplaarnr * Filiaalnr * ISBN
RESERVERING * Lezernr * ISBN * Datum
De primaire sleutels zijn onderstreept. Vreemde sleutels zijn voorzien van een sterretje. Het bijbehorende ER-diagram is weergegeven in figuur 10.1. o.b.v. ISBN
Figuur 10.1
Reservering
o.b.v. ISBN
Uitgave
o.b.v. lezernr
Filiaal
Lezer
o.b.v. filiaalnr
Exemplaar
o.b.v. filiaalnr
o.b.v. lezernr Uitlening
Copyright 2007 Academic Service
o.b.v. exemplaarnr
345
10 SQL, Structured Query Language
10.5
Database Alco (praktijkopdrachten)
Een groothandel in alcoholische dranken maakt onder meer gebruik van de onderstaande tabellen. ARTIKEL Artikelcode * Soortnr Jaar Inhoud Adviesverkoopprijs Opvoorraad
SOORT Soortnr * Productgroepnr Naam Kleur Alcoholpercentage
PRODUCTGROEP Productgroepnr Productnaam
FACTUUR Factuurnummer * Afnemernummer Factuurdatum
FACTUURREGEL * Factuurnummer * Artikelcode Verkoopaantal Verkoopprijs
AFNEMER Afnemernummer Naam Adres Postcode Plaats Regio
De primaire sleutels zijn onderstreept. Vreemde sleutels zijn voorzien van een sterretje. Het bijbehorende ER-diagram is weergegeven in figuur 10.2. Figuur 10.2
factuurregel
factuur
o.b.v. factuurnr
afnemer o.b.v. afnemernr
o.b.v. artikelcode Artikel
Soort o.b.v. soortnr
10.6
Productgroep
o.b.v. productgroepnr
Opvragingen uit één tabel
De volgende voorbeelden hebben betrekking op de bibliotheekdatabase. Om gegevens uit tabellen op te vragen moeten we gebruikmaken van het SELECT-commando, dat de volgende opbouw bezit:
Copyright 2007 Academic Service
346
Databaseontwikkeling 4 Access 2003
SELECT
[,] FROM [ WHERE ] ; De teksten tussen de scherpe haken <> geven aan dat daar de betreffende gegevens dienen te worden ingevuld. Alles tussen rechte haken [] geeft aan dat het gebruik van dat gedeelte toegestaan, maar niet verplicht is. De afsluitende puntkomma geeft het einde van de opdracht aan. Deze is verplicht, omdat anders wordt gewacht met de uitvoering van het commando. Het overzicht wordt getoond in rijen. Per geselecteerde rij uit de tabel worden de gevraagde kolommen afgedrukt. De uitvoer bestaat dus ook weer uit een tabel. voorbeelden
De namen van alle lezers uit Rotterdam: SELECT FROM WHERE
naam lezer plaats = ‘Rotterdam’ ; (let op de aanhalingstekens)
Uitvoer : NAAM Jansen Pietersen Gerritsen enzovoort De titels en prijzen van alle boeken van Hermans: SELECT FROM WHERE
titel, prijs uitgave schrijver = ‘Hermans’ ;
Uitvoer : TITEL Onder professoren Donkere kamer van Damocles enzovoort.
Copyright 2007 Academic Service
PRIJS 34,95 29,95
10 SQL, Structured Query Language
347
Terzijde Let op! Standaard wordt door SQL onderscheid gemaakt tussen hoofd- en kleine letters! Binnen Access wordt hierin echter (standaard) geen onderscheid gemaakt.
De adressen en telefoonnummers van alle filialen die binnen Breda gelegen zijn: SELECT FROM WHERE
filadres, filtelefoon filiaal 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. voorbeeld
De titels van de boeken van Wolkers die minder dan # 25,– kosten, en de titels van de boeken van Campert die bij uitgeverij ‘de brede letter’ zijn uitgegeven. SELECT FROM WHERE OR
titel uitgave (schrijver = ‘Wolkers’ AND prijs < 25 ) (schrijver = ‘Campert’ AND uitgeverij = ‘de brede letter’) ;
Bij het opgeven van voorwaarden, moeten we teksten omgeven door aanhalingstekens; getallen kunnen we direct opnemen.
Copyright 2007 Academic Service
348
Databaseontwikkeling 4 Access 2003
Als we in een voorwaarde een datumaanduiding willen gebruiken, moeten we de datum standaard aangeven volgens het formaat mm-dd-jj, omgeven door twee hekjes. De datum 2 april 1955 moeten we dus opgeven als #4-2-55# of als #04-02-55#. De eeuwaanduiding laten we standaard weg, tenzij we Windows anders hebben ingesteld. Hoe we de datum precies moeten intoetsen, is afhankelijk van de instellingen van Windows. Ga dat dus zelf even na. Ongeacht de datuminstelling van Windows moeten we binnen het SQL-deel van Access altijd met de Amerikaanse notatiewijze 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 aangegeven door de eerste drie letters. De datum 3 mei 1981 wordt dan #3-MAY-81#. In de Nederlandse versie gebruiken we uiteraard #3-MEI-81#.
Terzijde De datumnotatie tussen hekjes is geen standaard SQL-notatie en werkt alleen in Access-SQL. In andere databases wordt een andere datumnotatie gebruikt. Hetzelfde geldt voor de hieronder besproken jokers (wildcards). In standaard SQL worden respectievelijk _ 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 gebruiken volgens de standaard ANSI 89. In bijlage B staat meer informatie over hoe je kunt overschakelen naar ANSI 92.
In de voorwaarden kunnen we gebruikmaken van: 1. = , > , < , <= , >= en <> WHERE prijs >= 49
Copyright 2007 Academic Service
10 SQL, Structured Query Language
349
2. BETWEEN ... AND ..... (De grenswaarden voldoen ook!) IN ( waardenverzameling ) NOT LIKE Bij de operator LIKE kunnen we gebruikmaken van de tekens ‘?’ en/of ‘*’. Het teken ‘?’ geeft aan dat op die positie één willekeurig teken moet staan. Het teken ‘*’ geeft aan dat op die plaats 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. voorbeelden
WHERE prijs BETWEEN 20 AND 30 WHERE prijs IN ( 10, 15, 27, 49 ) WHERE prijs NOT IN ( 10, 15, 27, 49 ) WHERE schrijver LIKE ‘?olk*’ De laatste voorwaarde selecteert dus bijvoorbeeld de schrijvers Wolkers, Tolkien en Kolk. WHERE Geboortedatum LIKE ‘02-03-*’ Welke lezers zijn er op 3 februari jarig? Let op, nu zijn de nullen wel verplicht en de datum moet als tekst zijn opgegeven! WHERE schrijver <> ‘Wolkers’ OR schrijver IS NULL Zonder de toevoeging ‘OR schrijver IS NULL’ worden de boeken waarbij geen schrijver is opgenomen niet afgedrukt omdat een vergelijking met een leeg veld altijd de waarde FALSE oplevert. Door een extra voorwaarde op te nemen en dus expliciet te testen op een leeg veld, worden ook deze rijen opgenomen in de uitvoertabel. WHERE DatumRetour - DatumLenen > 7 Wie heeft er langer dan een week geleend? Het verschil tussen twee datums levert het aantal dagen dat daartussen ligt. We kunnen dus gewoon met datums rekenen! WHERE Geboortedatum BETWEEN ‘05-01-88’ AND ‘05-31-88’ Welke lezers zijn er in Mei 1988 geboren?
Copyright 2007 Academic Service
350
Databaseontwikkeling 4 Access 2003
Het kan voorkomen dat bij bepaalde opvragingen meerdere keren dezelfde rij zou worden afgedrukt. Als we bijvoorbeeld alle woonplaatsen van de lezers laten afdrukken, zullen diverse woonplaatsen zeer waarschijnlijk meerdere keren voorkomen. Als we alle geproduceerde rijen slechts één maal in het overzicht willen opnemen, dan breiden we het SELECT-statement uit met de toevoeging DISTINCT. Door de verwerkingswijze van DISTINCT blijkt dat de uitvoer nu ook automatisch gesorteerd is op volgorde van de te tonen kolommen. SELECT FROM
DISTINCT woonplaats lezer ;
Om een overzicht van de namen van de schrijvers met de naam van de uitgeverij van het betreffende boek te krijgen, zonder dubbele combinaties, formuleren we het volgende commando: SELECT FROM
DISTINCT schrijver, uitgeverij uitgave ;
Hierbij kan wel de naam van een schrijver meerdere keren voorkomen, evenals de naam van een uitgeverij, maar iedere combinatie wordt hoogstens één keer in het overzicht opgenomen. Opgaven 10.1 Verzorg aan de hand van de tabellen die behoren bij de bibliotheekdatabase de volgende overzichten: a. Alle gegevens van alle uitgaven. b. De telefoonnummers en postcodes van alle lezers uit Leiden die nog niet meerderjarig zijn. c. De namen van de schrijvers die ooit een boek hebben uitgegeven bij uitgeverij ‘De dunne kaft’. d. De namen van de uitgeverijen die ooit een boek van Wolkers hebben uitgebracht. e. De datums waarop lezer 64489 boeken heeft geleend, na 1980. f. De nummers van de filialen die minimaal één exemplaar hebben van het boek met ISBN 9062335306. 10.2 Wanneer kan het voorkomen dat in een overzicht meerdere rijen hetzelfde zijn? Gebruik in het antwoord de term ‘primaire sleutel’.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
351 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 betreffende database openen via Bestand, Database openen. Selecteer het overzicht Query’s. Om een nieuwe query te ontwerpen gebruiken we de knop Nieuw. Uit de geboden mogelijkheden in figuur 10.3, Nieuwe query, kiezen 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
Copyright 2007 Academic Service
352
Databaseontwikkeling 4 Access 2003
Omdat we in de SQL-query zelf opgeven welke tabellen we wensen 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 ontwerpen. We kunnen nu het scherm selecteren waarin we zelf SQLquery’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. Figuur 10.5
We zien dat het woord SELECT al voor ons is neergezet. We kunnen nu de query intoetsen, waarna we hem kunnen laten uitvoeren door op de knop Uitvoeren te drukken (de toets met het uitroepteken). Ook kunnen we in het menu kiezen voor Query, Uitvoeren. Op het scherm wordt de uitvoer van de query getoond, of een foutmelding omdat de query niet juist is opgesteld. In het laatste geval kunnen we na het lezen van de foutmelding kiezen voor OK en de query direct verbeteren. Als de query foutloos is – en dus wordt uitgevoerd – zal Access het resultaat op het scherm plaatsen. Deze uitvoer kunnen we op de gebruikelijke wijze afdrukken op papier: via Bestand, Afdrukken of door gebruik te maken van de knop Afdrukken.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
353
Figuur 10.6
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 behorende menu even naar beneden trekken door te klikken op de knop T 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 ontworpen 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 kolommen altijd uit één woord bestaan. Bij Access kunnen we echter kolomnamen uit meerdere woorden laten bestaan. Deze namen
Copyright 2007 Academic Service
354
Databaseontwikkeling 4 Access 2003
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 zelfstandig 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ïnstalleerd. 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-database. 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 soortnummer en jaartal afdrukken. f. Welke rode dranken met een alcoholpercentage van 10 of meer kunnen worden geleverd. Laat het productgroepnummer en de naam afdrukken. g. Bij welke artikelen is geen adviesverkoopprijs opgenomen? h. Op welke dagen hebben we gefactureerd? i. Toon alle artikelen uit de productgroepen wijn, port, rose en sherry.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
10.8
355
Eenvoudige opvragingen uit meerdere tabellen
In de vorige paragraaf hebben we ons beziggehouden met het uitvoeren van opvragingen uit één enkele tabel. Vaak zullen de gegevens echter uit meerdere tabellen komen. We maken dan gebruik van hetzelfde SELECT-statement, maar geven bij het FROM-gedeelte nu meerdere tabellen op. SELECT [,] FROM [,] [ WHERE ] ; Als we meerdere tabellen opgeven, wordt iedere rij uit de ene tabel gecombineerd met alle andere rijen uit de andere tabellen. We noemen dit een join. Als we twee tabellen met ieder 100 rijen combineren, ontstaan dus 10.000 rijen! Bij grote tabellen neemt het totale aantal gegenereerde rijen explosief toe. Deze ‘explosie’ dienen we tegen te gaan. Het is vrijwel altijd zinloos om alle rijen uit de ene tabel te combineren met alle rijen uit de andere tabel. We mogen alleen de zinvolle combinaties toestaan. Daartoe maken we gebruik van het WHERE-gedeelte. voorbeeld
We geven een voorbeeld: een overzicht van de namen en nummers van de lezers die in een 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 FROM WHERE AND
lezer.naam, lezer.lezernr lezer , filiaal lezer.filiaalnr = filiaal.filiaalnr filiaal.filplaats = ‘Breda’ ;
Hierbij is allereerst opgegeven wat er in het overzicht moet worden opgenomen. Daarbij moet de kolomnaam voorafgegaan worden
Copyright 2007 Academic Service
356
Databaseontwikkeling 4 Access 2003
door de naam van de bijbehorende tabel, van elkaar gescheiden door een punt. De tabelnaam mag achterwege gelaten worden als de kolomnaam uniek is voor de in het FROM-gedeelte opgesomde tabellen. Ook goed is dus: SELECT FROM WHERE AND
naam, lezernr lezer , filiaal lezer.filiaalnr = filiaal.filiaalnr filplaats = ‘Breda’ ;
Vervolgens wordt opgegeven uit welke tabellen gegevens benodigd zijn. Hierna worden de juiste rijen van de tabellen met elkaar gecombineerd. In dit geval gebeurt dit op basis van gelijk filiaalnummer. 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. voorbeeld
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 combinaties moeten we kijken naar de in de tabellen overeenkomende kolommen. Voor het op de juiste manier combineren komen we dan op de volgende beperkingen: WHERE AND
uitlening.exemplaarnr = exemplaar.exemplaarnr exemplaar.isbn = uitgave.isbn
Daarnaast hebben we nog te maken met beperkingen die uit de vraagstelling volgen, te weten: AND AND AND
uitlening.lezernr = 355267 uitlening.datum >= #1-1-01# 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 aliasnaam op, door de tabelnaam te laten volgen door de door ons
Copyright 2007 Academic Service
10 SQL, Structured Query Language
357
gewenste alias-naam, gescheiden door een spatie. Bij het aanduiden van de tabellen moeten we vervolgens de alias-naam gebruiken. SELECT FROM WHERE AND AND AND AND
DISTINCT u.titel uitgave u , exemplaar e, uitlening ul ul.exemplaarnr = e.exemplaarnr e.isbn = u.isbn ul.lezernr = 355267 ul.datum >= #1-1-01# 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) flexibel 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 tabellen. Voordat de query wordt uitgevoerd, zal Access om de waarde vragen die aan de variabele moet worden toegekend. We kunnen van de voorgaande query de uitvoer flexibel maken door de laatste twee regels te wijzigen in: AND AND
ul.datum >= Startdatum 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 kunnen nu dus ook een overzicht opvragen over heel 1997, of over de eerste week van mei, of van het derde kwartaal, of... voorbeeld
We kunnen ook een overzicht maken van alle titels waarvoor een reservering bestaat. Merk op dat het opnemen van DISTINCT noodzakelijk is. SELECT FROM WHERE
DISTINCT u.titel uitgave u , reservering r u.isbn = r.isbn ;
Copyright 2007 Academic Service
358
Databaseontwikkeling 4 Access 2003
Tip: Uit een tabel alle kolommen nodig? Maak dan gebruik van het teken ‘*’. lezer.* Bijvoorbeeld : of exemplaar.filiaalnr, uitgave.* of e.filiaalnr, u.* Opgaven 10.5 Verzorg aan de hand van de tabellen die behoren bij de bibliotheekdatabase de volgende overzichten: a. De namen van de lezers die ooit een boek van Wolkers hebben geleend. b. Een overzicht van alle gegevens van de lezers die lenen bij filialen 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-database. 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.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
10.9
359
Wijzigen van de volgorde
Tot nu toe is de volgorde waarin de rijen van de uitvoertabel werden getoond willekeurig totstandgekomen. Vaak zal de gebruiker behoefte hebben aan een uitvoer die op een bepaalde wijze gesorteerd is. Daartoe kunnen we het SELECT-commando uitbreiden met ORDER BY. SELECT FROM [ WHERE [ ORDER BY
[,] [,] ] [ASC/DESC] ] ;
De toevoeging ORDER BY zal de uitvoer laten zien in volgorde van de waarden, opgeslagen in de opgegeven kolom. Door meerdere kolommen op te geven, gescheiden door een komma, wordt bij gelijke waarde in de eerste kolom verder gesorteerd op basis van de daarna opgesomde kolom(men). Met de optie ASC wordt oplopend gesorteerd (standaard), met de optie DESC wordt de uitvoer in aflopende volgorde gesorteerd. Bij sorteren op meerdere kolommen kunnen we per kolom de optie ASC of DESC opgeven. voorbeeld
Een overzicht van de boeken aanwezig in Leiden. Getoond moeten worden: ISBN en titel, gesorteerd op titel. SELECT FROM WHERE AND AND ORDER BY
DISTINCT u.isbn, titel uitgave u, exemplaar e, filiaal f u.isbn = e.isbn e.filiaalnr = f.filiaalnr filplaats = ‘Leiden’ titel ;
Opmerkingen 1. 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 standaardsorteervolgorde is. 3. De toevoeging DISTINCT is gebruikt omdat van een boek meer dan één exemplaar aanwezig kan zijn. Hiervan hoeft slechts één keer opgave gedaan te worden.
Copyright 2007 Academic Service
360
Databaseontwikkeling 4 Access 2003
voorbeeld
Een overzicht van alle titels en prijzen. In alfabetische volgorde van titel, bij gelijke titel dalend op prijs. SELECT FROM ORDER BY
titel, prijs uitgave titel, prijs DESC
Opgaven 10.7 Verzorg aan de hand van de tabellen die behoren bij de bibliotheekdatabase de volgende overzichten: a. Een lijst met alle gegevens van alle lezers, gesorteerd op naam. Bij gelijke naam moet verder worden gesorteerd op woonplaats. b. Een lijst van de nu uitgeleende boeken (titel en schrijver), gesorteerd op exemplaarnummer. c. Een lijst met daarop alle filiaalgegevens, gesorteerd op postcode. 10.8 Voer de volgende opdrachten uit aan de hand van de Alco-database. 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, gesorteerd 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 adviesverkoopprijs. 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, flesinhoud en adviesverkoopprijs tonen. De duurste fles moet als eerste worden getoond, de goedkoopste als laatste.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
10.10
361
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 ( ) – Bepaalt de kleinste optredende waarde in de uitvoertabel, voor de opgegeven kolom. MAX ( ) – Bepaalt de grootste optredende waarde in de uitvoertabel, voor de opgegeven kolom. AVG ( ) – 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 ( ) – Bepaalt het aantal rijen met een nietlege kolomwaarde in de genoemde kolom van de uitvoertabel. COUNT ( DISTINCT ) – Bepaalt het aantal verschillende waarden dat optreedt in de genoemde kolom van de uitvoertabel. Als we Access hebben ingesteld volgens de standaard ANSI 89 dan wordt deze functie niet ondersteund. Bij het gebruik van de standaard ANSI 92 wel. Voor meer toelichting, zie bijlage B. De op de CD bijgeleverde tool S(imple)QL ondersteunt deze functie (uiteraard) wel. SUM ( ) – 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. voorbeeld
Het aantal uitgaven waarbij een schrijver bekend is: SELECT FROM
COUNT (schrijver) uitgave ;
De prijs van het duurste boek. SELECT FROM
MAX(prijs) uitgave ;
Het aantal schrijvers waarvan boeken aanwezig zijn: SELECT FROM
COUNT (DISTINCT schrijver) uitgave ;
Copyright 2007 Academic Service
362
Databaseontwikkeling 4 Access 2003
Deze query werkt wel in standaard SQL, maar helaas niet in Access, wel in S(imple)QL! De gemiddelde prijs van de boeken : SELECT FROM
AVG(prijs) of SELECT SUM(prijs)/COUNT(*) uitgave FROM uitgave ;
In de twee laatstgenoemde query’s kunnen we twee verschillende antwoorden vinden, omdat functies die op velden werken (bijvoorbeeld AVG en SUM), lege velden (NULL) buiten beschouwing laten, en COUNT(*) doet dat niet! Opmerkingen 1. De volgende query zal leiden tot een foutmelding omdat de kolom ‘plaats’ meerdere waarden kan opleveren en de functie slechts één. Het totale aantal lezers uit Dordrecht: SELECT FROM WHERE
plaats , COUNT(*) lezer plaats = ‘Dordrecht’ ;
We kunnen deze query wel anders formuleren: SELECT FROM WHERE Uitvoer: MIN(plaats) Dordrecht
MIN(plaats) , COUNT(*) lezer plaats = ‘Dordrecht’ ;
COUNT(*) 1283
Omdat in de uitvoertabel alleen de kolomwaarde Dordrecht voorkomt, zal als minimumwaarde ook Dordrecht worden gevonden. 2. Omdat door het opgeven van bewerkingen de kop boven een kolom een vreemd opschrift krijgt, kunnen we expliciet opgeven welke tekst als koptekst moet worden afgedrukt. Dit is niet beperkt tot de resultaten van bewerkingen, we mogen dit ook doen bij gewone kolommen. We geven hiertoe achter de bewerking de toevoeging AS, gevolgd door het door ons gewenste opschrift.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
363
SELECT FROM WHERE
MIN(plaats) AS Plaats , COUNT(*) AS Aantal lezer plaats = ‘Dordrecht’ ;
Uitvoer: Plaats Dordrecht
Aantal 1283
3. Behalve de eerdergenoemde functies kent Access er nog veel meer, die hier echter niet besproken worden. We kunnen via de ingebouwde hulp meer informatie opvragen. Opgaven 10.9 Verzorg aan de hand van de tabellen die behoren bij de bibliotheekdatabase de volgende overzichten: a. Het aantal uitgeleende exemplaren van Wolkers. b. Het aantal exemplaren van het boek ‘Onder professoren’ van Hermans dat aanwezig is in de Rotterdamse 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-database. 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 voorraad? Toon het gevonden aantal. i. Voor welk bedrag is er op 29 Juni 2005 gefactureerd aan klanten die niet uit Rotterdam komen?
Copyright 2007 Academic Service
364
Databaseontwikkeling 4 Access 2003
10.11
Groeperen
Vaak hebben gebruikers de wens gegevens gegroepeerd op een gemeenschappelijk kenmerk ter beschikking te hebben. Om aan deze wens te voldoen, is het mogelijk het SELECT-statement uit te breiden met de toevoeging GROUP BY. SELECT FROM GROUP BY [HAVING
[,] [,] [,] ] ;
De toevoeging GROUP BY zal de rijen groeperen op basis van de waarden in de genoemde kolom. Per gevonden groep wordt vervolgens de uitvoer gegenereerd. Er ontstaat daarbij per gevonden groep slechts één rij, de groepsrij. Als gevolg hiervan mogen in het SELECT-gedeelte dan ook alleen maar de kolommen worden genoemd die ook in de GROUP BY-regel voorkomen. Andere kolommen zijn niet toegestaan, omdat er in die kolommen verschillende waarden kunnen voorkomen. Welke van die waarden zou moeten worden afgedrukt? In het SELECT-gedeelte mogen wel functies worden gebruikt, omdat een functie altijd precies één waarde oplevert. voorbeeld
Een overzicht van alle schrijvers waarvan boeken aanwezig zijn: SELECT FROM GROUP BY
schrijver uitgave schrijver ;
Alle schrijvers komen slechts één maal in het overzicht voor. Een alternatieve oplossing: SELECT FROM voorbeeld
DISTINCT schrijver uitgave ;
De onderstaande query is NIET toegestaan: SELECT schrijver, titel FROM uitgave GROUP BY schrijver ;
Copyright 2007 Academic Service
10 SQL, Structured Query Language
365
Na het groeperen op schrijver(naam) kan de naam worden afgedrukt. De naam heeft immers in de betreffende groep van uitgegeven boeken steeds dezelfde waarde. Maar de titel kan niet worden afgedrukt omdat iedere uitgave in principe een andere titel heeft. Welke titel zou moeten worden geselecteerd? voorbeeld
Een overzicht van alle schrijvers, tezamen met het aantal door hen geschreven boeken: SELECT FROM GROUP BY
schrijver, COUNT(*) uitgave schrijver ;
Van iedere schrijver worden de naam en het aantal aangetroffen titels afgedrukt. Bedenk dat we nu wel een kolom kunnen combineren met een functie, omdat beide nu slechts één waarde opleveren. Als we een functie combineren met een GROUP BY, dan werkt de functie per groep! voorbeeld
Met de toevoeging HAVING kunnen we bepalen welke groepen in het overzicht moeten worden opgenomen. Wat WHERE doet met rijen, doet HAVING met groepen. Bij HAVING is echter het gebruik van functies toegestaan. Een overzicht van de schrijvers die meer dan tien titels op hun naam hebben staan: SELECT FROM GROUP BY HAVING
voorbeeld
schrijver uitgave schrijver COUNT(*) > 10 ;
Een overzicht van de uitgebrachte boeken per schrijver per uitgeverij, tezamen met het aantal uitgebrachte boeken: SELECT FROM GROUP BY
schrijver, uitgeverij, COUNT(*) uitgave schrijver, uitgeverij ;
Een GROUP BY mag dus bestaan uit meerdere kolommen. Per unieke combinatie wordt in dat geval een rij in de uitvoertabel opgenomen.
Copyright 2007 Academic Service
366
Databaseontwikkeling 4 Access 2003
voorbeeld
Per schrijver de prijs van het duurste boek dat door hem of haar is geschreven: SELECT FROM GROUP BY
1.
2. 3. 4. 5.
schrijver, MAX(prijs) uitgave schrijver ;
Er gelden enkele specifieke eigenschappen bij het gebruik van GROUP BY: In het SELECT-gedeelte mogen alleen die kolommen worden opgesomd die ook voorkomen in het GROUP BY-gedeelte, alsmede functies. Het is overigens niet verplicht het GROUP BYargument op te nemen in de SELECT-regel. Functies werken nu per groep en mogen wel kolommen bevatten waarop niet wordt gegroepeerd. Per groep wordt slechts één rij in de uitvoertabel opgenomen. We kunnen groeperen aan de hand van meerdere kolommen. Per unieke combinatie ontstaat een rij. We kunnen met HAVING voorwaarden opleggen aan de groepen. Alleen groepen die voldoen aan de voorwaarde worden opgenomen in de uitvoertabel. We mogen hier alleen de kolommen gebruiken die ook in het GROUP BY-gedeelte voorkomen, alsmede functies. Eerder hebben we gezien dat bij een SELECT-commando ook de toevoegingen WHERE en ORDER BY kunnen worden gebruikt. Dat blijft uiteraard zo. SELECT FROM [ WHERE GROUP BY [ HAVING [ ORDER BY
[,] [,] ] ] [ASC/DESC] ] ;
De volgorde waarin de diverse stappen worden doorlopen, is nu als volgt: 1. Welke tabellen gebruiken? (FROM) 2. Welke rijen selecteren? (WHERE)
Copyright 2007 Academic Service
367
10 SQL, Structured Query Language
3. 4. 5. 6. voorbeeld
Welke groepen maken? Welke groepen selecteren? Welke kolommen in de uitvoer? Welke volgorde in de uitvoer?
(GROUP BY) (HAVING) (SELECT) (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 FROM WHERE GROUP BY HAVING ORDER BY
filiaalnr, COUNT(*) lezer geboortedatum < #1-1-80# filiaalnr COUNT(*) > 1000 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 aangetroffen 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 eveneens de tabel Filiaal gebruiken en deze op basis van het filiaalnummer 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 alfabetisch 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:
Copyright 2007 Academic Service
368
Databaseontwikkeling 4 Access 2003
SELECT FROM WHERE AND GROUP BY HAVING ORDER BY
f.filiaalnr, COUNT(*), MIN(filnaam) lezer l, filiaal f l.filiaalnr = f.filiaalnr geboortedatum < #1-1-80# f.filiaalnr COUNT(*) > 1000 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 FROM WHERE AND GROUP BY HAVING ORDER BY
.filiaalnr, COUNT(*), filnaam lezer l, filiaal f l.filiaalnr = f.filiaalnr geboortedatum < #1-1-80# f.filiaalnr, filnaam COUNT(*) > 1000 COUNT(*) ;
Als algemene regel zouden we kunnen aanhouden: wat in SELECT staat (behalve functies) staat ook bij de GROUP BY. voorbeeld
Een overzicht met daarop het lezernummer, de lezernaam en het aantal door de lezer geleende boeken: SELECT FROM WHERE GROUP BY
voorbeeld
l.lezernr, naam, count(*) lezer l, uitlening u l.lezernr = u.lezernr l.lezernr, naam ;
Idem, maar nu alleen voor de lezers uit Rotterdam: SELECT FROM WHERE AND GROUP BY
l.lezernr, naam, count(*) lezer l, uitlening u l.lezernr = u.lezernr plaats = ‘Rotterdam’ l.lezernr, naam ;
Copyright 2007 Academic Service
10 SQL, Structured Query Language
voorbeeld
369
Idem maar nu alleen voor de lezers uit Rotterdam die minder dan 100 boeken hebben geleend: SELECT FROM WHERE AND GROUP BY HAVING
l.lezernr, naam, count(*) lezer l, uitlening u l.lezernr = u.lezernr plaats = ‘Rotterdam’ l.lezernr, naam count(*) < 100 ;
Opgaven 10.11 Verzorg aan de hand van de tabellen, behorend bij de bibliotheekdatabase de volgende overzichten: a. Het aantal boeken per schrijver dat nu is uitgeleend. b. Het aantal leden per woonplaats, gesorteerd per woonplaats; in het overzicht dienen alleen de plaatsen met meer dan 1000 leden te worden opgenomen. c. Per 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-database. 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.
Copyright 2007 Academic Service
370 370
Databaseontwikkeling 4 Access 2003
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 voorraad? 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 boekenprijs? Om die vraag te kunnen beantwoorden zullen we eerst de gemiddelde boekenprijs moeten bepalen. De onderstaande query levert die waarde op. SELECT FROM
AVG(prijs) uitgave ;
Stel dat hier een bedrag van # 27,50 wordt gevonden. Dan kunnen we nu met de volgende query de vraag beantwoorden. SELECT FROM WHERE
* uitgave prijs > 27.5 ;
We hebben nu echter twee 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:
Copyright 2007 Academic Service
371
10 SQL, Structured Query Language
SELECT FROM WHERE
* uitgave prijs
> ( SELECT FROM
AVG(prijs) uitgave ) ;
We hebben nu gebruik gemaakt van een subquery. Deze subquery, omsloten door ronde haken, wordt als eerste uitgevoerd en als het ware vervangen door de gegenereerde uitvoer, de gemiddelde prijs. Hierna wordt dan de hoofdquery uitgevoerd en worden de boeken bepaald die duurder zijn dan de gemiddelde prijs. We kunnen gebruik maken van meer dan één subquery tegelijkertijd. Bijvoorbeeld bij het oplossen van de vraag: van welk boek ligt de prijs het dichtst onder de gemiddelde prijs? We beginnen weer met het bepalen van de gemiddelde boekprijs. SELECT FROM
AVG(prijs) uitgave ;
Vervolgens gaan we alle prijzen achterhalen die onder deze gemiddelde waarde liggen. SELECT FROM WHERE
prijs uitgave prijs
< ( SELECT FROM
AVG(prijs) uitgave ) ;
Van al deze prijzen zijn we eigenlijk alleen maar geïnteresseerd in de grootste waarde omdat die het dichtst onder de gemiddelde aankoopprijs ligt. We krijgen dan: SELECT MAX (prijs) FROM uitgave WHERE prijs
< ( SELECT FROM
Copyright 2007 Academic Service
AVG(prijs) uitgave ) ;
372
Databaseontwikkeling 4 Access 2003
Tenslotte willen we nu nog weten voor welk boek (of boeken) deze prijs geldt. SELECT FROM WHERE
* uitgave prijs = FROM WHERE
( SELECT MAX(prijs) uitgave prijs <( SELECT AVG(prijs) FROM uitgave ) );
We hebben nu gebruik gemaakt van twee (geneste) subquery’s die beide zijn omgeven door ronde haken. Bedenk daarbij dat de laatste subquery deel uit maakt van de middelste subquery en dat dus de afsluitende ronde haak hiervan achter de laatste subquery moet worden geplaatst. Als laatste inleidende voorbeeld zullen we de vraag beantwoorden: welke boeken (uitgaven) zijn in 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 onderstaande query. SELECT FROM WHERE AND AND
uitgave.* uitgave, exemplaar, uitlening uitgave.isbn = exemplaar.isbn exemplaar.exemplaarnr = uitlening.exemplaarnummer 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:
Copyright 2007 Academic Service
10 SQL, Structured Query Language
SELECT FROM WHERE AND AND
373
uitgave.isbn uitgave, exemplaar, uitlening uitgave.isbn = exemplaar.isbn exemplaar.exemplaarnr = uitlening.exemplaarnummer 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 WHERE
* uitgave isbn ‘niet in de eerder gevonden lijst’.
Voor de eerder gevonden lijst kunnen we nu de eerder opgestelde query gebruiken en deze als subquery opnemen. We krijgen: SELECT FROM WHERE
* uitgave isbn NOT IN ( SELECT uitgave.isbn FROM uitgave, exemplaar, uitlening WHERE uitgave.isbn = exemplaar.isbn AND exemplaar.exemplaarnr = uitlening.exemplaarnummer AND huurdatum BETWEEN #1-1-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 eenvoudiger om tot een correcte oplossing te komen. Bij subquery’s kunnen we onder andere de volgende twee hoofdconstructies tegenkomen. Met deze constructies kunnen vrijwel alle overzichten worden gegenereerd.
Copyright 2007 Academic Service
374
Databaseontwikkeling 4 Access 2003
1. Een kolomwaarde vergelijken met één waarde Geef de namen van de lezers die op dezelfde datum geboren zijn als lezernr 4773. SELECT lezernr, naam FROM lezer WHERE geboortedatum = (SELECT geboortedatum FROM lezer WHERE lezernr = 4773 ) ; De subquery levert de geboortedatum van lezer 4773 (één waarde) op. In de hoofdquery wordt van iedere lezer de geboortedatum daarmee vergeleken. In plaats van het teken ‘=’ mogen we ook alle andere ongelijkheid-operatoren gebruiken. 2. Een kolomwaarde vergelijken met een waardenverzameling (IN/ALL) Geef de exemplaarnummers van de boeken geschreven door Wolkers, gesorteerd op nummer. SELECT exemplaarnr FROM exemplaar WHERE isbn IN (SELECT FROM WHERE ORDER BY exemplaarnr ;
isbn uitgave schrijver = ‘Wolkers’ )
Allereerst worden alle 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 FROM WHERE
titel uitgave prijs >= ALL (SELECT prijs FROM uitgave );
Allereerst wordt een tussentabel gegenereerd met alle prijzen. Vervolgens wordt bij ieder boek nagegaan of de prijs van dat
Copyright 2007 Academic Service
10 SQL, Structured Query Language
375
betreffende boek groter dan of gelijk is aan alle waarden (ALL) die in de zojuist gegenereerde verzameling voorkomen. En alleen voor de grootste waarde geldt dat. Een alternatieve oplossing hier zou zijn: SELECT FROM WHERE
titel uitgave prijs = (SELECT MAX(prijs) FROM uitgave ) ;
Daarbij wordt eerst in de subquery de hoogste prijs bepaald. Daarna wordt in de hoofdquery bekeken voor welke uitgave(n) die hoogste prijs geldt. Geef alle titels van boeken van Wolkers die ook door andere schrijvers zijn gebruikt: SELECT FROM WHERE AND
titel uitgave schrijver = ‘Wolkers’ titel = IN (SELECT titel FROM uitgave WHERE schrijver <> ‘Wolkers’ ) ;
Ook hier wordt eerst weer een tussentabel gegenereerd, die nu alle titels bevat van boeken geschreven door andere schrijvers. Vervolgens worden alle titels van de boeken van Wolkers met deze verzameling vergeleken; titels die daarin voorkomen, worden afgedrukt. Opmerkingen met betrekking tot subquery’s 1. In een subquery mag in het SELECT-gedeelte slechts één kolom (zonder DISTINCT) of functie gebruikt worden (standaard SQL). 2. Een subquery mag alleen voorkomen als rechterlid van een voorwaarde. 3. Een subquery moet een waarde of een waardenverzameling opleveren die overeenstemt met het linkergedeelte van de voorwaarde. 4. Een subquery mag alleen voorkomen in een voorwaarde bij WHERE of bij HAVING (of AND/OR). 5. De subquery moet tussen ronde haken worden geplaatst. 6. Na een subquery kan de ‘gewone’ query worden voortgezet.
Copyright 2007 Academic Service
376
Databaseontwikkeling 4 Access 2003
SELECT FROM WHERE AND
GROUP BY ORDER BY
voorbeelden
...... ...... ...... ... IN (SELECT FROM WHERE AND ....... ....... ;
...... ...... ...... ...... )
1. Geef de naam van de schrijver met het grootste aantal titels op zijn naam. Allereerst zullen we dan per schrijver het aantal titels moeten bepalen. Hierbij moeten we de tabel Uitgave gebruiken en hier per schrijver tellen, dus gebruikmaken van GROUP BY. SELECT FROM GROUP BY
COUNT(*) uitgave schrijver
Vervolgens gaan we dit nogmaals doen en zullen we de naam afdrukken van de schrijver waarvoor geldt dat het getelde aantal groter dan of gelijk is aan alle zojuist gevonden waarden. Denk eraan dat we groter of gelijk moeten nemen, omdat de subquery ook het aantal van de schrijver met het grootste aantal vindt! SELECT FROM GROUP BY HAVING
schrijver uitgave schrijver COUNT(*) >= ALL (SELECT COUNT(*) FROM uitgave GROUP BY schrijver ) ;
2. Wie is de oudste lezer? Eerst bepalen we van alle geboortedatums de kleinste waarde (dat wil zeggen het langst geleden, dus het oudst). Vervolgens lopen we alle lezers langs om te kijken of hun geboortedatum gelijk is aan de gevonden kleinste waarde. Van die lezer(s) drukken we de gegevens af.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
377
SELECT * FROM lezer WHERE geboortedatum = (SELECT MIN ( geboortedatum ) FROM lezer ) ; 3. Welke schrijver heeft het grootste aantal titels op zijn naam? Eerst in de subquery per schrijver (GROUP BY) het aantal titels bepalen. We selecteren alleen de gevonden aantallen. Vervolgens in de hoofdquery nog een keer per schrijver tellen en het gevonden aantal vergelijken met de zojuist gevonden waarden. Is het aantal uit de hoofdquery groter dan of gelijk aan alle gevonden waarden, dan hebben we de grootste. Van deze schrijver selecteren we de naam. SELECT schrijver FROM uitgave GROUP BY schrijver HAVING COUNT(*) >= ALL ( SELECT FROM GROUP BY
COUNT(*) schrijver schrijver ;
4. Welke lezers hebben geen boeken gereserveerd? Een bibliotheek houdt wel bij welke lezer welke boeken leent en reserveert, maar natuurlijk niet welke lezers niet lenen of reserveren. Daarom moeten we het probleem via een omweg benaderen. Omdat de bibliotheek wel bijhoudt wie er wel een boek heeft gereserveerd, zullen we de nummers van die lezers bepalen. Vervolgens onderzoeken we bij iedere lezer of zijn/haar nummer voorkomt in de zojuist gevonden verzameling. We krijgen dan: SELECT FROM WHERE
lezernr, naam lezer lezernr NOT IN ( SELECT FROM
lezernr reservering ) ;
5. Dezelfde vraag als hiervoor, maar nu alleen van de lezers uit Rotterdam. Bovendien moet de geproduceerde uitvoer op volgorde van naam worden gepresenteerd.
Copyright 2007 Academic Service
378
Databaseontwikkeling 4 Access 2003
SELECT FROM WHERE
lezernr, naam lezer lezernr NOT IN ( SELECT FROM AND Plaats = ‘Rotterdam’ ORDER BY naam ;
lezernr reservering )
6. Welke lezers hebben boeken geleend die ook door andere lezers uit dezelfde woonplaats zijn geleend? We zullen in dit geval eerst uitzoeken welke boeken ook werkelijk door lezers zijn geleend. We stellen dan de volgende query op: SELECT FROM WHERE AND
isbn lezer l, uitlening ul, exemplaar e l.lezernr = ul.lezernr ul.exemplaarnr = e.exemplaarnr
Nu worden alle geleende boeken getoond. Wij willen echter alleen de boeken die geleend zijn door lezers uit dezelfde woonplaats als een andere lezer. Stel dat de betroffen lezer woont in Emmen. We zouden dan de query moeten uitbreiden met AND plaats = ‘Emmen’ en krijgen dan: SELECT FROM WHERE AND AND
isbn lezer l, uitlening ul, exemplaar e l.lezernr = ul.lezernr ul.exemplaarnr = e.exemplaarnr plaats = ‘Emmen’
Nu kunnen we de query opstellen die de lezers toont die ook zo’n boek hebben geleend. We krijgen dan: SELECT FROM WHERE AND AND
l.lezernr, naam lezer l, uitlening ul, exemplaar e l.lezernr = ul.lezernr ul.exemplaarnr = e.exemplaarnr isbn IN (SELECT isbn FROM lezer l, uitlening ul, exemplaar e WHERE l.lezernr = ul.lezernr AND ul.exemplaarnr = e.exemplaarnr AND plaats = ‘Emmen’ )
Copyright 2007 Academic Service
10 SQL, Structured Query Language
379
Er wordt nu steeds gekeken of de lezer uit Emmen komt, wat uiteraard niet juist is. In de subquery moeten we kijken of de woonplaats van de lezer uit de subquery gelijk is aan de woonplaats van de lezer uit de hoofdquery. Daartoe geven we de lezertabellen uit beide 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 FROM WHERE AND AND
l1.lezernr, naam lezer l1, uitlening ul, exemplaar e l1.lezernr = ul.lezernr ul.exemplaarnr = e.exemplaarnr isbn IN ( SELECT isbn FROM lezer l2, uitlening ul, exemplaar e WHERE l2.lezernr = ul.lezernr AND ul.exemplaarnr = e.exemplaarnr AND l1.plaats = l2.plaats ) ;
We noemen de bovenstaande query gecorreleerd, omdat in de subquery gegevens gebruikt worden uit de hoofdquery. SQL zal nu eerst in de hoofdquery een lezer selecteren en voor deze lezer de subquery gaan uitvoeren. Pas daarna wordt de tweede lezer in de hoofdquery geselecteerd. De subquery wordt nu niet, zoals gebruikelijk, slechts één keer doorlopen, maar vele malen, namelijk voor iedere rij uit de hoofdquery. De uitvoering van een gecorreleerde query kan dus wel enige tijd in beslag nemen! Opgaven 10.13 Verzorg aan de hand van de tabellen die behoren bij de bibliotheekdatabase 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.
Copyright 2007 Academic Service
380 380
Databaseontwikkeling 4 Access 2003
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-database. 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 artikel 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 FROM WHERE
titel, u.isbn, exemplaarnr, filiaalnr uitgave u, exemplaar e u.isbn = e.isbn
zal alleen de titels van de uitgaven tonen waarvan het isbn ook in de tabel Exemplaar voorkomt. Een uitgave waarvan nog geen
Copyright 2007 Academic Service
10 SQL, Structured Query Language
381
exemplaar in de bibliotheek aanwezig is – waarvan het isbn dus niet in de tabel Exemplaar voorkomt – wordt niet getoond; ook niet alleen de titel, zonder exemplaarnummer en 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 toevoeging left join een bijbehorende rij is gevonden. Om in dit voorbeeld ook de titels te krijgen van boeken die nog niet in de bibliotheek aanwezig zijn, wijzigen we de query in: SELECT FROM ON
titel, u.isbn, e.exemplaarnr, filiaalnr uitgave u LEFT JOIN exemplaar e u.isbn = e.isbn
Normaal gesproken koppelen we met de regel WHERE. Deze is nu vervangen door de regel ON om duidelijk te maken dat op die voorwaarde gecombineerd moet worden. Van alle uitgaven worden de titel en het ISBN getoond; alleen van uitgaven waarvan exemplaren aanwezig zijn in de bibliotheek worden ook het bijbehorende exemplaarnummer en 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 verwisselen krijgen we feitelijk weer de eerder besproken left join! Als tweede voorbeeld formuleren we de query waarmee we kunnen nagaan welke lezers op dit moment welke boeken hebben geleend. Heeft een lezer op dit moment geen boeken geleend, dan moeten wel zijn/haar nummer en naam worden getoond.
Copyright 2007 Academic Service
382
Databaseontwikkeling 4 Access 2003
SELECT FROM ON WHERE
l.lezernr, naam, exemplaarnr, huurdatum lezer l LEFT JOIN uitlening u l.lezernr=u.lezernr retourdatum IS NULL ;
De voorwaarde waarop de combinatie (join) is gebaseerd, wordt voorafgegaan door ON. De bijkomende voorwaarde volgt op gebruikelijke wijze achter WHERE. Views Bij het werken met gegevensbestanden wordt er vaak gewerkt met views. Een view is een bepaalde blik op een database waarbij over het algemeen slechts een selectie van de gegevens wordt getoond. Op de verkoopafdeling van een groothandel ziet men bijvoorbeeld van een klant wel het afleveradres maar niet het factuuradres. Een medewerker van de financiële afdeling ziet juist wel het factuuradres en waarschijnlijk niet het afleveradres. Een verkoper ziet alleen maar de klanten die tot zijn rayon behoren, terwijl zijn afdelingschef alle klanten te zien krijgt. Binnen Access kunnen views heel eenvoudig als query 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 WHERE
* Afnemer Plaats = “Rotterdam” ) ;
Hierna kan de verkoper werken met: SELECT * FROM RotterdamseKlanten ; Het bovenstaande CREATE VIEW commando wordt (helaas) door Access niet ondersteund, daar moet je gebruik maken van query’s die immers hetzelfde bewerkstelligen. De tool S(imple)QL, meegeleverd op de bij het boek behorende CD, ondersteunt views wel volledig.
Copyright 2007 Academic Service
10 SQL, Structured Query Language
383
Een view is dynamisch. Hiermee bedoelen we dat het niet zo is dat tijdens het 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 statisch 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 ondersteunt: SELECT FROM WHERE
COUNT (DISTINCT schrijver) uitgave, exemplaar uitgave.isbn = exemplaar.isbn ;
Een alternatieve oplossing met behulp van een ‘view’: SELECT FROM
COUNT (*) (SELECT FROM WHERE
DISTINCT (schrijver) uitgave, exemplaar uitgave.isbn = exemplaar.isbn );
Een ander voorbeeld. Hoeveel lezers hebben in 2004 een boek van J.K. Rowlings geleend? Geef ook het totale aantal uitleendagen. Als een lezer meerdere keren een boek van Rowlings heeft geleend mag hij toch maar één keer meetellen. We zullen dus ook nu weer gebruik moeten maken van COUNT DISTINCT. Een juiste oplossing binnen standaard SQL:
Copyright 2007 Academic Service
384
Databaseontwikkeling 4 Access 2003
SELECT FROM WHERE AND AND AND
COUNT(DISTINCT lezernr), SUM (Retourdatum – Huurdatum + 1) uitgave, exemplaar, uitlening uitgave.isbn = exemplaar.isbn exemplaar.exemplaarnr = uitlening.exemplaarnr YEAR(huurdatum) = 2004 schrijver = ‘J.K. Rowlings’ ;
Met behulp van een ‘view’: SELECT FROM
10.14
COUNT(*), SUM (aantalperklant) (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 );
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 gegevens INSERT INTO uitgave (isbn,titel,schrijver,uitgeverij,prijs) VALUES (9062335306,’Korte gras’,’Hennekorf’, ‘Korte Pen’, 45.90); Hierbij wordt eerst gezegd dat de actie bestaat uit het toevoegen van rijen aan de genoemde tabel ( INSERT INTO uitgave). Vervolgens wordt vermeld in welke kolommen een waarde moet worden geplaatst. Het is namelijk niet noodzakelijk om direct alle
Copyright 2007 Academic Service
10 SQL, Structured Query Language
385
velden een waarde te geven. Ten slotte worden de in te voegen waarden opgenomen (VALUES). Hierbij wordt de eerstgenoemde waarde in het eerstgenoemde veld geplaatst. De tweede waarde in het veld dat als tweede is genoemd, enzovoort. Deze manier van invoegen kun je goed gebruiken om via een webpagina ingevoerde gegevens toe te voegen aan een tabel. Daarbij moet je dan wel een script/programmeertaal gebruiken die speciaal voor webtoepassingen is ontwikkeld. Wijzigen van gegevens UPDATE lezer SET naam = ‘Jansen’ , adres = ‘Kerkstraat 23’ , plaats = ‘Delft’ WHERE lezernr = 4773; Allereerst wordt de tabel genoemd waarin de wijziging moet worden doorgevoerd (UPDATE). Vervolgens wordt vermeld in welk veld de waarde moet worden aangepast. Ten slotte staat vermeld onder welke voorwaarde dit moet gebeuren. Zonder voorwaarde wordt de wijziging namelijk in alle records doorgevoerd! Verwijderen van gegevens reservering DELETE FROM WHERE lezernr = 4773; Hier wordt eerst de tabel genoemd waaruit moet worden verwijderd (DELETE FROM). Vervolgens worden de voorwaarden opgesomd waaronder de verwijdering moet plaatsvinden. Samenvoegen van uitvoertabellen Dit kan alleen via SQL gerealiseerd worden, niet via de standaardopvraagfaciliteiten van Access! SELECT FROM WHERE UNION SELECT FROM WHERE
lezernr lezer filiaalnr = 14 lezernr uitlening huurdatum = ‘2-15-97’;
Copyright 2007 Academic Service
386
Databaseontwikkeling 4 Access 2003
Dubbele records in de uitvoer worden automatisch onderdrukt. Willen we deze wel zien, dan moeten we verbinden via UNION ALL. In ieder van de afzonderlijke 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 uitlening. 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 uitgenodigd 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 FROM UNION ALL SELECT FROM
naam, adres, postcode, woonplaats student naam, adres, postcode, plaats docent ;
Copyright 2007 Academic Service
A
Veldeigenschappen
Tijdens het ontwerpen van een tabel kunnen we niet alleen opgeven welke velden we in de tabel wensen op te nemen, we kunnen ook de eigenschappen van het veld instellen. Er bestaan in totaal dertien verschillende eigenschappen. Deze kunnen we echter niet altijd instellen omdat ze niet altijd relevant zijn. Afhankelijk van het soort veld kunnen we een eigenschap wel of niet instellen. We kunnen dit ook achteraf doen door de bestaande tabel te openen in de Ontwerpweergave. Figuur A.1
In deze bijlage komen alle eigenschappen kort aan bod.
Copyright 2007 Academic Service
388
Databaseontwikkeling 4 Access 2003
Veldlengte Hiermee stellen we de Veldlengte in bij velden van het type Tekst, Numeriek en Autonummering. De lengte voor een tekst-veld staat standaard ingesteld op 50, maar deze kan 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,4s1038 en +3,4s1038 ; dubbele precisie – getal met maximaal 15 decimalen, tussen –1,797s10308 en +1,797s10308 ; 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 veldlengte alleen kiezen uit lange integer en replicatie id. Hoewel Access hier zelf de nummering bijhoudt, kunnen we wel beïnvloeden wat het eerstvolgende nummer moet worden. Stel we willen in de database Reisbureau in de tabel Klant de eerstvolgende waarde van het klantnummer op 4000 zetten:
Copyright 2007 Academic Service
A Veldeigenschappen
389
Open dan eerst de tabel Klant en zorg ervoor dat klantnummer niet langer een sleutelveld is. 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 klantnummer op. Selecteer vervolgens in de menubalk Query, Toevoegquery en geef op dat we de gegevens willen toevoegen aan de tabel Klant. Laat de query uitvoeren. Open hierna de tabel Klant en verwijder het zojuist toegevoegde record, met de waarde 3999. Zorg er ook voor dat de originele sleutelinstelling weer wordt ingesteld, dus klantnummer weer aanwijzen als sleutel. Als we nu een nieuw record toevoegen, zullen we zien dat Access automatisch de waarde 4000 toekent als eerstvolgende klantnummer. 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. Notatiewijze Met de eigenschap Notatie kunnen we opgeven hoe gegevens moeten worden gepresenteerd naar buiten toe. Deze eigenschap heeft geen invloed op de waarde van het veld zelf, alleen op de presentatiewijze. Zo kan een tekst, opgeslagen in kleine letters,
Copyright 2007 Academic Service
390
Databaseontwikkeling 4 Access 2003
op het scherm gepresenteerd worden als een tekst in hoofdletters. Afhankelijk van het soort veld kunnen we de notatiewijze instellen. Voor een tekst-veld kunnen we gebruikmaken van: @ op de positie van dit teken wordt het ingetypte teken of een spatie 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. voorbeeld
Om een artikelcode te tonen volgens het formaat twee tekens, punt, vier tekens, punt, één teken, in hoofdletters, kunnen we gebruikmaken van de notatie >@@.@@@@.@;[rood]”onbekend”. Als er geen waarde wordt ingevuld, wordt dit dus met de tekst ‘onbekend’ weergegeven (in het rood). De bovengenoemde eigenschappen gelden ook voor velden van het type memo. Voor een veld van het type numeriek 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, standaard worden er twee decimalen getoond. Euro – de valutanotatie wordt gebruikt, waarbij altijd het eurosymbool wordt getoond, onafhankelijk van het in Windows ingestelde valutasymbool; Vast – er wordt ten minste één cijfer weergegeven, zonder duizendtalteken, standaard worden er twee decimalen getoond. Standaard – het scheidingsteken voor duizendtallen wordt gebruikt; de standaardinstelling van het aantal decimalen is 2.
Copyright 2007 Academic Service
A Veldeigenschappen
391
Percentage – de waarde wordt met 100 vermenigvuldigd en er wordt een procentteken (%) toegevoegd; de standaardinstelling van het aantal decimalen is 2. Wetenschappelijk – de standaard wetenschappelijke notatie wordt gebruikt, dus machten van tien. Naast de standaardinstellingen kunnen we bij getallen ook een eigen presentatiewijze definiëren. We kunnen dan gebruikmaken van: . (punt) , (komma) 0 # # $ % E– of e–
E+ of e+
het scheidingsteken voor duizendtallen; het decimale scheidingsteken; 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; 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; wetenschappelijke notatie, met een minteken bij negatieve exponenten en een plusteken (+) bij positieve exponenten; te gebruiken in combinatie met andere symbolen, bijvoorbeeld 0,00E+00.
We kunnen bij getallen werken met vier secties, van elkaar gescheiden door een puntkomma. Deze bevatten achtereenvolgens de opmaak voor positieve getallen, voor negatieve getallen, voor de waarde nul (het getal nul) en ten slotte voor de Null-waarde (leeg veld). Voorbeeld : # #.##0,00; # #.##0,00 “Negatief!”;”Nul”; ”Onbekend”. Door deze instelling worden getallen altijd getoond als bedragen, voorafgegaan door het euroteken. Er wordt altijd minimaal één cijfer voor het decimaalteken getoond en altijd twee decimalen. Bij negatieve bedragen (tweede sectie) wordt achter
Copyright 2007 Academic Service
392
Databaseontwikkeling 4 Access 2003
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 eigenschappen 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 instelling van Windows zelf; standaard aangeduid met bijvoorbeeld: 17:34:23. Middellange tijdnotatie – middellange aanduiding, bijvoorbeeld: 5:34 PM. Korte tijdnotatie – korte aanduiding, bijvoorbeeld: 17:34. Naast de standaardinstellingen kunnen we ook een eigen presentatiewijze definiëren. We kunnen dan gebruikmaken van: : / c
scheidingsteken binnen de tijdaanduiding, aan te passen binnen Windows zelf; scheidingsteken binnen de datum; als de vooraf gedefinieerde Standaard datumnotatie;
Copyright 2007 Academic Service
A Veldeigenschappen
d dd ddd dddd ddddd dddddd w ww m mm mmm mmmm k j jj jjjj u uu n nn s ss ttttt AM/PM
am/pm A/P a/p AMPM
393
dag van de maand in één of twee cijfers, afhankelijk van wat nodig is (van 1 tot en met 31); dag van de maand (altijd) in twee cijfers; eerste twee letters van de dag; volledige naam van de dag; als de vooraf gedefinieerde Korte datumnotatie; als de vooraf gedefinieerde Lange datumnotatie; dag van de week (van 1 tot en met 7); week van het jaar (van 1 tot en met 53); maand van het jaar in één of twee cijfers; maand van het jaar (altijd) in twee cijfers; eerste drie letters van de maand; volledige naam van de maand; datum weergegeven als kwartaal van het jaar (van 1 tot en met 4); dag van het jaar (van 1 tot en met 366); laatste twee cijfers van het jaartal (van 01 tot en met 99); volledig jaartal in vier cijfers; uren in één of twee cijfers; uren in (altijd) twee cijfers; minuten in één of twee cijfers; minuten in (altijd) twee cijfers; seconden in één of twee cijfers; seconden in (altijd) twee cijfers; als de vooraf gedefinieerde Lange tijdnotatie; tijdaanduiding in maximaal 12 uren, met toevoeging van de hoofdletters AM (’s ochtends) of PM (’s middags); maximaal 12 uren, maar nu met toevoeging van de kleine letters am (’s ochtends) of pm (’s middags); maximaal 12 uren, met toevoeging van de hoofdletter A (’s ochtends) of P (’s middags); maximaal 12 uren, met toevoeging van de kleine letter a (’s ochtends) of p (’s middags); maximaal 12 uren, met de aanduiding van ochtend of middag, zoals gedefinieerd in Windows zelf.
Copyright 2007 Academic Service
394
Databaseontwikkeling 4 Access 2003
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 beschikken 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. Invoermasker Met een Invoermasker kunnen we per teken opgeven welke invoer is toegestaan. Daarbij kunnen we gebruikmaken van de volgende symbolen:
Copyright 2007 Academic Service
A Veldeigenschappen
395
0
verplichte invoer van een cijfer (0 t/m 9), het plus- en minteken 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 telefoonnummer) samen met de waarde opgeslagen. Als we 1 typen of de sectie leeg laten, worden alleen de tekens opgeslagen die we daadwerkelijk intoetsen. In de derde sectie geven we het teken op waarmee we spaties in het invoermasker wensen weer te geven. Om een bankrekening in te toetsen volgens het formaat 12.34.56.789, waarbij we de punten zelf niet opslaan, geven we de volgende notatie op: 00\.00\.00\.000;1;. Een postcode kan volgens de layout 0000\ >LL;1 De spatie (tussen de tekens \ en >) wordt nu niet opgenomen in het bestand.
Copyright 2007 Academic Service
396
Databaseontwikkeling 4 Access 2003
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 instelling 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. Figuur A.2
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 presenteren deze wel in de in- en uitvoer doordat we deze symbolen
Copyright 2007 Academic Service
A Veldeigenschappen
397
Figuur A.3
Figuur A.4
hebben opgenomen in het masker. Ten slotte voltooien we het masker. Let op! Als we gebruikmaken van een invoermasker en tegelijkertijd van de eigenschap Notatie, heeft de eigenschap Notatie prioriteit bij het weergeven van de gegevens.
Copyright 2007 Academic Service
398
Databaseontwikkeling 4 Access 2003
Bijschrift Normaal 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 kunnen we een andere tekst opgeven die als bijschrift moet worden gebruikt. Standaardwaarde Met deze eigenschap kunnen we een veld van een nieuw record automatisch laten vullen met een Standaardwaarde. Dit is handig als we in een veld vaak dezelfde waarde moeten invullen. We kunnen hier ook gebruikmaken van functies. Bij een datumveld kunnen we bijvoorbeeld gebruikmaken van de functie DATE() om de huidige datum te noteren. Uiteraard kunnen we tijdens het daadwerkelijk invoeren van gegevens de standaardwaarde wijzigen in een andere waarde. Validatieregel Met een Validatieregel kunnen we controleren of de door de gebruiker ingetoetste waarde voldoet aan de beperkingen zoals we die hebben opgegeven. We kunnen een validatieregel direct invoeren, maar ook gebruikmaken van de opbouwfunctie voor expressies zoals we die ook zijn tegengekomen bij het opstellen van 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 uitdrukking AND te gebruiken! Een tekst van vijf tekens, waarvan de eerste letter een A is, waarbij het ook is toegestaan om niets in te vullen: LIKE “A????” OR IS NULL. Let erop dat we ook de waarde van Vereist moeten instellen op No!
Copyright 2007 Academic Service
A Veldeigenschappen
399
Validatietekst Als we gebruikmaken van een Validatietekst, zal Windows een standaardmelding tonen op het moment dat er onjuiste invoer is ingegeven. Willen we een eigen melding laten tonen, dan kunnen we de tekst hier opgeven. Vereist De eigenschap Vereist gebruiken we om op te geven of een veld verplicht een waarde moet krijgen of dat men het ook leeg mag laten. Lengte nul toegestaan De eigenschap Lengte nul toegestaan bepaalt of we lege invoer toestaan of niet. Deze eigenschap werkt direct samen met de eigenschap Vereist. Is de eigenschap Vereist op Nee ingesteld, dan is lege invoer (bijvoorbeeld direct op Enter of op de spatiebalk drukken) toegestaan. In het veld wordt dan de Null-waarde geplaatst. Staat de waarde van de eigenschap Vereist op Ja, dan 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 bijgehouden) 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 verstandig op dat veld een index te definiëren. Access creëert zelf automatisch een index voor ieder sleutelattribuut. Vanuit een sleutelwaarde worden vaak gerelateerde gegevens in andere bestanden gezocht. Om dit zoeken te versnellen is het verstandig om in die bestanden, op basis van de betreffende 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 vertraagd omdat de index steeds opnieuw moet worden bijgewerkt.
Copyright 2007 Academic Service
400
Databaseontwikkeling 4 Access 2003
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 combinatie 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 eigenschappen 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 worden opgenomen of niet. In dit scherm kunnen we ook bestaande indexen wijzigen of verwijderen. We verwijderen een index door de betreffende regel te markeren en vervolgens op de toets Delete te drukken.
Copyright 2007 Academic Service
A Veldeigenschappen
401
Figuur A.5
Unicode compressie Access ondersteunt, net als de andere Office-modules, het Unicode-schema. Hiermee is het mogelijk in plaats van de gebruikelijke 256 tekens ruim 65000 verschillende tekens te gebruiken. Dit betekent echter wel dat velden van het type Tekst, Memo en Hyperlink twee keer zoveel ruimte in beslag nemen als wanneer er geen gebruik gemaakt wordt van Unicode. Indien we de Unicodecompressie 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 schijfruimte 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 verstandig de compressie uit te schakelen. IME-modus / IME-zinmodus IME staat voor Input Method Editor. Dit is een programma waarmee 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 IMEzinmodus 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 hierbij de keuze uit Chinees, Japans en Koreaans. De gewenste IME kun je downloaden vanaf de officiële Windows Officewebpagina.
Copyright 2007 Academic Service
402
Databaseontwikkeling 4 Access 2003
Infolabels Een 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 bijvoorbeeld in staat om snel een email te versturen, een afspraak te plannen of een naam toe te voegen aan de lijst met contactpersonen. Maar er bestaan ook acties die niet zo zeer gericht zijn op Outlook maar op andere zaken, bijvoorbeeld het ophalen van financiële gegevens over een bedrijf. Ook andere partijen dan Microsoft hebben standaardacties ontwikkeld. Heb je een infolabel aan een veld gekoppeld dan zal, zodra je het veld selecteert, het infolabelsymbool verschijnen. Door hier met de rechtermuistoets op te klikken kun je de actie starten. Wil je infolabels bij gebruik van het gegevensblad niet tonen, dan kun je dit bereiken door via Extra, Opties naar het tabblad Gegevensblad te gaan en hier voor de betreffende keuze het vinkje weg te halen.
Copyright 2007 Academic Service
B
Opties
Tijdens het werken met Access zullen we merken dat het programma een aantal vooraf ingestelde standaardwaarden kent, bijvoorbeeld 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 standaardinstellingen worden hierna nader toegelicht. Willen we een standaardwaarde wijzigen, dan kiezen we in het menu voor Extra, Opties. Vervolgens wordt het scherm dat is afgebeeld 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/query’s. De overige tabbladen worden hier verder buiten beschouwing gelaten omdat deze buiten de doelstellingen van dit boek liggen. Weergave In het tabblad Weergave kunnen we opgeven wat we op het scherm wensen te zien. We regelen dit door het betreffende item wel of niet af te vinken (zie 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.
Copyright 2007 Academic Service
404
Databaseontwikkeling 4 Access 2003
Figuur B.1
Als tweede kun je opgeven of je het Taakvenster dat Access standaard 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 (tabellen, rapporten, enzovoort) worden getoond maar ook de specifieke snelkoppelingen, bijvoorbeeld Rapport maken in ontwerpweergave of Rapport maken met wizard. De vierde instelling, Verborgen objecten, komt soms goed van pas. We kunnen namelijk objecten uit de database (tabellen, query’s, enzovoort) verbergen. Daartoe klikken we er in het databasescherm 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 tabblad 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 ‘verbergen’ eventueel weer opheffen.
Copyright 2007 Academic Service
B Opties
405
De vijfde instelling is ‘gevaarlijk’. We kunnen daarmee de systeemtabellen zichtbaar maken in het databasescherm. In deze tabellen houdt Access voor zichzelf bij hoe de database is opgebouwd: 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 bedoeling 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 voorwaarden wensen te zien. Ook de wijze van klikken om objecten in het databasevenster te openen kun je nog opgeven. Algemeen In het tabblad Algemeen, zie 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
Copyright 2007 Academic Service
406
Databaseontwikkeling 4 Access 2003
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 opgezocht, 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 sorteervolgorde van bestaande databases. Met de instelling Automatische naamcorrectie kunnen we instellen 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 databases 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 compressieprogramma’s zoals PKZIP wordt behaald. We kunnen ook opgeven of we gebruik wensen te maken van geluidseffecten bij bijvoorbeeld het optreden van fouten of uitzonderlijke situaties, Feedback met geluid. De te gebruiken geluiden 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 verwijderen, kunnen we afdwingen dat de persoonlijke gegevens zoals naam en bedrijf wel of niet worden opgenomen in de algemene
Copyright 2007 Academic Service
B Opties
407
eigenschappen van een database. De algemene eigenschappen van een database kun je opvragen via Bestand, Eigenschappen. Met de knop Webopties roep je een scherm op waarin je een aantal webgerelateerde 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 aangeboden sjablonen en mediafragmenten. Via deze optie kun je ook aangeven of je wilt meewerken aan het leveren van feedback aangaande het gebruik van Microsoft software. Deze feedback verloopt geheel geautomatiseerd en in de achtergrond. Op regelmatige tijdstippen worden (niet-persoonsgebonden) gegevens omtrent gebruik, uitzonderingen, foutmeldingen etc. naar Microsoft verstuurd. Bewerken/zoeken In het tabblad Bewerken/zoeken kunnen we als eerste opgeven wat de standaardmethode zoeken/vervangen moet zijn. Deze standaardmethode wordt voorgesteld als we gegevens gaan zoeken in een tabel via de menukeuze Bewerken, Zoeken. De standaardmethode 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 daadwerkelijk 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 kunnen we hier de waarde instellen die opgeeft: Geen lijsten weergeven waarvoor meer dan het volgende aantal records is gelezen. Lijsten waarbij minder dan het opgegeven aantal records is betrokken, worden getoond. Lijsten waarbij meer dan het opgegeven aantal records is betrokken, worden onderdrukt.
Copyright 2007 Academic Service
408
Databaseontwikkeling 4 Access 2003
Figuur B.3
Toetsenbord In het tabblad Toetsenbord kunnen we als eerste opgeven wat de wijze van Verplaatsing met Enter moet zijn op het moment dat we op de toets Enter drukken, zie 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 k en m 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 k en m wel of niet door kunnen gaan naar een vorig/ volgend record in de lijst.
Copyright 2007 Academic Service
B Opties
409
Figuur B.4
Gegevensblad In het tabblad Gegevensblad kunnen we de opmaak van de gegevensbladen instellen, zie figuur B.5. Figuur B.5
De instellingen voor Standaardkleuren, Standaardlettertype, Standaardweergave van rasterlijnen, Standaardkolombreedte, Standaardceleffect en Animatie weergeven kunnen we aanpassen.
Copyright 2007 Academic Service
410
Databaseontwikkeling 4 Access 2003
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’s Het tabblad Tabellen/query’s is bedoeld om de standaard bij het ontwerpen van tabellen en query’s in te stellen, zie figuur B.6. 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
Copyright 2007 Academic Service
B Opties
411
tabel voor het eerst op in het ontwerp van een formulier/rapport, dan worden automatisch alle eigenschappen van dat veld meegenomen, bijvoorbeeld dat het een numeriek veld is met twee decimalen. 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 eigenschappen 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 instelling 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 combinaties 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 aanbrengen of dat ook gebruikers van de query dat mogen, gebaseerd op de aan de gebruiker algemeen toegekende rechten. De optie Met SQL-Server compatibele syntaxis (ANSI 92) bepaalt of je wilt werken met de standaard ANSI 92 of met de standaard ANSI 89. Access werkt bij SQL met de standaard ANSI 89. Deze standaard is dan ook in dit boek aangehouden. Zolang je werkt met Access-databases geeft dit weinig tot geen beperkingen. Maar als je gegevens wilt ontsluiten die in een professioneel DBMS zoals MS SQL-server liggen opgeslagen, moet je de standaard ANSI 92 gebruiken omdat MS SQL-server volgens die standaard werkt.
Copyright 2007 Academic Service
412
Databaseontwikkeling 4 Access 2003
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 verschillen, 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 aangetroffen! Door dit soort verschillen is het dan ook niet mogelijk om beide standaarden door elkaar te gebruiken. Je moet een keuze maken. Bedenk dat bij het overschakelen naar de standaard ANSI 92, door het aanvinken van het betreffende veld, je 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.
Copyright 2007 Academic Service
C
Een grote, uitgewerkte opdracht
In deze bijlage wordt een uitgewerkt voorbeeld gegeven van een opdracht waarin alle aspecten aan de orde komen zoals die in dit boek zijn toegelicht in de hoofdstukken 1 tot en met 7. Er wordt uitgegaan van een gegeven informatiebehoefte. Via de techniek van het normaliseren wordt hieruit de informatiebehoefte bepaald. Vervolgens wordt de informatiebehoefte vertaald naar een Accessdatabase 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 kunnen vergelijkbare opgaven verkrijgen bij de auteurs van het boek. Voor meer informatie hierover verwijzen we naar het voorwoord. De opdracht Een tweewielcentrum in Almelo verkoopt fietsen, brommers en scooters. Sinds enige jaren heeft men de klanten ook de mogelijkheid gegeven om brommers en scooters te leasen. Om de gegevens hiervan bij te houden maakt men onder andere gebruik van de volgende overzichten. In figuur C.1 wordt per leasecontract vastgelegd wie welke brommer of scooter least, vanaf welke datum en tegen welk bedrag. Tevens wordt na afloop van het contract de datum vastgelegd waarop het contract eindigt. Men kan een contract per maand opzeggen. Er geldt wel een opzegtermijn van twee maanden. Tenslotte houdt men per contract ook de betalingsgegevens bij. De prijs per maand is gebaseerd op het merk en type brommer of scooter dat wordt gehuurd en van het feit of men ook een verzekering via het tweewielcentrum heeft afgesloten. In dat geval ontvangt men een korting van 10% op het standaard leasebedrag per maand.
Copyright 2007 Academic Service
414
Databaseontwikkeling 4 Access 2003
Figuur C.1
In figuur C.2 wordt per merk en type de prijs bijgehouden die men per maand in rekening brengt. Figuur C.2
a. Logisch ontwerp a.1. Normaliseer beide figuren. Licht de normalisaties toe, denk daarbij aan het toelichten van proces-, samengestelde en constante gegevens. Licht ook de sleutelkeuze toe.
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
415
a.2. Integreer de normalisaties tot één geheel en ontwerp het bijbehorende ERD. a.3. Bij de onderdelen d, e en f kan sprake zijn van nog niet genoemde attributen. Voeg deze (indien van toepassing) toe aan de betreffende objecten. b. Technisch ontwerp b.1. Ontwerp de tabellen met behulp van Access. Zorg ervoor dat bij vreemde sleutels alleen uit de bijbehorende sleutelwaarde kan worden gekozen door gebruik te maken van een combobox (zie hoofdstuk 5). Neem in de kolom Beschrijving een korte omschrijving op. b.2. Leg tussen de tabellen alle bestaande relaties en dwing daarbij de controle op referentiële integriteit af. 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 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 netjes, overzichtelijk en uitnodigend is. d. Opvragen gegevens d.1. Verzorg een query waarmee alle klantgegevens worden gepresenteerd van klanten die per automatische incasso betalen. Op volgorde van postcode. d.2. Verzorg een query waarmee een overzicht wordt verkregen met daarop 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. 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 lopende leasecontracten. Toon het overzicht op volgorde van plaatsnaam.
Copyright 2007 Academic Service
416
Databaseontwikkeling 4 Access 2003
d.5. Verzorg een query waarmee per contract het totaal aan betaalde bedragen wordt getoond. Laat ook het aantal betalingen en de naam van de klant tonen. Het overzicht moet liggen op volgorde van dalend totaalbedrag. e. Manipuleren gegevens e.1. Verzorg een query waarmee het bedrag per maand wordt aangepast. Leasebedragen boven de # 20,– moeten met 2% worden verhoogd. Alle andere moeten met 3% worden verhoogd. Maak voordat je dit test een kopie van je database! 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 de database! f. Rapporten f.1. Verzorg een rapport waarmee figuur C.2 kan worden gegenereerd. 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. Uitwerking a. Logisch ontwerp a.1. Normaliseer beide figuren. Licht de normalisaties toe, denk daarbij 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, maandbedrag, RG (betaal-datum, betaald bedrag))
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
417
Per contract wordt een uniek nummer gebruikt. Het contractnummer kan dus als sleutel worden gebruikt. Alle gegevens worden één keer vermeld, met uitzondering van de betaalgegevens, die dus zijn opgenomen in een 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, ingangsdatum, 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 combinatie 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) (contractnummer, betaaldatum, betaald bedrag) (klantnummer, naam, adres, postcode, plaats, telefoonnummer, geboortedatum) Er is een nieuwe groep ontstaan met daarin de gegevens van de klant. Deze gegevens hebben immers op zich niets te maken met het contractnummer.
Copyright 2007 Academic Service
418
Databaseontwikkeling 4 Access 2003
We vinden dus uiteindelijk: CONTRACT
BETALING KLANT
(contractnummer, klantnummer, merk, type, ingangsdatum, beëindigingdatum, verzekering, maandbedrag) (contractnummer, betaaldatum, betaald bedrag) (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 constanten 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 uiteindelijk: VOERTUIG
(merk, type , prijs per maand)
a.2. Integreer de normalisaties tot één geheel en ontwerp het bijbehorende ERD. De integratie geeft in eerste instantie de onderstaande vier tabellen. CONTRACT
BETALING KLANT VOERTUIG
(contractnummer, klantnummer, merk, type, ingangsdatum, beëindigingdatum, verzekering, maandbedrag) (contractnummer, betaaldatum, betaald bedrag) (klantnummer, naam, adres, postcode, plaats, telefoonnummer, geboortedatum) (merk, type , prijs per maand)
Door de integratie ontstaat er plotseling een procesgegeven. Het maandbedrag in de tabel CONTRACT is na integratie een procesgegeven geworden, omdat dit bedrag ook kan worden afgeleid
Copyright 2007 Academic Service
419
C Een grote, uitgewerkte opdracht
uit de prijs per maand uit de tabel VOERTUIG, tezamen met het gegeven verzekering uit de tabel CONTRACT. Immers, als er geen verzekering is afgesloten, geldt dat het maandbedrag gelijk is aan de prijs per maand. Als er wel een verzekering bij afgesloten is, wordt er een korting van 10% op de prijs per maand verleend. Dus uit het feit of er wel of niet een verzekering is afgesloten, kan in combinatie met de prijs per maand het maandbedrag worden berekend. We laten het maandbedrag dus achterwege. We krijgen dan: CONTRACT BETALING KLANT VOERTUIG
(contractnummer, klantnummer, merk, type, ingangsdatum, beëindigingdatum, verzekering) (contractnummer, betaaldatum, betaald bedrag) (klantnummer, naam, adres, postcode, plaats, telefoonnummer, geboortedatum) (merk, type , prijs per maand)
Dit levert het volgende ERD op: Betaling
Contract
o.b.v. contractnummer
Klant
o.b.v. klantnummer o.b.v. merk + type Voertuig
Bij een contract kunnen nul, een of meer betalingen horen. Een betaling hoort bij precies één contract. Bij een contract hoort precies één klant, maar een klant kan wel meerdere contracten hebben lopen. Omdat we een klantgegeven pas opnemen in de database als er een contract is opgesteld, hoort er bij iedere klant minstens één contract. Bij een contract hoort één type 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 betreffende 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
Copyright 2007 Academic Service
420
Databaseontwikkeling 4 Access 2003
per contract bepaalt of hij wel of niet via automatische incasso wil betalen. We krijgen dus uiteindelijk: CONTRACT
BETALING KLANT VOERTUIG
(contractnummer, klantnummer, merk, type, ingangsdatum, beëindigingdatum, verzekering, aut incasso) (contractnummer, betaaldatum, betaald bedrag) (klantnummer, naam, adres, postcode, plaats, telefoonnummer, geboortedatum) (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 omschrijving op. De ontworpen tabellen kun je terugvinden in database TWEEWIELCENTRUM. Deze database is te vinden op de cd-rom die bij het boek is geleverd. Een afdruk van de ontworpen tabellen is weergegeven in de figuren C.3 tot en met C.6 Figuur C.3
Figuur C.4
Figuur C.5
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
421
Figuur C.6
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 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 worden uitgevoerd en getest. De inhoud van de tabellen kan worden teruggevonden in de database TWEEWIELCENTRUM. Voor de overzichtelijkheid is de inhoud van de tabellen ook hier weergegeven in de figuren C.8 tot en met C.11.
Copyright 2007 Academic Service
422
Figuur C.8
Databaseontwikkeling 4 Access 2003
contract- klantnummer nummer
merk
type
ingangsdatum
beëindigings- verzekering aut incasso 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
7
1
Vespa
Pronto
1-9-2002
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
Nee
Ja
11
4
Asprilla
Rimi
3-1-2003
Ja
Ja
12
8
Vespa
Pronto
26-3-2003
Nee
Nee
contractnummer
betaaldatum
2
1-4-2002
C
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
1
1-11-2002
C 23,40
1-9-2002
26-3-2003
Nee
Nee
Nee
Nee
betaald bedrag 9,00
9,00
– zie vervolg –
Copyright 2007 Academic Service
423
C Een grote, uitgewerkte opdracht
Figuur C.9
contractnummer
betaaldatum
8
1-11-2002
betaald bedrag C
7
1-11-2002
C 22,50
3
1-11-2002
C 13,00
4
1-11-2002
C
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
7
1-2-2003
C 22,50
5,00
9,00
6,00
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
Copyright 2007 Academic Service
424
Figuur C.10
Figuur C.11
Databaseontwikkeling 4 Access 2003
klantnaam nummer
adres
postcode plaats
telefoonnummer
geboortedatum
Kerkstraat 2
7607 BS
Almelo
0546753796
7605 BG
Almelo
0546758869 27-12-1981 0548442943
1
Jansen, Jan
2
Walters, Wouter Merelstraat 13
3
Verploeg, Koen
Oranjestraat 164
7461 DK
Rijssen
4
Wit, Erica de
Almeloseweg 182
7614 LB
Mariaparochie 0546433839 15-11-1982
5
Boer, Koen de
Eikenlaan 10
7461 XS
Rijssen
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
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
0548499303
1-3-1982 31-3-1982 28-3-1979
prijs per maand
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, overzichtelijk en uitnodigend is. Figuur C.12
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.
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
425
d. Opvragen gegevens d.1. Verzorg een query waarmee alle klantgegevens worden gepresenteerd van klanten die per automatische incasso betalen. Op volgorde 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. Figuur C.13
Figuur C.14
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.
Copyright 2007 Academic Service
426
Databaseontwikkeling 4 Access 2003
Figuur C.15
Figuur C.16
d.3. Hoeveel leasecontracten zijn er in 2002 afgesloten, die nog steeds doorlopen en waarbij ook direct de verzekering via ons is afgesloten? Figuur C.17
De query is opgeslagen onder de naam Aantal2002Verzekering. Figuur C.17 bevat een afdruk van het ontwerpscherm. Figuur C.18 bevat de gegenereerde uitvoer.
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
427
Figuur C.18
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 gegenereerde uitvoer. Figuur C.19
Figuur C.20
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 AantalContractenPerPlaats. Figuur C.21 bevat een afdruk van het ontwerpscherm. Figuur C.22 bevat de gegenereerde uitvoer.
Copyright 2007 Academic Service
428
Databaseontwikkeling 4 Access 2003
Figuur C.21
Figuur C.22
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.23
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
429
Figuur C.24
e. Manipuleren gegevens e.1. Verzorg een query waarmee het bedrag per maand wordt aangepast. Leasebedragen boven de # 20,– moeten met 2% worden verhoogd. Alle andere moeten met 3% worden verhoogd. Maak voordat je dit test een kopie van de database! De query is opgeslagen onder de naam VerhoogMaandbedragen. Figuur C.25 bevat een afdruk van het ontwerpscherm. Er is gebruikgemaakt van de IIF-functie om de wijziging tot stand te brengen. Figuur C.25
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 VerwijderBeeindigdeCont racten. Figuur C.26 bevat een afdruk van het ontwerpscherm. Om deze query goed te laten verlopen dient de relatie tussen Contract
Copyright 2007 Academic Service
430
Databaseontwikkeling 4 Access 2003
en Betaling te zijn ingesteld op Gerelateerde records trapsgewijs verwijderen. Hierdoor zullen ook de betalingen van de betrokken contracten worden verwijderd! Figuur C.26
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.27
Copyright 2007 Academic Service
C Een grote, uitgewerkte opdracht
431
Figuur C.28
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 worden 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.
Copyright 2007 Academic Service
432
Databaseontwikkeling 4 Access 2003
Figuur C.29
Figuur C.30
Copyright 2007 Academic Service
433
Index C Caption 221 Check Box 145 Combo Box 156 Command Button 180 Common Expressions 312 conceptueel datamodel 14 Conditions 264 constante gegevens 25 constantentabel 273 ControlTip Text 184 converteren 7 COUNT 361
Symbolen &-teken 256 A achtergrondkleur 255 actiekolom 248 afbeeldingen 151 afdrukken 88 afhankelijk kader 152 Algemeen 405 alias 356 Alleen lijst 163 AND 347 applicatie 5, 271 argumenten 248 ASC 359 attribuut 26, 36, 70 attribuutwaarde 36 AVG 361 B Back Color 255 Backup 123 besturingselementnaam 263 BETWEEN 348 bewerken 407 bijeenhouden 223 bij geen gegevens 320 bij klikken 268 bij openen 269 bij opmaken 314 bijschrift 221, 398 bij sluiten 300 Border Style 222 breedte 284
D database 9 aanmaken 71 openen 351 selecteren 77 database-administrator 14 datadictionary 60 datamodel 14 DataPageSize 208 datumaanduiding 348 DELETE FROM 385 derde normaalvorm 33 DESC 359 detail 215 DISTINCT 350 DividingLines 280 draaigrafieken 192 draaitabellen 185 dubbele repeterende groep 47, 52 duplicaten verbergen 216
Copyright 2007 Academic Service
434
Databaseontwikkeling 4 Access 2003
E eerste normaalvorm 28 elementaire gegevens 25 Enabled 168 entiteit 36 entiteit-occurence 36 Entiteit-Relatie-Diagram 36 ExpandedByDefault 208 Expression Builder 260 F flexibele query 226 Font Size 281 Font Weight 222 Fore Color 311 foreign key 38 formaat modus 154 kader niet vullen 154 kader vullen 154 uitsnede 154 formulier(en) 145 autoformulier 135 gebruiken 140 wizard 137 formulierkiezer 170 formulierkoptekst 280 formuliervoettekst 282 FROM 346 functie Choose() 310 IIf() 292 Switch() 310 functioneel datamodel 14 G gangbare expressies 312 gebeurtenis 268 gegeven 2 manipuleren 416, 429 opvragen 415, 425 gegevensanalyse 20
gegevensbank 9 gegevensblad 409 gegevenstructuur 7 groepeerinterval 223 groeperen 364 groeperen op 223 groepskoptekst 223 groepsvak 149 groepsvoettekst 223 GROUP BY 364 Group Footer 223 Group Header 223 Group Interval 223 Group On 223 H handje met vijf vingers 293 handje met wijsvinger 293 HAVING 365 Height 284 Hide Duplicates 216 homoniemen 58 hoofdformulier 165 hoogte 284 I identity integrity 343 IIF 115 IN 349 inconsistent 5 indexeren 399 informatie 2 informatie-analyse 20 informatiebehoefte 20 ingeschakeld 168, 294 inner join 322, 381 INSERT INTO 384 integreren 59 integriteit 2 invoermasker 394 IS NULL 349
Copyright 2007 Academic Service
435
Index
J join 355 joineigenschappen 108 K kandidaat-sleutels 27 Keep Together 223 keuzelijsten 156 met invoervak 156 zonder invoervak 156 klassieke bestandsorganisatie 9 knopinfo 184 kolombreedte 86 kolommen 342 vastzetten 88 verbergen 87 verplaatsen 87 koptekst 362 L label 280 left join 381 left outer-join 322 lengte nul toegestaan 399 lettertype 85 lijn 222 LIKE 349 LimitToList 163 Line 222 List Box 157 Locked 168 logisch ontwerp 414, 416 M macro AlleMacrosStoppen 320 Berichtvenster 249 CancelEvent 320 FilterToepassen 250 FormulierOpenen 258 GebeurtenisAnnuleren 320
GoToControle 263 MacroStoppen 267 Maximaliseren 249 NaarBesturingselementGaan 263 OpenForm 258 OpenReport 298 RapportOpenen 298 SetValue 258 Sluiten 250 StopAllMacros 320 StopMacro 267 TabelOpenen 248 VorigFormaat 250 WaardeInstellen 258 macrogroep 257 macronaam 248 Macro Name 248 macrostap 252 Main Switchboard 331 MAX 361 Mde-bestand 339 meerdere tabellen 355 menustructuur 275 metagegevens 62 MIN 361 Min.- en max.-knop 280 minimaliteit-eis 343 Min Max Buttons 280 modaal 257 modaalvenster 257 Modal 257 N naam 290 Name 290 navigatieknoppen 279 NavigationButtons 279 NewRowOrCol 326 niet-afhankelijk kader 152 nieuwe rij of kolom 326 normaliseren 23
Copyright 2007 Academic Service
436
Databaseontwikkeling 4 Access 2003
Q query bijwerk~ 119 gecorreleerd 379 groepeer~ 116 selectie~ 100, 112 verwijder~ 120
afdrukken 134 autorapport 124 etiketten 131 verwijzingen 259 wizard 126 rapportkoptekst 214 rapportvoettekst 215 record 70 ~kiezers 279 ~locking 16 filteren 81 sorteren 81 toevoegen 80 vervangen 83 verwijderen 81 wijzigen 80 zoeken 82 recordbegrenzingslijnen 280 RecordSelectors 279 redundantie 5 referential integrity 343 referentiële integriteit 90 afdwingen 92 rekenkundige bewerkingen 361 rekenveld 185 relaties 90 toepassen 94 toevoegen 91 verwijderen 94 relationele database 13 repeterende groep 26 Report Footer 215 right join 381 right outer join 322 rijen 342 rijhoogte 86 runtime versie 339
R randbreedte 281 randstijl 222 rapporten 211, 416, 430
S schakelbordbeheer 330 schakelborden 329 schuifbalken 279
notatiewijze 389 nulde normaalvorm 23 O OLE-objecten 151 On Open 269 ontwerpweergave 351 opbouwen tabellen 415 opbouwfunctie voor expressies 260 opdrachtknoppen 180 opmaak 85 opstarten 337 opties voor groeperen 228 opties voor totalen 239 OR 347 ORDER BY 359 outer join 381 P Page Footer 215 Page Index 179 Pages 311 pagina 311 pagina-index 179 paginakoptekst 215 paginavoettekst 215 primaire sleutel 343 procesgegevens 26 programma 271
Copyright 2007 Academic Service
437
Index
ScrollBars 279 SELECT 346 selectievakje 145 Single Step 252 Size Mode 154 Clip 154 Zoom 154 sleutelattribuut 27 sleutelveld 76 speciale joins 380 SQL 341 standaardwaarde 398 starten 251 subformulier 165 subformulier/subrapport 176 subquery’s 370 SUM 361 Switchboard Manager 330 switchboards 329 synoniemen 59 systeemmenu 257 T tabbesturingselement 175 tabbladen 174 tabel 4, 342 aanmaken 73 aanpassen 79 selecteren 78 tabellen/query’s 410 Tab Stop 182 tabstop 182 tabvolgorde 295 technisch ontwerp 415, 420 tekengewicht 222 tekengrootte 281 tekstuitlijning 225 Text Align 225 toepassing 271 toetsenbord 408 Toggle Button 147 trapsgewijs bijwerken 92
trapsgewijs verwijderen 92 tweede normaalvorm 31 U uitvoeren 352 Unbound Object Frame 152 UNC 202 unieke records 116 unieke waarden 116 UNION 385 UPDATE 385 V validatieregel 398 validatietekst 399 VBA-code 269 veld 70 veldlengte 388 vereist 399 vergrendeld 168, 295 view 14 Visual Basic for Applications 269 volgorde 359 voorbeeldopgave 413 voorgrondkleur 311 voorwaarden 264 vreemde sleutel 38, 343 W wachtwoord 395 weergave 403 werking tabtoets 286 WHERE 346 WHERE-voorwaarde 250 Where Condition 250 wisselknop 147 wizard opzoeken 157 wizards voor besturingselementen 149 Z zoeken 407
Copyright 2007 Academic Service