【发布时间】:2017-05-06 02:27:44
【问题描述】:
我坚持以下。我有一个存储过程,它以日期和经理 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
注意:ARCVTADMIN、ACT 是架构名称
当我在 SQL Server 中运行此存储过程时,它可以正常工作
Declare @D nVarchar(max);
EXECUTE ACT.sp_getAllocations @dtmReportDate = '20161220', @ManagerID = 91, @type=@D 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?在这种情况下,
Me是什么? frmTeamDashboardWorkstate 是子表单吗?您是否希望此记录集在表单打开的所有时间都在网络上保持打开状态?如果没有,那么您应该使用“断开连接”的记录集。在设置之前使用rst.CursorLocation = adUseClient(可能需要将Dim设置为New ADODB.Recordset才能做到这一点)。 -
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
@Skippy 感谢您的回复。以下是澄清...
-
@Skippy 从哪里调用 loadAllocation?**从 OnChange 事件组合框 (ManagerID)** 在这种情况下,我是什么? frmTeamDashboardWorkstate 的父窗体 frmTeamDashboardWorkstate 是子窗体吗? 是 您是否希望此记录集在表单打开的所有时间都通过网络保持打开状态?如果没有,那么您应该使用“断开连接”的记录集。 不确定,但只需要显示数据在设置之前使用 rst.CursorLocation = adUseClient(可能需要将其调暗为 New ADODB.Recordset 才能执行此操作)。**仍然没有运气**
-
@marc_s 谢谢你的建议,一旦我完成了这个问题,我会做一个快速的 CTRL + H 事情......
标签: sql-server ms-access stored-procedures vba ms-access-2010