Ошибка выполнения 3065 Не удается выполнить запрос выбора в инструкции VBA SQL

У меня возникли некоторые проблемы со сценарием VBA, который я создаю, и я подумал, что лучше всего задать вопрос здесь. Я дам некоторую предысторию:

Я пишу эту программу, так как многие мои клиенты идут против обычных документов, выдаваемых налоговой инспекцией моей страны, и платят наличными, а затем заставляют меня рассчитать сумму налога на эту конкретную сумму. Выяснение этого вручную требует немало бумажной работы, поэтому я пишу приложение, которое делает это и многое другое. Приведенный ниже сценарий лежит в основе того, что необходимо сделать.

Для первого варианта использования я по сути создал одноразовую форму в Access - ничего не пишется, она просто для временного расчета и отправки на принтер - для расчета отпускных.

Поскольку я не могу выполнить поиск SQL в вычисляемой ячейке, я запускаю сценарий VBA, который выполняет за меня тяжелую работу, передавая три введенных значения в качестве аргументов.

Тем не менее, я не могу избавиться от ошибки выполнения 3075, и я не могу понять, откуда она взялась. Я проследил это до оператора SQL, но не могу найти, где может быть ошибка оператора. Где я ошибаюсь?

Вот код:

    Option Compare Database

    Public Function DetermineTax(CurrentDate As Date, CurrWageType As String, CalcNetWages As Currency)

    'Checks whether required fields are blank

    If Not (IsDate(CurrentDate)) Then
        Exit Function
    End If

    If (CurrWageType = "") Then
        Exit Function
    End If

    If (CalcNetWages <= CCur(0#)) Then
        Exit Function
    End If

    Dim strSQL As String

    'Calculates tax based on (-((n-b)/(a-1))-n) formula, where all WHERE arguments have been met.

    strSQL = 
    "SELECT FIRST (ROUND(((-(CalcNetWages-tblWageRate.CoefficientB)/(tblWageRate.CoefficientA-1))-CalcNetWages))) " & _
    "FROM tblWageType INNER JOIN tblWageRate " & _
    "ON tblWageType.WageTypeID = tblWageRate.fk_WageTypeID " & _
    "WHERE tblWageRate.TaxYearStart <= CurrentDate And " & _
    "tblWageRate.TaxYearEnd >= CurrentDate And " & _
    "tblWageType.WageType = CurrWageType And " & _
    "tblWageRate.Net >= CalcNetWages;"

    CurrentDb.Execute Query:=strSQL, Options:=dbFailOnError + dbSeeChanges

    'DoCmd.RunSQL strSQL

    End Function

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

Спасибо!

EDIT: Угу, я слишком долго смотрел на этот код. Функцию ROUND необходимо заключать в скобки. Это избавило от ошибки 3075. Я изменил свой код выше, чтобы он был сейчас.

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


person Kyle Drayton    schedule 03.10.2014    source источник
comment
Что значит SELECT FIRST...? Я такого оператора не встречал, возможно вы имели ввиду SELECT TOP 1...   -  person Arvo    schedule 03.10.2014
comment
SELECT FIRST должен выбрать первый возвращаемый результат. Поскольку почти наверняка будет более одного результата, в котором tblWageRate.Net больше, чем CalcNetWages, я должен выбрать первый, чтобы вернуть правильные коэффициенты. Я только что попробовал SELECT TOP 1, и он изменил ошибку на 2342 (для действия RunSQL требуется аргумент, состоящий из инструкции SQL)   -  person Kyle Drayton    schedule 03.10.2014
comment
На самом деле я никогда не заменяю CurrentDate, CurrWageType или CalcNetWages. Это вводимые пользователем переменные, которые необходимо передать, чтобы получить совпадение с SQL-запросом. Результат будет записан в текстовое поле, однако, поскольку я хочу, чтобы этот код работал во многих различных формах, я хочу сначала убедиться, что он действительно возвращает правильные значения.   -  person Kyle Drayton    schedule 03.10.2014
comment
TOP 1 — это стандартизированный синтаксис. Доступ имеет особый вкус SQL.   -  person Michiel van der Blonk    schedule 03.10.2014


Ответы (1)


Я решил свою проблему в течение недели. Я считаю, что проблемы заключались в а) способе обработки дат и б) отсутствующих кавычках.

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

Option Compare Database
Option Explicit

Private Sub btnCalc_Click()

Me.txtWeeklyTax = CalcNetTax(Me.txtWeeklyNet, Me.txtDatePaid, Me.cmbTaxType)


End Sub

Private Sub btnInsertRec_Click()

Dim strSQL As String

strSQL = ""
strSQL = strSQL & "INSERT INTO tblPayment  "
strSQL = strSQL & "            (  "
strSQL = strSQL & "                        fk_EmployerID,  "
strSQL = strSQL & "                        fk_EmployeeID,  "
strSQL = strSQL & "                        PaymentDate  ,  "
strSQL = strSQL & "                        fk_WageTypeID,  "
strSQL = strSQL & "                        NetPayment   ,  "
strSQL = strSQL & "                        TaxPayable  "
strSQL = strSQL & "            ) "
strSQL = strSQL & "VALUES  "
strSQL = strSQL & "            (  "
strSQL = strSQL & "                        '" & Me.cmbEmployer & "',  "
strSQL = strSQL & "                        '" & Me.cmbEmployee & "',  "
strSQL = strSQL & "                        '" & Me.txtDatePaid & "',  "
strSQL = strSQL & "                        '" & Me.cmbTaxType & "',   "
strSQL = strSQL & "                        '" & Me.txtPropNet & "',   "
strSQL = strSQL & "                        '" & Me.txtPropTax & "'   "
strSQL = strSQL & ");"

'strSQL = strSQL & "VALUES  "
'strSQL = strSQL & "            (  "
'strSQL = strSQL & "                        '" & Me.[cmbEmployer] & "',  "
'strSQL = strSQL & "                        '" & Me.[cmbEmployee] & "',  "
'strSQL = strSQL & "                        '" & Me.[txtDatePaid] & "',  "
'strSQL = strSQL & "                        '" & Me.[cmbTaxType] & "',   "
'strSQL = strSQL & "                        '" & Me.[txtPropNet] & "',   "
'strSQL = strSQL & "                        '" & Me.[txtPropTax] & "',   "
'strSQL = strSQL & ");"

Debug.Print strSQL

DoCmd.RunSQL (strSQL)
Call cmdReset_Click

End Sub

Private Sub cmbEmployer_AfterUpdate()
  Me.cmbEmployee.Requery
End Sub

Private Sub cmdReset_Click()
On Error GoTo ResetError
Dim Frm As Form, Ctl As Control

Set Frm = Me
For Each Ctl In Frm
Ctl.Value = Null
Next Ctl

ResetError:
If Err = 2119 Or Err = 438 Or Err = 2448 Then
Resume Next
ElseIf Err > 0 Then
MsgBox Err & ": " & Err.Description
End If
End Sub

Фактическая налоговая функция...

Option Compare Database
Option Explicit

Public Function CalcNetTax(NetPay As Currency, PayDate As Date, TaxType As Integer) As Currency

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String

Set db = CurrentDb

strSQL = ""
strSQL = strSQL & "SELECT     FIRST (ROUND((-(" & [NetPay] & "-tblWageRate.[CoefficientB])/(tblWageRate.[CoefficientA]-1)-" & [NetPay] & "))) AS TaxPayable "
strSQL = strSQL & "FROM       tblWageType  "
strSQL = strSQL & "           INNER JOIN tblWageRate  "
strSQL = strSQL & "           ON         tblWageType.[WageTypeID] = tblWageRate.[fk_WageTypeID] "
strSQL = strSQL & "WHERE      (  "
strSQL = strSQL & "                      (  "
strSQL = strSQL & "                                 (  "
strSQL = strSQL & "                                            tblWageRate.[TaxYearStart]  "
strSQL = strSQL & "                                 )  "
strSQL = strSQL & "                                 <= " & SQLDate([PayDate]) & "  "
strSQL = strSQL & "                      )  "
strSQL = strSQL & "           AND  "
strSQL = strSQL & "                      (  "
strSQL = strSQL & "                                 (  "
strSQL = strSQL & "                                            tblWageRate.[TaxYearEnd]  "
strSQL = strSQL & "                                 )  "
strSQL = strSQL & "                                 >= " & SQLDate([PayDate]) & "  "
strSQL = strSQL & "                      )  "
strSQL = strSQL & "           AND  "
strSQL = strSQL & "                      (  "
strSQL = strSQL & "                                 (  "
strSQL = strSQL & "                                            tblWageType.[WageTypeID]  "
strSQL = strSQL & "                                 )  "
strSQL = strSQL & "                                 = " & [TaxType] & "  "
strSQL = strSQL & "                      )  "
strSQL = strSQL & "           AND  "
strSQL = strSQL & "                      (  "
strSQL = strSQL & "                                 (  "
strSQL = strSQL & "                                            tblWageRate.[Net]  "
strSQL = strSQL & "                                 )  "
strSQL = strSQL & "                                 >= " & [NetPay] & "  "
strSQL = strSQL & "                      )  "
strSQL = strSQL & "           );"

Debug.Print strSQL
Set rs = db.OpenRecordset(strSQL)
rs.MoveFirst
CalcNetTax = CCur(rs.Fields(0))

rs.Close
db.Close

Set rs = Nothing
Set db = Nothing

End Function

Private Function SQLDate(vDate As Variant) As String
        If IsDate(vDate) Then
            SQLDate = "#" & Format$(vDate, "mm\/dd\/yyyy") & "#"
        End If
End Function
person Kyle Drayton    schedule 12.10.2014