AW: Löschen von Access Datenbank
02.12.2019 10:09:47
Access
Hallo Chris,
Genau - ich will alle Datensätze aus einer spezifischen ACCDB löschen.
leider bin ich in Access und SQL ein völliger NOOB und darum darauf angewiesen, dass mir jemand die Lösung vorkaut :-)
Hier mal das Makro zum löschen einzelner Artikel:
Option Explicit
Sub Artikel_löschen()
' Die in der Tabelle "Löschen"
' aufgeführten Artikel werden in der
' Access-Tabelle "Artikel" gelöscht
Dim anz As Long
Dim artnr As Long
Dim datei As String
Dim con As ADODB.Connection
Dim pfad As String
Dim rs As ADODB.Recordset
Const titel As String = "Artikel löschen (ADO)"
Dim ws As Worksheet
Dim ze As Integer
pfad = ThisWorkbook.Path
datei = pfad & "\Bestell.accdb"
If Dir(datei) = "" Then
MsgBox "Datei '" & datei & "' existiert nicht!"
Exit Sub
End If
Set con = New ADODB.Connection
con.Open ConnectionString:= _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & datei & ";" & _
"Mode=Share Exclusive"
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open Source:="Artikel", _
ActiveConnection:=con, _
CursorType:=adOpenStatic, _
LockType:=adLockPessimistic, _
Options:=adCmdTableDirect
Set ws = ThisWorkbook. _
Worksheets("Löschen")
rs.Index = "Primärschlüssel"
' (1) Prüfen, ob die zu löschenden
' Artikelnummern existieren
ze = 2
Do Until IsEmpty(ws.Cells(ze, 1))
artnr = ws.Cells(ze, 1)
rs.Seek KeyValues:=artnr, _
SeekOption:=adSeekFirstEQ
If rs.EOF Then
MsgBox Prompt:="Die Artikel-Nr. " & artnr & _
" ist in der Datenbank nicht vorhanden." _
& vbNewLine & _
"Es wird keine Löschung durchgeführt.", _
Title:=titel
GoTo Ende
End If
ze = ze + 1
Loop
' (2) Artikel löschen
ze = 2
anz = 0
Do Until IsEmpty(ws.Cells(ze, 1))
If ws.Cells(ze, 4) = "ja" Then
artnr = ws.Cells(ze, 1)
rs.Seek KeyValues:=artnr, _
SeekOption:=adSeekFirstEQ
If Not rs.EOF Then
rs.Delete
anz = anz + 1
End If
End If
ze = ze + 1
Loop
' (3) Fertigmeldung
MsgBox Prompt:=anz & " Artikel in der Datenbank " & _
"gelöscht.", _
Title:=titel
Ende:
rs.Close
Set rs = Nothing
con.Close
Set con = Nothing
End Sub
um damit 1000 Datensätze zu löschen, müsste ich also 2000 Zellen per Schleife durchlaufen und 1000mal den "rs.delet" Befehl an Access schicken. Wie gesagt, das würde zwar funktionieren aber es kommt mir nicht funktional vor.
Ich habe von Dieter auch ein Makro erhalten, dass statt des "rs.add" Befehls ein SQL Kommando an Access schickt:
Option Explicit
Sub Artikel_löschen_SQL()
' Die in der Tabelle "Löschen"
' aufgeführten Artikel werden in der
' Access-Tabelle "Artikel" gelöscht
Dim anz As Long
Dim artnr As Long
Dim betrSätze As Long
Dim cmd As ADODB.Command
Dim con As ADODB.Connection
Dim datei As String
Dim pfad As String
Dim rs As ADODB.Recordset
Dim sql As String
Const titel As String = "Artikel löschen (ADO/SQL)"
Dim ws As Worksheet
Dim ze As Integer
pfad = ThisWorkbook.Path
datei = pfad & "\Bestell.accdb"
If Dir(datei) = "" Then
MsgBox "Datei '" & datei & "' existiert nicht!"
Exit Sub
End If
Set con = New ADODB.Connection
con.Open ConnectionString:= _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & datei & ";" & _
"Mode=Share Exclusive"
Set cmd = New ADODB.Command
cmd.ActiveConnection = con
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open Source:="Artikel", _
ActiveConnection:=con, _
CursorType:=adOpenStatic, _
LockType:=adLockPessimistic, _
Options:=adCmdTableDirect
Set ws = ThisWorkbook. _
Worksheets("Löschen")
rs.Index = "Primärschlüssel"
' (1) Prüfen, ob die zu löschenden
' Artikelnummern existieren
ze = 2
Do Until IsEmpty(ws.Cells(ze, 1))
artnr = ws.Cells(ze, 1)
rs.Seek KeyValues:=artnr, _
SeekOption:=adSeekFirstEQ
If rs.EOF Then
MsgBox Prompt:="Die Artikel-Nr. " & artnr & _
" ist in der Datenbank nicht vorhanden." _
& vbNewLine & _
"Es wird keine Löschung durchgeführt.", _
Title:=titel
GoTo Ende
End If
ze = ze + 1
Loop
rs.Close
Set rs = Nothing
' (2) Artikel löschen
ze = 2
anz = 0
Do Until IsEmpty(ws.Cells(ze, 1))
If ws.Cells(ze, 4) = "ja" Then
artnr = ws.Cells(ze, 1)
sql = "DELETE FROM Artikel " & _
"WHERE [Artikel-Nr] =" & CStr(artnr) & ";"
cmd.CommandText = sql
cmd.Execute RecordsAffected:=betrSätze, _
Options:=adCmdText + adExecuteNoRecords
If betrSätze 1 Then
MsgBox "Fehler beim Löschen von Satz " & artnr & _
vbNewLine & betrSätze
GoTo Ende
End If
anz = anz + 1
End If
ze = ze + 1
Loop
' (3) Fertigmeldung
MsgBox Prompt:=anz & " Artikel in der Datenbank " & _
"gelöscht.", _
Title:=titel
Ende:
Set cmd = Nothing
con.Close
Set con = Nothing
End Sub
Den SQL-Befehl müsste man doch relativ einfach umstricken können, dass er die gesamte Datenbank löscht?
LG,
Klaus M.