Значения ячеек Excel как динамические значения запроса - PullRequest
0 голосов
/ 13 июня 2019

В моем листе Excel у меня есть кнопка, которая запускает запрос SQL и возвращает результаты при взаимодействии часов. У меня есть две ячейки с именами StartDate и EndDate, которые отформатированы как входные ячейки. Я хочу, чтобы оператор просматривал столбец ActionDate и возвращал только результаты в пределах диапазона этих ячеек.

 Private Sub CommandButton1_Click()

 Dim cnn As New ADODB.Connection
 Dim rst As New ADODB.Recordset
 Dim ConnectionString As String
 Dim StrQuery As String
 Dim StartDate As Date  
 Dim EndDate As Date    

 StartDate = Sheets("Sheet1").Range("B5").Value  
 EndDate = Sheets("Sheet1").Range("B6").Value    
 cnn.Open ConnectionString
 cnn.CommandTimeout = 900

 StrQuery = "SELECT Employees.EmployeeID, Employees.First_Name, 
 Employees.Last_Name, EmployeeTimeCardActions.ActionTime, 
 EmployeeTimeCardActions.ActionDate, EmployeeTimeCardActions.ShiftStart, 
 EmployeeTimeCardActions.ActionType FROM Employees LEFT OUTER JOIN 
 EmployeeTimeCardActions ON 
 Employees.EmployeeID=EmployeeTimeCardActions.EmployeeID WHERE ActionDate 
 >StartDate  AND ActionDate <  EndDate ;"

 rst.Open StrQuery, cnn****

 Sheets(1).Range("D3").CopyFromRecordset rst
 End Sub

У меня есть синтаксическая ошибка на rst.Open StrQuery, cnn, я пометил ****.

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Просто используйте параметризацию с помощью объекта ADO Command , что исключает необходимость объединения или пунктуации данных.В частности, поместите qmarks ? в подготовленный оператор SQL без данных, который затем связывается с параметрами, содержащими ваши значения StartDate и EndDate .Обратите внимание, что при таком подходе набор записей создается из вызова Command.Execute (не Recordset.Open).

Private Sub CommandButton1_Click()    
    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim cmd As New ADODB.Command                       ' NEW VARIABLE
    Dim ConnectionString As String, StrQuery As String
    Dim StartDate As Date, EndDate As Date    

    StartDate = Sheets("Sheet1").Range("B5").Value  
    EndDate = Sheets("Sheet1").Range("B6").Value    
    cnn.Open ConnectionString
    cnn.CommandTimeout = 900

    StrQuery = "SELECT e.EmployeeID, e.First_Name, e.Last_Name, " _
               & "     t.ActionTime, t.ActionDate, t.ShiftStart, t.ActionType " _
               & " FROM Employees e " _
               & " LEFT OUTER JOIN EmployeeTimeCardActions t " _
               & "       ON e.EmployeeID = t.EmployeeID " _
               & " WHERE ActionDate > ?  AND ActionDate < ?;"

    With cmd
        .ActiveConnection = cnn
        .CommandText = StrQuery
        .CommandType = adCmdText
        .Parameters.Append .CreateParameter("str_param", adDate, adParamInput, , StartDate)
        .Parameters.Append .CreateParameter("end_param", adDate, adParamInput, , EndDate)

        Set rst = .Execute                           ' CREATES RECORDSET
    End With

    Sheets(1).Range("D3").CopyFromRecordset rst

    rst.Close: cnn.Close
    Set rst = Nothing: Set cmd = Nothing: Set cnn = Nothing
End Sub
0 голосов
/ 13 июня 2019

Измените строку запроса так, чтобы вы фактически ссылались на свои переменные:

StrQuery = "SELECT Employees.EmployeeID, Employees.First_Name, 
 Employees.Last_Name, EmployeeTimeCardActions.ActionTime, 
 EmployeeTimeCardActions.ActionDate, EmployeeTimeCardActions.ShiftStart, 
 EmployeeTimeCardActions.ActionType FROM Employees LEFT OUTER JOIN 
 EmployeeTimeCardActions ON 
 Employees.EmployeeID=EmployeeTimeCardActions.EmployeeID WHERE ActionDate 
 > '" & StartDate & "' AND ActionDate < '" & EndDate & "';"

Вам также может понадобиться свернуть даты в ' или # в зависимости от базы данных, которую вы запрашиваете.

Кстати, обычно лучше параметризовать строку запроса, чтобы избежать возможности внедрения SQL; тем более что ваш механизм ввода - это диапазон Excel. Пример

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