Referentiële integriteit werkt niet

Status
Niet open voor verdere reacties.

janluc

Gebruiker
Lid geworden
10 jul 2016
Berichten
53
In bijgaande database heb ik een één op veel relatie gemaakt tussen tblOrders en tblOrderregels, met "referentiële integriteit afdwingen" aangevinkt.

Desondanks is het mogelijk om in tblOrderregels een record aan te maken zonder het veld OrderID in te vullen.

Ik heb de relatie al verwijderd, gecomprimeerd en opnieuw aangemaakt, maar geen resultaat.

In dezelfde database heb ik het probleem niet met de vergelijkbare tabellen tblPakbonnen en tblPakbonregels.

Wie kan me uitleggen wat hier fout gaat?

Dank, Jan Luc
 

Bijlagen

  • Factuurprogramma.zip
    838,2 KB · Weergaven: 33
Laatst bewerkt:
Niets invullen is iets anders als een foute waarde invullen. Dus dat klopt wel. Sterker nog: als het niet zou kunnen, zou je nooit met relaties kunnen werken, want je begint altijd met niet-bestaande records als je tabellen maakt. Dus als je geen relatie zou mogen maken als er niks is, dan kun je nooit die relatie maken. In een goed ontworpen db (formulier) speelt het probleem ook helemaal niet, omdat je automatisch vanuit het hoofdformulier het subformulier invult.
 
Dank voor jullie antwoorden.
@sytze: die heb ik gezien, maar daar heb ik de oplossing niet gevonden. Of heb ik iets over het hoofd gezien?
@ Octafish: ik begrijp niet wat je precies bedoelt met "Dus als je geen relatie zou mogen maken als er niks is, dan kun je nooit die relatie maken". Ik beweer namelijk niet dat ik geen relatie zou moeten mogen maken, maar dat ik geen nieuwe record zou moeten mogen aanmaken. En bij mijn weten zou dat onmogelijk moeten zijn als de de relatie eenmaal is aangemaakt, met de optie ref. integr afdwingen aangevinkt. Bij tblPakbonnen en tblPakbonregels in het bestand krijg ik in elk geval wél een foutmelding als ik in de tweede tabel een record probeer aan te maken : "u kunt geen record toevoegen omdat voor de tabel tbl Pakbonnen een gerelateerde record vereist is". Of zie ik dat niet goed?

Voor de zekerheid voeg ik een nieuw voorbeeldbestand toe, in het vorige zaten nog wat rare problemen die zouden afleiden van de probleemstelling (zonder te willen beweren dat deze versie probleemloos is natuurlijk;)
 

Bijlagen

  • Factuurprogramma Brouwerij.zip
    507,6 KB · Weergaven: 33
Laatst bewerkt:
... maar dat ik geen nieuwe record zou moeten mogen aanmaken. En bij mijn weten zou dat onmogelijk moeten zijn als de de relatie eenmaal is aangemaakt, met de optie ref. integr afdwingen aangevinkt.
Nogmaals: Referentiële Integriteit controleert het voorkomen van verkeerde verwijzingen, niet op het ontbreken van verwijzingen. Als je in tblOrderregels een verkeerd OrderID intypt, een waarde die dus niet voorkomt in de tabel tblOrders, dan heb je een probleem: dan kun je het record niet opslaan. Dát is Referentiële integriteit. Daarnaast kun je nog instellen dat je de verwijssleutel leeg laat (een outer join) maar dat is sowieso zelden handig.
Jij hebt één tabel met twee koppelingen: de tabel tblPakbonregels. Die heeft koppelingen met tblPakbonnen en tblOrderregels. Laat je in die tabel het veld PakbonID leeg, of het veld OrderregelID leeg, dan heb je een probleem want dat mag niet.

Referentievelden zijn sowieso verplichte velden, want een pakbonregel zonder pakbon of orderregel zou een verkeerde pakbon opleveren. Datzelfde geldt voor OrderID in tblOrderregels: dat zou een verplicht veld moeten zijn. En dáár zit bij jou de crux: dat is bij jou geen verplicht veld. En zodra een veld niet verplicht is, mag je het leeg laten. En op dat moment controleert Access ook niet meer of de ingevoerde waarde wel mag. In de andere koppeltabellen heb je het wél goed ingesteld, dus waarom voor tblOrderregels niet, is mij een raadsel. Maar je moet daar OrderID dus verplicht maken, omdat je anders dus records kan maken zonder OrderID. Maar nogmaals: dat heeft niets met RI te maken.
 
Dat is duidelijk Octafish, dank voor de uitgebreide uitleg!
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan