2016-12-20 10 views
0

私は以下についています。私は、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 

すべてのヘルプは

+0

loadAllocationはどこから呼び出されていますか?この文脈で「私」とは何ですか? frmTeamDashboardWorkstateはサブフォームですか?フォームが開いている間、このレコードセットをネットワーク上で開いたままにしますか?そうでない場合は、「切断された」レコードセットを使用する必要があります。それを設定する前に 'rst.CursorLocation = adUseClient'を使用してください(これを行うには'新しいADODB.Recordset'としておそらく 'Dim'する必要があります)。 – Skippy

+1

サイドノート:ストアドプロシージャのプレフィックス '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_'を避け、他の何かを接頭辞として使うのが最善です。 –

+0

@Skippyご回答いただきありがとうございます。以下はその説明です... – Shallo

答えて

0

OKを理解されるであろう、私はあなたがする必要があると思うことは...

まず、別のモジュールであなたのPublic Sub loadAllocation()であるか、それが親フォームのモジュールになっています?私は親フォームのモジュール内にPrivate Subとしてそれを持つことをお勧めします。

第2に、親フォームのモジュールでモジュールレベルの変数としてrstを宣言する必要があります。 loadAllocation()が実行された後は範囲内に留まる必要があります。だから、右モジュールの上部にある、任意のSubまたはFunction定義する前に、ちょうどOption Compare DatabaseOption Explicit後、

Private rst As ADODB.Recordset 

に追加それから私は

Private Sub loadAllocation() 
On Error GoTo PROC_ERR 

    Dim objSS As New clsSQLServer 

    Set rst = New ADODB.Recordset 
    rst.CursorLocation = adUseClient 
    Set rst = objSS.getSPRecordset(Me.dtmReportDate, Me.managerID) 
    'You could put some Debug.Print statements in here just to check that rst has retrieved some data' 
    If rst.State = adStateOpen Then 
     Set Me.frmTeamDashboardWorkstate.Form.Recordset = rst 
     frmTeamDashboardWorkstate.Form.Requery 
     rst.ActiveConnection = Nothing 
    End If 

PROC_EXIT: 
    'Put any clean-up code in here' 
    Exit Sub 

PROC_ERR: 
    'Put your preferred error handling code in here' 
    Resume PROC_EXIT 

End Sub 

メイクとしてあなた手順・コードを再でしょう(Form_Unloadイベントの)親フォームを閉じるときには必ずSet rst = Nothingをクリーンアップしてください。

0

32ビットまたは64ビットアクセスを使用していますか? 32ビットを使用している場合、bigintは64ビットで、32ビットのアクセスでは処理できません。

関連する問題