Hallo, ich habe derzeit ein Problem, dass mir die letzten Haare noch ausfallen lässt:
Ich habe zwei Formulare. Jedes Formular ist mit einer eigenen Tabelle verbunden.
In beiden Formularen gibt es ejnen Button "Datensatz löschen". Hier der Code der in beiden Formularen für die Schaltfläche steht (beispielhaft für ein Formular dargestellt):
Private Sub Befehl69_Click()
On Error GoTo Err_Befehl69_Click
'Felder Suchen ausblenden
Me.Weitersuchen.Visible = False
Me.Kombinationsfeld35.Visible = False
'Eingabe erlauben
Me.AllowEdits = True
Me.AllowAdditions = True
Me.AllowDeletions = True
'Datensatz löschen
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70
'DoCmd.GoToRecord , , acNewRec
'Eingabe erlauben
Me.AllowEdits = False
Me.AllowAdditions = False
Me.AllowDeletions = False
Exit_Befehl69_Click:
Exit Sub
Err_Befehl69_Click:
MsgBox Err.Description
Resume Exit_Befehl69_Click
End Sub
Bis jetzt ging das einwandfrei. Nun passiert plötzlich in einem Formular nach Betätigen der Schaltfläche folgendes:
Ohne die Meldung "Sie versuchen 1 Datensatz zu löschen...." wird der Datensatz gelöscht und gleichzeitig ein neuer angelegt und der Datenzeiger geht auf diesen neuen Datensatz.
Im zweiten Formular geht alles einwandfrei. Was kann ich hier machen bzw. ist das Problem schon einmal aufgetreten? Ich selbst bin etwas befremdet, da dies die ganze Zeit einwandfrei funktioniert hat. Im Voraus vielen Dank!
Grüße
Herbert
Habe das Ganze auch schon probiert indem ich eine neue Schaltfläche angelegt habe nur mit dem Code der automatisch erzeugt wird - Ergebnis wie vorher!
Hallo Herbert,
VBA macht das was du sagst.
'DoCmd.GoToRecord , , acNewRec
Ist diese Zeile in beiden Formularen auskommentiert?
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
Echt ätzend, dass MS immer noch diese Codezeilen aus der Steinzeit generiert >:(.
Ich würde DoCmd.RunCommand acCmdDeleteRecord
verwenden bzw. per SQL löschen
Dim sSQL As String
sSQL = "DELETE FROM DeineTabelle WHERE ID = " & Me.FeldMitID
CurrentDb.Execute sSQL, dbFailOnError
Me.Requery
(Namen anpassen)
gruss ekkehard
Man kann auch im Recordset bzw. besser im RecordsetClone des Formulars einen Datensatz löschen und bestimmen, welcher Datensatz anschließend dargestellt werden soll. Dim bm() As Byte
If Me.NewRecord Then Exit Sub 'hier ist nichts zu löschen
'ggf. noch MsgBox-Gedöns wie: 'Wollen Sie den Datensatz wirklich löschen?'
'einpflegen und eine Fehlerbehandlung hinzufügen.
'aktuellen Datensatz löschen und nachfolgenden Datensatz anzeigen
With Me.RecordsetClone
'synchronisieren
.Bookmark = Me.Bookmark
'zum nächsten Datensatz marschieren
.MoveNext
If Not .EOF Then
'Datensatz merken
bm = .Bookmark
'zurück zum zu löschenden Datensatz
.Bookmark = Me.Bookmark
'Löschen
.Delete
'synchronisieren
Me.Bookmark = bm
Else
'wir sind schon beim letzten Datensatz
.MovePrevious
'Löschen
.Delete
'zum letzten Datensatz marschieren
.MoveLast
'wenn es diesen gibt, synchronisieren
If Not .EOF Then Me.Bookmark = .Bookmark
End If
End WithEinstellungen wie AllowEditions, etc. müssen nicht geändert werden. Die üblichen Events beim Löschen von Datensätzen werden auch nicht ausgelöst.
Zuerst mal vielen Dank,
habe leider alles ausprobiert - ohne Erfolg! Was mich am meisten wundert ist, dass die Meldung "Sie versuchen 1 Datensatz zu löschen..." nicht mehr erscheint und einfach ohne Zustimmung gelöscht wird. Zu Ekkehard: Ich hatte die Zeile mit dem NewRecord zunächst in beiden Formularen und wollte nach dem Löschen einen neuen Datensatz anlegen. Habe dies aber wieder entfernt. Was halt so merkwürdig ist, ist dass das Löschen in dem anderen Formular mit exakt dem gleichen Code funktioniert!
Gruß
Herbert
Hallo Lachtaube, was jetzt interessant bei deinem Code ist: Hier bekomme ich eine Laufzeitfehlermeldung:
Laufzeitfehler 3021 - Kein aktueller Datensatz. Und dies obwohl ich diesen Datensatz abgespeichert und zur Sicherheit noch mal einen neuen Datensatz dazu angelegt habe.
Außerdem reagiert die Schaltfläche erst beim zweiten Klicken!
???...
Gruß Herbert
Hallo zusammen,
ich habe den Fehler gefunden. Ich hatte bei diesem Formular im Ereignis "Beim Anzeigen"
ein Kontrollkästchen: Me.Rechnung = False gesetzt. Ich hätte nie gedacht, dass diese Angabe eine derartige Fehlfunktion auslösen könnte.
Euch allen vielen Dank für die Hilfe!
Grüße
Herbert
Hallo Herbert,
Tja, Form_Current (Beim Anzeigen) wird eben bei JEDEM DS-Wechsel
ausgelöst. Auch nach dem Löschen wird ein DS angezeigt (sofern es
noch welche gibt). Und in Lachtaubes Code tritt dieses Ereignis durch
das Bookmark-"Gehopse" sogar mehrfach ein.
Durch das Setzen eines Wertes (Me.Rechnung = False) wird dein
Formular Dirty und der DS kann nicht gelöscht werden.
Vorsichtshalber fügst du deshalb vielleicht an den Anfang der Prozedur
diese Zeile ein
If Me.Dirty Then Me.Dirty = False
gruss ekkehard
Hallo Ekkehard,
super, vielen Dank!
Gruß
Herbert