私は以下についています。私は、ResultSetを生成するためのパラメータとして、日付とマネージャIDを取るストアドプロシージャを持ってレコードセットを返さないストアドプロシージャ
CREATE PROCEDURE[ACT].[sp_getAllocations]
@dtmReportDate DATE,
@ManagerID BIGINT,
@type nvarchar(MAX) OUTPUT
AS
BEGIN
SELECT
ARCVTADMIN.tblEmployee.strFirstName + ' ' + ARCVTADMIN.tblEmployee.strSurname AS Name,
COUNT(ACT.tblActivity.employeeID) AS Workstate,
SUM(CASE WHEN ACT.tblactivity.statusTypeID = 4 AND ACT.tblActivity.dtmCompletedDate = @dtmReportDate THEN 1 ELSE 0 END) AS Completed,
SUM(CASE WHEN ACT.tblActivity.statusReasonID = 1 THEN 1 ELSE 0 END) AS NewLeads,
SUM(CASE WHEN ACT.tblContact.dtmLoggedDate = @dtmReportDate THEN 1 ELSE 0 END) AS Worked
FROM
ACT.tblContact
RIGHT OUTER JOIN
ACT.tblActivity ON ACT.tblContact.activityID = ACT.tblActivity.activityID
LEFT OUTER JOIN
ARCVTADMIN.tblEmployee ON ACT.tblActivity.employeeID = ARCVTADMIN.tblEmployee.employeeID
AND ACT.tblActivity.employeeID = ARCVTADMIN.tblEmployee.employeeID
AND ACT.tblActivity.employeeID = ARCVTADMIN.tblEmployee.employeeID
AND ACT.tblActivity.employeeID = ARCVTADMIN.tblEmployee.employeeID
GROUP BY
ARCVTADMIN.tblEmployee.strFirstName + ' ' + ARCVTADMIN.tblEmployee.strSurname,
ARCVTADMIN.tblEmployee.managerID
HAVING
(ARCVTADMIN.tblEmployee.managerID = @ManagerID)
END
NB:ARCVTADMIN、ACTは、スキーマ名で私のようなSQL Server内でそれを実行したときに
このストアドプロシージャが正常に動作します
Declare @D nVarchar(max);
EXECUTE ACT.sp_getAllocations @dtmReportDate = '20161220', @ManagerID = 91, @[email protected] out
Print @D
以下私はSQL Server内でそれを実行すると、ストアドプロシージャによって生成された結果である
Name Workstate Completed NewLeads Worked
===========================================================
Nikki Furnell 4999 0 3434 0
Harriet Johnson 10 0 0 0
Claire Rowe 138 0 17 0
Carina Hughes 4 0 0 0
私は結果セットを取得し、私のフォームに割り当てしようとしていると私は以下しようとしている
Public Function getSPRecordset(dtmReportDate As String, managerID As Long) As ADODB.Recordset
Dim strType As String
Dim rst As ADODB.Recordset
If Not (isConnectionOpen()) Then
OpenConnection
End If
Set ADOCom = New ADODB.Command
ADOCom.ActiveConnection = ADOConn
ADOCom.CommandType = adCmdStoredProc
ADOCom.CommandText = "[ACT].[sp_getAllocations]"
ADOCom.Parameters.Refresh
ADOCom.Parameters.Append ADOCom.CreateParameter("@dtmReportDate", adDate, adParamInput, 10, dtmReportDate)
ADOCom.Parameters.Append ADOCom.CreateParameter("@ManagerID", adBigInt, adParamInput, 10, managerID)
ADOCom.Parameters.Append ADOCom.CreateParameter("@type", adVarChar, adParamOutput, 10000, strType)
Set rst = ADOCom.Execute
Set getSPRecordset = rst
End Function
以下のように私はクラスモジュール内の関数を持っています。
Public Sub loadAllocation()
Dim objSS As clsSQLServer
Dim rst As ADODB.Recordset
Set objSS = New clsSQLServer
Set rst = objSS.getSPRecordset(Me.dtmReportDate, Me.managerID)
Set Me.frmTeamDashboardWorkstate.Form.Recordset = rst ***Error Line ****
set rst=nothing
End Sub
すべてのヘルプは
loadAllocationはどこから呼び出されていますか?この文脈で「私」とは何ですか? frmTeamDashboardWorkstateはサブフォームですか?フォームが開いている間、このレコードセットをネットワーク上で開いたままにしますか?そうでない場合は、「切断された」レコードセットを使用する必要があります。それを設定する前に 'rst.CursorLocation = adUseClient'を使用してください(これを行うには'新しいADODB.Recordset'としておそらく 'Dim'する必要があります)。 – Skippy
サイドノート:ストアドプロシージャのプレフィックス 'sp_'を**使用しないでください**。マイクロソフトは、[*ストアドプロシージャの名前付け*を参照してください](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx)、およびあなたはいつか名前衝突のリスクを将来実行します。 [ストアドプロシージャのパフォーマンスにも悪い](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)単に 'sp_'を避け、他の何かを接頭辞として使うのが最善です。 –
@Skippyご回答いただきありがとうございます。以下はその説明です... – Shallo