Er is een logische reden voor, en hij is (gedeeltelijk) te omzeilen.
Zoals je misschien wel kunt begrijpen, kun je met een formulier maar in één tabel tegelijk records toevoegen. Het toevoegen van een record gebeurt namelijk maar in één tabel die de focus heeft.
In een query kun je verschillende tabellen aan elkaar koppelen, maar ook hier geldt het principe: toevoegen van records kan maar in één tabel van die query. Als je een query maakt waarmee je records wilt kunnen toevoegen, moet je die tabel dus als uitgangspunt nemen. Best begin je dus, als je een query maakt waarmee je records wilt kunnen toevoegen, met die tabel te selecteren, en alle velden uit die tabel in de query te zetten. Doe dat bij voorkeur door de velden te slepen/selecteren en niet met het sterretje (asterix).
Vervolgens voeg je de overige tabellen toe waaruit je velden wilt gebruiken. Als je de relaties goed hebt gelegd, worden de tabellen automatisch gekoppeld aan de basistabel; anders moet je de tabellen zelf koppelen. Normaal gesproken bevatten de toegevoegde tabellen een sleutelveld, dat terugkomt in de basistabel. Hierbij geldt een één-op-veel relatie: de Hoofdtabel tblKlanten is aan de tabel tblFacturen gekoppeld door het veld Klantnummer uit tblKlanten te koppelen aan kl_Klantnummer uit de tabel tblFacturen. Hierbij geldt als regel: in de tabel Klanten mag je een klantnummer één keer toevoegen (sleutelveld); in de tabel Facturen mag een klantnummer meerdere keren voorkomen, want een klant mag meer dan één factuur ontvangen (bij elke bestelling een aparte factuur).
Voorbeeldje: je maakt een formulier voor Facturen, dus je gebruikt alle velden uit de tabel tblFacturen. In die tabel heb je een veld kl_Klantnummer. Om de klantgegevens voeg je dus de tabel tblKlanten toe. In deze tabel is het veld Klantnummer het sleutelveld. In de Relaties heb je het veld Klantnummer gekoppeld aan het veld kl_KLantnummer, dus Access koppelt in de query de velden automatisch aan elkaar. Nu selecteer je uit de tblKlanten de velden Bedrijfsnaam, Adres, Huisnr, Postcode en Plaats. Hetzelfde doe je voor de overige tabellen. Zou ik in het voorbeeld niet het veld kl_Klantnummer gebruiken, maar het veld Klantnummer uit de tabel tblKlanten, dan zou de query niet meer werken.
Waarom werkt deze query nu wel om records toe te voegen? Heel simpel eigenlijk: uit de tabel Facturen zijn alle velden gebruikt, en uit de overige tabellen de velden die geen sleutelveld zijn. Je moet het dus zo zien: alle velden die je in de query hebt opgenomen, slaan hun gegevens op in de tabel waar ze uitkomen. In je query sla je een nieuw record op in tblFacturen. Volgens de integriteit mag een Klantnummer meerdere keren voorkomen in tblFacturen, dus dat is prima. Zou ik het veld Klantnummer gebruiken uit de tabel Klanten, dan heb ik een tweeledig probleem. Als eerste: je zou nu proberen om in de tabel Klanten hetzelfde klantnummer nog een keer toe te voegen. Dat mag niet, want het veld Klantnummer is een sleutelveld. Het tweede probleem heeft hier mee te maken: als je een Factuur record toevoegt, ben je verplicht om een Klantnummer in te voeren. Omdat het klantnummer uit Klanten wordt gehaald, gebeurt dat niet. En dan kun je het record dus niet opslaan.
Het tweede probleem kun je ondervangen door het veld kl_Klantnummer uit tblFacturen ook toe te voegen. Maar deze oplossing lost het eerste probleem niet op: je bent nog steeds bezig om een bestaand klantnummer toe te voegen aan Klanten! En overigens is het klantnummer maar één keer nodig, want uiteraard is het klantnummer voor de tabel Facturen identiek aan het klantnummer in de tabel Klanten. Je hebt het veld du maar één keer nodig.
Conclusie: via een query kun je acties uitvoeren op één tabel tegelijk. Van deze tabel moet je dus alle velden die je wilt invullen opnemen in de query. Uit de aanvullende tabellen neem je de velden die geen sleutelveld zijn. Deze opzet heeft ook nog een (misschien ongewenst) bij-effect. De Klantgegevens zoals Naam en adres zijn wèl te muteren! Als je dus in een query waarin 6 factuurrecords zitten van een klant, en je wijzigt iets in het adres va één record van de query, dan zul je zien dat alle 6 records de nieuwe waarde laten zien. Bedenk zelf maar waarom dat zo is...