Relaties maken tussen 8 tabellen met maar één overeenkomende kolom

Status
Niet open voor verdere reacties.

marieke1994

Gebruiker
Lid geworden
31 mrt 2014
Berichten
23
Beste allemaal,

Ik ben al een tijdje bezig met het in elkaar zetten van een database met persoonsgegevens. Van mijn baas kreeg ik de opdracht 10 tabellen te maken met onderwerpen (tblIntake, tblFollowUp, tblBespreking etc.), met allemaal een overeenkomende factor; het volgnummer. Voorbeeldje, in tblIntake staan de volgende kopjes: volgnummer, datum_intake, naam, geboortedatum, woonplaats en in tblFollowUp staan: volgnummer, datum_FU, tekst_FU. Nu wil ik graag deze 8 kopjes (waaronder Intake, Follow Up en bespreking) aan elkaar koppelen in een relatie, zodat ik straks vanuit een startscherm met knoppen naar de verschillende specifieke formulieren kan gaan. Dus als ik in het startscherm bij volgnummer 1 sta en ik op de knop Intake klik, ik de informatie van volgnummer 1 krijg!

Kan iemand mij hiermee helpen, of doe ik nu veel te moeilijke dingen?

Alvast bedankt!!!!;););)
 
Relaties (koppelingen tussen tabellen) baseer je doorgaans op een één-op-veel relatie tussen twee tabellen. Een tabel [KLanten] met een Klantnummer als sleutel (elke klant uniek) zal (vermoed ik) maar één intake hebben, en die gegevens zou je dus gelijk in Klanten kunnen zetten. Maar als een intake uit meerdere sessies bestaat, dan is een tabel [Intake] weer goed, want dan leg je daarin een één-op-veel relatie met Klanten. Elke klant kan dan meerdere intake records krijgen. Als Intake uniek is op basis van Volgnummer, dan gaat dit verhaal al niet op, want dan kan Volgnummer nooit uniek zijn. En dat is geloof ik wel de bedoeling? In dat geval (Volgnummer uniek) heb je een één-op-één relatie met Klanten want één uniek volgnummer is dan gekoppeld aan één uniek klantennummer.

Maar vanuit [Intake] geredeneerd werkt het op dezelfde manier: één intake (=uniek volgnummer) kan meerdere FollowUp records hebben, dus je hebt dan een één-op-veel relatie tussen [Intake] en [FollowUp] op basis van het veld Volgnummer.
Maak je nu op basis van [Intake] een formulier, dan zie je gelijk de gekoppelde Followup records als dat als doorlopend formulier is toegevoegd aan Intake. Hoef je niks voor te doen. Dus ook geen knop te maken. Op basis van Klanten krijg je hetzelfde: als je daar de Intake op zet, dan zie je de intake records die bij de klant horen.
 
Bedankt voor je reactie. [Intake] bestaat uit één sessie. Ik heb in de opbouw van de database allemaal verschillende tabellen gemaakt die nog niet aan elkaar gekoppeld zijn. Ik werk ook niet vanuit formulier [Intake], maar vanuit een startscherm (waar ik ook een aparte tabel voor heb; [tblBasisgegevens], zoals hieronder:
startscherm.JPG

en als ik dan op de knop Intake druk, krijg ik dit:

Intake voorbeeld.JPG

Moet ik deze 8 tabellen (waaronder Intake en basisgegevens) via relaties koppelen, en zo ja, hoe precies???
Alvast bedankt!!
 
Ik zou, voordat ik überhaupt aan formulieren ga denken, eerst de structuur in orde maken. Dat is: op basis van een Functioneel ontwerp eerst kijken wat de db moet doen, wat er uit moet rollen en wat er in opgeslagen gaat worden. Vervolgens ga je tabellen maken, en de relaties leggen. Als alles werkt, ga je formulieren bedenken. Jij werkt zo te zien andersom :). Mag natuurlijk wel, maar je haalt je waarschijnlijk erg veel extra werk op de hals.
Je hebt een aparte knop <Relaties> in de balk <Hulpmiddelen voor databases>. Daarin maak je de relaties. Let er wel op dat je <Referentiële integriteit afdwingen> aanzet, anders zijn de relaties volkomen zinloos.
 
Ja dat is wel een goede tip, maar ik heb alle 8 formulieren al gemaakt. En moet ik dan alle tabellen met elkaar koppelen, of is het zoals hieronder ook goed:

relatie.JPG

Of moet ik elke tabel naar de overige 7 tabellen verbinden, zodat ik 7x8 relatie-verbindingen krijg??
 
Ik zie een hele onhandige tabellenstructuur, als ik eerlijk mag zijn :). En omdat je in alle tabellen dezelfde sleutel gebruikt (Volgnummer) zou je zelfs alles in één tabel kunnen stoppen, als dat tenminste qua velden (maximaal 256) past. Scheelt je een enorme hoeveelheid gedoe met recordbewerkingen. Omdat elke tabel dezelfde unieke sleutel heeft, kun je ook alleen maar één-op-één relaties maken. Er is dus geen onderlinge afhankelijkheid, die je qua naamgeving overigens wel veronderstelt. Een tabel Intake kan unieke records bevatten (een intake doe je maar 1 keer), maar een tabel FollowUp impliceert toch dat je meerdere consults moet kunnen doen per case.
Bovendien constateer ik een zekere overlap in je tabellen, meest expliciet tussen de tabellen [Intake] en [Begingegevens] waar gewoon dezelfde velden inzitten, met hetzelfde Volgnummer als sleutelveld. Dat is (in mijn ogen althans) dus volkomen fout. Dat mag (nee, moet!) maar één tabel zijn. Jammer dus dat je je formulieren al hebt, want volgens mij is er aan de structuur nog veel te verbeteren!
 
Ja ik ben altijd al een beetje tegendraads geweest.. Ik dacht dat het allemaal iets makkelijker te bewerken was.
De [Basisgegevens] is inderdaad geen goede tabel, deze had ik ook alleen gemaakt voor het startscherm, zodat ik meteen de persoon met gegevens had en dan verder kon klikken naar verdere belangrijke zaken als de Follow up. Deze heb ik dan ook verwijderd (staat eigenlijk allemaal al in [Intake]). Het zijn inderdaad meer dan 256 velden, en mijn baas wil er in de toekomst misschien nog wel meer invoegen, vandaar de opgesplitste tabellen. Is er een manier om deze 8 tabellen alsnog in deze situatie met elkaar te verbinden, want nu [Basisgegevens] weg is, is er tussen de tabellen nog maar één overeenkomend veld (volgnummer)?
Ik hoop dat het mogelijk is!!
 
Feitelijk zijn alle tabellen dus één geheel, en moet je hem ook zien als één geheel. Dat betekent in de praktijk dat het geen ene mallemoer uitmaakt hoe je ze aan elkaar koppelt (sterker nog: het maakt niet eens uit óf je ze koppelt) omdat ze allemaal hetzelfde sleutelveld hebben. Dat wil natuurlijk niet zeggen dat je jezelf geen problemen op de hals hebt gehaald met deze constructie :). Want wat is in de praktijk het probleem waar je tegenaan gaat lopen? Je vult je 'hoofd' tabel in (heb je eigenlijk niet op basis van je sleutelvelden) en dat is waarschijnlijk de tabel [tblIntake]. Zodra je een record hebt ingevuld, zou je gelijk ook de overige tabellen al willen vullen, omdat je daarin ook dezelfde records nodig hebt.

Het makkelijkst werkt het dan ook als je alle 7 formulieren aan het formulier frmIntake hangt, want dan krijg je, als je een nieuwe intake doet, gelijk gekoppelde records in de overige subformulieren. Het Volgnummer wordt namelijk automatisch overgenomen als je in frmIntake een nieuwe intake aanmaakt. Je zou dan je 7 tabellen elk op een apart tabblad kunnen zetten, en die al dan niet zichtbaar maken of zo. Dat zou ik dus doen: één hoofdformulier op basis van tblIntake, en de overige op subformulieren.
 
Ik heb er even een tijdje over na zitten denken en uit zitten vogelen wat nou de beste optie is. Mijn hoofdtabel wordt inderdaad [Intake], waarin ik knoppen maak die verwijzen naar de andere tabellen ([Follow Up] en [Bespreking]). Ook klopt het dat ik in alle andere tabellen, behalve dus [Intake], meerdere cases nodig ga hebben. Hoe kan ik dit het beste aanpakken, moet ik dan alle volgnummers in de verschillende tabellen primaire sleutels maken, want dan kan ik geen duplicaten en dus geen verschillende cases maken.. Of moet ik alleen volgnummer in [Intake] een primaire sleutel maken en deze koppelen via volgnummers aan de overige tabellen, zodat het één-op-veel relaties worden? Ik hoop dat je me nog verder kunt helpen, want je advies tot nu toe was erg belangrijk!!
 
Je geeft zelf eigenlijk al het antwoord: op het moment dat een gekoppelde tabel meer records gaat krijgen van één volgnummer uit tblIntake, kan Volgnummer in die tabel geen sleutelveld meer zijn. Je krijgt dan dus een één-op-veel relatie. Je kunt dan een extra Veld toevoegen als sleutelveld.
Ik zou de constructie met een hoofdformulier met subformulieren overigens niet gelijk afwijzen, omdat je automatiseringsproces er zoveel makkelijker van wordt. En met tabbladen kan het er heel gelikt uitzien. Waarschijnlijk nog mooier ook als losse formulieren!
 
Aha oke, dus als ik het goed begrijp is het kopje Volgnummer in mijn hoofdformulier [Intake] het sleutelveld. Hier kunnen dus geen duplicaten van gemaakt worden, omdat er maar één intake per persoon plaatsvindt.

Dan nu de overige tabellen, want dat is nog een beetje onduidelijk. Al mijn overige tabellen zoals [Bespreking] en [FollowUp] hebben wél de overeenkomende factor Volgnummer, maar omdat deze uit meerdere cases bestaat zijn deze géén sleutelvelden. Hóe koppel ik dan het (sleutelveld) volgnummer uit [Intake] aan de kolommen volgnummer uit mijn overige tabellen?

Ik probeer het nu zoals hieronder:
relaties.JPG

Maar als ik dan precies hetzelfde probeer te doen bij de relatie tussen [Intake] en [Bespreking], krijg ik de volgende foutmelding:
foutmelding.JPG

Ik heb referentiële integriteit aanzet, maar zodra ik dit uitzet lukt het wel...
 
Hij geeft aan dat de tabel vergrendeld is, dus waarschijnlijk is hij al geopend. Maar je doet het op zich verder prima, dus aan de handeling zelf ligt het niet.
 
Die is logischer :). Deze melding krijg je als het gegevenstype van de koppelvelden niet gelijk is, bijvoorbeeld de een is een tekstveld, en de ander een numeriek veld. Of twee numerieke velden, waarvan de een Integer is, en de ander lange integer.
Dat kun je controleren in de beide tabellen.
 
Laatst bewerkt:
Haha ik ben heel erg vervelend, want nu heb ik alle velden gelijk gemaakt, maar nu krijg ik deze foutmelding..:(
foutmelding 3.JPG
 
Jeetje het is me al gelukt! Heeeeel erg bedankt voor je goede en snelle advies, mijn vraag is beantwoord!!:d:d:d:d
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan