96 Aufrufe
Gefragt in Datenbanken von
Hallo,

kann mir jemand einen VBA-Code geben wie ich doppelte Werte in einem Feld vermeide

es geht um das Feld "KundenNr"

Ich habe jetzt schon mehre ausprobiert, welche ich im Internet gefunden habe, aber bei mir funktioniert keiner, ich verzweifle schier, mache ich was falsch ?

Tabelle heißt: "Tabelle-Verpackung"

Spalte in dieser Tabelle heißt: "KundenNr"

Name vom Feld heißt: "Leser-Kunde"

Steuerelementinhalt heißt: "KundenNr"

Gruß Andreas

8 Antworten

0 Punkte
Beantwortet von xlking Experte (2k Punkte)

Hallo Andreas,

Einfachste Lösung ohne VBA: Gehe in die Entwurfsansicht der Tabelle und weise dem Feld Kundennummer einen (evtl. zusätzlichen) Primärschlüssel zu. Dann werden doppelte Werte gar nicht erst angenommen. Ein Feld vom Typ Autowert brauchst du dann nicht mehr, kannst es aber auch drin lassen. Dann sind halt beide Felder Primär.

https://www.youtube.com/watch?v=qfip5fBcfKc

Gruß Mr. K.

0 Punkte
Beantwortet von
Hallo Mr.K.

ja das wäre mir auch am liebsten gewesen und das habe ich auch probiert, nur er nimmt es nicht an, dann müßte ich den Primärschlüßel vom Autowert löschen und dann bringe ich es nicht mehr mit den Bezieheungen so hin, weil, das ist eine ältere Datenbank von mir, die ich gerade ein bißchen umschreiben möchte.

Du schreibst, ich kann es auch drin lassen, aber das läßt er nicht zu, sondern nur ein Feld indiziert ohne Duplikate :-(
0 Punkte
Beantwortet von xlking Experte (2k Punkte)
Bearbeitet von xlking
Hast du, wie im Video gezeigt, versucht beide Felder mit STRG+Click zu markieren und erst dann den Schlüssel zu setzen? Vielleicht musst du auch erst den Schlüssel bei AutoWert vorübergehend entfernen, bevor du ihn für beide Felder setzen kannst.

Prüfe in jedem Fall, ob die im Feld enthaltenen Werte bereits eindeutig sind. Sollte auch nur eine Dopplung vorkommen, wird Access beim Setzen des Schlüssels sicher meckern.

Wenn es im Video geht, sollte es eigentlich auch bei dir gehen. Es sei denn MS hat diese tolle Funktion aus den neuen Versionen rausgenommen. Kann ich mir aber nicht vorstellen, weil Access dann nicht mehr zu älteren Datenbanken abwärtskompatibel wäre.
0 Punkte
Beantwortet von
Hallo, jetzt habe ich nochmal rum probiert. Und zuerst geschaut, ob ich eine Verdoppelung habe. Und tatsächlich, drum lies er es auch nicht zu, jetzt konnte ich "ja,keine Duplikate möglich" einstellen. und wie du geschrieben hast sogar zwei Primärschüßel setzen (zuvor Beziehung löschen) und mit ein bißchen probieren die Beziehung wieder wie vorher herstellen.

Nur die Meldung, welche dann kommt, wenn man versucht eine gleiche Nummer einzugeben, ist für einen Laien, der dann das Programm mal bedienen soll, nicht ganz verständlich: "Sie können nicht zu dem angegebenen Datensatz springen"  

Danke dir mal, aber falls du doch noch einen passenden VBA-Code hast, dann wäre das auch schön :-)

Gruß Andreas
0 Punkte
Beantwortet von xlking Experte (2k Punkte)
Hallo Andreas,

ich habe leider schon seit Jahrzehnten kein Access mehr, kann also nur allgemeine Tipps geben. Aber wenn so eine Fehlermeldung kommt lässt sich diese doch bestimmt mit On Error überspringen. In etwa so: (ungetestet)

Sub Feld_Change()

On Error Goto Fehler:

'An dieser Stelle kommt dann dein Code zum Einfügen des Textboxwertes in das Tabellenfeld!

Fehler:
MsgBox "Dieser Eintrag existiert schon!"
Resume Next

Gruß Mr. K.
0 Punkte
Beantwortet von
Hallo,

leider weiß ich nicht, wenn die Systemmeldung von Access kommt: "Sie können nicht zu dem angegebenen Datensatz springen" wo dieser VBA-Code liegt und wie ich da dann hinkomme um deinen o.g. Vorschlag einzubauen.

Weiß niemand eine VBA-Code mit dem ganz am Anfang bezeichneten Feldern, wo ich zum z.B [beim Verlassen]  des Feldes, prüfen kann ob doppelte Werte vorliegen ?
0 Punkte
Beantwortet von mixmax Experte (2.3k Punkte)

Hallo,

also ich habe wohl die Anmerkung du hast sicher nur einen Primärschlüssel, der kann mehrere Spalten enthalten aber dann kann es kombinationen von doppelungen geben. Was du vermutlich machst ist ein Primärschlüssel und ein Eindeutiger Index (nachdem alle dublikate entfernt sind).

zweispaltiger PK (erlaubt):

Spalte1 Spalte2
1 A
2 B
3 A
4 B

Wenn der PK aus 2 Spalten besteht darf jede Kombination vorkommen also wenn man die Spalten einzeln betrachtet kommen Werte mehrfach vor und das ist erlaubt.

PK + uniqueIX

Spalte1 Spalte2
1 A
2 B
3 C
4 D

also weder Spalte 1 noch Spalte 2 dürfen dann doppelte Werte enthalten.

Wenn Spalte 2 ein unique index ist, der aber NULL-Werte zuläßt, kann es wohl mehrere Zeilen mit null geben (null ist kein Wert und wenn man NULL zuläßt kann es wohl mehrere Zeilen geben die alle keinen Wert haben)

VBA zu nutzen um doppelte Werte zu finden ist seeehr langsam.

am besten kannst du 
select Spalte2, count(*) from tabelle group by Spalte2 having count(*)>1
wählen um alle Werte die mehrfach vorkommen in einer Spalte zu erhalten.

Grundsätzlich würde ich überlegen von Access als Datenbank abstand zu nehmen. Die Datenbank ist Dateibasiert und sehr sperrig. Die Formular-erstellung ist extrem Fehleranfällig und VBA super alt und langsam als Sprache.
Ich habe ganz gute Erfahrungen mit Visual Studio Express gemacht und eine echte Anwendung in C# gebaut und microsoft localdb kann einen lokalen microsoft SQL-Server verwenden. Man könnte auch z.B. was modernes wie python benutzen und andere Datenbanken je nachdem obs multiusertauglich sein soll z.B. mit XAMP das als WebDienst laufen lassen (also im lokalen Netz ohne vom internet erreichbar zu sein)
0 Punkte
Beantwortet von

Danke für die Antwort, aber ich bin relativ Anfänger, da komme ich nicht ganz mit, sorry.

Ich denke, ich werde die Indizierung (ohne Duplikate) auswählen und mit der Meldung: "Sie können nicht zu dem angegebenen Datensatz springen" leben.

Aber noch mal kurz was ich meine: Ich will nur das Feld "Buch_Nr" überprüfen, ob Wert schon vergeben ist, nachdem ich einen Wert eingegeben habe.

Und da habe ich im Internet z.B. dieses gefunden und "Vor Aktualisierung" des Feldes hinterlegt, aber es kommt immer der Debugger :-( und bleibt bei .Undo hängen

Private Sub Form_BeforeUpdate(Cancel As Integer)

    ' Prüft, ob der Wert im Feld 'MeinFeld' bereits in 'Tabelle1' existiert

    If DCount("*", "Tabelle1", "[MeinFeld] = '" & Me.txtMeinFeld & "'") > 0 Then

        MsgBox "Dieser Wert existiert bereits!", vbCritical, "Doppelter Eintrag"

        Cancel = True ' Bricht die Speicherung ab

        Me.txtMeinFeld.Undo ' Macht die Eingabe rückgängig

    End If

End Sub

Gruß Andreas

...