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