Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1724to1728
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Löschen von Access Datenbank

Löschen von Access Datenbank
02.12.2019 07:35:08
Access
Hallo Forum,
ich habe von Dieter bereits absolut geniale Hilfe im Bezug auf Fernsteuerung einer Access-Datenbank aus Excel bekommen:
https://www.herber.de/forum/cgi-bin/callthread.pl?index=1724675
Eine Frage hat sich jetzt ergeben: Kann ich eine Access Datenbank aus Excel komplett löschen? (Die Option möchte ich haben, um Inventur machen zu können).
Mit Dieters Makros KÖNNTE ich das zwar bereits - ich würde einfach alle 1.000.000 Einträge aus der Access Datenbank in Excel importieren, eine Schleife for i = 1 to 1000000 drüber laufen lassen und eine Million mal sein Makro "spezifische Artikelnummer aus Datenbank löschen" ausführen.
Aber das geht doch bestimmt performanter und eleganter?
LG,
Klaus M.

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Löschen von Access Datenbank
02.12.2019 08:22:24
Access
Hi Klaus
Löschen einer Datenbank, einer Tabelle innerhalb einer DB oder des Tabelleninhalts, sind unterschiedliche Sachen. Gemäss Beschreibung gehe ich davon aus, dass du die Datensätze (Tabelleninhalt) löschen willst. Dazu kann man folgendes SQL-Statement verwenden:
"DELETE FROM Tabelle1"
cu
Chris
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.
Anzeige
AW: Löschen von Access Datenbank
02.12.2019 10:31:27
Access
Hi Klaus
Im bereits bestehenden SQL muss lediglich das Lösch-Kriterium DELETE FROM Tabelle WHERE x = y entfernt werden.
Also hier den richtigen String einbauen und die ganzen Schleifen entfernen.
sql = "DELETE FROM Artikel;"
cmd.CommandText = sql
cmd.Execute RecordsAffected:=betrSätze, Options:=adCmdText + adExecuteNoRecords
cu
Chris
AW: Löschen von Access Datenbank
05.12.2019 13:14:56
Access
Danke Chris, so funktioniert es!
Hier mein Makro:
Option Explicit
Const pfad As String = "C:\herber\Datenbanken"     'Access DB PFad
Const myAccessDB As String = "DieAccDB.accdb"                      'Access DB Dateiname
Const myDB As String = "ScanArchiv"                                'DB-Tabellenname im Access
Sub KillWholeDB()
'ACCESS Tabelle per SQL komplett löschen - VORSICHT!
If MsgBox("Soll " & myDB & " aus " & myAccessDB & " wirklich komplett gelöscht werden?",  _
vbYesNo) = 6 Then
Call DB_SQL("DELETE FROM " & myDB & ";")
End If
End Sub
Sub DB_SQL(mySqlCommand As String)
On Error GoTo hell
Const APPNAME = "mod_Access / DB_SQL"
Dim cmd As ADODB.Command
Dim con As ADODB.Connection
Dim datei As String
datei = pfad & "\" & myAccessDB
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
cmd.CommandText = mySqlCommand
cmd.Execute
'*** Fehlerbehandlung
Err.Clear
hell:
If Err.Number = -2147467259 Then Resume     'Datenbank wird bereits verwendet
If Err.Number  0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
& "Fehlernummer: " & Err.Number & vbLf & Err.Description
Err.Clear
Set cmd = Nothing
con.Close
Set con = Nothing
End Sub

Anzeige
AW: Löschen von Access Datenbank
06.12.2019 17:59:48
Access
Hi Klaus
Danke für die Rückmeldung und post des Mustercodes. So hatte ich mir den Code vorgestellt :)
Noch ein Hinweis: Ich denke sobald Daten bearbeitet werden (DELETE, UPDATE etc.), dann empfiehlt es sich ein "Lock" zu setzen.
https://www.herber.de/forum/archiv/1696to1700/1699388_Excel_und_ADODBConnection.html
https://docs.microsoft.com/en-us/sql/ado/guide/data/types-of-locks?view=sql-server-2017
cu
Chris
Anzeige
AW: Löschen von Access Datenbank
07.12.2019 21:47:34
Access
Hallo Chris,
das schöne ist, jetzt habe ich gar nicht das Makro zum löschen der DB erstellt - sondern, viel geiler, das Makro zum SQL-ansprechen der DB. Wenn ich jetzt ein wenig SQL lerne, kann ich damit ganz viel Unsinn anstellen :-)
LG,
Klaus M.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige