2017-12-10 5 views
0

コマンドを使用してストアドプロシージャを呼び出します。私はレコードセットで結果を受け取ります。今私はいくつかの計算を行う必要があるため、返されたレコードの数を知る必要があります。 RecordSet.RecordCountはそれを与えるはずですが、-1しか返しません。私はMoveLastを試して、CursorTypeとCursorLocationの異なる値を試しました。何も役立ちません。VBA RecordSet.RecordCount = -1ストアドプロシージャとコマンドを使用する場合

私は、レコード数の固定数を仮定して一時的な解決策を作成しました。

ここにはRecordCountについてのスレッドと記事がありますが、読んでも何も役立たないようです。私はコマンドを使用するという問題はありますか?ほとんどの例では、コマンドを使用していません。

私は経験豊富なプログラマーですが、SQLやVBAにはあまり使用されていません。私に助けを与えることができる人は誰ですか?

よろしく、 ヴォルフガング

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 

答えて

0

あなたはとてもその時点で返されたレコードの数がダウンA5から占有行の数です

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

をやった:

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

プラス4は、5行目から開始しているためです。

関連する問題