我有两个版本的访问前端。一个用于Access 2003的仍然由几台尚未升级到Access2010和Win7的计算机运行,不幸的是,Acces2010版本在2003年的Access崩溃中导致我无法解决的主要形式结束。后端是SqlServer 2005 SqlExpress版本。
因此,我坚持使用2003年人的老版本,幸运的是他们不需要2010版本的新功能。
现在,当Access 2003版本在某处运行时,从大型机转储加载数据的维护实用程序会被“在Patient_Clinic_Visits上选择1”阻止。我找不到的是“Patient_Clinic_visits上的SELECT 1”来自哪里。
我已查看了所有模块代码和所有查询,但找不到类似的内容。
我认为它必须是前端形式,但是如何在没有查看RecordSource的表单的所有对象和控件的情况下搜索它,其中包含一些SQL代码?
欢呼声,
JonHD
答案 0 :(得分:1)
最后,我搜索了其他一些问题,并考虑以编程方式转储可能存在的违规信息。这是我想要做的两个不同答案的混合物。在VBA中对Instant Window的限制,以及它将从Debug.Print中保留多少行,我已经使用WScript对象转储到日志文件。
代码基本上是:
(注1:最后这没有找到我的问题的答案 - 请参阅我最近的另一个问题!!)
(注意2:这是一个快速而又脏的脚本。我注意到它第一次运行WriteStream时没有写任何东西,即使它在执行代码时它似乎正在做某事。无论如何当我运行它时它再次起作用。没有花时间调试原因!)。
Function DumpFormsAndQueries()
Dim obj As AccessObject
Dim objctrl As Control
Dim frm As Form
Dim dbs As Object
Dim fsoSysObj As FileSystemObject
Dim filFile As Object
Dim txsStream As TextStream
Dim strPath As String
Set dbs = Application.CurrentProject
Set fsoSysObj = New FileSystemObject
' Return Windows Temp folder.
strPath = "C:\Temp\"
On Error Resume Next
' See if file already exists.
Set filFile = fsoSysObj.GetFile(strPath & "Database_Form_dump.Log")
' If not, then create it.
If Err <> 0 Then
Set filFile = fsoSysObj.CreateTextFile(strPath & "Database_Form_dump.Log")
End If
Debug.Print ">> dumping to: " & strPath & "Database_form_dump.log"
Set txsStream = filFile.OpenAsTextStream(ForAppending)
For Each obj In dbs.AllForms
DoCmd.OpenForm obj.name, acDesign
Set frm = Forms(obj.name)
Debug.Print ">>>> dump form: " & obj.name
txsStream.WriteLine "====================================================================="
txsStream.WriteLine "Form : " & obj.name
txsStream.WriteLine "RecordSource: " & frm.RecordSource
txsStream.WriteLine "====================================================================="
For Each objctrl In frm.Controls
txsStream.WriteLine " --------------------------------------------------"
txsStream.WriteLine " : " & objctrl.name & " Type = " & TypeName(objctrl)
txsStream.WriteLine " --------------------------------------------------"
On Error Resume Next
txsStream.WriteLine " >>>> Recordsource: (" & objctrl.RecordSource & ")"
txsStream.WriteLine " >>>> Controlsource: (" & objctrl.ControlSource & ")"
txsStream.WriteLine " >>>> Rowsource: (" & objctrl.RowSource & ")"
txsStream.WriteLine " >>>> Caption: (" & objctrl.Caption & ")"
txsStream.WriteLine " >>>> Text: (" & objctrl.Text & ")"
txsStream.WriteBlankLines 1
Next objctrl
DoCmd.Close acForm, obj.name, acSaveNo
txsStream.WriteBlankLines 3
Next obj
txsStream.WriteLine "====================================================================="
txsStream.WriteLine " Q U E R I E S - in database"
txsStream.WriteLine "====================================================================="
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Set db = CurrentDb()
For Each qdf In db.QueryDefs
txsStream.WriteLine "Query: " & qdf.name
txsStream.WriteLine "SQL (start) ---------------------------------------------------- "
txsStream.WriteLine qdf.sql
txsStream.WriteLine "SQL (end) ---------------------------------------------------- "
Next qdf
Set qdf = Nothing
Set db = Nothing
txsStream.Close
Debug.Print ">> ended"
End Function
答案 1 :(得分:0)
在“访问”菜单中,选择“数据库工具” - >“数据库文档管理器”。在那里,选择所有对象并按“确定”。这需要一些时间,但随后会出现一个报告,列出数据库中的所有内容,包括最后的代码。
对于大型数据库来说,报告可能非常大。
您可以将报告导出到Word(有一个选项)。在那里,搜索你的字符串。 (我认为它应该是“SELECT 1 来自 Patient_Clinic_visits”)