Есть ли способ заменить все локальные таблицы процессом импорта? - PullRequest
0 голосов
/ 13 июня 2019

Мне нужно предоставить удаленным пользователям, работающим на сайтах без сетевого подключения, доступ к данным с нашего сервера 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 за формой все еще обрабатывается. Есть ли способ решить эту проблему?

1 Ответ

1 голос
/ 13 июня 2019

Насколько я могу судить, невозможно удалить все таблицы и повторно импортировать их из действия пользователя в форме, поскольку само действие блокирует процесс удаления.
Я обошел эту проблему, переместив синхронизацию.этот процесс происходит до входа в систему, что на самом деле является более приятным с точки зрения пользователя, а также автоматизирует его, поэтому не возникает проблем с инженерами, которые не забывают запустить процесс обновления.Это лучшее решение, чем мой первоначальный план.

...