Hallo,
ich habe ein Formular in tabellarischer Ansicht.
Im Kopfbereich sind Kombinationsfelder über jeder Spalte, die alle Einträge (mit distinct) der jeweiligen Spalte enthalten. So kann man anhand der Auswahl genau die Datensätze heraussuchen lassen, die den gewählten Eintrag in dieser Spalte besitzen. Quasi als Filter.
Im Fußbereich hab ich u.a. eine Schaltfläche, die zum Löschen des Datensatzes dient, der gerade den Fokus hat.
Das Löschen funktioniert nur, wenn in dem Formular ALLE Datensätze der referenzierten Tabelle angezeigt werden.
Ansonsten höre ich nur ein „Ping“ durch die Lautsprecher, aber sehe nirgendswo eine Fehlermeldung oder ähnliches.
Den Löschvorgang mache ich mit DoCmd.RunCommand(acCmdDelete).
Wie erreiche ich es, dass der aktive Datensatz auch bei einer gefilterten Ansicht gelöscht wird?
Den Löschvorgang mache ich mit DoCmd.RunCommand(acCmdDelete).
Wie erreiche ich es, dass der aktive Datensatz auch bei einer
gefilterten Ansicht gelöscht wird?
nutze das dir gegebene …
Formular im Editierungsmodus öffnen
Symbolleiste: Toolbox
Schaltfläche einfügen
im dann angezeigten Assistenten die Löschfunktion wählen
den VBA Code des Taste ansehen (um daraus zu lernen)
im dann angezeigten Assistenten die Löschfunktion wählen
den VBA Code des Taste ansehen (um daraus zu lernen)
Das habe ich auch schon gemacht.
Der erzeugte Code verwendet hier die DoMenuItem-Methode, die veraltet ist und von der RunCommand-Methode abgelöst wurde.
Aber auch hier lässt sich der Datensatz nur löschen, wenn ALLE Datensätze im Formular angezeigt werden.
Hi Andi,
Access arbeitet intern mit Recordsets. Das kann eine Tabelle oder ein Abfrageergebnis sein. Ob Du das Recordset bearbeiten kannst hängt davon ab, mit welcher Einstellung (LockType-Parameter) es geladen wurde. Der Standardwert ist „adLockReadOnly“, also schreibgeschützt.
Ich könnte mir vorstellen, dass in Deinem Formular anfangs die komplette Tabelle geladen wird und LockType = adLockOptimistic bzw adLockPessimistic ist (beide erlauben schreibenden Zugriff).
Sobald Du einen der eingebauten Filter anwendest, wird ein entsprechendes Recordset erzeugt und angezeigt, das dann aber schreibgeschützt geöffnet wird.
Im Code könnte das so aussehen:
Dim rs As New ADODB.Recordset
rs.Open Quelle, ActiveConnection, CursorType, LockType, Options
Vieleicht musst Du nur sicherstellen, dass die angezeigten Recordsets mit dem richtigen LockType-Parameter (s.o.) geöffnet werden.
Ich könnte mir vorstellen, dass in Deinem Formular anfangs die
komplette Tabelle geladen wird und LockType = adLockOptimistic
bzw adLockPessimistic ist (beide erlauben schreibenden
Zugriff).
Sobald Du einen der eingebauten Filter anwendest, wird ein
entsprechendes Recordset erzeugt und angezeigt, das dann aber
schreibgeschützt geöffnet wird.
Den „Filter“ erstelle ich mir quasi selber.
Die Tabelle Mitarbeiter, auf der das Formular basiert, enthält u.a. die Spalte Nachname. Alle Nachnamen sind per
SELECT DISTINCT Nachname FROM Mitarbeiter;
in das Kombinationsfeld eingetragen.
Für das Kombinationsfeld habe ich diesen Code geschrieben:
Private Sub cbNachname\_AfterUpdate()
Me.RecordSource = "select distinct \* from Mitarbeiterdaten where Nachname='" & cbNachname & "';"
End Sub
Im Code könnte das so aussehen:
Dim rs As New ADODB.Recordset
rs.Open Quelle, ActiveConnection, CursorType, LockType,
Options
Vieleicht musst Du nur sicherstellen, dass die angezeigten
Recordsets mit dem richtigen LockType-Parameter (s.o.)
geöffnet werden.
Kannst du mir dabei helfen, wie ich den Code auf mein Formular anpasse? Momentan bin ich in VBA noch nicht so bewandert.
Private Sub Loeschen\_Click()
If not Isnull(Me!PersonalNr) then
Currentdb.Execute "DELETE FROM Mitarbeiter WHERE Personalnr = " & Me!PersonalNr, dbFailOnError
Me.Requery
end if
end sub