MS-Access参数化查询图表:自动传入父报表日期参数问题
解决方案:将父报表起止日期传入Access图表参数化查询
方法1:直接在图表行源中引用父报表控件
现代图表的行源可直接引用父报表的控件值,无需依赖临时表。修改图表行源为参数化查询,直接调用父报表的startDate和endDate控件:
SELECT Format([DateAndTime]," mm/dd hh:nn") AS Expr1, Avg([Vaccum]) AS VAC, AVG([Pressure]) AS PRESSURE, AVG([Temp]) AS [ACTUAL TEMPERATURE] FROM [trendData] WHERE [DateAndTime] Between Reports!父报表名称!startDate And Reports!父报表名称!endDate GROUP BY Format([DateAndTime]," mm/dd hh:nn") ORDER BY Format([DateAndTime]," mm/dd hh:nn");
若图表位于子报表内,引用路径需调整为:Reports!父报表名称!子报表控件名称.Form.startDate
注意:需确保父报表在图表加载时已完全初始化,控件值处于可用状态。
方法2:通过报表事件动态修改图表行源
若直接引用控件存在加载顺序问题,可在父报表的Detail_Format事件中动态更新图表行源,传入起止日期参数:
Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer) Dim chartObj As Object Dim sqlStr As String Dim startDt As Date, endDt As Date startDt = Me.startDate.Value endDt = Me.endDate.Value ' 获取图表对象(假设子报表控件名为ChartSubReport,图表控件名为Chart0) Set chartObj = Me.ChartSubReport.Report.Chart0 ' 构建带日期过滤的SQL语句 sqlStr = "SELECT Format([DateAndTime],' mm/dd hh:nn') AS Expr1, " & _ "Avg([Vaccum]) AS VAC, AVG([Pressure]) AS PRESSURE, AVG([Temp]) AS [ACTUAL TEMPERATURE] " & _ "FROM [trendData] " & _ "WHERE [DateAndTime] Between #" & Format(startDt, "yyyy-mm-dd hh:nn:ss") & "# And #" & Format(endDt, "yyyy-mm-dd hh:nn:ss") & "# " & _ "GROUP BY Format([DateAndTime],' mm/dd hh:nn') " & _ "ORDER BY Format([DateAndTime],' mm/dd hh:nn');" ' 更新图表行源并重新查询 chartObj.RowSource = sqlStr chartObj.Requery End Sub
方法3:优化现有临时表方案
若必须保留临时表逻辑,可在生成临时表时直接过滤日期范围,减少后续查询的处理成本:
修改Report_Load事件中的SQL语句,加入日期过滤参数:
qdf.SQL = "SELECT * INTO [" & tempTableName & "] FROM [trendData] WHERE [DateAndTime] Between ? And ?" qdf.Parameters(0).Value = startDate qdf.Parameters(1).Value = endDate
修改后临时表仅包含指定日期范围内的数据,图表行源可继续使用现有查询,无需额外调整。
关键注意事项
- 日期值在SQL中需用
#包裹,且统一使用yyyy-mm-dd hh:nn:ss格式,避免区域格式差异导致的错误。 - 若使用子报表,需确保
LinkMasterFields和LinkChildFields配置正确,或在父报表事件中触发子报表的重新查询。 - 现代图表的参数化功能需Access 2016及以上版本支持,请确认当前Access版本兼容性。
内容的提问来源于stack exchange,提问作者Dadams
相关产品推荐
相关产品推荐

