Я пытаюсь вставить или обновить внешний лист, используя SQL с VBA. Ниже полный код функции. Ошибка возникает, когда я пытаюсь открыть набор записей в l oop, передавая запрос выбора sql. Любая помощь будет оценена. Я знаю, что строка подключения работает так же, как я использую ее в другом коде.
Строка SQL выглядит так:
select top 1 VALUENAME FROM [TradingTotals$] WHERE LOWER(VALUENAME)= LOWER('Trading') AND VALUEDATE =29/05/2020 AND CLOSINGMONTH = 'May' ORDER BY VALUEDATE DESC)
Код полной функции
Public Function InsertClosingMonthTotals(ByVal CollOfTradeLogTotObj As Collection) As Boolean
Dim IsSuccess As Boolean
Dim Item As TradeLogTotalsObj
Dim Sql As String
Dim SqlSelect As String
Dim ConnDbString As String
Dim TotalRecords As Long
Dim Name As String
Dim Value As Variant
Dim Trading As Variant
Dim LongShort As Variant
Dim Therms As Variant
Dim Valdate As Date
Dim ClosingMonth As String
ClosingMonth = Helper.FormatValue(Date, formatTypes.AsMonthlongOnly)
Set Glob_Conn = New ADODB.Connection
Set Glob_RecSet = New ADODB.Recordset
' Client-side cursor for correct return of record count
Glob_RecSet.CursorLocation = adUseClient
'Get Connection string according to the database server type
ConnDbString = Helper.GetConnectionString(ServerTypes.Excel, Glob_FilePathForDataInput)
'if the connection is closed then open it
If (Glob_Conn.State = 0) Then
Glob_Conn.Open (ConnDbString)
End If
For Each Item In CollOfTradeLogTotObj
Name = Item.Name
Value = Helper.FormatValue(Item.Value, AsNumber)
LongShort = Helper.FormatValue(Item.LongShort, AsDecimalThreeDigits)
Therms = Helper.FormatValue(Item.Therms, AsDecimalThreeDigits)
Valdate = Helper.FormatValue(Item.dateTime, AsDateDisplay)
SqlSelect = "select top 1 VALUENAME FROM [" & Glob_SheetNameTotalBooks & "$]" & _
" WHERE LOWER(VALUENAME)= LOWER(" & "'" & Name & "'" & ")" & " AND VALUEDATE =" & Valdate & _
" AND CLOSINGMONTH = " & "'" & ClosingMonth & "'" & _
" ORDER BY VALUEDATE DESC)"
Debug.Print ("SQL SELECT " & SqlSelect)
Debug.Print ("*************************************************************")
'open the record set
If (Glob_RecSet.State <> 1) Then
' ******* ERROR ON LINE BELOW ON OPEN **********
Glob_RecSet.Open SqlSelect, Glob_Conn, adOpenForwardOnly, adLockOptimistic
End If
TotalRecords = Glob_RecSet.RecordCount
If (TotalRecords > 0) Then
Sql = "UPDATE TradingTotals SET VALUENAME =" & "'" & Name & "'" & _
",VALUEDATE =" & Valdate & _
",VALUE =" & Value & _
",LONGSHORT =" & LongShort & _
",THERMS =" & Therms & _
",CLOSINGMONTH =" & "'" & ClosingMonth & "'" & _
" WHERE LOWER(VALUENAME) = LOWER(" & Name & ") AND VALUEDATE = " & Valdate & " AND CLOSINGMONTH =" & ClosingMonth
Else
Sql = "INSERT INTO " & Glob_SheetNameTotalBooks & " (VALUENAME,VALUEDATE,VALUE, LONGSHORT, THERMS, CLOSINGMONTH )" & _
" VALUES (" & "'" & Name & "'" & "," & Valdate & "," & Value & "," & LongShort & "," & Therms & "," & ClosingMonth & ")"
End If
Debug.Print ("SQL INSERT " & Sql)
Debug.Print ("*************************************************************")
Glob_Conn.Execute Sql
Next Item
'cleanup
Helper.CloseConnectionObjects Glob_RecSet, Glob_Conn
InsertClosingMonthTotals = IsSuccess
End Function
![enter image description here](https://i.stack.imgur.com/iVQLz.png)
EDIT этот запрос работает
SQL SELECT select TOP 1 VALUENAME FROM [TradingTotals$] WHERE LOWER(VALUENAME) ='Trading'
и кажется, что проблема связана с LOWER (); Кто-нибудь знает, нельзя ли LOWER () использовать в запросах Excel?
EDIT 2
кажется, что это просто вопрос «правильного» написания запроса в Excel ; этот ниже работает. В предыдущем запросе также было дополнительное ")" в конце запроса
SQL SELECT select top 1 VALUENAME FROM [TradingTotals$] WHERE VALUENAME= 'Trading' AND VALUEDATE ='29/05/2020' AND CLOSINGMONTH = 'May' ORDER BY VALUEDATE DESC
Я пытаюсь снова использовать LOWER ()
EDIT 3 LOWER () не работает, по крайней мере, так, как я использую его в VBA;
SQL SELECT select top 1 VALUENAME FROM [TradingTotals$] WHERE LOWER(VALUENAME)='Trading' And ValueDate = '29/05/2020' AND CLOSINGMONTH = 'May' ORDER BY VALUEDATE DESC
Я также пробовал использовать двойные кавычки для литералов