invoegquery

Status
Niet open voor verdere reacties.

musti

Gebruiker
Lid geworden
26 feb 2006
Berichten
143
De situatie is als volgt:
Bij het absentiemenu aangekomen krijg je een keuzelijst te zien van alle klassen.
Daarna klik je op het knop absentie maken, waardoor je naar het absentiemenu form terecht komt. Hierbij vul je de jaar, maand en dag in en klikt daarna vervolgens op query uitvoeren. Hier moet voor alle leerlingen die in dat klas zitten aan het absentie worden toegevoegd, dat helaas niet lukt.
 

Bijlagen

Het belangrijkste probleem is, dat je een Selectiequery hebt gemaakt, en geen Toevoegquery.
Daarnaast heb je in de query zo'n beetje alle tabellen opgenomen die je hebt, en dat is hier ook niet nodig ;)
Een ander (nogal stevig) probleem is, dat je de aan Absentie toe te voegen velden eerst opent in een formulier met een Subfomulier. Daar zie ik eerlijk gezegd geen enkele noodzaak voor: het enige dat je wilt, is een datum selecteren en toevoegen aan de gegevens die je al hebt overgehaald uit het eerste formulier. Dat kan allemaal gewoon op één formulier gebeuren.

Als je dat hebt geregeld, dan maak je een Toevoegquery, waarbij je alleen maar de gegevens uit het formulier hoeft toe te voegen via de knop Opbouwen, en de juiste velden uit de tabel Absentie, waarin je de gegevens wilt opslaan.
Ik zou dan ook nog wel een check inbouwen dat je de gegevens maar één keer kunt toevoegen, maar dat is voor later zorg. Eerst zorgen dat:

1. Alle gegevens die je wilt toevoegen op één formulier staan
2. Er een Toevoegquery is, waarbij je alle gegevens op de juiste velden zet

Mocht je er niet uitkomen: ik heb vanavond niet zoveel tijd, maar misschien iemand anders wel...
 
Het belangrijkste probleem is, dat je een Selectiequery hebt gemaakt, en geen Toevoegquery.
Daarnaast heb je in de query zo'n beetje alle tabellen opgenomen die je hebt, en dat is hier ook niet nodig ;)
Een ander (nogal stevig) probleem is, dat je de aan Absentie toe te voegen velden eerst opent in een formulier met een Subfomulier. Daar zie ik eerlijk gezegd geen enkele noodzaak voor: het enige dat je wilt, is een datum selecteren en toevoegen aan de gegevens die je al hebt overgehaald uit het eerste formulier. Dat kan allemaal gewoon op één formulier gebeuren.

Als je dat hebt geregeld, dan maak je een Toevoegquery, waarbij je alleen maar de gegevens uit het formulier hoeft toe te voegen via de knop Opbouwen, en de juiste velden uit de tabel Absentie, waarin je de gegevens wilt opslaan.
Ik zou dan ook nog wel een check inbouwen dat je de gegevens maar één keer kunt toevoegen, maar dat is voor later zorg. Eerst zorgen dat:

1. Alle gegevens die je wilt toevoegen op één formulier staan
2. Er een Toevoegquery is, waarbij je alle gegevens op de juiste velden zet

Mocht je er niet uitkomen: ik heb vanavond niet zoveel tijd, maar misschien iemand anders wel...

ik kom er niet echt uit. Ik wil me graag verdiepen erin, maar kort aan tijdgebrek zou ik wel enige hulp gebruiken, waardoor het later in de toekomst als een mooi voorbeeld kan dienen.
Toch bedankt voor alle moeite
 
Ik had vandaag niet zoveel tijd, maar ik zal er vanavond nog even naar kijken.
 
Time flies..... :confused:

Kijk er straks naar!
 
Time flies..... :confused:

Kijk er straks naar!

zit er misschien een foutje in de relatie. Er is een relatie van klas naar Absentie en niet van leerling naar absentie.
En van klas naar absentie is 1 op veel en niet veel op veel, want in een absentie kunnen meerdere leerlingen voorkomen.
 
Time flies..... :confused:

Kijk er straks naar!

Ik heb het bijna gedaan, maar er is een klein probleempje. Kan je er daarna kijken.
formulieren:
AbsentMenu
AbsentMakenVoorbereiding
AbsentMaken

Sorry ik heb dit in de verkeerde vraag gepost.
 

Bijlagen

De bestandjes komen bij mij op het werk niet door de virusscanner heen...
 
Hij blijft vinden dat je besmet bent.... Toch niet in Meggico geweest? :D
Ik kijk vanavond wel, met een pint erbij. Werkt toch al een stuk lekkerder... Overigens geeft de foutmelding aan dat er een sleutelconflict is; dat betekent meestal dat het record in die combinatie al bestaat. Als het wel opgeslagen zou moeten kunnen worden, dan moet je dus eerst controleren of de relaties en afhankelijkheden wel goed staan. Het kan ook zijn dat een verplicht veld niet wordt ingevuld, al blijkt dat hier nog niet uit.

Als je de query uitvoert via VBA, dan is het slim om de SQL die je uitvoert af te vangen, en rechtstreeks in een query te testen. Dan zie je vaak beter wat er fout gaat.

Dim tmp
tmp=Inputbox("","",strSQL)

bijvoorbeeld als code voor de regel waarin je de Docmd.RunSQL hebt staan.

Dan krijg je de feitelijk uit te voeren query in een tekstbox, die je vervolgens kunt kopieëren naar het Kladblok of zo, en vervolgens plakken in een lege query.
 
Hij was thuis prima te openen, dus je hoeft er geen dokter bij te halen...
Alle gekheid op een stokje: je bent (onbewust, mag ik hopen) slachtoffer geworden van het OSS. Een bekend verschijnsel onder (licht) slordige ontwerpers, die er voor zorgt dat iets om onverklaarbare redenen ineens niet meer werkt... Wat het is? Het Onhandige Sleutel Syndroom!
Ik raad mensen altijd aan om Sleutelvelden zelf een heldere naam te geven, en dat niet aan Access over te laten. Niet alleen voorkom je OSS problemen, Access beloont je ook door bij queries automatisch de juiste velden aan elkaar te knopen. Wel zo handig!
Maak je echter een tabel aan, en heb je niet zo snel een logische eigen sleutel, dan lijkt het logisch om een Autonummerveld door Access te laten maken. Makkelijk, en altijd uniek. Dit veld wordt door Access dan altijd Id genoemd, bij gebrek aan creativiteit daar in Silicon Valley. Zij kunnen uiteraard ook niet weten waar jij je tabel voor gebruikt!
Wanneer kom je nu in de problemen? Als je, zoals jij nu, een toevoegquery maakt. Als je velden uit gerelateerde tabellen toevoegt aan een koppeltabel, dan zal Access je helpen waar mogelijk. Als je leerlingtabel het sleutelveld LeerlingID heeft, en de tabel absentie heeft het veld Leerling_ID als gekoppeld veld, dan weet Access niet dat deze twee velden hetzelfde zijn. Het het veld in absentie echter LeerlingID, dan ziet Access dat de veldnamen identiek zijn, en zal ze dus direct neerzetten in je toevoegquery. Handig, toch?

En nu komt het: identieke velden zijn dus ook sleutelvelden die ID heten. En daar gaat jouw toevoegquery in de fout... In de toevoegquery heb je het veld ID uit de tabel Klas gebruikt om je formulier op te filteren. Jammer genoeg heeft de tabel Absentie ook een veld ID, dus Access heeft ze netjes voor je gekoppeld.
Als je de query nu uitvoert, krijg je een Sleutelconflict, zoals de melding al aangaf. Waarom? Je probeert een waarde uit de tabel Klas toe te voegen aan het veld ID in de tabel absentie, waar het veld een autonummerveld is. En dat kan uiteraard niet; bij autonummering wordt het nummer gegenereerd bij het aanmaken van een nieuw record, en je kunt dus geen bestaande nummers overschrijven/toevoegen. De oplossing is hier erg simpel: haal in de regel <Toevoegen aan> het veld leeg. Je zult zien, dat het nu wel werkt!
Ik heb de fout nog even gemarkeerd in bijgaande afbeelding, voor de duidelijjkheid.
Het verhaal is een beetje lang voor de feitelijke oplossing, maar dat komt omdat ik graag wil benadrukken hoe belangrijk het is om de naamgeving van de objecten, tabellen en formulier(objecten) gelijk vanaf het begin goed te doen, juist om dit soort problemen te voorkomen. Als je in VBA allerlei queries en recordsets gaat maken, en je moet naderhand alle code doorlopen, omdat je de namen van de velden moet aanpassen, wordt je echt niet blij....
 

Bijlagen

  • Toevoegfout.jpg
    Toevoegfout.jpg
    92,5 KB · Weergaven: 94
Hij was thuis prima te openen, dus je hoeft er geen dokter bij te halen...
Alle gekheid op een stokje: je bent (onbewust, mag ik hopen) slachtoffer geworden van het OSS. Een bekend verschijnsel onder (licht) slordige ontwerpers, die er voor zorgt dat iets om onverklaarbare redenen ineens niet meer werkt... Wat het is? Het Onhandige Sleutel Syndroom!
Ik raad mensen altijd aan om Sleutelvelden zelf een heldere naam te geven, en dat niet aan Access over te laten. Niet alleen voorkom je OSS problemen, Access beloont je ook door bij queries automatisch de juiste velden aan elkaar te knopen. Wel zo handig!
Maak je echter een tabel aan, en heb je niet zo snel een logische eigen sleutel, dan lijkt het logisch om een Autonummerveld door Access te laten maken. Makkelijk, en altijd uniek. Dit veld wordt door Access dan altijd Id genoemd, bij gebrek aan creativiteit daar in Silicon Valley. Zij kunnen uiteraard ook niet weten waar jij je tabel voor gebruikt!
Wanneer kom je nu in de problemen? Als je, zoals jij nu, een toevoegquery maakt. Als je velden uit gerelateerde tabellen toevoegt aan een koppeltabel, dan zal Access je helpen waar mogelijk. Als je leerlingtabel het sleutelveld LeerlingID heeft, en de tabel absentie heeft het veld Leerling_ID als gekoppeld veld, dan weet Access niet dat deze twee velden hetzelfde zijn. Het het veld in absentie echter LeerlingID, dan ziet Access dat de veldnamen identiek zijn, en zal ze dus direct neerzetten in je toevoegquery. Handig, toch?

En nu komt het: identieke velden zijn dus ook sleutelvelden die ID heten. En daar gaat jouw toevoegquery in de fout... In de toevoegquery heb je het veld ID uit de tabel Klas gebruikt om je formulier op te filteren. Jammer genoeg heeft de tabel Absentie ook een veld ID, dus Access heeft ze netjes voor je gekoppeld.
Als je de query nu uitvoert, krijg je een Sleutelconflict, zoals de melding al aangaf. Waarom? Je probeert een waarde uit de tabel Klas toe te voegen aan het veld ID in de tabel absentie, waar het veld een autonummerveld is. En dat kan uiteraard niet; bij autonummering wordt het nummer gegenereerd bij het aanmaken van een nieuw record, en je kunt dus geen bestaande nummers overschrijven/toevoegen. De oplossing is hier erg simpel: haal in de regel <Toevoegen aan> het veld leeg. Je zult zien, dat het nu wel werkt!
Ik heb de fout nog even gemarkeerd in bijgaande afbeelding, voor de duidelijjkheid.
Het verhaal is een beetje lang voor de feitelijke oplossing, maar dat komt omdat ik graag wil benadrukken hoe belangrijk het is om de naamgeving van de objecten, tabellen en formulier(objecten) gelijk vanaf het begin goed te doen, juist om dit soort problemen te voorkomen. Als je in VBA allerlei queries en recordsets gaat maken, en je moet naderhand alle code doorlopen, omdat je de namen van de velden moet aanpassen, wordt je echt niet blij....

Ik heb nog een probleempje voor de zoveelste keer. Bedankt echt voor alles.

Het is namelijk zo dat het invoegquery werkt en dat de absenties worden toegevoegd aan de leerlingen. Daarna wordt er nog een formulier geopend waar de gebruiker de absenties moeten kunnen bewerken, maar het gaat niet, het lijkt of de velden vergrendeld zijn terwijl dat niet zo is. ik kom er echt niet uit.

formulier:
absentiemenu, absentiemaken
 

Bijlagen

Zal er vanavond een blik op werpen.
 
Op welk formulier speelt het probleem? D'r zijn er nogal wat ;)
 
Op welk formulier speelt het probleem? D'r zijn er nogal wat ;)

Bij formulier "AbsentieMaken" vul ik de dag,maand en de jaar in. Vervolgens voer ik een invoegquery uit met daaropvolgend een formulier(AbsentiesBewerken) dat opent met de knop "Absentie maken" . Het probleem is dat "AbsentieMaken" de actieve venster blijft terwijl de bedoeling is dat de formulier "AbsentiesBewerken" de actieve venster wordt.
De formulier "Absentiesbewerken" wordt geopend met een filter (query: AbsentieBewerken)
 
Ik krijg de bestanden niet gedownload op mijn werk, omdat de virusscanner vindt dat er wat mee is...
Kun je, door de db eerst te comprimeren en herstellen, kijken of je er één bestand van kunt maken? Anders wordt het vanavond...
 
Ik krijg de bestanden niet gedownload op mijn werk, omdat de virusscanner vindt dat er wat mee is...
Kun je, door de db eerst te comprimeren en herstellen, kijken of je er één bestand van kunt maken? Anders wordt het vanavond...

doe maar vanavond.

prettige dag verder
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan