In een Delphi-applicatie gebruik ik ADO om een Access 2000 database te benaderen. Dat werkt naar behoren. Een aantal tabellen heeft een autonummering-veld als primary ID. In een grid control worden twee tabellen met een autonummeringsveld gebruikt om een master-detailrelatie te tonen. Dat gaat goed, totdat gebruikers records gaan toevoegen.
Dan gebeurt het volgende:
De randvoorwaarden:
Dan gebeurt het volgende:
- Een gebruiker voegt een master record toe (in tabel A). Aan deze record wordt in het grid geen ID toegekend, dat wordt immers door Access gedaan (tabel A heeft autonummering) bij een update.
- De gebruiker voegt vervolgens een detail record toe (in tabel B) aan de zojuist toegevoegde master record. Ook hieraan wordt geen ID toegekend, want dat moet Access weer door met zijn autonummering.
- Bij het toevoegen van de detailrecord geeft Access een foutmelding dat hij de detail record refereert aan een onbekende ID in tabel A. Dat is ook logisch, want mijn applicatie heeft geen idee welke ID Access heeft gegeven aan de zojuist in tabel A toegevoegde record. En de in tabel B toe te voegen detail record moet aan deze ID refereren om de master-detail-relatie tussen beide records tot stand te brengen.
De randvoorwaarden:
- Na iedere recordmutatie alle master en detail records opnieuw opvragen in de database (een refesh dus) is hopeloos traag en bovendien verlies ik daarmee allerlei gegevens zoals de op dat moment geselecteerde record. Een refresh is daarom geen optie.
- Het problem duikt ook op in een vergelijkbare situatie: als de gebruiker eerst een (master) record in tabel A toevoegt en vóór een refresh van die tabel wijzigingen probeert aan te brengen in de nieuwe record, gaat het ook mis. Het is dan voor Access namelijk niet duidelijk welke record het moet updaten, want de te wijzigen record heeft nog geen ID toegewezen gekregen door de autonummering van Access.
Een goede grap mag vrienden kosten.