Требуются только подчиненные формы работы иногда - PullRequest
0 голосов
/ 23 мая 2018

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

Я уверен, что мой sql работает, так как подчиненная форма работает нормально, когда на нее не влияет основная форма.

Private Sub btnSearch_Click()
    Dim sql As String

    sql = "SELECT tblCustomer.[Job ID], tblCustomer.[Customer Name], tblCustomer.[Street Name], tblCustomer.Area, tblAppointments.[Appointment Date] " _
    & "FROM tblCustomer " _
    & "LEFT JOIN tblAppointments ON tblCustomer.[Job ID] = tblAppointments.[Job Number].Value " _
    & "WHERE [Customer Name] LIKE '*" & Me.txtKeywords & "*'" _
    & "OR [Job ID] LIKE '*" & Me.txtKeywords & "*'" _
    & "OR [Street Name] LIKE '*" & Me.txtKeywords & "*'" _
    & "OR [Area] LIKE '*" & Me.txtKeywords & "*'" _
    & "OR [Appointment Date] LIKE '*" & Me.txtKeywords & "*'" _
    & "ORDER BY tblAppointments.[Appointment Date];"

    Me.subCustomerList.Form.RecordSource = sql
    Me.subCustomerList.Form.Requery
End Sub

Отладчик показывает ошибку в следующей строке:

Me.subCustomerList.Form.RecordSource = sql

Я также получаю сообщение об ошибке

объект или класс не поддерживает набор событий

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Рассмотрим параметризацию с сохраненным запросом по нескольким причинам в вашем случае:

  1. Помогает избежать проблем с синтаксисом, таких как у вас, так как Access не позволит вам сохранить запрос с ошибками синтаксиса при использованииКонструктор запросов GUI;
  2. Лучшая обслуживаемость, чем конкатенированная строка SQL, для которой требуется вложение в одинарные / двойные кавычки и вы абстрагируете данные из кода;
  3. Механизм доступа компилирует хранимые запросы в соответствии с наилучшим планом выполнения, поэтомуболее эффективен, чем VBA, называемый строкой SQL (т. е. использовать индекс для JOIN).

SQL (сохранить как объект запроса с параметром, на который ссылаетсяимя в VBA)

PARAMETERS txtKeywordsParam TEXT(255);
SELECT c.[Job ID], c.[Customer Name], c.[Street Name], c.Area, a.[Appointment Date]
FROM tblCustomer c
LEFT JOIN tblAppointments a ON c.[Job ID] = a.[Job Number]
WHERE c.[Customer Name] LIKE txtKeywordsParam 
  OR c.[Job ID] LIKE txtKeywordsParam 
  OR c.[Street Name] LIKE txtKeywordsParam 
  OR c.[Area] LIKE txtKeywordsParam 
  OR a.[Appointment Date] LIKE txtKeywordsParam 
ORDER BY a.[Appointment Date];

VBA

Private Sub btnSearch_Click()
    Dim qdef As QueryDef
    Dim rst As Recordset

    ' OPEN QUERY AND BIND PARAM
    Set qdef = CurrentDb.QueryDefs("mySavedParamQuery")
    qdef!txtKeywordsParam = "*" & Me.txtKeyword & "*"

    ' ASSIGN QUERY RESULT TO RECORDSET
    Set rst = qdef.OpenRecordset()    

    ' APPLY RECORDSET TO FORM 
    Set Me.subCustomerList.Form.Recordset = rst    
    Set qdef = Nothing    
End Sub
0 голосов
/ 23 мая 2018

Я создал новую подчиненную форму и скопировал ту, которая не работала, и, кажется, все работает хорошо.

...