Tot nu toe heb je een query gebruikt om een bepaalde sortering en/of selectie op een tabel toe te passen (selectiequery). De mogelijkheden van query's reiken echter heel wat verder. Zo kun je aan de hand van een query een aantal tabellen aan elkaar koppelen.
Voorbeeld
Wanneer je de tabel tblVerkopen inkijkt, zul je daar weinig concrete informatie vinden. Om te weten over welk artikel of welke klant het gaat, zou je telkens in de tabel tblArtikelsVerkoop en tblKlanten moeten kijken met welk artikel of met welke klant de velden Code artikel of Code klant overeenkomen. Dat is precies wat bij het koppelen van tabellen gebeurt.
Bij het koppelen van tabellen komt het er in de eerste plaats op aan een verband of relatie tussen de tabellen te ontdekken. Daardoor moet je goed weten welke velden de tabellen bevatten.
Maak een query via Queryontwerp (tab Maken/groep Query's).
Voeg de gewenste tabellen toe (voorbeeld: tblVerkopen, tblArtikelsVerkoop, tblKlanten).
Er wordt automatisch een verbinding gelegd tussen velden met een gelijke naam. De verbinding noemt een join. Deze joins worden door Access zelf gemaakt.
Voeg vervolgens de velden toe aan de query met je eigen gewenste methode.
Maak een query met volgende velden:
Code artikel, naam artikel uit de tabel tblArtikelsVerkoop;
Code klant, Naam klant, Voornaam klant uit de tabel tblKlanten;
Datum verkoop, Aantal verkochte exemplaren, Code betaling uit de tabel tblVerkopen.
Sorteer oplopend op het veld Datum Verkoop.
Deze query zorgt ervoor dat bij elk verkocht artikel de naam van het artikel wordt weergeven. Bovendien bij elke verkoop ook de naam en voornaam van de klant weergegeven. Bewaar deze query als tblVerkopenGekoppeldAanKlantenEnArtikels.
Access legt de koppeling tussen de tabellen automatisch als de veldnaam en gegevenstype van de te koppelen velden identiek zijn. In de praktijk is dat niet altijd zo.
Sleep het veld met de muis naar het veld in de andere tabel om een koppeling te activeren.
Als je een query tabellen aan elkaar koppelt, worden enkel de records getoond waarvan de inhoud van de gekoppelde velden in beide tabellen identiek is. De andere records worden niet getoond. We verduidelijken dat met een voorbeeld.
Voorbeeld
Bij het bekijken van de tabel tblArtikelsVerkoop merk je dat deze 100 records telt.
Verander in tblLeveranciers de code van leverancier van 002 naar 102. Maak vervolgens een nieuwe query aanmaakt met de tabellen tblArtikelsVerkoop en tblLeveranciers en koppel deze. Neem verschillende velden op en voer de query uit. De query zal maar 93 records kennen.
Alle verkopen waar de leverancier code 002 heeft zijn weggelaten in de query omdat het veld niet in beide tabellen voorkomt!
Het niet tonen van alle gegevens kan je oplossen door de aard van de koppeling (=join) te veranderen. Dat gebeurt in het dialoogvenster Joineigenschappen. Om dat dialoogvenster te openen, moet je dubbelklikken op de koppeling of in het snelmenu de opdracht Join-eigenschappen uitvoeren.
Het dialoogvenster Joineigenschappen verschijnt. Het komt er nu op aan om na te gaan van welke van beide tabellen alle records weergegeven moeten worden. Bij het leggen van een relatie tussen twee tabellen is een van de tabellen gewoonlijk de hoofdtabel. De andere tabel wordt dan gebruikt om meer informatie over een of meer velden uit de hoofdtabel weer te geven.
De hoofdtabel is hier tblArtikelsVerkoop. De bedoeling van de koppeling is dat enkel de identieke gegevens in de links en rechtse kolom voorkomen gelinkt worden.
Kies het jointype 2.
Door dit jointype worden alle records uit de tabel tblArtikelsVerkoop opgenomen. Hierdoor toont hij bij het voorbeeld 100 rijen ongeacht of hij de Leverancier kan vinden in tblLeveranciers.
Wanneer je het voorbeeld geprobeerd hebt, pas dan in tblLeveranciers de code 102 terug aan naar 002.
Het instellen van de jointype is alleen nodig als de gegevens in de gekoppelde velden niet altijd perfect overeenkomen of als het veld in een beide tabellen niet overal ingevuld is.
Inner Join Bevat alle records waarbij de inhoud van de gekoppelde velden in beide tabellen gelijk is.
Left Join Bevat ALLE records uit de hoofdtabel en alleen de records uit de extra tabel waarbij de inhoud van de gekoppelde velden in beide tabellen gelijk is.
Right Join Bevat ALLE records uit de extra tabel en alleen de records uit de hoofdtabel waarbij de inhoud van de gekoppelde velden in beide tabellen gelijk is. Standaardrelaties in een database definiëren
Om te vermijden dat je bij het maken van een query zelf de relaties tussen tabellen moet definiëren, kun je in de database standaardrelaties definiëren. Dat gebeurt in het venster Relaties dat je kunt openen via Hulpmiddelen voor databases > Relaties….
Het venster Relaties verschijnt. Als er nog geen standaardrelaties gedefinieerd werden, verschijnt het dialoogvenster Tabel toevoegen. Dat venster verschijnt ook bij het ontwerpen van een nieuwe query. Als het niet verschijnt, kun je het oproepen door op de tab Ontwerpen (groep Relaties) op de knop Tabel weergeven te klikken. Je kunt ook tabellen toevoegen aan het venster Relaties door ze vanuit het navigatiedeelvenster Relaties te slepen.
Om een standaardrelatie tussen twee tabellen te leggen, ga je te werk zoals bij een query: klik op het veld in de ene tabel en sleep het naar het overeenkomstige veld in de andere tabel.
Bij het leggen van de relatie verschijnt het dialoogvenster Relaties bewerken. In dat venster kun je bepalen welk soort relatie je wilt leggen. Als er tussen de inhoud van de gekoppelde velden verschillen zijn, kun je via de opdrachtknop Jointype… de joineigenschappen instellen (zie vorige kop).
Om de koppeling / relatie tot stand te brengen, moet je op de opdrachtknop Maken klikken.
Als je het venster Relaties sluit, vraagt Access of je de indeling van de relaties wilt opslaan. Je kunt de indeling van dat venster ook tussendoor bewaren door op de knop Opslaan te klikken.
Als je in het venster Relaties twee tabellen aan elkaar koppelt, kun je ook de optie Referentiële integriteit afdwingen inschakelen. Wat dat nu betekent verduidelijken we aan de hand van het volgende voorbeeld.
Voorbeeld
Open het venster Relaties. Voeg in het venster de tabellen tblStatuten en tblPersoneelsleden toe. Leg een relatie tussen beide. Is dit al gebeurd klik dan met de rechtermuisknop op de bestaande relatie tussen tblPersoneelsleden en tblStatuten en kies in het snelmenu de opdracht Relatie bewerken…
Het dialoogvenster Relaties bewerken verschijnt. Bij het maken van een relatie is er altijd een primaire tabel en een gerelateerde tabel. De primaire tabel staat links. De tabel tblStatuten is hier de primaire tabel, terwijl de tblPersoneelsleden de gerelateerde tabel is. Op het te koppelen veld in de primaire tabel moet een primaire sleutel ingesteld zijn. Er mogen in dat veld dus nooit dubbele waarden voorkomen. Het veld moet ook altijd ingevuld zijn.
In het vak Type relatie verschijnt Een-op-veel of Een-op-een.
Bij een een-op-een relatie is er voor elke record in de primaire tabel juist één record uit de gerelateerde tabel waarvan de inhoud van het gekoppelde veld dezelfde is. Voor deze relatie zou dat betekenen dat er voor elke statuut maar één personeelslid is met dat statuut.
Bij een een-op-veel relatie kan de inhoud van het veld in de gerelateerde tabel (tblPersoneelsleden) leeg zijn. Als je in dat veld iets invult, moet het overeenkomen met de inhoud van een van de records uit de primaire tabel. In dit geval kun je de inhoud van het veld Statuut in de tabel tblPersoneelsleden leeg laten. Als je iets invult, moet het overeenkomen met een van de statuten uit de tabel tblStatuten.
Het gaat hier om een Een-op-veel relatie. Schakel het selectievakje Referentiële integriteit afdwingen in. Klik op OK en sluit het venster Relaties. Het afdwingen gaat er voor zorgen dat elk personeelslid een statuut gekoppeld moet hebben en dit dus niet leeg mag blijven. Sla de indeling van dat venster op.
Bij referentiële integriteit worden een aantal beperkingen opgelegd voor het wijzigen van gegevens in de primaire tabel. Als je de inhoud van het gekoppelde veld in de primaire tabel wijzigt, gaat Access na of er records met een overeenkomstige veldinhoud in de gerelateerde tabel zijn.
Voorbeeld
Wanneer je in de tabel tblStatuten het statuut B (=Bediende) probeert te wijzigen in X zal je er niet in slagen. Zolang er een B voorkomt in de tabel tblPersoneelsleden kan je B niet wijzigen. Je hebt namelijk een integriteit overtreding. Als je dus referentiële integriteit hebt ingesteld ga je een foutmelding krijgen wanneer je het voorbeeld probeert toe te passen.
Via venster Relaties kan je relaties tussen 2 tabellen gaan bewerken. Door de optie Gerelateerde velden trapsgewijs bijwerken in te schakelen, kun je dat probleem omzeilen. Als je de inhoud van het gekoppelde veld in een primaire tabel verandert, wordt de inhoud van de gekoppelde veld in de gerelateerde tabel ook veranderd.
Let op! Je krijgt geen enkele boodschap die je op de hoogte brengt van je ingreep!
Voorbeeld
Als we voor de relatie tussen tblStatuten en tblPersoneelsleden de trapsgewijze bewerking inschakelen. Zo kan je de gegevens consistent houden tussen de twee tabellen.
Door referentiële integriteit af te dwingen zorg je er ook voor dat je in de primaire tabel geen gegevens kan wissen zolang deze gebruikt zijn in waarde in secundaire tabel.
Voorbeeld
Als je referentiële integriteit niet afdwingt dan zou je in de tabel tblStatuten het statuut Z (=Zaakvoerder) kunnen verwijderen. In de tabel tblPersoneelsleden zou je toch werknemers kunnen terugvinden met statuut Z. Wanneer we dit wel afdwingen is het niet mogelijk om dit statuut te verwijderen tot alle werknemers met statuut Z zijn aangepast of verwijderd. Als de integriteit is ingesteld zal je hier ook een foutmelding krijgen.
Via het zelfde proces als bij trapsgewijs bewerken kan je ook trapsgewijs verwijderen instellen.
Trapsgewijs verwijderen zouden we voor de relatie in het voorbeeld NIET instellen. Wanneer we per ongeluk een statuut zouden verwijderen (je krijgt tenslotte geen melding) worden ook alle betrokken personeelsleden verwijderd zonder waarschuwing.