我正试图在MS Access中创建一个直通查询,该查询将连接到SQL server,并使用表单中的组合框作为WHERE语句部分的筛选参数。
我知道连接和一切工作,因为如果我进入
SELECT * FROM mrch.Promo_Request_Base
我收到了所有的结果。
现在,当我尝试输入类似的内容时
SELECT * FROM mrch.Promo_Request_Base WHERE mrch.Promo_Request_Base.Requestor_Name = 'UserABC';
那么它也起作用。
如果我像这样输入SQL,它对我不起作用:
SELECT *
FROM mrch.Promo_Request_Base
WHERE (((mrch.Promo_Request_Base.Requestor_Name) = [Forms]![f_PromoRequest_VIEW_Header_001a]![Combo133]));
我也试过这个:
SELECT *
FROM mrch.Promo_Request_Base
WHERE (((mrch.Promo_Request_Base.Requestor_Name) = [Forms]![f_PromoRequest_VIEW_Header_001a]![Combo133].Columns(0)));
[Combo133]中包含值"UserABC"。
如果你能帮助我,我将不胜感激。
您没有。
传递查询按原样传递给数据源,Access根本不会对其进行解析。这意味着无法在传递查询中使用基于表单的参数。
相反,请使用VBA来设置参数。
有关如何执行此操作的信息,请参阅如何在Microsoft Access的不同上下文中使用VBA中的参数?。具体来说,关于DAO的部分适用于传递查询。
这也意味着您无法打开查询进行显示。使用VBA在数据表视图中使用窗体设置自己的记录集。请注意,如果记录集需要重新查询参数,这可能会导致排序/筛选出现问题。
传递查询意味着它在服务器端执行。该服务器不能再去查看访问和提取数据,然后去尝试窃取你电脑上的所有电子邮件或财务数据。
简单的解决方案是在将表达式发送到sql server之前对其进行"处理"或"评估"。您可以使用以下内容:
Dim strSQL As String
strSQL = "SELECT * From mrch.Promo_Request_Base " & _
"WHERE mrch.Promo_Request_Base.Requestor_Name = '" & _
[Forms]![f_PromoRequest_VIEW_Header_001a]![Combo133] & "'"
With CurrentDb.QueryDefs("qryPass")
.SQL = strSQL
End With
' now code here to open form, or say launch report
DoCmd.OpenReport "rptPromoList", acViewPreview
请注意,您必须确保服务器端的sql格式正确。
所以,在上面,我假设Requestor_Name是一个文本类型的字段。所以,这意味着你必须在表达式周围加引号(我用的是单引号(。如果你从组合框中得到的列是一个数字,那么不需要引号,你可以使用这个:
strSQL = "SELECT * From mrch.Promo_Request_Base " & _
"WHERE mrch.Promo_Request_Base.Requestor_Name = " & _
[Forms]![f_PromoRequest_VIEW_Header_001a]![Combo133]
所以其他代码也是一样的——上面唯一的变化是我省略了在表达式周围添加引号('(的做法。
非常感谢您的帮助。
最后,我的做法有所不同。我正在通过VBA更改PassTrough查询:
Private Sub Command159_Click()
Dim db As dao.Database
Set db = CurrentDb
Dim qdf As dao.QueryDef
Set qdf = db.QueryDefs("q_PassThrough_VIEW_001a")
qdf.SQL = "SELECT * From mrch.Promo_Request_Last_Version_rpt_v " & _
"WHERE mrch.Promo_Request_Last_Version_rpt_v.F_Qtr_CD LIKE '" & _
[Forms]![f_PromoRequest_VIEW_Header_001a]![Combo145] & "%'"
qdf.Close
db.Close
Set qdf = Nothing
Set db = Nothing
End Sub