我处理的问题似乎无法解决。我有一个Access查询,我根据单个文本框值的条件检查多个列。前3列的一切都很好用。他们是所有的字符串。
SELECT Req.Ctrl, Vend.VendNick, Req.CSCReq, Req.PO, Req.Status, Line.Quote
FROM Line INNER JOIN (Vend INNER JOIN Req ON Vend.[VendID] = Req.[Vend])
ON Line.Ctrl = Req.Ctrl
WHERE (((Req.CSCReq)=[Forms]![Index]![Box2])) OR
(((Req.PO)=[Forms]![Index]![Box2])) OR
(((Line.Quote)=[Forms]![Index]![Box2]));
当我添加第4列时,我收到错误"表达式输入错误,或者它太复杂了......"
SELECT Req.Ctrl, Vend.VendNick, Req.CSCReq, Req.PO, Req.Status, Line.Quote
FROM Line INNER JOIN (Vend INNER JOIN Req ON Vend.[VendID] = Req.[Vend])
ON Line.Ctrl = Req.Ctrl
WHERE (((Req.CSCReq)=[Forms]![Index]![Box2])) OR
(((Req.PO)=[Forms]![Index]![Box2])) OR
(((Line.Quote)=[Forms]![Index]![Box2])) OR
(((Req.Ctrl)=[Forms]![Index]![Box2]));
我假设这是因为第4列是int,并且访问没有为此特定列正确定义文本框值的参数。有没有什么办法可以在查询的列级别或sql中解决这个问题,以便前3个仍然将值视为字符串,但是第4个将值视为int?
感谢您的帮助
答案 0 :(得分:1)
而是将您的列转换为字符串,以便将表中的每一行与文本框值进行比较,使用CInt
执行相反的操作。它会更有效率:
(((Req.Ctrl)=CInt([Forms]![Index]![Box2])));
答案 1 :(得分:0)
我将你的两个答案和一个小谷歌结合起来,帮助我到达我想去的地方。非常感谢您的快速反应。 Ted的回答使第4列发挥作用,但其他3列开始失败并出现同样的错误。 JohnHC的做法也是如此。以下是最终奏效的内容。
SELECT Req.Ctrl, Vend.VendNick, Req.CSCReq, Req.PO, Req.Status, Line.Quote
FROM Line INNER JOIN (Vend INNER JOIN Req ON Vend.[VendID] = Req.[Vend])
ON Line.Ctrl = Req.Ctrl
WHERE (((Line.Quote)=[Forms]![Index]![Box2])) OR
(((Req.PO)=[Forms]![Index]![Box2])) OR
(((Req.CSCReq)=[Forms]![Index]![Box2])) OR
(((CVar([Req].[Ctrl]))=[Forms]![Index]![Box2]));
出于某种原因,CVar让一切都开始点击......不知道为什么,但它确实有效。
答案 2 :(得分:-1)
使用STR()函数:
str(Req.Ctrl)=[Forms]![Index]![Box2]
顺便说一句,我讨厌MS Access及其过度使用括号......