Проблема с использованием Between в запросе выбора в базе данных MS Access 2010 - PullRequest
0 голосов
/ 03 мая 2019

Утро, пожалуйста, кто-нибудь может мне помочь, чтобы этот запрос SELECT работал?У меня есть форма (frm_Reports), на которой у меня есть два текстовых поля (Text98 и Text100 оба отформатированы, чтобы взять ShortDate) и кнопку (RunReport).Пользователь вводит начальную дату в Text98 и конечную дату в Text100, а затем нажимает кнопку RunReport.Даты из Text98 и Text100 хранятся в переменных как Dates (называемые stardate и enddate), а затем выполняется запрос SELECT (см. Код ниже), который извлекает все записи в таблице (tbl_details), которые имеют дату входа (подстолбец с заголовком DateTime) падает между начальной и конечной датами, введенными пользователем.Проблема в том, что я не могу заставить работать запрос SELECT.

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

sqlstr = "SELECT * FROM tbl_details WHERE (tbl_details.DateTime) > #" & startdate & "#; "

Однако, как только я пытаюсь превратить эту строку в запрос типа BETWEEN, я получаю

"Ошибка времени выполнения '13': несоответствие типов.

    Private Sub RunReport_Click()

    Dim selectedreport As String
    Dim startdate As Date
    Dim enddate As Date
    Dim sqlstr As String

    selectedreport = Me.ComboReport.Column(1)
    startdate = Me.Text98
    enddate = Me.Text100
    'sqlstr = "SELECT * FROM tbl_details WHERE (tbl_details.DateTime) > #28/04/2019#;" - THIS WORKS
    'sqlstr = "SELECT * FROM tbl_details WHERE (tbl_details.DateTime) > #" & startdate & "#;" - THIS WORKS
    sqlstr = "SELECT * FROM tbl_details WHERE (tbl_details.DateTime) BETWEEN #" & startdate & "#" And "#" & enddate & "#;" 'THIS DOES NOT WORK

    Dim dbs As Database
    Dim rst As Recordset

    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset(sqlstr)
    With rst
        While Not .EOF()
        vName = .Fields("DateTime").Value
        Debug.Print vName

    .MoveNext
    Wend
    End With

    dbs.Close

    End Sub

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

Ответы [ 3 ]

0 голосов
/ 03 мая 2019

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

sqlstr = "SELECT * FROM tbl_details WHERE (tbl_details.DateTime) BETWEEN #" & startdate & "# And #" & enddate & "#;"
' instead of this:
sqlstr = "SELECT * FROM tbl_details WHERE (tbl_details.DateTime) BETWEEN #" & startdate & "#" And "#" & enddate & "#;"

Парадругие пункты:

  • Если в вашем столбце DateTime указано время, вам нужно немного изменить код.Если пользователь вводит 2019-05-03 в качестве даты окончания, значения, которые появляются 3 мая, будут исключены (например, 2019-05-03 15:00).
  • DateTime - неверное имя столбца, так как оно не описывает вашеданные.Вы также можете рассмотреть вопрос о переименовании tbl_details.Подробности о том, что?
  • Вы должны также дать своим текстовым полям осмысленные имена.txtStartDate вместо Text98.
  • При объявлении dbs и rst лучше всего добавить библиотеку (например, Dim dbs as DAO.Database), поскольку библиотеки ADO и DAO используют одни и те же классы.
  • Вместо жесткого кодирования SQL в VBA вы также можете использовать параметризованный запрос, поэтому вам не нужно генерировать SQL (что иногда бывает сложно).
0 голосов
/ 03 мая 2019

Рассмотрите возможность использования параметризованного запроса с использованием QueryDefs и избегайте любых беспорядочных конкатенаций или вложений в кавычки / символы в зависимости от типа данных. Затем привяжите значения формы к объекту querydef и назначьте querydef для объекта набора записей.

SQL (сохранить ниже как сохраненный объект запроса)

PARAMETERS [param_start] Date, [param_end] Date;
SELECT * FROM tbl_details 
WHERE (tbl_details.DateTime) BETWEEN [param_start] AND [param_end]

VBA (привязать параметры запроса к набору записей отчета)

Private Sub RunReport_Click()
    Dim qdef As QueryDef
    Dim rst As Recordset
    Dim selectedreport As String

    ' OPEN QUERY AND BIND PARAMS 
    Set qdef = CurrentDb.QueryDefs("mySavedParamQuery")

    qdef!start_param = Me.Text98
    qdef!end_param = Me.Text100

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

    With rst
        While Not .EOF()
            Debug.Print .Fields("DateTime").Value
            .MoveNext
        Wend
    End With

    Set qdef = Nothing    
    Set rst = Nothing
End Sub
0 голосов
/ 03 мая 2019

Я думаю, что вам нужно проверить 2 вещи:

  1. В вашем первом закомментированном SQL у вас есть фиксированное значение #28/04/2019# вместо enddate переменной.Вы должны проверить, работает ли она также с переменной.

  2. Возможно, проблема в вашем формате даты dd/mm/yyyy.Если вы не укажете это явным образом, интерпретатор запросов Access будет читать его как mm/dd/yyyy, если день <= 12 (это может быть месяц). </p>

Лучший подход заключается виспользуйте формат для преобразования всех дат в SQL следующим образом:

SELECT * FROM tbl_details WHERE (tbl_details.DateTime) BETWEEN #" & format(startdate,"mm/dd/yyyy") & "#" And "#" & format(enddate,"mm/dd/yyyy") & "#;"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...