Я пытаюсь получить данные из моей базы данных 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").Value
.
Используя эти два SKU в качестве примеров, первый работает, второй нет, массив будет выглядеть следующим образом..
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 информацией, соответствующей критериям.
Чего мне не хватает?Я ослеп, пытаясь найти его.