Inhoudsopgave
Relaties maken
Het venster waar je de relaties legt, is bereikbaar via de ontwerpweergave en de gegevensbladweergave. Soms is het leven gemakkelijk en kan je kiezen. ????
Ik vertrek nu van de gegevensbladweergave en klik dan op de tab tabel.
Je ziet nu de in de groep relaties de knop relaties staan. Klik op relaties.
Het tabblad relaties opent nu.
Het is best om vooraleer we verdergaan eerst de tabeltabs die open staan te sluiten. Anders krijg je daarover straks een foutmelding te lezen. Sla op als je nog wijzigingen had gedaan.
Aan de rechterkant zie je het venster tabellen toevoegen. Je merkt dat je tabellen, koppelingen en query’s (waarover later meer) kan toevoegen om de relaties te leggen.
Je ziet onder tabellen de tabellen die in je database zitten.
Het is nu de bedoeling om die tabellen toe te voegen onder het tabblad relaties. Dat doe je door de tabellen in het lijstje te selecteren (eventueel meerdere items tegelijk door shift in te drukken en dan de tabellen aan te klikken) en dan te klikken op de knop geselecteerde tabellen toevoegen. Je kan gewoon dubbelklikken op een tabel om die aan de relaties toe te voegen.
Je ziet nu de tabellen naast elkaar verschijnen, met ook de velden per tabel. De primaire sleutel wordt aangeduid met een sleutelicoontje.
Je kan zoals je hierboven ziet de volgorde van de tabellen veranderen door op de titel van de tabel te klikken zodat er een gekleurd kader rond verschijnt. Vervolgens kan je door klikken en slepen de tabel verplaatsen. Je kan door te slepen ook gemakkelijk de afmetingen aanpassen.
Om relaties te maken sleep je een veld uit de ene tabel naar het overeenkomstige veld in de andere tabel.
Als je bijv. in de boekentabel elk record een bepaalde locatie wil kunnen geven om aan te geven waar dat boek te vinden is, dan moeten we dus een relatie leggen van het locatieveld in de boekentabel naar het locatieveldveld in de locatietabel. Je verwijst dus in de boeken naar een bepaald veld in de locatietabel.
Dat lukt alleen maar als je dat locatieveld 2 x hebt: 1 x in de locatietabel, en 1 x in de boekentabel. Er zijn velden nog die overeenkomen om relaties tussen de tabellen te kunnen leggen.
Ik mijn voorbeeld had ik alleen een locatieveld gemaakt in de locatietabel. Wat ik nu dus moet doen is ook in de boekentabel iets zeggen over de locaties. Ik doe dat door daar een nieuw veld bij te maken. Met de wizard opzoeken zorg ik ervoor dat ik in de boekentabel dezelfde locaties zie als in de locatietabel.
Is dat gelukt? Ok, dan zijn we klaar om de relaties te leggen. Sluit nu opnieuw alle openstaande tabellen, en schakel over naar de tab relaties.
Omdat we net de wizard opzoeken hebben gebruikt, is nu automatisch al een relatie toegevoegd. Je ziet dat aan het lijntje tussen de locatietabel en de boekentabel. Als je goed kijkt zie je dat die relatie eigenlijk van het locatie_id veld naar het locatieveld loopt.
Je moet nu eens dubbelklikken op die lijn tussen de 2 tabellen. Er opent nu een venstertje waar je in detail ziet welke relatie je instelt.
- Je ziet welke velden uit weke tabellen je aan elkaar vastknoopt.
- Je ziet onderaan wat voor relatie het is. Hier is dat “een-op-veel”: 1 locatie kan terugkomen bij veel boeken, terwijl 1 boek maar 1 locatie kan hebben.
- Jointype: dit heeft te maken met wat er met de records moet gebeuren die al in de database zitten, ik leg dat straks uit.
- Referentiële integriteit: hiermee stel je in wat er moet gebeuren als je met een wijziging aan je records of tabel de relatie verstoort. Wat moet er in de boekentabel gebeuren als je een auteur in de auteurtabel wist? Daarover gaat referentiële integriteit. Meer info vind je hieronder.
Zorg dat er zeker een vinkje bij referentiële integriteit staat en klik ik gewoon op OK. De uitleg over referentiële integriteit volgt straks.
Je ziet nu een dikkere lijn tussen de 2 tabellen staan. Er staat ook een 1 en ∞ symbool bij om aan te geven dat het een 1 op veel relatie is. Die extra symbolen verschijnen omdat we de referentiële integriteit aangevinkt hebben.
Wil je later een relatie wissen? Klik dan op de lijn te klikken en druk de delete-toets in.
Als je de wizard opzoeken gebruikt, leg je dus relaties. Je kan die ook manueel leggen in het relatievenster. We gaan dat eens proberen.
Laat ons dat eens doen met de relatie tussen de onderwerptabel en de boeken. Die is ook 1 op veel in dit geval: een onderwerp hoort bij meer boeken, maar een boek heeft maar 1 onderwerp.
Wat we dan eerst doen is in de boekentabel een nieuw veld onderwerp aanmaken. Ik kies voor veldtype numeriek omdat we gaan linken met de onderwerp_id, en dat is gewoon een nummertje.
Vervolgens bewaren we dat en sluit ik de boekentabel.
In het relatievenster maken we de relatie nu manueel: klik op onderwerp_id in de onderwerptabel en sleep dat naar onderwerp in de boekentabel. Vervolgens opent opnieuw het relatievenster waar je de referentiële integriteit aanvinkt.
Laat ons nu even terugkeren naar onze auteurstabel. Vlak voor de eerste kolom Auteur-ID, zie je nu plustekentjes staan. Als je daarop klikt, zie je voor welke boeken dat bepaalde ID gebruikt wordt.
Het stukje wat openklapt noemen we een subgegevensblad, een gegevensblad in een gegevensblad.
Je kan zelfs in zo’n subgegevensblad ook data typen, om zo meteen data in te geven in 2 tabellen tegelijk.
Handig hé?
Referentiële integriteit
Tijd om dit concept met de moeilijke naam een beetje verder uit te spitten.
Wat is referentiële integriteit?
Zoals je weet hebben we in het relatievenster daarnet het vinkje bij referentiële integriteit aangevinkt.
Dat betekent dat Microsoft Access ons gaat helpen om de database zuiver, zonder fouten te houden wanneer we wijzigingen willen aanbrengen in de tabellen die door de relatie met elkaar verbonden zijn.
Wat als ik bijvoorbeeld een boek ingeef met een onderwerp-ID wat niet bestaat? Dan verstoor ik de relatie.
Wanneer ik dat probeer te doen verschijnt een foutmelding. Die voorkomt dat ik per ongeluk een niet bestaande onderwerp gebruik.
2 extra vinkjes wanneer je relaties met referentiële integriteit instelt
Wanneer we een relatie instellen en het vinkje bij referentiële integriteit zetten, dan kunnen we 2 extra vinkjes zetten:
- gerelateerde velden trapsgewijs bewerken
- gerelateerde records trapsgewijs verwijderen
Als je dit zo leest, betekent het waarschijnlijk weinig. Daarom probeer ik hieronder kort uit te leggen wat je ermee kan doen. ????
Het ene vinkje bepaalt wat er gebeurt als je velden in verbonden tabellen bewerkt, terwijl het andere vinkje bepaalt wat er gebeurt als je velden verwijdert.
Gerelateerde velden trapsgewijs bewerken
Het eerste bepaalt wat er moet gebeuren als de primaire sleutel wordt aangepast.
Als je het vinkje niét zet, is zo’n aanpassing niét mogelijk (de aanpassing brengt dan de integriteit in gevaar). Aanpassingen zijn niet toegestaan.
Als je het vinkje wél zet, dan wordt het record in de andere tabel aangepast wanneer je het in de ene tabel wijzigt. Je bewerking in de ene tabel wordt ook doorgevoerd in de andere.
Omdat in mijn tabel de unieke sleutels uit een autonummering bestaat, kan ik hier moeilijk dat effect laten zien.
Gerelateerde velden trapsgewijs verwijderen
Wat moet er gebeuren met mijn boek (in de boekentabel) als ik een onderwerp verwijder uit de onderwerptabel?
Als dit vinkje is ingeschakeld, dan kan je een onderwerp verwijderen, maar dan worden ook de boeken over dat onderwerp verwijderd. Dat is dus een serieuze ingreep. Je records worden gewist. Je krijgt wel een waarschuwing die je erop attent maakt, maar toch. Goed opletten is de boodschap. ❗
Als dit vinkje niet is ingeschakeld, maar wel referentiële integriteit, dan kan je géén onderwerp verwijderen zolang dit ergens in de boekentabel wordt gebruikt.
Jointype
Wanneer je een relatie legt, zie je ook een knopje staan waarmee je het zogenaamde jointype instelt. Die knop is nuttig om te bepalen wat het systeem moet doen met de data die al in je tabellen zitten wanneer we straks query’s gaan maken.
Stel dat je bijvoorbeeld een boek hebt waarvoor het onderwerpveld niet is ingevuld. Mag dat boek dan getoond worden? Of mogen enkel boeken getoond worden die een onderwerp hebben?
En andersom kan ook, wat met onderwerpen die niet aan een boek zijn toegewezen. Heeft het nut om die te tonen?
Zodra je op het jointype knopje klikt, kan je kiezen uit 3 mogelijke gevallen:
Vertaald naar ons voorbeeld betekenen deze opties:
- Gegevens uit de ene tabel worden alleen getoond als ze in gebruik zijn in de andere tabel, dat is dus de meest strenge situatie.
- Onderwerpen worden getoond (ook als ze nog niet aan een boek zijn toegewezen); boeken worden enkel getoond als ze een auteur hebben
- Boeken worden getoond (ook als ze nog geen auteur hebben); onderwerpen worden enkel getoond als ze zijn toegewezen aan een boek.
Snap je het? Jointype bepaalt dus welke impact de tabellen op elkaar hebben.
Alle relaties verder uittekenen en de verbindingstabel maken
Tijd nu om heel onze database eens uit te tekenen. Alle tabellen moeten met elkaar in verbinding gebracht worden.
Eerder hadden we al gezegd dat de relatie tussen de auteurs en de boeken een veel-op-veel relatie is. Een auteur kan terugkomen bij meerdere records in de boekentabel, en een boek kan terugkomen bij meerdere auteurs in de auteurtabel.
Zoals gezegd maken we daarvoor een verbindingstabel. Dat is een gewone tabel, met in dit geval maar 2 velden (auteur_ID en boek_ID). Bedoeling is nu dat we 2 primaire sleutels aanmaken, voor elk veld een. Waarom 2? Omdat in dit geval niet het auteur-ID of het boek_ID uniek is, maar wel de combinatie van de 2. Geen 2 records zullen dezelfde combinatie van eenzelfde auteur_ID en boek_ID hebben.
Dat doe je door in de ontwerpweergave de 2 rijen te selecteren, en dan te klikken op de knop primaire sleutel in de groep extra op de tab tabelontwerp.
Vervolgens zetten we deze tabel tussen de auteurstabel en boektabel, en leggen we de relaties. Ik verschuif de tabellen nu ook een beetje om alles goed overzichtelijk te maken. Je ziet duidelijk dat de boekentabel in onze database centraal staat.
Wat ik tot slot nu nog moet doen is in de verbindingstabel de data ingeven. Dus voor elk Boek_ID aangeven welke Auteur-ID’s toegevoegd moeten worden. Dat is een tijdrovend werkje waarvoor we later nog een beter alternatief zullen uitleggen.
Relaties mooi weergeven & afdrukken
Tot slot van dit deel nog iets over de weergave van de relaties zodat je als je dat zou willen een mooi overzicht zou kunnen afdrukken van de relaties in je rapport.
Geef de relaties weer via hulpmiddelen voor databases. Klik daarna op op de knop relatierapport in de groep extra op de tab relatieontwerp.
Het venster wat nu opent is eigenlijk het afdrukvoorbeeld van een rapport. Je herkent bovenaan vast en zeker de opties, zoals die ook in een afdrukvoorbeeld in Word worden weergegeven.
Met het lint kan je op de tab afdrukvoorbeeld aanpassingen doen aan de opmaak van je rapport. Ik heb mijn relatierapport bijvoorbeeld liggend gemaakt door in de groep pagina-indeling liggend te selecteren in plaats van staand.
Je kan het afdrukken met de knop afdrukken in het lint.
Om het rapport verder te bewerken klik je in het lint op afdrukvoorbeeld sluiten.
Je ziet dat het rapport nu geopend wordt in een bewerkweergave, waardoor je het kan wijzigen (bijvoorbeeld de koptekst).
Om je aanpassingen te bewaren en het rapport op te slaan zodat je het ook later gemakkelijk kan oproepen druk je op ctrl s en geef je het rapport een naam. Ik noem het bijvoorbeeld relatierapport.
Vanaf nu is het beschikbaar in het navigatiedeelvenster.