Нахождение синтаксической ошибки в большом проекте VBA / MS Access - PullRequest
0 голосов
/ 01 июня 2018

У меня есть база данных MS Access, которая отображает сообщение об ошибке синтаксиса SQL при запуске."Синтаксическая ошибка в запросе. Неполное предложение запроса."Это также показывает другую ошибку через несколько секунд после того, как я нажал «ОК» на первой.

Вот две ошибки: https://imgur.com/a/PesjIFk

Но это не говорит мне, где находится синтаксическая ошибка.В этом проекте есть операторы SQL в разных местах.Это действительно большой проект, и было бы нецелесообразно просто просматривать весь код, надеясь, что где-нибудь я замечу ошибку.Как я могу узнать, где находится эта ошибка?

РЕДАКТИРОВАТЬ: Хорошо, так что, очевидно, у вас должна быть клавиатура с клавишей «Break», чтобы даже найти, где находится ошибка.Вот это да.К счастью, у меня есть один.Вот код, на который меня берет Access, если я нажимаю break, когда вижу сообщение об ошибке.Этот код для подчиненной формы другой формы.Он выделяет первую строку (Private Sub Form_Current ()).

Private Sub Form_Current()
    If NumEnums > 0 Then
        CurrentEnum = val(Nz(bit_value_edit.value)) 'Update CurrentEnum to the currently selected enum
        Call UpdateEnumsLabel(Me.Parent![enums label]) 'Update label
    End If
End Sub

... и вот UpdateEnumsLabel ():

Public Sub UpdateEnumsLabel(ByRef label As Control)
    If NumEnums > 0 Then
        label.Caption = "Enums: " & CurrentEnum & "/" & NumEnums
    Else
        label.Caption = "Enums: 0"
    End If
End Sub

Определение для CurrentEnum:

Public CurrentEnum, CurrentPort, CurrentFile, CurrentGroup As Long

Я думаю, что эта ошибка не связана с кодом в Form_Current (), но Access выделяет эту строку, потому что ошибка возникает при открытии формы.Но форма не содержит ничего, что использует запрос, поэтому я не понимаю, с каким запросом в Access возникла проблема.

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Часто ctrl-break попадает в строку, где вы допустили ошибку.Однако в случае нескольких «событий» и кода без обработки ошибок, часто ошибка возникает в подпрограмме, которая вызвала код, а не в самом коде, вызвавшем ошибку.

Что бы я сделал, запуститеприложение (удерживайте клавишу Shift для предотвращения запуска кода или запуска форм).

Теперь, когда вы запустили приложение, но без форм или запущенного кода, проверьте макрос autoexecc (если он есть, проверьте, какой код он пытается запустить).

Если макрос autoexec не используется, проверьте файл-> options-> current database.В этом представлении вы можете посмотреть / увидеть / определить, как называется начальная форма.

Как только вы определили начальную форму (или модуль / код запуска), вызываемую из макроса autoexec, затемВы можете просто добавить пустой модуль кода и поместить в свой код ту же команду, которая используется для запуска вашего приложения.

Итак, давайте предположим, что макрос autoexec отсутствует, и вы определяете, что форма запуска - frmMain.

Итак, теперь мы можем запустить приложение (удерживайте нажатой клавишу Shift, чтобы предотвратить запуск любого кода запуска).Теперь введите в новый «тестовый» модуль стандартного кода следующий код:

Sub MyGo

  Stop

  Docmd.OpenForm "frmMain"

End sub

Таким образом, вы вводите код, приведенный выше, нажимая ctrl-s, чтобы сохранить код выше.Теперь, когда ваш курсор находится в любом месте внутри приведенного выше кода, вы просто нажимаете F5 для запуска.

В этот момент вы нажимаете / останавливаете команду «stop» в отладчике.В этот момент вы можете нажать f8, чтобы перейти к следующей строке кода.Если соответствующая форма вызывает другой код и т. Д., Вы все равно сможете сделать один шаг, и «в конце концов» вы попадете на строку, которая вызывает ошибку.

Хотя приложение может быть большим, просто посмотрите наформы запуска (и затем стартовый код) означает, что вам действительно нужно отслеживать и просматривать код запуска, а не все приложение.

0 голосов
/ 01 июня 2018

Когда появится сообщение об ошибке, используйте Control + Break.Это приведет вас к линии, вызывающей проблему.

Вам также нужно открыть модуль и сформировать опцию отладки в редакторе VBA, выбрать «Compile All Modules»

И так как это, похоже, происходитпри открытии / загрузке вы можете проверить как макросы, так и основные модули, чтобы найти все, что срабатывает в AutoExec.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...