У меня неприятная проблема с EXCEL VBA, использующим набор записей ADODB. У меня есть запрос, который напрямую в Access работает правильно, но когда я помещаю его в VBA, набор записей всегда возвращается ноль. У меня есть другие запросы, которые работают, как и ожидалось, но что-то в этом типе запросов всегда не может вернуть результат в VBA, даже если он работает в Access.
Ниже приведена функция, отвечающая за выполнение запроса. Он построен для того, чтобы я мог делать подсчеты, и в аналогичной функции суммы в таблице ProjList. Первый запрос стиля используется там, где не должен использоваться флаг ограничения года (sYrIn = -1), и он работает как ожидалось.
Второй запрос стиля - это когда год в флаге содержит значение для ограничения количества или сумма к указанному c году. Наши идентификаторы проекта имеют форму X99-999, где первая позиция обозначает тип проекта, следующие две цифры обозначают год, в котором был открыт проект, а последние три цифры представляют собой уникальное увеличенное число, которое сбрасывается в 001 каждый год.
Здесь есть ряд строк, которые предназначены только для отладки обратной связи. Ниже кода я включил некоторые результаты отладки.
Я понимаю, что мы должны задать конкретный c вопрос, но у меня есть четыре, которые тесно связаны с этой ситуацией и примером кода, и не думаю, что так тесно связаны четыре поста - это хорошо. Мои вопросы о втором наборе запросов. Они никогда не работают в VBA.
1) Я неправильно читаю набор записей в этом случае?
2) Есть ли какое-то ограничение в «сложности» запроса, который может быть выполнен таким образом?
3) Почему первый запрос возвращается, а второй нет?
4) Есть ли лучший способ увидеть реальный запрос результат выполнения?
Опять все запросы работают в Access.
Примечание: в коде, который появляется, код поиска года жестко запрограммирован, так как фактический код использует текущий год и недостаточно данных для 2020 существует для значимости результата (0 - 0!)
Также есть два запроса для второго типа. Один закомментирован - он терпит тот же сбой в VBA и успех в Access.
Function GetDBProjCount(sCharIn As String, sFldIn As String, Optional sYrIn As Integer = -1) As Integer
Dim iResult As Integer
Dim sQryString As String
Dim sSearchChar As String
Dim pQryParam As Object
Dim sParamValA As String
Dim sParamValB As String
Dim iParamLenA As Integer
Dim iParamLenB As Integer
iResult = 0
Call MakeDBConnection
Set pQryParam = CreateObject("ADODB.Parameter")
If CInt(sYrIn) > 0 Then
If ((CInt(sYrIn) > 10) And (CInt(sYrIn) < 50)) Then
sYrIn = Right(sYrIn, 2)
ElseIf ((CInt(sYrIn) > 2010) And (CInt(sYrIn) < 2050)) Then
sYrIn = Right(sYrIn, 2)
Else
sYrIn = -1
End If
End If
If sYrIn < 0 Then
sQryString = "SELECT Count(*) FROM " & tblProjList & " WHERE Left(" & sFldIn & ", 1)=?;"
sParamValA = sCharIn
sParamValB = ""
iParamLenA = 1
iParamLenB = 1
Else
sQryString = "SELECT Count(*) FROM (Select * from [" & tblProjList & "] WHERE [" & garProjListFlds(4, 1) & "] Like ?) WHERE Left([" & sFldIn & "],1)=?;"
'sQryString = "SELECT Count(*) FROM [" & tblProjList & "] WHERE ((Left([" & sFldIn & "], 1)= ? ) AND ([" & garProjListFlds(4, 1) & "] LIKE ?));"
sParamValA = "*19-*" 'comment "'*" & CStr(sYrIn) & "-*'"
sParamValB = sCharIn
iParamLenA = 8
iParamLenB = 1
End If
If QDebugMode Then Debug.Print "GetDBProjCountA: " & sQryString
With goDBCmd
.ActiveConnection = goDBConn
.CommandText = sQryString
.CommandType = adCmdText
Set pQryParam = .CreateParameter("ParamA", adChar, , iParamLenA, sParamValA)
.Parameters.append pQryParam
If sYrIn > 0 Then
Set pQryParam = .CreateParameter("ParamB", adChar, , iParamLenB, sParamValB)
.Parameters.append pQryParam
End If
Set goDBRecSet = .Execute
End With
If QDebugMode Then Debug.Print ("GetDBProjCountB: Parameters: A: " & sParamValA & " B: " & sParamValB)
Dim msg, fld
For Each fld In goDBRecSet.Fields
msg = msg & fld.Value & "|"
Next
If QDebugMode Then Debug.Print ("GetDBProjCountC: Result: " & msg)
GetDBProjCount = goDBRecSet.Fields(0)
Call CloseDBConnection
End Function
Вот что я вижу в ближайшем окне:
GetDBProjCountA: SELECT Count(*) FROM ProjList WHERE Left(ProjArchiveFlag, 1)=?;
GetDBProjCountB: Parameters: A: O B:
GetDBProjCountC: Result: 45|
GetDBProjCountA: SELECT Count(*) FROM (Select * from [ProjList] WHERE [ProjCCID] Like ?) WHERE Left([ProjArchiveFlag],1)=?;
GetDBProjCountB: Parameters: A: *19-* B: O
GetDBProjCountC: Result: 0| (In Access this one returns 44)
Создан набор записей в подпрограмме MakeDBConection введите
Set goDBRecSet = New ADODB.Recordset
goDBRecSet.ActiveConnection = goDBConn
goDBRecSet.CursorLocation = adUseClient
goDBRecSet.CursorType = adOpenStatic
goDBRecSet.LockType = adLockPessimistic
Set goDBCmd = New ADODB.Command
Строка подключения: «Provider = Microsoft.ACE.OLEDB.12.0;» & "Источник данных =" & DBPath