Access查询筛选逾期10天记录时遇参数输入请求问题求助
Access查询筛选逾期10天记录的问题解决
问题原因
你在筛选条件中直接引用了同一查询里的计算字段DueDate,但Access的查询执行顺序是先处理筛选条件,再计算自定义字段。此时条件里的DueDate还未被计算生成,Access会将其识别为未定义的参数,因此弹出输入窗口。
解决方案
方案1:直接在筛选条件中嵌入完整判断逻辑
无需依赖DueDate和OverdueBy10计算字段,直接在查询的任意字段条件行中写入完整的逾期判断表达式,设置条件为True即可:
IIf([Priority]="0-Urgent", DateDiff("d", DateAdd("d", -365, [Received]), Date()) - 365 >=10, DateDiff("d", DateAdd("d", Switch([Priority]="A - 24 hours",1,[Priority]="A- 24 hours",1,[Priority]="B - 72 hours",3,[Priority]="B- 72 hours",3,[Priority]="C - 5 working days",5,[Priority]="C- 5 days",5,[Priority]="D > 5 working days",14,[Priority]="D > 5 days",14,[Priority]="0-Urgent",-365), [Received]), Date()) >=10)
方案2:通过子查询先计算字段再筛选
先创建子查询生成DueDate和OverdueBy10,再在外层查询中筛选符合条件的记录:
- 新建查询,输入以下SQL并保存(命名为
qry_WithDueDate):
SELECT *, DateAdd("d",Switch([Priority]="A - 24 hours",1,[Priority]="A- 24 hours",1,[Priority]="B - 72 hours",3,[Priority]="B- 72 hours",3,[Priority]="C - 5 working days",5,[Priority]="C- 5 days",5,[Priority]="D > 5 working days",14,[Priority]="D > 5 days",14,[Priority]="0-Urgent",-365),[Received]) AS DueDate, IIf([Priority]="0-Urgent",IIf(DateDiff("d",[DueDate],Date())-365>=10,"Yes",""),IIf(DateDiff("d",[DueDate],Date())>=10,"Yes","")) AS OverdueBy10 FROM 你的表名;
- 新建查询基于
qry_WithDueDate,设置OverdueBy10的条件为="Yes",即可得到目标记录。
方案3:VBA动态生成查询(可选)
如果需要灵活控制查询生成,可使用VBA代码创建带筛选的查询:
Sub CreateOverdueQuery() Dim qdf As QueryDef Dim sqlStr As String ' 删除已存在的同名查询 On Error Resume Next CurrentDb.QueryDefs.Delete "qry_Overdue10Days" On Error GoTo 0 ' 构建包含子查询的SQL语句 sqlStr = "SELECT * FROM (" & _ "SELECT *, " & _ "DateAdd('d',Switch([Priority]='A - 24 hours',1,[Priority]='A- 24 hours',1,[Priority]='B - 72 hours',3,[Priority]='B- 72 hours',3,[Priority]='C - 5 working days',5,[Priority]='C- 5 days',5,[Priority]='D > 5 working days',14,[Priority]='D > 5 days',14,[Priority]='0-Urgent',-365),[Received]) AS DueDate, " & _ "IIf([Priority]='0-Urgent',IIf(DateDiff('d',[DueDate],Date())-365>=10,'Yes',''),IIf(DateDiff('d',[DueDate],Date())>=10,'Yes','')) AS OverdueBy10 " & _ "FROM 你的表名) AS SubQ " & _ "WHERE SubQ.OverdueBy10 = 'Yes'" ' 创建并保存查询 Set qdf = CurrentDb.CreateQueryDef("qry_Overdue10Days", sqlStr) Set qdf = Nothing ' 打开查询查看结果 DoCmd.OpenQuery "qry_Overdue10Days" End Sub
替换代码中的你的表名为实际表名,运行宏即可自动生成筛选后的查询。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

