Ошибка времени выполнения -2147417848 (80010108) при отключении свойства FilterOn отчета - PullRequest
0 голосов
/ 06 июня 2018

Я работаю над созданием параметров фильтрации myReport , содержащихся в контейнере подчиненной формы.Я использовал решение, описанное в этом вопросе: Отчет о фильтрации

от HansUp.Используя описанный код, фильтр успешно создается, сохраняется и применяется с событием OnClick объекта apllyFilterButton.

Затем я создаю disableFilterButton и в событии OnClick помещаю предложенный код в ранее упомянутый поток.Во время тестирования я получаю эту ошибку:

«Ошибка времени выполнения» -2147417848 (80010108) ':

Ошибка метода «FilterOn» объекта «_Report_myReport» *

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

Код:

Private Sub disableFilterButton_Click()
Forms![myForm]![myReport].Report.FilterOn = False
Forms![myForm]![myReport].Report.Filter = ""
Forms![myForm]![myReport].Requery
End Sub

После сбоя, используя опцию «Отладка», первая строка кода вышевыделеноМое исследование здесь и вокруг сети предложило добавить строку «пустой фильтр», а также проблему с реестром или существующий цикл в коде, который создает сбой.Но так как с помощью кнопок ленты все работает, я думаю, что-то простое, что мне не хватает.Я все еще новичок.

Код, используемый в myFilterButton для создания фильтра, не полностью завершен, но должен работать:

Private Sub applyFilterButton_Click()

Dim ctl As Control
Dim varVyber As Variant
Dim filtrVolba As String
Dim filtrUplny As String

'Criteria creation for filter SQL
 Set ctl = Forms![myForm]![filterOptionOne]
 If ctl.ItemsSelected.Count <> 0 Then
    For Each varVyber In ctl.ItemsSelected
    filtrVolba = filtrVolba & ctl.Column(0, varVyber) & """ OR (sourceQuery.sourceColumn) = """
    Next varVyber

filtrVolba = Left$(filtrVolba, Len(filtrVolba) - Len(" OR (qry_sourceQuery.sourceColumn) = "))
    Forms![myForm]![myReport].Report.Filter = "(((sourceQuery.fieldBoundToMyReport)=[Forms]![myForm]![TextBoxBoundToMyReport]) AND ((sourceQuery.filterOptionOneSourceField) = """ & filtrVolba & "))"
 Forms![myForm]![myReport].Report.FilterOn = True

Else

MsgBox "Not yet"
End If
End Sub

Помощь будет высоко оценена!Thomas

1 Ответ

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

Tomáš,

Поскольку весь код в вашем примере находится в классе myForm , позвольте мне объяснить некоторые основы кодирования Access.

  1. Синтаксис [Forms]![Form]![Control] действительно предназначен для запросов, событий и свойств форм и отчетов, а также макросов.Хотя он действителен в VBA, нет проверки этого синтаксиса во время компиляции!Таким образом, строка VBA, такая как:

    varValue = [Forms]![Blah]![BlahBlah]  ' doesn't exist
    

    , будет скомпилирована нормально, но потерпит неудачу во время выполнения.

  2. Элементы управления в форме с модулем класса становятся открытыми членами класса формы.Возьмите вашу форму myForm : вы можете ссылаться на ее элементы управления в коде, используя:

    varValue = Form_myForm.filterOptionOne.Value 
    

    Form_myForm - имя класса формы.Эта строка кода будет генерировать ошибки, если filterOptionOne будет переименован или удален.

  3. В любом классе VBA Me относится к общедоступному интерфейсу этого класса.,«Открытый интерфейс» просто означает все открытые функции, подпрограммы и свойства, определенные в классе.Итак, если бы вы использовали строку кода выше в myForm , лучший стиль выглядел бы так:

    varValue = Me.filterOptionOne.Value 
    

    Me в этом контексте ограничивает filterOptionOne на самом делеопределенный в классе, обеспечивающий дальнейшие проверки во время компиляции.

Итак, в свете этих трех пунктов, я бы реорганизовал ваш код следующим образом:

Private Sub disableFilterButton_Click()
     Me.myReport.Report.FilterOn = False
     Me.myReport.Report.Filter = ""
     Me.myReport.Requery
End Sub

Аналогично:

Private Sub applyFilterButton_Click()

    Dim ctl As Control
    Dim varVyber As Variant
    Dim filtrVolba As String
    Dim filtrUplny As String

    'Criteria creation for filter SQL
    Set ctl = Me.filterOptionOne
    If ctl.ItemsSelected.Count <> 0 Then
        For Each varVyber In ctl.ItemsSelected
            filtrVolba = filtrVolba & ctl.Column(0, varVyber) & """ OR (sourceQuery.sourceColumn) = """
        Next varVyber

        filtrVolba = Left$(filtrVolba, Len(filtrVolba) - Len(" OR (qry_sourceQuery.sourceColumn) = "))
        Me.myReport.Report.Filter = "(((sourceQuery.fieldBoundToMyReport)=" & Me.TextBoxBoundToMyReport.Value & ") AND ((sourceQuery.filterOptionOneSourceField) = """ & filtrVolba & "))"
        Me.myReport.Report.FilterOn = True
    Else
        MsgBox "Not yet"
    End If

End Sub

Это может решить не все ваши проблемы, но это должно поставить вас на более прочную основу для понимания того, как кодировать формы доступа.

...