Вы упомянули вздутие живота.Запустите Compact и Repair на раздутом внутреннем MDB, если вы этого еще не сделали.Помимо уменьшения размера файла, он также обновляет статистику индекса, что позволяет оптимизатору запросов принимать более правильные решения относительно ваших планов запросов.
Вы не предоставили подробную информацию о существующих базах данных и таблицах, поэтому я сделал несколько упрощающих предположений.
- Ваш внешний MDB содержит ссылки на все таблицы в концеКонец MDB, который вы хотите заархивировать.
- Все внешние ссылки являются ссылками только на эти таблицы.(IOW, нет ссылок на таблицы, которые вы не хотите архивировать.
- Имена ссылок совпадают с именами таблиц во внутренней базе данных.
- Все ваши таблицы содержат поле даты с именем"date_field". (Это поле, значения которого будут использоваться для определения того, какие записи архивируются.)
- Вы создали архивную базу данных C: \ db \ archive.mdb, которая включает в себя пустые копии всехтаблицы, которые вы хотите заархивировать. Возможно, вы захотите преобразовать поля автонумерации в длинное целое число. Также, если вы не предполагаете, что заархивированные данные вряд ли когда-либо будут использованы, вы можете отбросить все индексы (включая первичные ключи, уникальные ограничения иотношения) ... может быть, если вы заботитесь, может быть сэкономлено много места ... но вставка данных может быть намного быстрее, если у вас нет индексов для обновления.
Поэтому я предлагаю сделатькопию вашей внутренней базы данных, а затем попробуйте эту процедуру. Посмотрите в немедленном окне, чтобы проверить операторы INSERT и DELETE.sonable раскомментируйте две строки CurrentDb.Execute и посмотрите, что произойдет.(Вы делали резервную копию сначала, верно?)
Public Sub DoArchive()
Const cstrArchive As String = "C:\db\archive.mdb"
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strAppend As String
Dim strCutoff As String
Dim strDelete As String
Dim strWhere As String
Dim strMsg As String
On Error GoTo ErrorHandler
Set db = CurrentDb
strCutoff = "#" & Year(Date) - 1 & "/01/01#"
strWhere = " WHERE date_field < " & strCutoff
For Each tdf In db.TableDefs
If Len(tdf.Connect) > 0 Then
strAppend = "INSERT INTO [" & tdf.name & "] IN '" & _
cstrArchive & "' SELECT * FROM [" & tdf.name & _
"]" & strWhere & ";"
Debug.Print strAppend
''CurrentDb.Execute strAppend, dbFailOnError
strDelete = "DELETE FROM [" & tdf.name & "]" & _
strWhere & ";"
Debug.Print strDelete
''CurrentDb.Execute strDelete, dbFailOnError
End If
Next tdf
ExitHere:
On Error GoTo 0
Set tdf = Nothing
Set db = Nothing
Exit Sub
ErrorHandler:
strMsg = "Error " & Err.Number & " (" & Err.description _
& ") in procedure DoArchive"
MsgBox strMsg
GoTo ExitHere
End Sub