Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Duplikatsuche im Eingabeformular

Begonnen von ricco, August 16, 2020, 21:07:00

⏪ vorheriges - nächstes ⏩

ricco

Hallo zusammen
Bin neu im Forum und habe mit VBA leider nicht viel am Hut. Habe ein Formular für die Eingabe von Rezept-Zutaten in dem ich doppelte Einträge verhindern möchte. Das Feld "ZutatenBezeichnung" habe ich indiziert (ohne Duplikate) und im Ereignis "Bei Fehler" des Formulars "Zutatenerfassung" folgenden Code eingegeben (diesen habe ich in einem Forum gefunden):

Private Sub Form_Error(DataErr As Integer, Response As Integer) 'Überprüfung auf doppelte Datensätze

Me!ZutatenBezeichnung.SetFocus
If DataErr = 3022 Then
Response = acDataErrContinue
MsgBox Me!ZutatenBezeichnung & "! Diese Zutat gibt es bereits.", vbOKOnly, "Duplikat!"
Me!ZutatenBezeichnung.SetFocus
ZutatenBezeichnung = ""
Me!ZutatenBezeichnung.SetFocus
End If
End Sub

Das ganze fünktioniert aber nur wenn ich mit der Maus in einen anderen Datensatz klicke, dann wird die Prüfung ausgelöst.

Kann mir jemand helfen, wie die Kontrolle mit einem "Return" oder einer Schaltfläche auslöse?

Zusatzinfo:

Neue Datensätze erstelle ich mittels:

Private Sub Befehl11_Click() 'Neue Zutat erfassen

    Me.AllowAdditions = True
    DoCmd.RunCommand acCmdRecordsGoToNew
    ZutatenNeu = "Neu"
    DoCmd.RunCommand acCmdSaveRecord
    Me.AllowAdditions = False
   
End Sub

Für Hilfe bin ich sehr dankbar
Mit freundlichen Grüssen
Ricco

DF6GL

Hallo,

es kann das Ereignis "Vor Aktualisierung" des Textfeldes genutzt werden, um  auf einen schon vorhandenen DS zu prüfen. Alternativ ist das Form-Ereignis "Vor Aktualisierung" geeignet.


Sub Zutatenbezeichnung_BeforeUpdate(Cancel as Integer)

If Dcount("*", "tbl_MeineTabelle","Zutatenbezeichung = '" & Me!Zutatenbezeichnung & "'") > 0 Then
  Msgbox "So nicht!"
Cancel =True
End If

End Sub

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

ricco

Hallo Franz

Herzlichen Dank für die schnelle Unterstützung. Leider konnte ich das nicht zum funktionieren bringen. Habe den Code im Eingabeformular eingegeben:

Private Sub Form_BeforeUpdate(Cancel As Integer)

If DCount("*", "tblZutaten", "ZutatenBezeichung = '" & Me!ZutatenBezeichnung & "'") > 0 Then
  MsgBox "so nicht"
Cancel = True
End If

End Sub

Habe verschiedene Varianten, unter anderem den Tabellennamen durch den Formularnamen ersetzt. Funktioniert mit meiner Unkenntnis auf keine Weise. Bereits beim Erstellen von einem neuen Datensatz erscheint die Meldung "laufzeitfehler 2471". Was mache ich falsch.

Gruss und herzlichen Dank
Ricco

Beaker s.a.

Hallo Ricco,
Klartextvergleiche machen mich in so einem Zusammenhang immer
stutzig. Haben deine Zutaten keine ID (Primärschlüssel)? Und
steht dieser nicht als Fremdschlüssel (FK) in einer n:m-Tabelle
zusammen mit einem FK auf das Rezept?
Wenn du das so hast (solltest du), dann genügt normalerweise ein
eindeutiger Mehrfelderindex auf diese beiden FK. Dann bekommst
du autom. eine Fehlermeldung von Access (bzw. der JET-Engine).
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

DF6GL

Hallo,

vermutlich wirfst Du Feldnamen durcheinander:

Wie heißt das Feld denn in der Tabelle?
ZutatenBezeichung
oder
ZutatenNeu  ?


Zudem ist

ZutatenNeu = "Neu"

so zu schreiben:

Me!ZutatenNeu = "Neu"

falls es sich bei "ZutatenNeu" um ein Textfeld mit diesem Namen im Formular handelt, das an ein Tabellenfeld (Name?) gebunden ist.


Der Hinweis von Ekkehard ist insgesamt zielführender.



Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

ricco

Hallo zusammen

Ich stelle fest, dass ich mich noch sehr viel tiefer mit der Materie befassen muss, verstehe das mitgeteilte noch nicht. Werde versuchen aus eurer Hilfe zu lernen und werde mich sicher später wieder mit Anliegen melden.

Herzlichen Dank!
Mit freundlichen Grüssen
Ricco