2016-01-19 56 views
0

我有一个连接到存储所有数据的SQL Server的传统VB6应用程序。我正在为用户创建一个报告,我需要传递两个日期(FROM和TO)。在SQL Server中,我创建了几个满足我所有条件的视图,并使用这些数据填充dbo.tblTempTable(实际上并不是#tempTable,而是普通表)。目前这些日期是硬编码的,我正在努力寻找一种传递这些日期的方法。我很确定我无法将参数传递给视图。要填充我有一个简单的存储过程是这样的表....使用来自SQL Server的数据在Access中生成报告?

TRUNCATE TABLE dbo.tbl_TTableReport 

INSERT INTO tbl_TTableReport (UserID, CompanyID, CompanyName, Sold, Voided, Returned, Subtotal) 
    SELECT   
     1234 AS USERID, CompanyID, CompanyName, 
     Sold, Voided, Returned, Subtotal 
    FROM dbo.vCompanyInfo 

所以在这个select语句,每一个数据都来自于我的最终意见..vCompanyInfo。 Sold,Voided和Returned需要按FROM和TO日期过滤。我会如何做这样的事情?

EDITED。我试图创建一个存储过程,但我得到了一些奇怪的错误......我从来没有创建一个复杂的多SELECT语句SP之前,所以我仍然试图找出扭曲。

这是我trynig建立与选择语句的SP,但我一直看到相同的错误:子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

TRUNCATE TABLE dbo.tbl_TTableReport 

INSERT INTO tbl_TTableReport 
(UserID 
, CompanyID) 
, CompanyName) 
SELECT 1234 AS USERID 
,(Select CompanyID from dbo.tblMainInv) 
,(select CompanyName from dbo.tblCompanies) 

对于这两种CompanyID和公司名称有大约30的值。我试图让他们加载到表中,我不知道我的错误在哪里。

+0

为什么不能只使用带有where子句的select查询将需要的数据直接提取到客户端应用程序? –

+0

@BrianPressler我编辑了这个问题。请看 – barry17

+0

您的编辑不回答我的问题......它只会提出更多问题。为什么你需要临时表?您可以将报表的数据源设置为:SELECT 1234 AS USERID,CompanyID,CompanyName,Sold,Voided,Returned,Subtotal FROM dbo.vCompanyInfo其中<开始日期参数>和<结束日期参数>之间出售...等 –

回答

1

我建议您创建一个ADP Access project to connect to your SQL Server database。这使您可以更多地控制发送到Sql Server的查询以获取报告和数据输入表单。在创建项目文件时,您需要指定您需要连接的服务器和数据库。然后,为报告设置数据源非常简单,只需将针对数据库的select语句包括到报告的数据源中即可。您也可以参考表格上的文本框或自动提示参数。

至于您在编辑中遇到的第二个查询中出现的错误...您正在使用子查询作为表达式。 SQL Server在让你使用子查询作为在你的select语句中输出的值之一方面很不错,但它只是期望......一个值。所以你可以这样做:

Select 
    (select count(*) from MyTableValues) as CountTotal, 
    (select sum(*) from MyTableValues) as SumTotal 

但是,当SQL Server希望你只返回一个时,你要做的是返回几行。如果你想加入两个表的数据,您可以使用join ...类似:

SELECT 1234 AS USERID, CompanyID, CompanyName 
from dbo.tblMainInv 
join dbo.tblCompanies 
on tblMainInv.CompanyID = tblCompanies.CompanyID 

这可能是东西,你的看法dbo.vCompanyInfo可能已经样子。

如果您决定使用临时表格方式(尽管我强烈建议您重新考虑,因为您只是为将来的维护工作做更多工作)...这是东西,你的过程可能是这样的:

GO 
CREATE PROCEDURE sp_LoadReportData 
(
    @UserID as int, 
    @StartDate as datetime, 
    @EndDate as datetime 
) AS 

delete from tbl_TTableReport 
where USERID = @UserID 

INSERT INTO tbl_TTableReport 
    (UserID, CompanyID, CompanyName, Sold, Voided, Returned, Subtotal) 
SELECT   
    @UserID AS USERID, 
    CompanyID, 
    CompanyName, 
    Sold, 
    Voided, 
    Returned, 
    Subtotal 
FROM vCompanyInfo 
where 
    Sold between @StartDate and @EndDate 
    and Voided between @StartDate and @EndDate 
    and Returned between @StartDate and @EndDate 

GO 

你可以这样调用你想要的过滤器的过程,并发送UserID因为像这样的参数:

exec sp_LoadReportData 1234, '1/1/2016', '1/20/2016' 

但是,这仍然没有按”不能解决你的问题......因为你仍然需要发送UserID作为参数在报表中的数据源,如:

select * from tbl_TTableReport where UserID=1234 

UNL您希望为每个用户创建一个表格和程序,您应该重新考虑您的策略并学习如何以标准方式进行操作。

+0

谢谢。是的,我基本上使用视图来获取所有信息。我只是试图测试它,如果它能工作。我只需要从一个视图中提取数据以填充此临时表,并带有2个参数.... FROM和TO – barry17

+0

已更新我的答案,以向您展示如何使用参数创建过程。 –

+0

非常感谢@Brian Pressler。我忘了提一件事。我的最终VIEW ..... vCompanyInfo是多个查询的结果。现在出售,VOIDED和RETURNED我有个人查询,其中我实际筛选2个日期(硬编码)。 vCompanyInfo只有值,我做TRANSDATE过滤在他们自己的个人查询。 (出售,无效,退回)。 – barry17

相关问题