Kan Access het record weergeven welke de relationele integriteit voorkomt?

Status
Niet open voor verdere reacties.

PSVSupporter

Gebruiker
Lid geworden
13 aug 2009
Berichten
148
Ik wil 2 tabellen koppelen. De ene is inmiddels 4 miljoen records groot, de ander 'slechts' 4000. Nu wil ik deze via relationele integriteit koppelen aan elkaar (1 op veel), maar ik krijg een foutmelding dat dit niet kan.

Heeft Access de mogelijkheid om ook voorbeeldrecords te tonen die deze integriteit voorkomen?

Wat ik al gedaan heb is middels een left outer join kijken of er op bepaalde records geen records voorkomen in de kleine tabel, maar ik krijg altijd resultaat. Ook is de kleine tabel al dusdanig qua sleutel, dat er ook geen dubbele records voor komen. Maar ik ben een beetje door mijn mogelijkheden heen.
 
Zegt de foutmelding dat het niet kan, ook waarom het niet kan?
 
Het kan verschillende oorzaken hebben:
1. De gegevenstypen in de twee tabellen zijn niet hetzelfde: tabel 1 = tekst, tabel 2 = numeriek
2. De gegevenstypen in de twee tabellen zijn hetzelfde, maar de veldeigenschappen zijn niet gelijk: tabel 1 = lange integer, tabel 2 = decimaal
3. De gegevens in de gerelateerde tabel komen niet voor in de hoofdtabel: In de tweede tabel zit het KlantID 1223, in de tabel klanten is geen record met klantID 1223, want die is verwijderd.
 
Jazeker:
Er is geen unieke index gevonden voor het veld van de primaire tabel waarnaar wordt verwezen.
 
Dat riekt als optie 3.
 
Maak een query met de wizard Niet-gerelateerde records, en laat in de tabel met de gekoppelde gegevens zoeken naar niet-bestaande records in de hoofdtabel.
Dan zie je gelijk welke er ontbreken in de hoofdtabel.
 
Even de layout:

Tabel Orders:
* Filiaal
* Losdatum
* Artikelnummer
Leverdag
Regio
Ordertijd
overige gegevens

Sleutel zit op de 1e 3 velden.

Tabel Levertijden
* Regio
* Leverdag
* Filiaal
* Ordertijd
Overige gegevens
Sleutel zit op de 1e 4 velden.

De relatie hier tussen:
Regio - Regio
Filiaal - Filiaal
Leverdag - Leverdag
Ordertijd - Ordertijd

Velden hebben onderling dezelfde gegevenstype
 
Welke tabel is de hoofdtabel? Levertijden?
 
Ja, levertijden is de hoofdtabel.

Heb al eens een query gemaakt:
SELECT *
FROM Orders LEFT JOIN levertijden ON (Orders.Ordermoment] = Levertijden.Ordermoment) AND (Orders.Regio = Levertijden.Regio) AND (Orders.FILIAAL = Levertijden.Filiaal) AND (Orders.Leverdag] = Levertijden.Leverdag)
where levertijden.filiaal = null

Resultaat: Geen records ...
 
Het probleem zit hem ongetwijfeld in de combinatiesleutel:
* Regio
* Leverdag
* Filiaal
* Ordertijd
Ik vermoed, dat de afzonderlijke waarden vast allemaal in de tabel Orders zullen voorkomen, maar je hebt dus minstens één record in Orders zitten waar de sleutelcombinatie niet klopt.
Dat kun je met een Wizard Niet-gerelateerde records wel opsporen, al zul je de query die gemaakt wordt met de wizard wel zelf moeten uitbreiden, omdat je maar één veld kunt aangeven in de wizard, en je hebt er 4. Maar als je de constructie ziet, kun je dat makkelijk zelf.
 
Niet echt; deze wel:

SELECT Levertijden.Regio, Levertijden.Leverdag, Levertijden.Filiaal, Levertijden.Ordertijd, Levertijden.Overig
FROM Levertijden LEFT JOIN Orders ON (Levertijden.Ordertijd = Orders.Ordertijd) AND (Levertijden.Filiaal = Orders.Filiaal) AND (Levertijden.Leverdag = Orders.Leverdag) AND (Levertijden.Regio = Orders.Regio)
WHERE (((Orders.Regio) Is Null) AND ((Orders.Leverdag) Is Null) AND ((Orders.Filiaal) Is Null) AND ((Orders.Filiaal) Is Null));
 
Waarom een left outer vanuit Levertijden? Die geeft dan toch de records in de tabel Levertijden, waar geen records van bestaan in Orders?
Volgens mij moet het andersom zijn. Want van een levertijd kunnen 1 of meerdere orders voorkomen.
 
Je moet eigenlijk beide varianten maken, want met deze hoeveelheid gegevens weet je natuurlijk niet waar de combinatie fout kan gaan.
In dit voorbeeld kijk je naar alle records in Levertijden, en wil je zien welke records in Orders niet voorkomen. Dat zijn de boosdoeners.
Andersom kan dus ook: controleren of er in Orders combinaties zijn waar je in Leveringen geen record van hebt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan