Hoe voorkom ik overschrijving van bestaande gegevens in een tabel?

Status
Niet open voor verdere reacties.

wimhamer

Gebruiker
Lid geworden
20 jun 2011
Berichten
6
Ik heb 2 tabellen. Een controletabel en een doeltabel. In de controletabel vink ik de gegevens aan met een ja/nee veld. Deze gegevens mogen dan naar de doeltabel. Maar hoe voorkom ik dat ze weer overschreven worden in de doeltabel als hij al eerder gebruikts is? Bijvoorbeeld ik heb een veld met Naam, Znummer en accoord. In de doel tabel staan deze velden ook. Het znummer is uniek en kan nooit dubbel voorkomen. Als ik dmv de gegevens toevoeg aan de doeltabel krijg ik toch elke keer dubbele znummers.
Hij mag dus alleen toevoegen als het znummer uniek is en nog niet in de doeltabel staat.
Het lukt mij niet om te voorkomen dat access toch de znummers toevoegd.
 
Je moet een criterium maken op ZNummer. Iets als: Not in(SELECT Znummer FROM [Tabel])
 
Inderdaad controleren of het Znummer al bestaat in de doeltabel.

Of een unieke index op Znummer zetten in de doeltabel. Je krijgt dan wel een foutmelding
wanneer er een, al bestaand, nummer wordt toegevoegd.
 
Ik heb in het criterium Not in(SELECT Znummer FROM [Tabel]) gebruikt maar access overschrijft toch nog. Misschien een idee om met j/n te gaan werken? Dan maak ik toch een veld aan waar ik kan aanvinken welke overgezet mag worden. Als dit vinkje in de doeltabel ook staat mag hij niet overschrijven?
 
Geef de volledige SQL code eens; normaal gesproken moet het hiermee namelijk probleemloos werken.
 
Dit is de SQL code:

INSERT INTO Controletabel ( registratie, [Z-nummer], [nieuw Z-nummer], CATEGORIE, FORMAAT, [wetenschappelijke naam], etiketnaam, STATUS, vindplaats, eigenaar, opmerking, logies, [datum juist], naamtemp )
SELECT [Z5 Alles kopie].registratie, [Z5 Alles kopie].[Z-nummer], [Z5 Alles kopie].[nieuw Z nummer], [Z5 Alles kopie].CATEGORIE, [Z5 Alles kopie].FORMAAT, [Z5 Alles kopie].[WETENSCHAPPELIJKE NAAM], [Z5 Alles kopie].etiketnaam, [Z5 Alles kopie].STATUS, [Z5 Alles kopie].vindplaats, [Z5 Alles kopie].eigenaar, [Z5 Alles kopie].opmerking, [Z5 Alles kopie].logies, [Z5 Alles kopie].[datum juist], [Z5 Alles kopie].naamtemp
FROM [Z5 Alles kopie] INNER JOIN Controletabel ON [Z5 Alles kopie].[nieuw Z nummer] = Controletabel.[nieuw Z-nummer]
WHERE ((([Z5 Alles kopie].registratie) Like "*Rmdo*" Or ([Z5 Alles kopie].registratie) Like "*Rpbo*") AND (([Z5 Alles kopie].[nieuw Z nummer]) Not In (SELECT "nieuw Z-nummer" FROM [Controletabel])));
 
Er zit een foutje in je Not In regel; je verwijst niet naar een veldnaam:

Code:
Not In (SELECT [B][COLOR="red"][nieuw Z-nummer][/COLOR][/B] FROM [Controletabel])
 
Ik heb de Not In regel aangepast maar ik krijg nu helemaal niets meer te zien. Er word niets in de controletabel ingevuld terwijl er wel nieuwe gegevens zijn die niet overeenkomen met de controletabel.
Die zou access toch moeten toevoegen in de controletabel.
 
Laatst bewerkt:
Je kunt nog een andere techniek toepassen: voeg de tabel Controletabel toe aan de query, en maak een Outer Join van [Z5 Alles kopie] naar [Controletabel]. Dat is de joineigenschap: <Alle records van [Z5 Alles kopie] opnemen en alleen de records uit Controletabel waarvoor de gekoppelde velden identiek zijn>. In SQL ziet dat er zo uit:

Code:
FROM [Z5 Alles kopie] LEFT JOIN Controletabel ON [Z5 Alles kopie].lngCompanyID = Controletabel.lngCompanyID
WHERE (((Controletabel.[nieuw Z-nummer]) Is Null));

Als je dit doet, kan het criterium Not In(....) weg, want dat is dan dubbelop.
 
Het werkt! Er zat een typefout in de SQL code.
Iedereen bedankt voor het meedenken!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan