0

我有两个版本的访问前端。Access 2003 的一个仍然由几台尚未升级到 Access2010 和 Win7 的计算机运行,不幸的是,Acces2010 版本是在 2003 年我无法修复的主窗体关闭时导致 Access 崩溃的。后端是 SqlServer 2005 SqlExpress 版本。

因此,我坚持使用 2003 年的旧前端,幸运的是,他们不需要 2010 版本中的新功能。

现在,当 Access 2003 版本在某处运行时,从大型机转储加载数据的维护实用程序被“在 Patient_Clinic_Visits 上选择 1”阻止。我找不到的是“在 Patient_Clinic_visits 上选择 1”的来源。

我查看了所有模块代码和所有查询,但找不到类似的东西。

因此,我认为它必须在前端表单中,但是我如何在不查看该表单的所有对象和控件的情况下搜索其中包含一些 SQL 代码的 RecordSource 呢?

干杯,

乔恩高清

4

2 回答 2

1

最后,我搜索了一些其他问题,并考虑以编程方式转储可能的违规信息。这是我为做我想做的事而混合的两个不同答案。对 VBA 中即时窗口的限制,它将从 Debug.Print 保留多少行,我使用 WScript 对象转储到日志文件。

代码基本上:

  • 依次打开数据库中的每个表单
  • 转储其 RecordSource 描述
  • 然后对于其表单上的每个控件,以某种方式转储可能包含 SQL 的相关信息
  • 注意:我使用导致错误的 Writeline(某些代码)将失败而不写入的事实,以避免对要转储或不转储属性的不同控件类型进行大量测试。
  • 然后关闭表格
  • 然后它遍历数据库中的所有查询,并转储 SQL 代码

(注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
于 2013-05-28T07:56:55.757 回答
0

在 Access 菜单中选择 Database Tools->Database Documenter。在那里,选择所有对象并按 OK。这将需要一些时间,但随后您将看到一份报告,其中列出了数据库中的所有内容,包括最后的代码。

对于大型数据库,该报告可能相当大。

您可以将报告导出到 Word(有一个选项)。在那里,搜索你的字符串。(我认为应该是“Patient_Clinic_visits 中选择 1”)

于 2013-05-28T04:38:15.860 回答