设置Access窗体Filter时出现‘查询表达式语法错误’的问题
问题原因及解决方法
问题出在Access表单的Filter属性不支持嵌套子查询——虽然直接写SELECT语句时Access查询引擎允许用子查询,但表单的Filter属性语法限制更严格,只能用简单的条件表达式,不能包含SELECT ...这种嵌套查询。
给你三个可行的解决办法:
方法1:把子查询结果转成IN列表
先执行子查询拿到所有符合条件的ID,拼成逗号分隔的列表,再用IN语法作为Filter条件:
Dim rs As DAO.Recordset Dim strIDs As String Dim strWhere As String ' 执行子查询获取符合条件的OrderFID Set rs = CurrentDb.OpenRecordset("SELECT [Job Orders].OrderFID FROM [Job Orders] WHERE [Job Orders].BillJobFID=1324") If Not rs.EOF Then rs.MoveFirst ' 拼接ID列表 Do While Not rs.EOF strIDs = strIDs & "," & rs!OrderFID rs.MoveNext Loop ' 去掉开头多余的逗号 strIDs = Mid(strIDs, 2) ' 组装Filter条件 strWhere = "[ID] IN (" & strIDs & ")" End If rs.Close Set rs = Nothing ' 应用筛选 With frm .Filter = strWhere .FilterOn = True .OrderBy = strOrderBy .OrderByOn = True End With
方法2:改用INNER JOIN的查询作为表单数据源
直接把筛选逻辑做成关联查询,替换表单的RecordSource,不需要用Filter:
With frm ' 动态设置数据源,包含筛选和关联逻辑 .RecordSource = "SELECT Orders.* FROM Orders INNER JOIN [Job Orders] ON Orders.ID = [Job Orders].OrderFID WHERE [Job Orders].BillJobFID=1324" .OrderBy = strOrderBy .OrderByOn = True ' 不需要再开FilterOn End With
如果需要复用这个查询,也可以在Access里创建一个预定义查询,直接把表单的RecordSource设为这个查询名称。
方法3:用DAO记录集筛选后绑定表单
先筛选出符合条件的记录集,再绑定到表单:
Dim rs As DAO.Recordset Dim strSQL As String strSQL = "SELECT * FROM Orders WHERE [ID] IN (SELECT [Job Orders].OrderFID FROM [Job Orders] WHERE [Job Orders].BillJobFID=1324)" Set rs = CurrentDb.OpenRecordset(strSQL) With frm ' 绑定筛选后的记录集 .Recordset = rs .OrderBy = strOrderBy .OrderByOn = True End With Set rs = Nothing
内容的提问来源于stack exchange,提问作者BWhite
相关产品推荐
相关产品推荐

