Relaties in tabellen en queries, ik snap er niets van

Status
Niet open voor verdere reacties.

Kevercat

Gebruiker
Lid geworden
11 aug 2008
Berichten
88
Ik heb net een kleine database gemaakt en daarin komen vier groepen voor. Ik heb dus een tweede tabel gemaakt met de namen van die groepen en een relatie gemaakt naar de eigenlijke tabel met het veld groep. Vervolgens wat queries gemaakt en een formulier. In dat formulier had ik ook een keuze lijst gemaakt voor de groepen. Dit leek leuk te werken maar als ik in de tabel keek was de groep niet opgeslagen, het was gewoon een leeg veld geworden. Ik heb er weer een normaal veld van gemaakt maar ik baal er toch van dat ik het niet voor elkaar krijg. Ik doe daarom alles maar ik 1 database maar daar wordt de tabel wel erg groot van iedere keer. Kan iemand mij op weg helpen en zodanig dat ik het ook ga snappen?

Alvast bedankt voor de hulp, ik voeg de database bij.
 

Bijlagen

Zal er naar kijken, en dan ook nog vertellen wat er aan de hand was...

Michel
 
En hier de oplossing!

Het probleem was eigenlijk simpel opgelost, dus hier komt-ie...
Eerste puntje: ik weet eigenlijk niet wat je verkeerd had gedaan met de keuzelijst, want ik kon zonder probleem weer een keuzelijst van het tekstvak maken...

Toch heb ik een paar aanpassingen gemaakt. En wel de volgende: ik heb in de tabel Klavertjes het veld Groep vervangen door het veld Groep_ID. Dit veld is vervolgens gekoppeld aan de tabel Groep, waar nu ook een Groep_ID in zit. Het ID veld in de tabel Klavertjes heb ik hernoemd naar Klavertje_ID. Het was niet noodzakelijk, maar ik vind het zelf wel prettig als ik in een tabel kan zien waar de oorsprong ligt. Dus als je in Klavertjes informatie koppelt uit Groep, dan is het beter om in Klavertje dat veld ook Groep_ID te noemen. Je weet dan alijd waar het veld vandaan komt. De reden van het vervangen van het veld is, dat Groep_ID een sleutelveld is, en Groep niet. Wil je veilig kunnen werken met je gegevens, dan maak je altijd een verwijzing naar het sleutelveld, nooit naar een tekstveld.
Aangezien het veld Groep_ID een numeriek veld is, heb ik dat ook in de tabel Klavertje een numeriek veld gemaakt.
Hetzelfde geldt voor de queries; die zijn nu ook gebaseerd op het veld Groep_ID.
En als laatste dus het formulier; ook daar is het veld Groep_ID gebaseerd op het numerieke veld uit Groep.

Ik vermoed ook dat het daar is misgegaan; ik denk dat je de keuzelijstt hebt gemaakt m.b.v. de wizard, en zowel ID als groep hebt toegevoegd. Access verbergt automatisch het sleutelveld, zodat je alleen het veld Groep overhield. Bi het opslaan wordt echter wèl het veld ID opgeslagen, niet het veld Groep. Resultaat hiervan is, dat je waarschijnlijk het numerieke veld ID hebt gekoppeld aan het tekstveld Groep. En dat mag dus niet... Met als resultaat, dat de keuzelijst het dus niet doet!

De crux van het verhaal is dus: als je gegevens uit tabel A koppelt aan tabel B, neem dan altijd het Sleutelveld op, en niet het veld met de omschrijving!
Heb je meer hulp nodig, dan zien we dat wel verschijnen!

Michel
 

Bijlagen

En hier de oplossing!

Ik vermoed ook dat het daar is misgegaan; ik denk dat je de keuzelijstt hebt gemaakt m.b.v. de wizard, en zowel ID als groep hebt toegevoegd. Access verbergt automatisch het sleutelveld, zodat je alleen het veld Groep overhield. Bi het opslaan wordt echter wèl het veld ID opgeslagen, niet het veld Groep. Resultaat hiervan is, dat je waarschijnlijk het numerieke veld ID hebt gekoppeld aan het tekstveld Groep. En dat mag dus niet... Met als resultaat, dat de keuzelijst het dus niet doet!

Hallo Michel,

Je lijkt wel een beetje helderziend :) Ik heb inderdaad de wizard gebruikt om me een beetje te laten leiden, helaas is dat misleiden geworden.
Als ik het dus goed begrijp moet ik dit soort gevallen altijd koppelen aan het ID veld, ik had gekoppeld aan het veld Groep, vervolgens ook nog eens met de wizard de keuzelijst gemaakt. Ik heb wel gezien dat het ID veld als eerste gelijk mee kwam, deze had ik verwijderd en het veld Groep toegevoegd. Het leek wel te werken maar ik zag geen informatie in de tabel Klavertjes, veld Groep, dus ik denk dat ik zo'n beetje alles fout heb gedaan wat ik fout kon doen.
Dit verhaal geld voor het maken van een keuzelijst maar hoe werkt het dan als ik het complexer gaat maken:

Ik heb ook een vrij grote tabel waarin alle informatie tegelijk staat maar is zo al vrij complex, even voor het overzicht welke velden er ongeveer in staan:
Voornaam, voorletters, tussenvoegsel, achternaam, geboortedatum, dezelfde velden ook voor de partner, een ja/nee veld voor de vraag of er een partner is en een ja/nee veld of de partner achternaam gebruikt moet worden, de adresvelden (straat, postcode, woonplaats), de contactvelden zoals telefoon, mobiel en emailadres en dit dan ook weer voor de partner en dan ook nog velden voor de kinderen. Ik zou dit dus uitelkaar willen trekken. Ik zou dan denk ik een tabel moeten maken, bijvoorbeeld: Hoofdlid met de velden: Voornaam, voorletters, tussenvoegsel, achternaam, geboortedatum, en tabel Partners met dezelfde velden, een tabel contacten voor telefoonnummers en emailadressen zo'n zelfde tabel voor de contacten van de partner en een tabel kinderen. O ja de adresgegevens moet ik natuurlijk bij het Hoofdlid zetten. Dan ga ik het krijgen, nu moet ik de relaties gaan aanbrengen dus moet ik in de tabel Hoofdlid een veld aanmaken wat heet Partners_ID, Contacten_ID en kinderen_ID en in deze tabel natuurlijk ook de ja/nee velden. De aangemaakte _ID velden moet ik dan koppelen aan de desbetreffende ID velden van die tabellen, als ik het goed begrepen heb dan ben ik op de juiste weg?
Gaande weg bedacht ik me dus ook dat ik normaal gesproken een formulier gebruik om de gevens in te voeren, kan ik dat 1 groot formulier gebruiken waar alles in staat. Hoewel dat lijkt me ook niet handig. Ik denk dat ik nieuwe formulieren moet laten openen bij het aanklikken van de desbetreffende _ID velden.

Oeps, het ineens wel een heel verhaal geworden, voorlopig wel even genoeg denk ik. ik hoop alleen dat ik het nu een beetje begrepen heb.
 
Je begint in de goede richting te denken, met een paar kleine afdwalinkjes...
De grootste denkfout: in de hoofdtabel hoef je geen verwijzingen op te nemen naar de subtabellen, zoals je in het voorbeeld gebruikt:
dus moet ik in de tabel Hoofdlid een veld aanmaken wat heet Partners_ID, Contacten_ID en kinderen_ID
Het is precies andersom.... In de nieuwe tabellen neem je een verwijzing op naar het Hoofdlid! Als je straks de relaties gaat leggen, zie je dan dat één hoofdlid meerdere kinderen kan hebben, schijnt voor te komen in de praktijk, en ook meerdere partners (schijnt ook voor te komen in de praktijk ;) ).

Bij het opsplitsen van de grote tabel moet je jezelf de vraag stellen: welke gegevens moet ik per persoon meerdere keren invullen, en welke altijd maar één keer? Ik heb altijd vet gemaakt, want dat is een belangrijk onderscheid. Die gegevens gebruik je namelijk om een persoon precies te omschrijven. Zo zal een persoon maar één geboortedatum hebben. Dat gegeven is dus gebonden aan die persoon. Zoals gezegd, een persoon kan meerdere kinderen hebben, dus die gegevens moeten naar een andere tabel.
Want al die gezinsleden hebben ook weer hun unieke gegevens, die voor hun maar één keer worden opgeslagen.
Je kunt overigens, omdat dus in beginsel bijna alle velden hetzelfde zullen zijn, één en dezelfde tabel gebruiken, en bijvoorbeeld in een extra veld aangeven dat record 12 (van een dochter) een kind is van record 6 (de vader), en dat later record 45 een kind is van record 12, en zo door, maar dat kan later allerlei problemen opwerpen, om de familiestamboom netjes te krijgen. Overigens geldt hetzelfde voor de aparte tabel voor kinderen, want waar laat je die straks? (Mag je een nachtje over slapen...)

Kijk je nu naar adresgegevens, dan zal een persoon maar één thuisadres hebben. Misschien heeft-ie wel meer huizen, maar er is altijd maar één huisadres. Dat gegeven kan dus gewoon bij de persoon blijven in de hoofdtabel, en hoef je niet op te splitsen.
Tenzij... je een geschiedenis van iemand zijn verhuisbewegingen moet vastleggen. Als het adres bij de hoofdtabel zit, en iemand verhuist, dan pas je de adresgegevens aan. Logisch.... Maar dan ben je dus het oude adres kwijt. Wil je dat bewaren, dan moet dat dus in een aparte tabel, met ingangsdatum, en verhuisdatum erbij.

Kortom: er is niet zomaar een eenduidig antwoord te geven; alles hangt af van wat je precies met de gegevens wilt gaan doen. Wil je een soort stamboomeffect, dan kun je waarschijnlijk het beste toch voor één tabel kiezen. Gaat het puur om Hoofdlid, Partner en Kinderen, dan is splitsen wel handig. Daarbij sla je dus nogmaals het sleutelveld van de Hoofdpersoon (Hoofd_ID) op in de tabellen Partner en Kinderen, zodat je vanuit die tabellen een link kan maken welke Hoofdpersoon daar bij hoort.

Ook weer genoeg geklept....

Michel
 
Je begint in de goede richting te denken, met een paar kleine afdwalinkjes...
De grootste denkfout: in de hoofdtabel hoef je geen verwijzingen op te nemen naar de subtabellen, zoals je in het voorbeeld gebruikt:

Het is precies andersom.... In de nieuwe tabellen neem je een verwijzing op naar het Hoofdlid! Als je straks de relaties gaat leggen, zie je dan dat één hoofdlid meerdere kinderen kan hebben, schijnt voor te komen in de praktijk, en ook meerdere partners (schijnt ook voor te komen in de praktijk ;) ).

Ik geloof dat ik het langzaam aan begint te begrijpen. Mijn gedachten gingen altijd uit vanuit de hoofdtabel maar ik moet eigenlijk denken vanuit de bij tabellen met de gedachte waar horen ze bij?
Met die gedachte heb ik een test database gebouwd met de tabellen die ik zou willen gebruiken met de gedachte dat de hoofdtabel genaamd leden meerdere partners, kinderen telefoonnummers en emailadressen zou kunnen hebben en de partner ook meerdere tefoons en emailadressen (ik bedenk me nu dat het lid en partner allebei kinderen van hun zelf kunnen hebben, oke dat is voor later). De vraag is nu heb ik het goed begrepen en de relaties goed gelegd?
Als dit allemaal goed is dan heb je een gigantisch eind op weg geholpen, waarvoor ontzettend bedankt!
 
Volgens mij heb je het nu begrepen! :thumb:

Michel
 
Volgens mij heb je het nu begrepen! :thumb:

Michel

Tot zover is het mij nu duidelijk. Ik zit nu alleen nog met de invoer, normaal gesproken doe ik de invoer via een formulier gekoppeld aan een query waarin ook nog wat rekenvelden zitten voor het berekenen van de leeftijden en andere dingen, dit laatste is niet belangrijk dat weet ik wel weer bij te voegen maar ik vraag me nu af hoe ik moet handelen om de geven via een formulier in te voeren waarbij de gerelateerde tabellen gevuld worden. Moet ik een query maken waar alles weer samen komt en die koppel ik weer aan een formulier of maak ik aparte queries en koppel ik die aan aparte formulieren en moet ik dan bij het klikken op een veld zorgen dat het bewuste formulier dan op komt.
Met andere worden het maken van de gerelateerde tabellen snap ik nu maar nu het vullen op de juiste manier, ik neem aan dat dit iets anders loopt dan een "gewone" tabel vullen.
 
Dat hoeft niet, je kunt ook queries gebruiken om tabellen te vullen. En als je dat doet, da kun je daar zelfs ook nog berekeningen bij gebruiken. Alles hangt echter af van de constructie van je queries; als je de query verkeerd opzet, dan is hij niet geschikt voor invoer. Je kunt dan nog wel de resultaten bekijken, maar niet wijzigen.
Voor het wijzigen/toevoegen van data via een query is er een simpele vuistregel:
Baseer je query op de tabel die je wilt bijwerken, door daar alle velden van te selecteren. Kijk vervolgens naar de andere tabellen in de query, en voeg de aanvullende velden toe. Onder geen beding een sleutelveld uit een van de andere tabellen gebruiken!

Op deze website is wat meer info te vinden:
http://allenbrowne.com/ser-61.html

Michel
 
Voor het wijzigen/toevoegen van data via een query is er een simpele vuistregel:
Baseer je query op de tabel die je wilt bijwerken, door daar alle velden van te selecteren. Kijk vervolgens naar de andere tabellen in de query, en voeg de aanvullende velden toe. Onder geen beding een sleutelveld uit een van de andere tabellen gebruiken!
Oké, Als ik het dus goed begrijp kan ik een query maken van de (hoofd)tabel en de velden van de andere tabellen erbij plaatsen en dan moet ik alles kunnen invoeren en dat eventueel in een formulier.

Ik ga ook nog even op die website kijken of ik nog wijzer kan worden.
 
Je hebt het weer helemaal door.... Als je de query hebt gemaakt, en je bekijkt hem in de gegevensweergave, dan zie je vanzelf of je gegevens kunt invoeren. De knoppen Verwijderen en Nieuw zijn dan namelijk actief. Als dat niet het geval is, heb je dus één van de aspecten van Allen bij de hand.
Maar als je het op de aangegeven manier doet, kan het bijna niet fout gaan.

Michel
 
Michel,

Hartelijk dank voor alle hulp, ik kan hiermee wel weer vooruit.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan