我正在尝试找出构建动态查询的最佳方法,并将其用作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的字符串,并将子表单记录源更改为新字符串。有没有更好的方法来做这件事?
答案 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