I have a slight issue retrieving multiple recordsets (with column names) and pasting the data into an Excel sheet, like the image below
The VBA code that I have just retrieves the first recordset but not the rest
Any help will be much appreciated, thank you
x
Sub CProcedure()
Dim Conn As ADODB.Connection, RecordSet As ADODB.RecordSet
Dim Command As ADODB.Command
Dim ConnectionString As String, StoredProcName As String
Dim range1 As ADODB.Parameter, range2 As ADODB.Parameter
Dim SP_Param1 As String
Dim SP_Param2 As String
Application.ScreenUpdating = False
Set Conn = New ADODB.Connection
Set RecordSet = New ADODB.RecordSet
Set Command = New ADODB.Command
ServerName = "1111"
DatabaseName = "dataReporting"
UserId = "88888"
Password = "88888"
SP_Param1 = "StartDate"
SP_Param2 = "EndDate"
StoredProcName = "KPI_Report"
ConnectionString = "PROVIDER=SQLOLEDB;DATA SOURCE=" & ServerName & _
";INITIAL CATALOG=" & DatabaseName & "; User Id=" & _
UserId & "; Password=" & Password & ";"
Conn.Open ConnectionString
With Command
.ActiveConnection = Conn
.CommandType = adCmdStoredProc
.CommandText = StoredProcName
.CommandTimeout = 0
End With
Set range1 = Command.CreateParameter(SP_Param1, adDBDate, adParamInput, , DateSerial(2018, 1, 1))
Command.Parameters.Append range1
Set range2 = Command.CreateParameter(SP_Param2, adDBDate, adParamInput, , DateSerial(2018, 4, 1))
Command.Parameters.Append range2
Set RecordSet = Command.Execute
Sheets("Sheet1").Range("A2").CopyFromRecordset RecordSet
RecordSet.Close
Conn.Close
On Error GoTo 0
Application.ScreenUpdating = True
Exit Sub
End Sub
Update
I added the below loop but still no luck
'Loop through recordset and place values
RecordSet.MoveFirst
Do While RecordSet.EOF = False
For i = 0 To RecordSet.Fields.Count - 1
ActiveCell.Value = RecordSet.Fields(i).Value
ActiveCell.Offset(0, 1).Activate
Next i
ActiveCell.Offset(1, -i).Activate
RecordSet.MoveNext
Loop
This is the stored procedure code:
Sub storedproc()
Dim Conn As ADODB.Connection
Dim ADODBCmd As ADODB.Command
Dim rs As ADODB.RecordSet
Dim i As Integer
Dim sConnect As String
ServerName = "1111"
DatabaseName = "dataReporting"
UserId = "88888"
Password = "88888"
SP_Param1 = "StartDate"
SP_Param2 = "EndDate"
StoredProcName = "KPI_Report"
sConnect = "PROVIDER=SQLOLEDB;DATA SOURCE=" & ServerName &
";INITIAL CATALOG=" & DatabaseName & "; User Id=" & UserId &
"; Password=" & Password & ";"
'Establish connection
Set Conn = New ADODB.Connection
Conn.ConnectionString = sConnect
Conn.Open
'Open recordset
Set ADODBCmd = New ADODB.Command
ADODBCmd.ActiveConnection = Conn
ADODBCmd.CommandText = StoredProcName
ADODBCmd.CommandType = adCmdStoredProc
ADODBCmd.CommandTimeout = 0
Set range1 = ADODBCmd.CreateParameter(SP_Param1, adDBDate, adParamInput, , DateSerial(2018, 1, 1))
ADODBCmd.Parameters.Append range1
Set range2 = ADODBCmd.CreateParameter(SP_Param2, adDBDate, adParamInput, , DateSerial(2018, 4, 1))
ADODBCmd.Parameters.Append range2
Set rs = ADODBCmd.Execute()
'Loop through recordset and place values
rs.MoveFirst
Do While rs.EOF = False
For i = 0 To rs.Fields.Count - 1
ActiveCell.Value = rs.Fields(i).Value
ActiveCell.Offset(0, 1).Activate
Next i
ActiveCell.Offset(1, -i).Activate
rs.MoveNext
Loop
'Clean up
rs.Close
Set rs = Nothing
End Sub
Advertisement
Answer
The answer of S Meaden mentioning the GetNextRecordSet
solves your issue having multiple recordsets as result of a stored proc.
The following code dumps all recordsets, including the field names, into a sheet (do not forget to cleanup the sheet first if you run it repeatedly).
Set rs = Command.Execute
Dim startcol As Long
startcol = 1
With ThisWorkbook.Sheets(1)
Do While Not rs Is Nothing
Dim col As Long
For col = 0 To rs.Fields.Count - 1
.Cells(1, startcol + col) = rs.Fields(col).Name
Next col
.Cells(2, startcol).CopyFromRecordset rs
startcol = startcol + rs.Fields.Count + 1
Set rs = rs.NextRecordset
Loop
End With