Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Datensatz mit höchster ID löschen

Begonnen von joschi50, Mai 15, 2023, 11:13:00

⏪ vorheriges - nächstes ⏩

joschi50

In einer Kundendatenbank überprüfe ich während der Eingabe ob der Kundenname schon vorhanden ist.
Falls ja, öffnet sich ein Listenfeld mit möglichen "Doppelgängern". Ich kann nun einen der vorhandenen Einträge anklicken und mir wird der entsprechende Kunde in der Kundendatenbank geöffnet. Zu diesem Zeitpunkt wurde aber bereits ein "neuer" Kunde angelegt. Diesen letzten Datensatz, der die höchste ID in der Tabelle tbkunden hat, soll per VBA automatisch gelöscht werden.
Wie kann ich das bewerkstelligen ?
Auch Wolkenkratzer haben mal als Keller angefangen.

MzKlMu

Hallo,
verhindere besser das Anlegen eines neuen Kunden, statt nachträglich zu löschen.
Gruß Klaus

SeamusQDraide

Hallo Joschi,

falls Du da noch nicht weitergekommen bist, hier mein Herangehen an eine Duplikatcheck. Das Skript überpüft, ob ein Anbieter bereits angelegt ist und erzwingt zum einen vollständige Angaben, zum anderen lässt es kein Speichern zu, wenn der Anbieter bereits existiert. Der Nutzer muss dann entweder die Angaben korrigieren, oder das Formular über den "Undo"-Button verlassen, so dass kein neuer Datensatz angelegt wird.

Diese Funktion überprüft, ob in den übergebenen Feldern auch Werte eingetragen sind. Wenn Felder leer sind, ist der Rückgabewert > 0.

Function EmptyFields(ParamArray FieldArr() As Variant) 'Returns >0 if any field is empty

TestSum = 0

For i = 0 To UBound(FieldArr)

IF IsNull(FieldArr(i) Then
Testsum = TestSum + 1
End If

Next

EmptyFields = TestSum

EndFunction

Diese Funktion ist der Duplikatcheck, basierend auf Dem Firmennamen und der Kontaktperson. Sie gibt 1 zurück, wenn der Anbieter (die Kombi aus Firma (txtCompany) und Ansprechpartner (txtConPerson) schon exisiert; 0, wenn das nicht der Fall ist.

Function Duplicate Supplier

set db = CurrentDb

Set rsSupp = dbOpenRecordset("Select * From tblSupplier WHERE txtCompany = '" & Me.txtCompany & "' AND txtConPerson = '" & Me.txtConPerson & "'", dbOpenSnapshot)
'die obige Zeile sucht in der Liste mit den Daten zu deinen Anbietern nach Datensätzen, die mit den neu eingegebenen Daten txtCompany und txtConPerson übereinstimmen. Es sollten keine Daten gefunden werden, sonst ist es ein Duplikat

Do While Not rsSupp.EOF
rsSupp.MoveNext
Loop
'Hier laufen wir durch den Datensatz zum letzten Eintrag. Das geht wahrscheinlich eleganter mit MoveLast oder so. Ich verstehe auch nicht, warum ich überhaupt zum letzten Datensatz muss, damit im Folgenden RecordCount richtig funktioniert... Aber es ist funkionierender Code.

If rsSupp.RecordCound <> 0 Then 'wenn das das Fall ist, existiert der Datensatz bereits!
DuplicateSupplier = 1
Else
DuplicateSupplier = 0
End If

rsSupp.Close

End Function

Diese beiden Funktionen gehören in den Code der Eingabmaske. Meine Maske enthält die ungebundenen Textfelder txtCompany, txtConPerson, txtCountry, txtCity, txtPoCode, txtStreet, txtNum (Das ist die Hausmummer), txtPhone, txtMail: Eben die Kontaktinformationen.
Der Nutzer kann hier seinen (hoffentlich neuen) Anbieter eintragen. Sodann klicke er auf den Button "Save and Close". Dieser ist mit dem folgenden Code ("beim Klicken") versehen:

CheckEntry = EmptyFields(Me.txtCompany, Me.txtConPerson, Me.txtCountry, Me.txtCity, Me.txtPoCode, Me.txtStreet, Me.txtNum, Me.txtPhone, Me.txtMail)

If CheckEntry > 0 Then
MsgBox ("Please complete entry!")
ExitSub
End If

Duplicate = DuplicateSupplier
If Duplicate = 1 Then
MsgBox ("This supplier already exists!")
Exit Sub

Else
DoCmd.Close

End If

End Sub

Der Nutzer muss hier also solange Daten eingaben, bis er einen neune Supplier angelegt hat. Wenn es ihm dämmert, dass der gewünschte Anbieter schon angelegt ist, kommt er mit dem Button "Undo&Close" aus der Maske heraus:

Me.Undo
DoCmd.Close


Ich hoffe, das war jetzt irgendwie hilfreich.

Beaker s.a.

Man sich das Leben auch schwer machen.
ZitatZu diesem Zeitpunkt wurde aber bereits ein "neuer" Kunde angelegt.
Welcher Zeitpunkt bzw. welches Event ist das?
So eine Prüfung macht man üblicherweise am besten "BeforeUpdate". Und das möglichst
früh, also schon beim Textfeld. Es erst beim Form_BeforeUpdate zu machen halte ich
für anwenderunfreundlich, da er da ja u.U. schon weitere Eingaben gemacht hat, die
dann bei einem Abbruch (Cancel = True) auch verloren gingen.
Kurzform:
Private Sub Textfeld_BeforeUpdate(Cancel As Integer)
    If DCount("NamensfeldInTabelle", "Tabellenname", "NamensfeldInTabelle = " & Me.Textfeld) > 0 Then
        MsgBox "Name bereits vorhanden!"
        Textfeld.Undo
        Cancel = True
    End if
End Sub
Oder du nimmst gleich ein Kombi für die Namen. Da hast du deine Liste sofort, und
für neue bemühst du das Ereignis "NotInList".

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)