2017-12-10 3 views
0

Ich rufe eine gespeicherte Prozedur mit einem Befehl auf. Ich erhalte das Ergebnis in einem Datensatz. Jetzt muss ich einige Berechnungen durchführen und muss daher die Anzahl der Datensätze wissen, die zurückgegeben wurden. RecordSet.RecordCount sollte mir das geben, aber nur -1 zurückgeben. Ich habe verschiedene Werte von CursorType und CursorLocation ausprobiert, versuchte MoveLast. Nichts hilft.VBA RecordSet.RecordCount = -1 bei Verwendung der gespeicherten Prozedur und Befehl

Ich machte eine temporäre Lösung, indem ich eine feste Anzahl für die Anzahl der Datensätze angenommen.

Es gibt viele Threads hier über RecordCount, und auch Artikel, die ich lese, aber nichts scheint zu helfen. Ist das Problem, dass ich einen Befehl verwende? Die meisten Beispiele, die ich sehe, benutzen keine Befehle.

Ich bin ein erfahrener Programmierer, aber nicht so an SQL und VBA gewöhnt. Wer kann mir helfen?

Mit besten Grüßen, Wolfgang

Sub CallStoredProcedure() 

Dim Conn As ADODB.Connection, RecordSet As ADODB.RecordSet 

Dim Command As ADODB.Command 
Dim ConnectionString As String, StoredProcName As String 
Dim LoginID As ADODB.Parameter, Entity_Id As ADODB.Parameter 

Application.ScreenUpdating = False 

Set Conn = New ADODB.Connection 
Set RecordSet = New ADODB.RecordSet 
Set Command = New ADODB.Command 

'w 
RecordSet.CursorType = adOpenStatic 
RecordSet.CursorLocation = adUseClient 


ConnectionString = "Provider=SQLOLEDB;Data Source=HIQARBL218\SQLEXPRESS;Initial Catalog=SweSalaryStore;Trusted_Connection=yes;" 

On Error GoTo CloseConnection 

Conn.Open ConnectionString 

StoredProcName = "dbo.getInfoFromSQLDB" 

With Command 
    .ActiveConnection = Conn 
    .CommandType = adCmdStoredProc 
    .CommandText = StoredProcName 
End With 

Set EMPNR = Command.CreateParameter("@EMPNR", adVarChar, adParamInput, 100, "107") 
Command.Parameters.Append EMPNR 

Set PERNR = Command.CreateParameter("@PERNR", adVarChar, adParamInput, 100, "1111110008") 
Command.Parameters.Append PERNR 

Set CMPNR = Command.CreateParameter("@CMPNR", adVarChar, adParamInput, 100, "5612") 
Command.Parameters.Append CMPNR 

Set PERIODFROM = Command.CreateParameter("@PERIODFROM", adVarChar, adParamInput, 100, "1001") 
Command.Parameters.Append PERIODFROM 

Set PERIODTO = Command.CreateParameter("@PERIODTO", adVarChar, adParamInput, 100, "1701") 
Command.Parameters.Append PERIODTO 

Set RecordSet = Command.Execute 


Sheets("Sheet1").Range("A5").CopyFromRecordset RecordSet 


'loop to get column headings. 
For i = 0 To RecordSet.Fields.Count - 1 
    Sheets("Sheet1").Cells(1, i + 1).Value = RecordSet.Fields(i).Name 
Next i 


'Calculate last row in RecordSet 
Dim lastRow As Integer 
lastRow = 2000 
'lastRow = RecordSet.RecordCount 'NOT WORKING!!! 

'Average OB 
Dim AvgOB As Double 
AvgOB = Excel.WorksheetFunction.Average(Range(Sheets("Sheet1").Cells(5, 2), Sheets("Sheet1").Cells(lastRow, 2))) 
AvgOB = Excel.WorksheetFunction.Round(AvgOB, 2) 
Sheets("Sheet1").Cells(2, 2).Value = AvgOB 
Sheets("Sheet1").Cells(3, 2).Value = AvgOB * 12 


RecordSet.Close 
Conn.Close 
On Error GoTo 0 
Application.ScreenUpdating = True 
Exit Sub 

CloseConnection: 
    Application.ScreenUpdating = True 
    MsgBox "SQL Stored Procedure Did Not Execute Sucessfully!", vbCritical, "SQL Error" 
    Conn.Close 

End Sub 

Antwort

0

Sie getan haben

Sheets("Sheet1").Range("A5").CopyFromRecordset RecordSet 

so an diesem Punkt die Anzahl der zurückgegebenen Datensätze ist die Anzahl der Zeilen von a5 besetzt unten:

Dim lastrow as long 'not integer! 
lastrow = Sheets("Sheet1").Range("A5").currentregion.rows.count + 4 

das Plus vier ist seit Sie in Zeile 5 beginnen

Verwandte Themen