Как использовать VBA для создания запроса и выполнения запроса на основе того, что пользователи набрали в форме? - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь использовать vba, где пользователи вводят что-то в текстовое поле, а vba выполняет запрос с тем, что пользователь ввел в качестве критерия. Тем не менее, я получаю сообщение об ошибке «Ожидается: конец оператора»

   Private Sub btnSearch_Click()
On Error GoTo errorHandler
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim qdf As QueryDef
    Dim sql As String

    Set db = CurrentDb()
    Set qdf = db.QueryDefs("Expiry")

    sqlString = "SELECT Format([Expiry_Date], ""mmmm"") AS [Month], Sum([Contracts].[Contract _Value (S$)]) AS [Contract Value], Count([Contracts].[Contract No]) AS [Number of Contract] FROM [Contracts] WHERE Year([Expiry_Date])= '" & Me.txtExpiryYear & "' GROUP BY Format([Expiry_Date],""mmmm"")"
    Debug.Print sql
    qdf.sql = sqlString


    If Nz(Me.txtExpiryYear, "") = "" Then
        MsgBox "Please enter the year"
        Resume Exit_Update
    End If

    Set rs = db.OpenRecordset(sqlString)

      qdf.Close
      CurrentDb.Close

Exit_Update:
Exit Sub

errorHandler:
If Err.Number = 3075 Then
    MsgBox Err.Description
    Resume Exit_Update
End If

End Sub

1 Ответ

0 голосов
/ 04 июля 2019

Отладка - ключ к рабочему коду!

Для простоты начните с отображения значений в непосредственном окне.

If Nz(Me.txtExpiryYear, "") = "" Then 'start with check as if empty exit
    MsgBox "Please enter the year"
    Resume Exit_Update
End If
Dim sqlString As String

'sqlString = "SELECT Format([Expiry_Date], ""mmmm"") AS [Month], Sum([Contracts].[Contract _Value (S$)]) AS [Contract Value], Count([Contracts].[Contract No]) AS [Number of Contract] FROM [Contracts] WHERE Year([Expiry_Date])= '" & Me.txtExpiryYear & "' GROUP BY Format([Expiry_Date],""mmmm"")"
'Debug.Print sqlString
sqlString = "SELECT Format([Expiry_Date], ""mmmm"") AS [Month], Sum([Contracts].[Contract _Value (S$)]) AS [Contract Value], Count([Contracts].[Contract No]) AS [Number of Contract] FROM [Contracts] WHERE Year([Expiry_Date])= [paraYear] GROUP BY Format([Expiry_Date],""mmmm"")"
With CurrentDb.CreateQuerydef(vbNullString) 'temp querydef
    .sql = sqlString
    .Parameters("paraYear") = Me.txtExpiryYear ' using a paremter 
    with .OpenRecordset
        Do Until .Eof 'loop through rs
            Debug.Print .Fields("Month").Value & " " & .Fields("Contract Value").Value & " " & .Fields("Number of Contract").Value
            .MoveNext
        Loop
    End WIth
    Set me.Recordset = .OpenRecordset 'assign recordset to form: controls need to be bound to query fields.
End With

Exit_Update:
Exit Sub

errorHandler:
If Err.Number = 3075 Then
    MsgBox Err.Description
    Resume Exit_Update
End If

Чтобы отобразить набор записей в элементах управления форм, присвойте ему значение Me.Recordset и используйте те же имена полей, что и в предыдущем наборе записей, или вам нужно привязать новое поле.

Me.MyTextBox.ControlSource = "Month"

Что связывает столбец Month запроса с MyTextBox.

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