пытается обновить или вставить записи во внешний лист Excel с помощью запроса SQL - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь вставить или обновить внешний лист, используя 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

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

Я также пробовал использовать двойные кавычки для литералов

1 Ответ

0 голосов
/ 29 мая 2020

Итак, в конце были разные проблемы, но в основном из-за неправильного синтаксиса запроса, поскольку я пишу SQL, как при запросе SQL сервера; еще не освоил синтаксис запросов Excel.

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

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

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