aan welke tabel toevoegen

HankMegens

Gebruiker
Lid geworden
1 sep 2015
Berichten
107
Ik heb diverse tabellen. Tagenda, waarin een nieuw item wordt aangemaakt. Welke gekoppeld is aan Tagendeonderdeel, waar het type agendapunt wordt geslecteerd, en een Tfrequentie waarmee je kan kiezen of het weekleijks, maandelijks, dan wel uniek is. Ik heb de frequentie gekoppeld aan het agendaonderdeel, en niet aan de agenda zelf. Dit lijkt me logischer. Echter door mijn formulier te baseren op een query waarin bovenstaande tabellen zijn gekoppeld kan ik niks toevoegen, vanwege JOINS in de query.
Hoe los ik dit op? Toch de frenquentie aan het agendaitem in Tagenda koppelen of anders?
 

Bijlagen

Ik zal er zo even naar kijken, maar als ik je verhaal zo lees, dan heb ik op voorhand al een paar bedenkingen. In beginsel hebben een hoofdformulier en een subformulier een eigen bron (tabel, query) dus ik snap je laatste vraag niet helemaal. Ik maak regelmatig formulieren op basis van queries met meerdere tabellen, dus an sich moet dat gewoon kunnen werken. Maar er zijn een aantal voorwaarden waaraan je je moet houden, en dat heb je vermoedelijk niet gedaan. Nogmaals: ik kijk er zo nog naar!
 
Ik heb een eerste blik geworpen, en om te beginnen een aantal zaken aangepast, zoals de namen van je tabellen (zeer onhandige qualificatiemethode, vind ik. Sowieso is het aan te raden om je objecten een kwalificatie te geven, met één of meer letters, maar als je dat doet, gebruik daar dan geen Hoofdletters voor; dat maakt het herkennen van de échte naam een stuk lastiger. Zelf gebruik ik het liefst "tbl" of "t_" voor tabellen, "frm" of "f_" voor formulieren en zo voort.

Daarnaast heb ik je functies voor de leeftijdberekening versimpeld. De werking an sich was overigens verder goed.

Nu m.b.t. je echte vraag: om welk formulier gaat het precies? het formulier fAgenda doet het namelijk (na wat aanpassingen in de keuzelijsten) prima. Ook het toevoegen van een nieuw record is mogelijk. Dus waar zit het probleem? Ik vermoed in de keuzelijst/veld FrequentieID, die je wél op het formulier hebt, maar níet in de tabel. Ik vraag me overigens af, dat was ook een bedenkelijk puntje, of je de frequntie niet beter in de agenda kan opslaan. En wel om het volgende:

Een frequentie is in mijn ogen géén eigenschap van een afspraaksoort. In beginsel moet elke type afspraak een eigen frequentie kunnen hebben. Neem de eigenschap Repetitie: die staat bij jou op wekelijks, en dat zal best het vaakst voorkomen. Maar zijn er nooit speciale repetitieblokken? Ik kan mij goed voorstellen dat je vlak voor een optreden nog even een week elke (werkdag) bij elkaar wil komen om de puntjes op de 'ij' te zetten. (of: de puntjes op de 'i's' of de punt op de 'i'. Elke andere variant is taalkundig niet best ;)).
Idem voor een optreden: je hebt daarvoor de aanduiding 'uniek', wat in mijn ogen 'eenmalig' moet zijn. Om te beginnen: als je een concert drie keer achter elkaar uitvoert op dezelfde locatie, dan kun je sowieso al niet van uniek spreken. Bovendien: élk optreden is van zichzelf al uniek (niet herhaalbaar), maar dat geldt óók voor een repetitie. Er zijn een aantal zaken in het leven die je niet kan herhalen, omdat ze in het nú plaatsvinden. En dat nu is straks verleden tijd....

Kortom: de frequentie is een eigenschap van een agenda-afspraak, niet van het soort afspraak. Wil je een goed beeld hebben van welke eigenschappen een agenda-afspraak heeft, kijk dan eens naar de Outlook agenda; daar zie je perfect wat er allemaal geregeld kan/moet worden.

De oplossing voor jouw huidige situatie is dus in weze simpel. Je hebt nu alleen de tabel t_Agenda er onder hangen, waar geen veld FrequentieID in zit; dat zit in de tabel t_Agendaonderdeel. Als je de frequentie daarin wilt opslaan, ondanks mijn wijze advies, dan zul je die tabel dus moeten toevoegen aan een query die je voor het formulier gaat gebruiken. In die query neem je dan het veld FrequentieID op, en op je formulier koppel je dan het veld aan dat tekstobject.
Mijn advies zou dus zijn: doe dit niet, maar voeg aan de tabel t_Agenda een veld FrequentieID toe, en koppel dat dan aan je keuzelijst. Makkelijker, en beter.

Dan nog iets: wat wil je met de keuzelijst cboWeekdag? Die lijkt mij totaal niet nodig; een weekdag komt immers voort uit de datum die je hebt gekozen. Je kunt die heel simpel in de keuzelijst laten zien. Dus waarom?
 

Bijlagen

Laatst bewerkt:
Je hebt nog recht op de uitleg waarom jouw query niet werkt, en hoe je hem werkend kunt maken.

SELECT
t_Agenda.agendaID,
t_Agendaonderdeel.agendaonderdeelID,
t_Agendaonderdeel.agendaonderdeel,
t_Onderdeel.onderdeelID,
t_Onderdeel.onderdeelnaam,
t_Agenda.agenda,
t_Agenda.agendadatum,
t_Agenda.agendatijd,
t_Agendaonderdeel.weekdag,
t_Frequentie.frequentieID,
t_Frequentie.frequentie,
FROM
SELECT
t_Agenda.agendaID,
t_Agenda.agendaonderdeelID,
t_Agendaonderdeel.agendaonderdeel,
t_Agenda.onderdeelID,
t_Onderdeel.onderdeelnaam,
t_Agenda.agenda,
t_Agenda.agendadatum,
t_Agenda.agendatijd,
t_Agendaonderdeel.weekdag,
t_Agendaonderdeel.frequentieID,
t_Frequentie.frequentie
FROM
Links de velden zoals jij ze hebt toegevoegd aan de query (niet werkend), rechts de versie van mij die wél werkt. Ik zou bijna zeggen: bekijk de verschillen eerst zelf, en probeer te bedenken waarom mijn versie werkt, en die van jou niet. Maar ik vermoed dat je de verschillen wellicht nog wel zult zien, maar niet gelijk zal snappen wat daarbij het verschil maakt. Dus ik geef toch maar gelijk de uitleg erbij.

Als je goed hebt gekeken, zul je hebben gezien dat het verschil zit in de tabellen waarvoor ik de sleutelvelden gebruik. Ik pak als voorbeeld het tweede en derde veld: jij gebruikt t_Agendaonderdeel.agendaonderdeelID, ik gebruik t_Agenda.agendaonderdeelID. Als je de query uitvoert, zul je geen verschil zien, want ze geven allebei dezelfde waarde weer. Dus waarom werkt de ene wel, en de andere niet?

Heel simpel: je gebruikt het formulier (en de onderliggende tabel t_Agenda) om daarin een record aan te maken voor de tabel t_Agenda. Dat betekent, dat je alle verplichte velden van die tabel moet invullen. Dat begint dus al met het AgendaID, wat een autonummerveld is. Probleem opgelost. Zou je de tabel t_Agenda handmatig invullen, zou je daar geen probleem mee hebben en probleemloos de juiste waarde invullen. Maar wat gebeurt er als je jouw oplossing in het formulier (de query) gebruikt? Je vult niet een waarde in de tabel t_Agenda in, maar in de tabel t_AgendaOnderdeel! In de tabel t_Agenda blijft dus het AgendaOnderdeelID veld leeg! En dat wil je uiteraard niet.
En er is nóg een fout die optreedt met deze werkwijze: elke waarde die je met jouw query invult voor AgendaOnderdeelID is ofwel een bestaand getal (bekend onderdeel), ofwel een niet-bestaand getal. In het laatste geval ben je dus zélf een waarde aan het invullen in een tabelveld dat al gevuld wordt met een Autonummer. En dat is dus ook een probleem.

Kijk je verder in de query hierboven, dan zie je dat het probleem bij jou óók optreedt met de tabel t_Onderdeel (veld OnderdeelID) en de tabel t_Frequentie. En die laatste is ook weer een leuke, want die gaat dus een niveautje dieper in de fout. En dat komt omdat in t_Agenda geen frequentieID wordt opgeslagen, maar in de tabel t_AgendaOnderdeel. En daarom dus dezelfde constructie, met een andere brontabel.

De velden AgendaOnderdeel, OnderdeelNaam en Frequentie zijn tekstvelden die uit de bijbehorende brontabellen komen. Die kun je dus in beginsel niet fout gebruiken.

Samenvattend: als je in een query records wilt kunnen muteren/toevoegen, dan moet je sowieso uitgaan van een hoofdtabel die je wilt vullen, en daar alle velden van gebruiken. Wil je aanvullende velden uit gekoppelde tabellen zien, gebruik dan nooit de sleutelvelden uit die tabellen, want die zetten gelijk je query op slot. En nog een tip: als je in je formulier een veld als [Frequentie] verandert, dan verander je de originele waarde in de brontabel. Alle records zien dan dus de 'vernieuwde' waarde. Ik zet dus op het formulier die velden altijd op slot, om te voorkomen dat ze per ongeluk worden veranderd.
 
Terug
Bovenaan Onderaan