0

我需要让在没有网络连接的站点上工作的远程用户可以访问我们的 sql 服务器中的数据。我想在他们的 fe 中更新本地表,但我需要能够在代码中执行此操作,以便他们每次返回办公室时都可以触发更新过程。

我有一组工程师在构建完全没有网络访问权限的站点。我为他们创建了一个精简版的 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 代码仍在处理中。有没有办法解决这个问题?

4

1 回答 1

1

据我所知,没有办法删除所有表并从表单上的用户操作重新导入它们,因为操作本身会阻止删除过程。
我已经通过将同步过程移到登录之前进行来解决这个问题,从用户的角度来看,这实际上是更流畅的,并且还可以自动化它,因此工程师记住运行更新过程没有问题。这是一个比我原来的计划更好的解决方案。

于 2019-06-13T13:28:27.830 回答