Hoe maak ik een goede database

Status
Niet open voor verdere reacties.

Johnhn

Gebruiker
Lid geworden
1 mei 2012
Berichten
17
Beste,

Ik ben bezig met een database voor nieuwe klanten.
Mijn bedoeling is bij het openen van het bestand dat er een invulformulier als eerste tevoorschijn komt. Hier kun je alle gegevens invoeren.
Links moet een zoek optie zitten. Als er gezocht wordt op ieder record dan moet er een pop-up tevoorschijn komen met verschillende tabs voor de verschillende tabellen. rechts moet een rapportage overzicht worden gemaakt waarbij het gemakkelijk is om record uit tabellen te uit te printen.
Het is te vergelijken met het voorbeeld/template contactpersonen voor acces.

Nou moet dit waarschijnlijk met veel formulieren of met SQL. Van SQL heb ik niet zo heel veel kennis.

Nou is mijn vraag of iemand mij kan helpen om dit op te zetten.

Ik hoop dat het duidelijk is.

Ik heb mijn tabellen bijgevoegd.

Groet, John
 

Bijlagen

Ik heb je structuur even bekeken, en alvast een simpele basisfout gevonden in de tabel [Bestuur VvE]. Daarin heb je voor elk bestuurslid een eigen veld gemaakt. Dat is niet handig, omdat je op die manier erg lastig overzichten kunt maken. Beter is het om een aparte tabel [BestuurVvE_Leden] te maken waarin je die gegevens opneemt. Daarmee maak je de tabel [Bestuursgegevens] ook overbodig, waarin je nu o.a. deze velden hebt: [Bestuurslid I], [Adres bestuurslid I], [Bestuurslid II], [Adres bestuurslid II], [Bestuurslid III], [Adres bestuurslid III], etc. Ook die tabel is niet genormaliseerd. Feitenlijk zou je in die tabel alleen de velden [nr VvE], [Bestuurslid], [Adres bestuurslid], [Postcode bestuurslid] en [Plaats bestuurslid] nodig hebben. Eigenlijk is de tabel [Bestuursgegevens] dan de tabel [BestuurVvE_Leden] die ik voorstel. Je koppelt de tabel [BestuurVvE_Leden] aan de tabel [Bestuur VvE] op basis van het veld [nr VvE] met een één-op-veel relatie. Overigens is de tabelnaam 'Bestuursgegevens' in je huidige opzet ook helemaal verkeerd gekozen, want wat je daarin op wilt slaan zijn niet de Bestuurgegevens, maar de Bestuursleden gegevens. En daarmee is de naam dus uiterst verwarrend!
Overigens zie ik nu ik nog een keer kijk, dat de tabel [Bestuur VvE] helemaal weg kan, omdat je al een tabel [Gegevens VvE] hebt. En die koppel je dan aan de tabel [BestuurVvE_Leden] op basis van nrVvE.
Korotm: denk eerst goed na over de structuur van de db voordat je aan formulieren etc. gaat denken :)
 
Bedankt voor uw reactie.

Is het dan uberhaupt mogelijk om meerdere bestuursleden in te voegen als er maar 1 tabel/kolom voor is of is het mogelijk om het in te stellen als een bestuurslid wordt ingevuld dat er een nieuw vak voor het bestuurslid wordt aangemaakt?

Ik heb nou de database aangepast. Zoals u zei is het een stuk logischer.
Graag zou ik uw mening willen weten.

Wat is de volgende stap als ik kijk naar het invoeren van de gegevens?

Gr. John

Bekijk bijlage Acquisitie.zip
 
Laatst bewerkt:
Het gaat de goede kant op, maar je maakt nog steeds elementaire fouten. Zo heb je in de tabel [VvE Bestuursleden] het veld [nr VvE] als Sleutelveld benoemd, met als resultaat dat je nu per VvE maar één bestuurslid kunt hebben. Dat lijkt mij niet de bedoeling; elk Bestuurslid is uniek (vermoed ik) en elke VvE (die ook uniek is) kan meerdere bestuursleden hebben. Ik zou mij nog kunnen voorstellen dat in de praktijk een bestuurslid dat is voor meerdere VvE's, maar ik vermoed dat dit in de praktijk wel niet zal voorkomen. Daar hoef je de db niet voor aan te passen.
De fout met het sleutelveld heb je volgens mij ook gemaakt met de tabel [Beheerder VvE]. Hiermee heb je het aantal beheerders per VvE beperkt tot één. Ik weet niet of ik dat zo zou doen. Maar ik ken de situatie natuurlijk niet.
Om op je vraag terug te komen: het is zeer onwenselijk om in één tabel meerdere identieke gegevens op te slaan. Dat wil niet zeggen dat het niet kan (heb je zelf al aangetoond, want je had het zo ingericht ;) ) maar je moet het dus niet willen, omdat je de structuur van de db daarmee vernielt.
Kijk ook eens naar je relaties; die kloppen ook nog niet. Je moet bij het maken van een koppeling tussen twee tabellen in ieder geval <Refentiële Integriteit afdwingen> aanzetten om te voorkomen dat je verkeerde gegevens kunt invullen. De huidige relaties zijn nutteloos.
 
Wat betreft de elementaire fouten. Ik zal de tabellen nog even uitleggen en zou u dan willen checken waar de sleutels en relaties moeten komen? U heeft er duidelijk meer verstand van.

Een VvE heeft zijn eigen gegevens. Daarom dus de tabel Vereniging van Eigenaren. Een VvE heeft dus een beheerder, een gevolmachtigde en een bestuur. De beheerder is meestal 1 persoon/organisatie, bijv. een woningbouwcoorperatie. De gevolmachtigde is meestal ook 1 persoon. Zowel de beheerder als gevolmachtigde kunnen meerdere personen zijn. Het bestuur bestaat meestal uit 3 tot 5 personen. Deze moeten dus ook kunnen worden ingevoerd. Daarom had ik dus <bestuurslid 1, 2 etc.> oals u zei is het dus mogelijk om meerdere bestuursleden toe te voegen zoals het nou staat.

Ik heb de primiaire sleutels zo ingesteld dat als er gezocht wordt op <nr VvE> dat alles tevoorschijn komt. Ik begrijp dat, dat dus niet goed is. Zo dacht ik ook bij de relaties. De link ertussen is <nr VvE>. Ik begrijp dat, dat ook niet zo goed was.

Zou u mij kunnen vertellen wat dan de beste manier is om de sleutels en relaties in te stellen om de juiste basis te creëren?
 
De beheerder is meestal 1 persoon/organisatie, bijv. een woningbouwcoorperatie. De gevolmachtigde is meestal ook 1 persoon. Zowel de beheerder als gevolmachtigde kunnen meerdere personen zijn. Het bestuur bestaat meestal uit 3 tot 5 personen.
Zoals je het nu beschrijft, is anders als je het hebt ingericht. En eigenlijk beschrijf je het nu ook zoals ik al vermoedde dat je e.e.a. bedoelde, vandaar mijn opmerking dat er elementaire fouten in zitten.
Had je dit gezegd: De beheerder is altijd 1 persoon/organisatie en dit: De gevolmachtigde is altijd 1 persoon dan had je met je huidige opzet kunnen volstaan. Dan hadden de relaties namelijk geklopt. Maar je geeft zelf al aan dat dit niet altijd het geval is, en dat zowel beheerder als gevolmachtigde meerdere personen kunnen zijn. En dat houdt dan automatisch in dat je die gegevens in aparte tabellen opslaat (zoals je nu ook doet) en dan koppelt op het veld [nr VvE]. Dat veld is in de tabel VvE de primaire sleutel, en in de andere tabellen een verwijzingssleutel, zodat je een één-op-veel relatie kunt maken.

Overigens is het nog wel de vraag waarom je Beheerders, Bestuursleden en Gevolmachtigden in aparte tabellen opslaat; voor zover ik in je huidige tabellen kan zien, sla je ongeveer dezelfde gegevens op. Ik zou zeggen: gooi alle records die met personen te maken hebben, zoals NAW gegevens etc. in dezelfde tabel, en voeg daar een veld met een keuzelijst aan toe waarin je de functie van die persoon vastlegt. Dit werkt prima als een persoon ofwel een beheerder is, ofwel een gevolmachtigde ofwel een bestuurslid. Mag iemand een combinatie vervullen (beheerder+bestuurslid bijvoorbeeld) dan gaat dit niet werken (tenzij je met Access 2010 werkt).
De gedachte hierachter is, dat je de database opzet op basis van entiteiten. Een entiteit is dan een specifiek object in de database, zoals een VvE een entiteit is, en een Persoon ook. Dus alle gegevens die betrekking hebben op Personen, sla je op in dezelfde tabel. Om onderscheid te maken tussen de functies van die personen maak je dus die keuzelijst. Niet alleen wordt de db er een stuk overzichtelijker door, je kunt ook veel makkelijker doorbouwen in de db.

Om het verhaal af te maken: personen die aan een functie zijn gekoppeld, wil je ook aan de VvE kunnen koppelen. En daarvoor is dan een koppeltabel nodig. Dus met de tabel VvE_Persoon koppel je de VvE aan het Persoonsrecord, wat dan gelijk de sleutel is in die tabel ([nr_VvE] + [PersoonID].

Voorbeeldje:
Neem een Gevolmachtigde die in het Bestuur gaat zitten: in je huidige situatie kan dat (aparte tabellen, dus aparte records dus geen controle) makkelijk voorkomen, terwijl je dat misschien wel helemaal niet wilt. Om die persoon om te zetten moet je veel handelingen verrichten: persoon verwijderen uit Gevolmachtingden, en toevoegen aan Bestuur. In mijn opzet is het een kwestie van een andere functie geven, en je bent er. Een persoon kan dus nooit meer dan één functie vervullen, en door de functie te veranderen is gelijk de koppeling anders.
Je formulieren baseer je op de verschillende functies, dus daarvoor maak je queries die filteren op de specifieke waarden uit de keuzelijst. Voor een overzicht per VvE van Bestuursleden filter je op de functie Bestuur, voor Beheerders op Beheer etc. Dat kan zelfs allemaal in één formulier gebouwd worden!

Het verhaal wordt een klein beetje anders als je per functie nog specifieke waarden wilt opslaan die alleen voor die functie gelden. Maar dat kun je nog oplossen door daarvoor dan wèl aparte tabellen te maken die je koppelt aan de Personentabel.
 
Excuses voor de verkeerde omschrijving. Ik werk toevallig met acces 2010 op mijn stage en 2007 voor thuis.

Zoals u zegt, één tabel maken voor de persoonsgegevens is een goed idee. Dan is het dus gemakkelijk om een functie aan een persoon toe te voegen. Deze vernieuwde tabel heb ik inmiddels gemaakt. Één persoon kan echter meerdere functies hebben. Hoe doe ik dit?

Wat betreft de link tussen de tabellen. Dat begrijp ik nog niet helemaal. Bedoelt u dat er naast de tabel <VvE> en <Persoonsgegevens/VvE persoonID> nog een tabel moet komen. <VvE personen> om zo de juiste personen bij de juiste VvE te plaatsen?

Als ik het goed begrijp bedoelt u dit:
Tabel <VvE>, hier komen de VvE en de bijbehorende gegevens in. Tabel <Persoonsgegevens> om alle gerelateerde personen in te voeren. Met een functie om de rol aan te geven, bestuurder, gevolmachtigde of beheerder. En daarnaast voor de koppeling een tabel die <VvE> aan <persoonsgegevens> koppelt of kan dat door een sleutel in te stellen.Klopt dit zo?

Ik heb mijn nieuwe db bijgevoegd.

Gr. John

Bekijk bijlage Acquisitie.zip
 
Als je thuis met 2007 werkt vraag ik me af of je met een keuzelijst moet werken.
Één persoon kan echter meerdere functies hebben.
In 2010 kun je een keuzelijst maken waarin je meerdere waarden kunt opslaan. Deze zie je dan in het veld als kommagescheiden waarden terugkomen. Ik weet niet uit mijn hoofd of 2007 die optie ook heeft. Zelf zou ik dan overigens kiezen voor de optie om de functies apart op te slaan en dus geen keuzelijst voor functies te gebruiken. Tenzij je de hoofdfunctie van een persoon wilt vastleggen in het geval van meerdere functies voor een persoon.

Probeer in gegevensobjecten te denken, dan wordt het meestal wel duidelijker. Een Persoon is een object, een VvE is er één en de combinatie van Persoon_VvE_Functie dus ook. Je kunt dus (nog steeds als ik het goed snap) met drie tabellen uit de voeten:

[tbl_Personen], [tbl_VvE] en [tbl_Personen_VvE]. In de laatste tabel leg je dus alle personen vast met hun functies bij de VvE's, en maak je ook de keuzelijst Functies.
Als sleutel heb je dan: [PersoonID]+[nr_VvE]+[Functie]. Deze combinatie zorgt ervoor dat een persoon met 2 functies bij een VvE in de tabel [tbl_Personen_VvE] twee records krijgt, met in elk record een functie.
 
Ik zal het nog eens omschrijven om te kijken of ik het zo goed heb.

Meerdere functies per persoon kan voorkomen. Dat is dus wel even belangrijk.

Als ik het goed begrijp maak je een <tabel personen>, hier komen alle personen in met de gegevens inclusief welke functie ze hebben. De <tabel VvE> geeft de gegevens weer voor de vereniging. Om dus de juiste personen bij de juiste vereniging te krijgen wordt dus <tabel personen VvE> aangemaakt. Hier staat dan in welke personen bij welke VvE horen.

De uitleg met die sleutels snap ik dan niet helemaal. Is het misschien mogelijk dat u het aanpast en een zipje hier plaats zodat ik duidelijker kan zien wat je precies bedoelt?
De koppeling van personen en vve snap ik denk ik nog niet goed.

gr. John
 
Als je er even een 2003 db van kan maken, kan ik het voorbeeld wel aanpassen. Anders wordt het vrijdag.
 
Sorry, ik krijg het nou niet voormekaar.
Dan wacht ik wel tot vrijdag want de database moet wel goed worden.

Alvast bedankt dat u mij op deze manier wilt helpen.

gr. John
 
Wellicht dat anderen eerder tijd hebben :)
 
Ik heb een voorbeeldje gemaakt met 3 tabellen, en de juiste koppelingen er tussen gemaakt. In de koppeltabel kun je geen dubbele functies per persoon_VvE combinatie maken. Dat wordt afgedwongen door de drievoudige sleutel VvE-PersoonID-Functie.
 

Bijlagen

Wow, ook weer puntjes waar ik nog niet aan gedacht had zoals huisnummer en voorletters etc. Bedankt, de rar kan ik openen.

Het selecteren van de functie is goed. Meer mogelijkheden zijn er niet.
Ik kan zo 123 niet vinden waar je dit hebt ingesteld, dat zou ik graag willen weten.

Wat de functie's betreft, een gevolmachtigde kan ook in het bestuur zitten. Dit zou betekenen dat er wel dubbele functies mogelijk moeten zijn. Als dit niet in te stellen is, dan lijkt het mij geen probleem om dezelfde persoon twee keer in te schrijven. Als het goed is moet dat wel mogelijk zijn, je maakt dan een nieuw <persoonsID> Als dit niet handig is wat is dan de beste oplossing?

Ik heb in tabel <personen> bestuurslid weggehaald. De functie stel je toch later in.

<nr VvE> is bij nader inzien helemaal niet handig. Het is acquisitie dus nieuw mogelijke klanten. Die hebben geen nummer. Ik heb dit gewijzigd in <nummer>. Is nummeriek dan wel zo verstandig voor de gegevenstype? Hoe denk jij hierover?

Ik houd jouw voorbeeld aan en daar werk ik mee verder.

Kan ik al denken aan invulformulieren? en zou jij mij daar mee willen helpen?

gr. John

Bekijk bijlage Acquisitie V2.zip
 
De opzoeklijst maak je met de Wizard opzoeken. Die vind je bij <Gegevenstype> van het veld. Uiteindelijk maakt de wizard er dan een tekstveld of een numeriek veld van, en in het onderste deel van het venster zie je op het tabblad <Opzoeken> hoe hij is gemaakt. Je hebt het sleutelprincipe niet helemaal goed begrepen; het is wel degelijk mogelijk om per persoon meerdere functies te kiezen. Alleen is dat beperkt tot combinaties van Persoon+VvE+functie. Dus kun je drie combinaties maken, want er zijn 3 functies mogelijk. Gebruik je de sleutel Persoon+VvE dan is er maar één combinatie mogelijk. Overigens moet je dit soort ideeën
Als dit niet in te stellen is, dan lijkt het mij geen probleem om dezelfde persoon twee keer in te schrijven. Als het goed is moet dat wel mogelijk zijn, je maakt dan een nieuw <persoonsID>
echt verbieden in je hoofd, want dat is een totale NoGo Area in databaseland. Je maakt echt nooit een extra persoon aan om om databasebeperkingen te omzeilen! Als dat al nodig zou zijn, moet je de structuur van de db nog eens tegen het licht houden!
Je zou als uniek veld een Autonummerveld kunnen toevoegen aan VvE, zodat je het veld <nr VvE> alleen voor geaccepteerde klanten hanteert. In dat geval zou ik ook de koppeling aanpassen naar het nieuwe sleutelveld.
Als je alle gegevens kunt opslaan in de tabellen (kan ik zo niet beoordelen natuurlijk) dan kun je inderdaad met de formulieren verder! Maak eens wat met de wizards, daar zit vaak wel een goede basis in om op voort te borduren.
 
Het opzoeken heb ik gevonden. Dat is al duidelijk. Ik weet niet hoe er meerdere functies te selecteren zijn. Daarom vond ik het zo raar. Graag zou ik nog willen weten hoe je dat doet.

Als de VvE klant wordt heb ik een invoerveldje gemaakt <klant?> met een ja/nee omschrijving. Dit lijkt mij handig voor het sorteren? Hoe vind jij dat?

Ik ben al een beetje bezig geweest met formulieren afgelopen vrijdag en ik heb toch nog wat vragen.

Als ik van iedere tabel een standaard formulier maak dan moet eerst <formulier vve> vervolgens <formulier personen> en ten slotte <formulier functie> ingevuld worden. Als er klanten worden ingevuld moet deze volgorde dus wel in het uiteindelijke invulformulier worden gehanteerd.

Als er meerdere klanten zijn toegevoegd en en vervolgens worden alle records verwijderd dan bij het invoeren van een nieuwe klant wordt er gewoon doorgenummerd. Dus dan begint ie gewoon bij 6 bijvoorbeeld.

Als er automatische formulieren zijn germaakt geeft hij eronder een overzichtje aan. Deze overzichtjes zou ik graag zo zien:
Bij formulier VvE, een overzicht van tabel personen met de functie
Bij formulier personen, een overzicht van tabel functie met naam VvE.

Graag zou ik eerst op deze vragen antwoord willen hebben. Daarna heb ik wat betreft het invoeren weer nieuwe vragen. mischien ook nog wel over de formulieren.

gr. John
 
Voor elke combinatie maak je een nieuw record, zo simpel is het! Dus in elk record staat één functie vermeld. Hoe je die dan laat zien, is dan weer aan jou. Je kunt daarvoor een Subformulier maken op je Personen formulier waarin je de functies per VvE van die personen laat zien (gekoppeld op PersoonID), en op het formulier VvE doe je hetzelfde, maar dan voor de personen die bij die VvE de functies vervullen. In dat geval koppel je op VvE.
Of, doe ik tegenwoordig steeds vaker, ik maar daarvoor een Keuzelijst waarin ik de verschillende gegevens ophaal. In dit geval is het namelijk maar een klein stukje informatie, dat makkelijk in een keuzelijst past die relatief weinig plek in beslag neemt.

Record nummeren met AutoNummer houdt inderdaad in dat je een nummer maar één keer kan gebruiken. Dat geeft verder niks, het gaat er alleen om dat je een Uniek nummer genereert waarop je tabellen kunt koppelen. Het zou niet best zijn als je een nummer kunt hergebruiken; dan hangt een persoon met zijn functie ineens aan een andere VvE als je een nummer hergebruikt. Moet je dus niet willen! Bovendien: waarom zou je records verwijderen? Het is juist de bedoeling van een database dat je historie opslaat; een persoon die wordt afgedankt moet je op Inactief zetten, maar niet verwijderen. Dan ben je ook al zijn andere datagegevens (wanneer hij in functie was etc.) kwijt. En dat is niet de bedoeling, toch?
 
Kortom het record nummeren. AutoNummer is dus beter. Hij staat nou op numeriek. Je adviseert dus om <VvE> wat aan te passen. Een veldje met <benaderd + datum> zodat er te zien om de vve benaderd is. Daarnaast een optie met <klant> en <geen klant> zodat je weet of een vve nadat hij is aangeschreven een klant is of niet. Daarbij dan ook een datum bijvoegen zodat je weet wanneer de vve gereageerd heeft op de aanschrijving.

U geeft aan voor elke combi een nieuw record maar je mag een persoon niet 2x inschrijven. Hoe selecteer je dan de 2de functie als er een persoon wordt ingevoerd met 2 functies? Een subformulier is niet nodig. Het lijkt me dat je bij een formulier of rapportage dat je alle functies moet kunnen laten zien. Het ging mij echter om het selecteren.

Graag zou ik wat uitleg willen over de formulieren. Ik wil graag een invulformulier met een pop up. Zodat je in het eerste tab de vve in kan voeren. De tweede tab de personen en de derde tab de functies van de personen. Zo krijg je ook niet dat een bepaald formulier niet kan worden ingevuld omdat er een ander formulieren van te voren moet zijn ingevoerd.

Is het misschien mogelijk dat u die tabellen aanpast? Ik had die relaties verwijderd om er een autonummering van te maken ipv numeriek maar ik kon de 1 op veel relatie al niet weer vinden.
Als u dan akkoord geeft dat de basis van de tabellen goed is kan ik met wat uitleg werken aan formulieren etc.

Alvast bedankt.
John
 
Een persoon mag je niet tweemaal inschrijven, net zo min als je twee records aanmaakt voor één VvE. Maar in de koppeltabel mag elke combinatie van PersoonID, VveNummer en Functie één keer worden opgeslagen. In die tabel zie je dus maximaal 3 records per persoon en per VvE: één record voor elke functie. In op basis van die koppeltabel krijg je dan de subformulieren Functies die je op de Personenkaart zet en op de VvE kaart. In het eerste geval met een koppeling op basis van PersoonID, en in het tweede op basis van VvE ID.

Wat je qua formulieren wilt is wel te maken op op een formulier dat je maakt op basis van de koppeltabel. In dat formulier maak je dan keuzelijsten om 1) de persoon en 2) de VvE te selecteren. De keuzelijsten (met invoervak) baseer je respectievelijk op de tabel Personen en de tabel VvE (dat zijn immers de tabellen waarin de personen en VvE's uniek worden opgeslagen).
Die keuzelijsten hebben een Eigenschap <Bij niet in lijst>. Deze optie wordt getriggerd op het moment dat je een persoon (of VvE natuurlijk bij de andere lijst) kiest die niet bestaat. Access kan dan op basis van de ingevoerde informatie (naam persoon, naam VvE) een formulier openen waarin je de ontbrekende informatie kunt invullen. Door deze actie maximaal twee keer uit te voeren (bij zowel Persoon als VvE dus) zorg je ervoor dat er alleen geldige personen en VvE's gekozen kunnen worden. Heb je die twee gekozen,dan kan in de rest van het formulier de Functie gekozen worden. In zo'n formulier kun je simpel tekstvakken en keuzelijsten uitschakelen (Eigenschap <Ingeschakeld> staat dan uit) en pas inschakelen als er een persoon en een VvE is gekozen.
Je VvE's nummereren kun je handmatig doen, met een stukje VBA er achter die automatisch bij een nieuw nummer het hoogste nummer op zoekt. Of met een Autonummerveld, dat je in beginsel gewoon kunt toevoegen aan de tabel. Wel moet je er dan voor zorgen dat de nummers in je tabel voorkomen in de gekoppelde tabellen, anders doen de relaties het niet meer.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan