View Full Version : How to check each tbl for a date, then archive all data older than a month?
raggajunglist 05-27-2008, 11:45 PM Morning everyone,
Im using Access 2003 to try and create a sort of auto-archive function,
(i will stick on AutoExec when finished)
I have so far only managed to loop through all the tables but don't seem to be able to view the tables for fields like DATE or DATADATE.
I figure the append query would possible contain the code to loop through the tables and perform the append on each that met certain criteria?
Can anyone help me figure this out?
Many thanks
M
ecawilkinson 05-28-2008, 03:19 AM Could you be a bit clearer? When you say auto-archive, how are you going about it? I assume that you want to move any records older than a certain date to in a table to an archive version of the table. Also, did you define "last modified date" fields for each table to help you work out which records to archive?
raggajunglist 05-28-2008, 03:30 AM Hi, thanks for the reply.
Yes for all of the tables i want to archive there is a date modified field, some do not but i want the code to skip over those (Msys*, queries, Linked tables etc)
I meant auto as in AUTOEXEC, so each time the BE_database is loaded in the morning it will check to see if any files need archiving.
Also yes, i am wishing to append all the records that meet the date criteria to be sent of to an archive table.
I would have envisioned it as being an append query nested inside some vba function called from the AUTOEXEC macro?
Hope this makes sense, let me know if not.
Thanks
M
ecawilkinson 05-28-2008, 05:59 AM hi,
create a procedure in a module:
function ArchiveTables()
Dim tdf As DAO.TableDef
Dim db As DAO.Database
Dim fld As DAO.Field
Dim yourdate As Date
Dim lErr As Long
yourdate = DateAdd("m", -1, Date) ' one month ago
Set db = CurrentDb
For Each tdf In db.TableDefs
On Error Resume Next
Set fld = tdf.Fields("DateModified")
lErr = Err
On Error GoTo 0
If lErr = 0 And Left(tdf.Name, 3) <> "arc" Then
db.Execute "INSERT INTO Arc" & tdf.Name & " " & _
"SELECT * FROM " & tdf.Name & " WHERE DateModified < " & CDbl(yourdate)
db.Execute "DELETE * FROM " & tdf.Name & " WHERE DateModified < " & CDbl(yourdate)
End If
Next tdf
end sub
The code above will work if each of the tables you want to archive has a field called DateMOdified (or similar) and your archive tables are the same name as the table with a arc prefix, i.e. Table1 has arcTable1, table2 as arctable2. Again, you can use any prefix/suffix/naming convention as long as it is consistent.
I'm sure with some trweaking, you can get the above to work, just called it from an autoexec macro (using the RunCode command).
HTH,
Chris
raggajunglist 05-28-2008, 11:29 PM Chris,
Many thanks for the response,
This is perfect, i'd never used DAO before !!! i shall have to pull my finger out and get learning:)
Mike
raggajunglist 05-29-2008, 12:42 AM Hi again,
I've tried playing around with your code a bit but have seemingly run into a wall again..
Function ArchiveNumbers()
Dim tdf As DAO.TableDef
Dim db As DAO.Database
Dim fld As DAO.Field
Dim myDate As Date
Dim lErr As Long
Dim mySQL As String
myDate = EOMonth(Date, -1)
Set db = CurrentDb
For Each tdf In db.TableDefs
On Error Resume Next
lErr = Err
On Error GoTo 0
If lErr = 0 And Left(tdf.Name, 3) <> "ARC" And Left(tdf.Name, 10) = "tblNumbers" Then
Set fld = tdf.Fields("Date")
'//create the table
CreateArchiveTableNums
myTbl = "ARCHIVED_NUMBERS: " & Date
mySQL = "INSERT INTO [" & myTbl & "] SELECT * FROM " & tdf.Name & " WHERE Date <= " & CDbl(myDate)
Debug.Print mySQL
db.Execute mySQL
'mySQL = ""
'mySQL = "DELETE * FROM " & tdf.Name & " WHERE Date <= " & CDbl(myDate)
'db.Execute mySQL
End If
Next tdf
End Function
The resulting SQL seems fine, it even deletes the data from the tables (which are older than a month) it just wont insert into the created table, why would this happen?
INSERT INTO [ARCHIVED_NUMBERS: 29/05/2008] SELECT * FROM tblNumbers1 WHERE Date <= 30/04/2008
Any suggestions are much appreciated
raggajunglist 05-29-2008, 12:45 AM Haha, silly mistake, forgot about the need for # around dates :)
:rolleyes:
ecawilkinson 05-29-2008, 02:25 AM RaggaJunglist,
the reason I used cdbl(yourdate), is so that you do not run into date conversion problems. Using #30/04/08# is easy to handle, as Access makes an educated guess but if you are in UK and put #05/04/2008#, The DAO SQL will take that as 4th April 2008 not 5th May 2008. Do as I did, create a variable of date type, then convert it into a number (double if it is date and time, long if it is just a date). So you should use Clng(CutOffDate). To get a date of one month ago use:
Dim CutOffDate As Date
CutOffDate = DateAdd("m", -1, Date)
then use clng(CutOffDate) in the SQL statement. This may seem odd but it will save a world of pain later when you are stuck trying to work out why on 02/06/2008, records from 01/05/2008 are not being removed (DAO thinks you mean 05/01/2008).
HTH,
Chris
raggajunglist 05-29-2008, 03:25 AM ok that makes sense, i shall do that now!
thanks for your help chris, much appreciated!!
|
|