有没有办法用导入过程替换所有本地表?

时间:2019-06-13 10:11:30

标签: sql-server vba access-vba ms-access-2013

我需要给没有网络连接的站点上的远程用户访问来自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代码仍在处理中。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

据我所知,由于操作本身会阻止删除过程,因此无法删除所有表并从用户对表单的操作中重新导入它们。
我已经通过将同步过程移到登录之前来解决了这一问题,从用户的角度来看,这实际上是一种闪烁,并且可以实现自动化,因此工程师记住运行更新过程不会有问题。这是比我最初的计划更好的解决方案。