Почему мое утверждение where не дает результатов? - PullRequest
0 голосов
/ 07 февраля 2019

Я использую Excel VBA для извлечения данных из базы данных Access.Мои операторы «Выбрать» и «От» работают нормально.Когда я добавляю оператор «Где», я не получаю результатов.Вы можете помочь?!

Dim SDATE As String
Dim EDATE As String
Dim SQLstring As String

SDATE = Application.InputBox("Beginning Date", "Date 1", Format(Date - 31, "MM-DD-YY"))
EDATE = Application.InputBox("Ending Date", "Date 2", Format(Date, "MM-DD-YY"))

SQLstring = "SELECT tblitemhistory.HistDate, tblstockitems.MasterPNo, tblstockitems.ItemDescription, tblitemhistory.HistType, tblitemhistory.HistText, tblitemhistory.HistQty " & _
            "FROM tblitemhistory INNER JOIN tblstockitems ON tblitemhistory.StockID = tblstockitems.ItemID" & _
            "where (((tblitemhistory.HistDate)  between #" & [SDATE] & "# AND #" & [EDATE] & "#"""

getSQLString = SQLstring

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

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

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

Следовательно, рассмотрите две корректировки:

  1. Удалите любое форматирование и попросите пользователя ввести дату в любом регионе, в котором он находится, и скорректировать даты по умолчанию своего ЦПУ.

  2. Использование параметризации с MS Access ' QueryDefs в отличие от конкатенации SQL в VBA, как показано ниже для соединения DAO.

Sub RunQuery()
    Dim SDATE As Date, EDATE As Date
    Dim SQLstring As String
    Dim conn As Object, db As Object, qdef As Object

    SDATE = Application.InputBox("Beginning Date", "Date 1", Date - 31)   ' REMOVE Format()
    EDATE = Application.InputBox("Ending Date", "Date 2", Date)           ' REMOVE Format()

    Set conn = CreateObject("DAO.DBEngine.120")
    Set db = conn.OpenDatabase("C:\Path\To\Database.accdb")

    ' PREPARED STATEMENT (NO DATA) - CAN BE SAVED IN MS ACCESS AS QUERY OBJECT
    SQLstring = "PARAMETERS [Prm_SDATE] Date, [Prm_EDATE] Date;" & _
                "SELECT i.HistDate, s.MasterPNo, s.ItemDescription," & _
                "       i.HistType, i.HistText, i.HistQty " & _
                "FROM tblitemhistory i " & _
                "INNER JOIN tblstockitems s ON i.StockID = s.ItemID" & _
                "WHERE i.HistDate BETWEEN [Prm_SDATE] AND [Prm_EDATE];"

    ' BIND PARAMETERS
    Set qdef = db.CreateQueryDef("", SQLstring)
    qdef![Prm_SDATE] = SDATE
    qdef![Prm_EDATE] = EDATE

    ' OPEN RECORDSET
    Set rst = qdef.OpenRecordset

    ' DUMP OUTPUT TO EXCEL SHEET
    Worksheets("Sheet1").Range("A1").CopyFromRecordset rst

    rst.Close: db.Close        
    Set qdef = Nothing: Set db = Nothing: Set conn = Nothing
End Sub
0 голосов
/ 07 февраля 2019

Попробуйте снять скобки с [SDATE] и [EDATE].Это синтаксис SQL, а не VBA.

Возможно, вы захотите изменить свой формат на мм / дд / гггг, региональная интерпретация дат может вызвать головную боль.

См. Это:

https://bytes.com/topic/access/insights/575420-literal-datetimes-their-delimiters

** Править **

Я только что понял, что ты не прекращаешь все эти прощения: (((tblitemhistory.HistDate).Вам не нужно ни одного из них.Кроме того, наличие 3 кавычек в конце добавляет к концу вашего запроса кавычку, которая вам, вероятно, не нужна, попробуйте "where tblitemhistory.HistDate BETWEEN #" & SDATE & "# AND #" & EDATE & "#"

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