ich versuche aus einer Tabelle „FW“ in access via
VBA-Schleife die Datensätze herauszulöschen, die im Feld
[Anrede]
„Herrn und Frau“ haben.
Das hab ich bisher:
Public Sub Gemeinschaftskunden_löschen()
Dim db As DAO.Database, rs As DAO.Recordset
Set db = DBEngine.Workspaces(0).Databases(0)
Dim recLesen as DAO.Recordset , recSchreiben as DAO.Recordset , recDepotnummer As DAO.Recordset
Dim intPos As Long
Dim Depotnummer As Double 'Wieso Double??
Set recLesen = db.OpenRecordset(„Select * From [FW] Order By
Personennummer“, dbOpenDynaset )
Do Until recLesen.EOF
'recLesen.Edit
Debug.Print recLesen![Personennummer]
Debug.Print recLesen![Anrede]
Debug.Print recLesen![Nachname]
If recLesen![Anrede] = „Herrn und Frau“ Then recLesen.Delete
'recLesen.Update 'unnötig
recLesen.MoveNext
Loop
End Sub
aber das klappt nicht so richtig kann jemand helfen ?
Warum nicht gleich so:
Public Sub Gemeinschaftskunden_löschen()
Dim db As DAO.Database, rs As DAO.Recordset
Set db = DBEngine.Workspaces(0).Databases(0)
Set rs = db.OpenRecordset("Select * From [FW] where Anrede=‚Herrn und Frau‘ ", dbOpenDynaset)
Do Until rs.Eof
rs.Delete
rs.MoveNext
Loop
rs.Close
set rs=Nothing
set db=nothing
End Sub
oder so:
Public Sub Gemeinschaftskunden_löschen()
Currentdb.Execute "Delete From [FW] where Anrede=‚Herrn und Frau‘ "
End Sub
die Verwendung der Feldliste in der Delete-Anweisung ist überflüssig… Auch wenn kein Fehler von der Jet-Engine produziert wird, wird immer der gesamte Datensatz und damit immer alle Felder darin gelöscht.
Einzig die Where-Condition ist sinnvoll.
Weiterhin sollte auf Docmd.RunSql verzichtet werden (allenfalls ist das zum Testen brauchbar) und das SQL-Statement direkt auf die Jet-Engine losgelassen werden:
Dim DB as Dao.Database, lngID as Long
set Db=currentdb
lngID =1 ' z.B..
db.Execute "Delete from tblTabelle1 where Id= " & lngID,dbFailOnError
' oder bezgl. Problem
'db.Execute "Delete from [FW] where Anrede='Herr und Frau'" ,dbFailOnError
Msgbox "Es wurden " & db.Recordsaffected & " gelöscht"
set db=nothing