Hallo,
ich erstelle in eine andere DB immer eine Sicherheitstabelle mit folgendem Code:
tabname = "Sicherung_" + CStr(Format(Now, "dd_mm_yyyy_hh_nn_ss"))
Diese wird gespeichert:
DoCmd.DeleteObject acTable, "c:\test\Backup.mdb", "Sicherung"
Ich sichere die Tabelle also mit einen Timestamp, weil ich am Tag verschiedene Sicherungen habe.
Da nach X-Tagen die DB zu groß wird, möchte ich gerne diese Tabellen wieder automatisch löschen (wobei die letzten 3 Tage immer bleiben sollen).
So nun meine Frage, weiß jemand wie ich die Sicherungstabellen am besten packen kann. Da sie eine Uhrzeit im Namen führen, kann ich sie nicht direkt ansprechen. Mir fehlt aber das Wissen, wie ich ein delete nur mit Sicherung und Datum schreiben soll, zumal ich nicht weiß ob er sie dann auch erkennt, das sie ja auch noch die Uhrzeit führen.
Über jeden Tipp würde ich mich freuen, gerne auch andere Anregungen.
Danke
Hallo,
nur Tipp, umsetzen musst Du ihn selber.. ;) 8)
Selektiere in einem Recordset alle Tabellen aus der Tabelle "MSysobjects" mit Namen "Sicherung*" (like "Sicherung*") , dem Datum kleiner als Maxdatum - 3 Tage (erfordert ein bisschen Stringmanipulation, um aus dem Namensteil ein gültiges Datum zu generieren...) und sortiert nach dem Tabellennamen. Damit erhältst Du alle Sicherungstabellen die Du mittels Durchlauf durch den Recordset löschen kannst. Möglicherweise ist bei jedem Durchgang ein Requery des Recordsets vonnöten.
Mit "DoCmd.DeleteObject ..." kannst Du keine Massenlöschung erreichen.
Gruß
Franz, DF6GL
Hallo Franz,
das mit dem MSysobjects ist ja genial! Wusste gar nicht, dass es so etwas gibt.
Ich gebe mich mal daran und hoffe, dass ich es hinbekomme :-)
Wenn ich fertig bin sende ich den Code hier.
Danke
Ken
Hallo Franz,
Zitatmittels Durchlauf durch den Recordset löschen kannst.
Aber nicht direkt in MSysObjects, die ist IMO schreibgeschützt.
Ich bin auch kein Freund der Verwendung von MSys...-Tabellen, die sind
sicher nicht umsonst standardmässig ausgeblendet.
Für die gefragte Anforderung würde ich eher die Auflistung .TableDefs
verwenden. Würde vom Code her (Tabellenname ermitteln) ja ähnlich
funktionieren, ausser, dass man zum Löschen statt DoCmd.DeleteObject
die Methode .Delete der Auflistung verwenden würde/könnte.
gruss ekkehard
Hallo,
um Missverständnissen vorzubeugen: Es sind auch nicht die Einträge im MsysObjects gemeint, die sind sowieso nicht änderbar/löschbar, sondern die Tabellen-Objecte selber (z. B. durch die angesprochene Tabeldefs-Auflistung).
Andererseits gibt es ja mehrere Wege, die nach Rom führen :D ;)
Hallo,
habe noch ein kleines Problem, vielleicht kann mir jemand helfen.
Hier erstmal der Code:
Dim dbs As Database
Dim rst As Recordset
Dim strSQL As String
Set dbs = OpenDatabase("c:\test\Backup.mdb")
strSQL = "SELECT MSysObjects.Name, MSysObjects.Type, MSysObjects.DateCreate" _
& " FROM MSysObjects" _
& " WHERE (((MSysObjects.Name) Not Like 'msys*'" _
& " And (MSysObjects.Name) Not Like '~sq*'" _
& " And (MSysObjects.Name) Like 'Sicherung_*')" _
& " AND ((MSysObjects.Type)=1 Or (MSysObjects.Type)=6)" _
& " AND ((MSysObjects.DateCreate)<Date()))"
Set rst = dbs.OpenRecordset(strSQL)
With rst
Do Until .EOF
dbs.TableDefs.Delete !Name
.MoveNext
Loop
End With
rst.Close
Set rst = Nothing
Set dbs = Nothing
Folgendes passiert nun, Sicherung wird gelöscht, aber Sicherung_28_08_2012_usw. bleibt stehen. Also alles bleibt stehen was mit _Datum und Uhrzeit endet. Hat jemand eine Idee warum das so ist?
Danke!
Hallo,
alles OK, hatte nur ein Datumsproblem. Code funktioniert.