[db] Klant koppelen aan meerdere medewerkers

Pagina: 1
Acties:

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 29-04 10:56
Hoi mensen,

Oud programma inzake eenvoudige klantregistratie (In dbase) ben ik aan het herschrijven. Het datamodel ben ik iets aan het uitbreiden, in de oude situatie is het een platte tabel met klantgevens zonder relaties met andere tabellen.

Mijn (verkorte) datamodel:
code:
1
2
3
4
5
6
7
8
9
10
11
tblKLANT
PK  KLANT_NR                         
      KLANT_NAAM
      KLANT_ADRES
FK  KLANT_CONTACT              
FK  KLANT_AANMAAK_DOOR
FK  KLANT_WIJZIG_DOOR

tblPERSONEEL
PK  PERSONEEL_ID                 
       PERSONEEL_NAAM


de FK in tblKLANT zijn allemaal verwijzingen naar de PK van tblPERSONEEL.

Zo heeft elke klant een contactpersoon; is de klant door een bepaald iemand aangemaakt; en de laatste wijziging is gedaan door een bepaald persoon uit de tabel PERSONEEL.

Deze constructie kom ik op nog enkele andere plaatsen in mijn model tegen: een tabel heeft meerdere verwijzingen naar de een bepaald persoon uit tblPERSOON.

Echter nu ik queries wil gaan maken, loop ik tegen problemen aan, en begin ik te vermoeden dat mijn model niet goed is.

Voorbeeld van een eenvoudige querie die ik wil realiseren:
- overzicht van klantgegevens, waar ik in het overzicht kan zien welke personeelsleden met deze klant te maken hebben (contact, aangemaakt door, gewijzigd door)
code:
1
2
KLANT_NR  KLANT_NAAM KLANT_CONTACT KLANT_AANMAAK_DOOR KLANT_WIJZIG_DOOR
10010  testklant  jantje  pietje  mieke

jantje / pietje / mieke zijn de namen van personeel uit tblPERSONEEL.

Is mijn datamodel niet goed, of is hier toch wel eenvoudig een query voor te realiseren?

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 07-05 19:46
Het is een M-M relatie dus je hebt een koppeltabelletje nodig:
table klanten
-id -naam

table klanten_personeel
-klantid -personeelid

tabel personeel
-id -naam

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:00
Je zult best een tabel maken die 'tussen' klant en personeel staat.
In die tabel geef je de relatie tussen een klant en een personeelslid aan, samen met 'wat' ze gedaan hebben/

tabel:
code:
1
2
3
klant_id
personeelslid_id
actie_id

[sub]zelf nog ff een goeie naam verzinnen[:]
Deze tabel is dus gelinkt met klant, personeelslid en met een tabel waarin de mogelijke 'acties' zitten.

https://fgheysels.github.io/


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Ik zie het probleem niet, maar ik vermoed dat je niet beseft dat je tbl_personeel meer dan een keer aan je query kunbt toevoegem. Werk je in Access? Gewoon in het ontwerpraster 3 x tbl personeel toevoegen en dan de juiste joins leggen en dan kun je naam van het personeel uit drie verschillende tabel aliassen halen.

Je kunt een koppeltabel maken voor een veel-op-veel relatie maar in dit geval lijkt me dat niet zo'n geweldig idee.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:00
Niesje schreef op woensdag 04 mei 2005 @ 12:17:
Ik zie het probleem niet, maar ik vermoed dat je niet beseft dat je tbl_personeel meer dan een keer aan je query kunbt toevoegem. Werk je in Access? Gewoon in het ontwerpraster 3 x tbl personeel toevoegen en dan de juiste joins leggen en dan kun je naam van het personeel uit drie verschillende tabel aliassen halen.
Is geen goede oplossing, aangezien je zo met een beperking zit.
Je kunt een koppeltabel maken voor een veel-op-veel relatie maar in dit geval lijkt me dat niet zo'n geweldig idee.
Waarom niet ?
Het lost z'n probleem op, en het is flexibel. Nu kan hij enkel 2 personeelsleden aan een klant koppelen; met een koppeltabel: onbeperkt.

https://fgheysels.github.io/


  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 29-04 10:56
Nee ik ben aan het proberen te begrijpen waarom ik een koppeltabel nodig heb en waarom dit mijn probleem zou oplossen.

In de Relaties van Access heb ik wel de tabel tblPersoneel meerdere keren staan, maar dat dit kan in het Query ontwerp wist ik niet. Ik ga daar mee aan de slag!

EDIT ik zal beiden methodes eens proberen en kijken wat beste werkt.


met koppel tabel moet ik dus de velden KLANT_CONTACT_PERSOON etc. verwijderen, en deze beschrijven in het veld "actie" van de koppeltabel. En aan de hand van deze "actie" moet ik bepalen wat er precies de relatie is tussen de klant en persoon. Volgens mij gaat dit echt niet handig werken.

[ Voor 41% gewijzigd door trekker22 op 04-05-2005 12:24 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:00
trekker22 schreef op woensdag 04 mei 2005 @ 12:21:
Nee ik ben aan het proberen te begrijpen waarom ik een koppeltabel nodig heb en waarom dit mijn probleem zou oplossen.
Een meer op meer relatie (wat dit is: een klant kan door verschillende personeelsleden behandeld worden, en een personeelslid kan 1 of meer klanten behandelen), kan je (enkel) oplossen dmv een koppeltabel. In die tabel sla je gewoon de relaties op (maw, welk personeelslid behandeld er welke klanten). Je kan ook nog eens informatie over die relatie opslaan in uw koppeltabel (zoals ik in m'n eerste post gedaan heb met dat actie-id).

https://fgheysels.github.io/


  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 29-04 10:56
maar een klant wordt eigenlijk maar door 1 persoon behandeld, de contactpersoon.

Verder is er maar 1 persoon die de klant heeft "aangemaakt"
en er is maar 1 persoon die de klant voor het laatst heeft "gewijzigd"

met een koppeltabel weet ik niet hoe ik makkelijk er uit kan hoe halen "contactpersoon" "aangemaakt" en "gewijzigd"...

Dan lijkt me de oplossing van Niesje toch beter.

Ik heb de oplossing geprobeerd met de koppel tabel:

tblKLANT -- tblKLANT_PERSONEEL -- tblPERSONEEL

voorbeeld data
tblKLANT:
NR Naam
10811 TestKlant

tblKLANT_PERSONEEL
NUMMER PERSONEEL ACTIE
10811 2 CONTACT
10811 3 AANGEMAAKT
10811 4 WIJZIG

--> persoon 2 contactpersoon; 3 heeft aangemaakt en 4 laatst gewijzigd

tblPERSONEEL
NUMMER NAAM
2 Jan
3 Piet
4 Mieke

Nou mag jij mij dan vertellen hoe ik dan het in 1 query de klantgegevens + contactpersoon + aangemaakt + wijzig weer kan geven. Dus

query resultaat
nr naam contact aangemaakt gewijzigd
10811 TestKlant Jan Piet Mieke

[ Voor 55% gewijzigd door trekker22 op 04-05-2005 12:35 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:00
Mja, je kan er van doen wat je wilt natuurlijk. Als je zeker bent dat dit de enige eisen zijn, dan kan je het opslaan zoals je nu bezig bent hoor.

Hoe je er het uit kan halen met die koppeltabel:
code:
1
2
3
4
select personeelslid.naam
from personeelslid
inner join klant_personeelslid on ...
where klant_id = xxx and actie_id = 'id-van-aangemaakt-actie'.

https://fgheysels.github.io/


  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 29-04 10:56
Ook in de presentatie van de klantgegevens ga ik ervan uit dat deze velden star zijn en zou ik ook geen 1 op veel relatie willen laten zien.

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

whoami schreef op woensdag 04 mei 2005 @ 12:19:
[...]

Is geen goede oplossing, aangezien je zo met een beperking zit.


[...]

Waarom niet ?
Het lost z'n probleem op, en het is flexibel. Nu kan hij enkel 2 personeelsleden aan een klant koppelen; met een koppeltabel: onbeperkt.
Het lijkt me geen goed idee omdat niet duidelijk is of de soort en aantal relaties klant-personeel vast gedefinieerd is of niet. Als het eerste het geval is, en dat lijkt het geval (elke klant wordt aangemaakt, heeft een contact persoon en wordt wel eens gewijzigd en meer vraag is er niet), dan is een koppeltabel zelfs een slecht idee.

In theorie heb je helemaal gelijk dat een koppeltabel de problemen oplost en flexibel is. In de praktijk is het met Access echter onhandig werken met koppeltabellen en vraagt het (te) veel van de skills van TS, terwijl, als hij maar drie medewerkers nodig heeft, het in Access reuze makkelijk is een formuliertje te bouwen met een paar listboxjes. Met koppeltabellen wordt zelfs zo'n basisformuliertje veel moeilijker en complexer, ook al omdat hij regelmatig foutmeldingen zal krijgen dat recordset niet kan worden bijgewerkt, en de performance gaat er ook niet op vooruit.

Dus waarom de boel compliceren voor een feature die je misschien nooit nodig hebt?

edit:
sorry, ik tik niet zo snel ;)

[ Voor 3% gewijzigd door Lustucru op 04-05-2005 12:39 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 29-04 10:56
Niesje verwoordt precies zoals het in mijn hoofd zit. Voor veel zaken gebruik ik ook koppeltabellen. Maar voor een klantenbestand is dit echt wel makkelijker voor elkaar te krijgen!

Heb het werkend bedankt! Weer wat geleerd over queries maken in Access.

Verwijderd

Hier is de code in Access zonder gebruikmaking van koppeltabellen:

tblKLANT
PK KLANT_NR
KLANT_NAAM
KLANT_ADRES
FK KLANT_CONTACT
FK KLANT_AANMAAK_DOOR
FK KLANT_WIJZIG_DOOR

tblPERSONEEL
PK PERSONEEL_ID
PERSONEEL_NAAM

SELECT tblKLANT.KLANT_NR, tblKLANT.KLANT_NAAM,
A.PERSONEEL_NAAM AS Aangemaakt,
B.PERSONEEL_NAAM AS Contact,
C.PERSONEEL_NAAM AS Gewijzigd
FROM ((tblKLANT
LEFT JOIN tblPERSONEEL AS A ON tblKLANT.KLANT_AANMAAK_DOOR = A.PERSONEEL_ID)
LEFT JOIN tblPERSONEEL AS B ON tblKLANT.KLANT_CONTACT = B.PERSONEEL_ID)
LEFT JOIN tblPERSONEEL AS C ON tblKLANT.KLANT_WIJZIG_DOOR = C.PERSONEEL_ID;
Pagina: 1