SQL Server查询,变量为MS Access子表单记录源

时间:2016-04-26 20:20:37

标签: sql-server access-vba

我正在尝试找出构建动态查询的最佳方法,并将其用作MS Access子表单的记录源。我现在已经静态分配了我的WHERE子句,因此我可以构建表单并确保数据正确拉动。主窗体将有2个格式为ShortDate的文本框和2个带有查询结果的子窗体。第一个子表单是按员工姓名分组的查询,第二个子表单是部门总计的总和。

FWIW这是Access 2010 ADP / ADE前端,SQL Server 2008后端。我目前的Dept总计SQL如下:

SELECT        COUNT(*) AS TotalNumEstimates, SUM(NumPanels) AS TotalNumPanels, SUM(PriceBase) AS TotalBasePrice, SUM(PriceBase) / SUM(NumPanels) AS ValuePricePerPanel 
FROM            dbo.tblBid 
WHERE        (Date > CONVERT(DATETIME, '2016-01-01 00:00:00', 102)) 
HAVING        (SUM(NumPanels) > 0)

我计划将WHERE子句更改为“WHERE Date BETWEEN @FromDate和@ToDate”。然后在设置日期并单击“运行报告”按钮时在Access窗体上,以编程方式设置OnClick事件以分别将txtFromDate和txtToDate传递给@FromDate和@ToDate,但我无法完全理解该部分。

我能看到的唯一其他选项是将整个SQL语句键入为在OnClick事件中声明的txtFromDate和txtToDate的字符串,并将子表单记录源更改为新字符串。有没有更好的方法来做这件事?

2 个答案:

答案 0 :(得分:0)

我相信我已经找到了通过创建存储过程将文本框传递给WHERE子句的初始问题。如果我无法使存储过程正常工作,我将重新发布,但这似乎很容易。

答案 1 :(得分:0)

使用[永久]临时表,然后在表单卸载时删除。如果多个用户同时使用该表单,您需要在名称中添加某种类型的会话号。所以:

SELECT COUNT(*) AS TotalNumEstimates, SUM(NumPanels) AS TotalNumPanels, SUM(PriceBase) AS TotalBasePrice, SUM(PriceBase) / SUM(NumPanels) AS ValuePricePerPanel 
INTO   dbo.TempSubFormTable    
FROM   dbo.tblBid 
WHERE  Date > '2016-01-01'
HAVING SUM(NumPanels) > 0

从子表单中删除记录源,并为其提供一个公共接口:

Public Sub SetRecordSource(tbl as string)
    Me.RecordSource = "SELECT * FROM tbl" 'ORDER BY ...
End Sub

然后,在创建临时表之前,使子表单不可见。创建临时表后,

Me.subformName.Visible = True
Me.subformName.SetRecordSource temporary_table_name 'without the dbo. part of the name