Почему мой оператор SQL не находит соответствия с оператором WHERE ниже? - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь получить данные из моей базы данных MS Access с помощью инструкции Excel SQL.Он НЕ дает мне никаких ошибок, однако он также не извлекает данные, которые я ищу.

Если items(u, 1) является текстом (например, 308-203BL), то он работает отлично.

Я пробовал сравнивать их как текстовые, так и числовые, но ни в коем случае не находил совпадений, когда items(u, 1) равно 19310.

Это сравнивает его как текст ...

LEFT(Item," & Len(items(u, 1)) & ") = '" & items(u, 1) & "'"

это сравнивает его как числовое ...

VAL(LEFT(Item," & Len(items(u, 1))) & ") = " & items(u, 1)

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

items() - это массив, заполненный изТаблица с 1 столбцом на листе items = Range("Items").ValueTable Snip.
Используя эти два SKU в качестве примеров, первый работает, второй нет, массив будет выглядеть следующим образом.Pic of populated array.
SKU по SKU, они подаются в SQL, как показано ниже.

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

Поле для Item в БДэто короткий текст, поэтому я использовал '" & items(u, 1) & "'" для преобразования SKU в текст, когда пытался сопоставить его как текст, и Val() для преобразования поля в значение при попытке сопоставить его как число.Оба дали мне 0 записей в функции, но не дали ошибку типа данных.

Ниже приведена часть моего кода, которая определяет строку SQL, и немного послесловий, которые в основном вставляют ее в UDF.который извлекает информацию из БД и помещает ее в массив для меня.Помимо того, что не найдено совпадение, когда items(u,1) является числовым, оно прекрасно работает.

DBString = "SELECT Invoice, Line, Inv_Date, Sales_Order, SOLine, SO_Date, CustID, Item, Part_Description, Ship_Qty, Price, Ext_Sales FROM `" & Year(tabledate) & "-" & Format(tabledate, "mm") & "` WHERE Inv_Date BETWEEN #" & Sdate & "# AND #" & Edate & "# AND LEFT(Item," & Len(items(u, 1)) & ") = '" & items(u, 1) & "'"
SalesHolder = PullFromDB(DBString, SGMDB)

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

DBString = "SELECT Invoice, Line, Inv_Date, Sales_Order, SOLine, SO_Date, CustID, Item, Part_Description, Ship_Qty, Price, Ext_Sales FROM `" & Year(tabledate) & "-" & Format(tabledate, "mm") & "` WHERE Inv_Date BETWEEN #" & Sdate & "# AND #" & Edate & "# AND VAL(LEFT(Item," & Len(items(u, 1))) & ") = " & items(u, 1)
SalesHolder = PullFromDB(DBString, SGMDB)

Ниже приведен сам UDF, который извлекает информацию из БД.Это работает довольно хорошо.

Function PullFromDB(DBStr As String, DBLoc As String) As Variant
    Dim TheDB As Recordset, DBHolder() As Variant

    Set TheDB = OpenDatabase(DBLoc).OpenRecordset(DBStr)
    If TheDB.RecordCount = 0 Then GoTo theexit

    TheDB.MoveLast
    TheDB.MoveFirst

    ReDim DBHolder(0 To TheDB.RecordCount, 1 To TheDB.Fields.Count) As Variant

    For k = 1 To UBound(DBHolder, 2)
        TheDB.MoveFirst
        For j = 0 To UBound(DBHolder)
            If j = 0 Then
                DBHolder(j, k) = TheDB.Fields(k - 1).Name
            Else
                DBHolder(j, k) = TheDB.Fields(k - 1).Value
                TheDB.MoveNext
            End If
         Next j
    Next k

theexit:
    TheDB.Close
    Set TheDB = Nothing
    PullFromDB = DBHolder

On Error GoTo -1
End Function

Ожидаемый результат - заполнить массив SalesHolder информацией, соответствующей критериям.

Чего мне не хватает?Я ослеп, пытаясь найти его.

1 Ответ

0 голосов
/ 26 сентября 2019

Спасибо всем за ваши ответы на это, оказывается, я полностью искал не ту проблему.Код, который я разместил, был на самом деле корректным, проблема была с форматом поля Inv_Date в БД.Я ошибочно ввел последние пару месяцев в виде текста вместо даты, поэтому часть WHERE Inv_Date BETWEEN #" & Sdate & "# AND #" & Edate & "# моего SQL ничего не соответствовала.

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

Еще раз спасибо!

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