Мне нужно предоставить удаленным пользователям, работающим на сайтах без сетевого подключения, доступ к данным с нашего сервера sql. Я хочу обновить локальные таблицы в их fe, но я должен быть в состоянии сделать это в коде, чтобы они могли запускать процесс обновления каждый раз, когда возвращаются в офис.
У меня есть группа инженеров, работающих на строительных площадках без абсолютно никакого доступа к сети. Я создал урезанную версию fe для них, которая содержит только формы, таблицы и отчеты, необходимые для работы на месте, заполнения отчетов, а затем возвращения в офис и «загрузки» завершенных отчетов. Из того, что я прочитал, я полагаю, что лучший способ сделать это - создать локальную копию таблиц в их файлах, это даст им необходимые данные, и я могу использовать запрос на добавление для загрузки завершенного отчета. информация, когда они возвращаются в офис. Я создал локальные таблицы, используя процесс импорта для импорта таблиц с нашего сервера sql, и сохранил этот импорт.
Чтобы обновить их, я удаляю таблицы, затем запускаю сохраненный импорт.
Я исследовал и нашел много кода для этого обновления локальной таблицы, где это всего лишь одна таблица, но я хочу сделать это со всеми таблицами, и я продолжаю выдавать ошибку при попытке удалить таблицы до реимпортировать их.
мой код все еще находится в стадии разработки над тестом, поэтому многое комментируется, когда я прорабатываю каждый шаг, чтобы он работал так, как я хочу.
Private Sub cmdSynch_Click()
'check if there is data to upload to Compass **needs updating**
'If IsNull(DCount("IDfield", "table")) Then
'there's no update data, pull all data from Compass
Call CopyDB
're-open the main menu
DoCmd.OpenForm "Main Menu"
'Else
'upload the the data from here to Compass first, then refresh
'DoCmd.RunSQL "qryNametbc" ' will be an append query
'if there were no errors. clear the updates table
'Dim strSQLDelete As String
'strSQLDelete = "DELETE * FROM dbo_table_name;" ' needs updating ***
'DoCmd.SetWarnings False
'DoCmd.RunSQL strSQLDelete
'DoCmd.SetWarnings True
'then pull all the data from Compass
'Call CopyDB
'End If
End Sub
CopyDB просто вызывает функции CloseFormReports и DeleteTables, которые оба хранятся в модуле, а не в форме vba.
Public Function CloseFormsReports()
'Close all open forms
On Error GoTo errHandler
Do While Forms.Count > 0
DoCmd.Close acForm, Forms(0).Name
Loop
Do While Reports.Count > 0
DoCmd.Close acReport, Reports(0).Name
Loop
Exit Function
errHandler:
MsgBox Err.Number & ": " & Err.Description, vbOKOnly, "Error"
End Function
Public Function DeleteTables()
Dim dbs As DAO.Database
Dim i As Integer
Set dbs = CurrentDb
DoEvents
' Loop backwards through relations
For i = dbs.Relations.Count - 1 To 0 Step -1
dbs.Relations.Delete dbs.Relations(i).Name
Next i
' Loop backwards through tabledefs
For i = dbs.TableDefs.Count - 1 To 0 Step -1
If Left(dbs.TableDefs(i).Name, 4) <> "MSys" Then
dbs.TableDefs.Delete dbs.TableDefs(i).Name
End If
Next i
Set dbs = Nothing
End Function
Появляется «ошибка времени выполнения 3211: ядру базы данных не удалось заблокировать таблицу« xxxx », поскольку она уже используется другим пользователем или процессом».
Я добавил один шаг, чтобы попытаться решить эту проблему, закрыв все открытые формы перед удалением таблиц, но я все еще получаю «ошибку времени выполнения 3211» для таблицы, которая является источником записи подчиненной формы в форме навигации (основная форма) , Я думаю, что это может быть потому, что Главная форма, где процесс обновления запускается нажатием кнопки команды (cmdSynch). Главная форма успешно закрывается, но я предполагаю, что она все еще «активна», потому что код vba за формой все еще обрабатывается. Есть ли способ решить эту проблему?