2016-09-15 37 views
0

我想将提示用户输入的单独查询合并为单个查询。在用户输入的IIF中的SQL

Q1提示用户输入9位数ITEM(PN):

SELECT 
STUFF, 
MORE_STUFF 
FROM dbo_X 
WHERE (RIGHT(dbo_X.ITEM, 9)=[PN:]) 
ORDER BY dbo_X.COMPONENT 

Q2提示用户输入ItemDesc的一些部分(描述):

SELECT 
STUFF, 
MORE_STUFF 
FROM dbo_X 
WHERE dbo_x.ItemDesc LIKE '*'&[Description:]&'*' 
ORDER BY dbo_X.COMPONENT 

我的想法是使用I如果到根据用户输入执行单个WHERE语句:

SELECT 
STUFF, 
MORE_STUFF 
FROM dbo_X 
IIf ([Description{D}PartNumber{P}:]='D', 
    WHERE dbo_X.ItemDesc LIKE '*'&[Desc:]&'*', 
    WHERE (RIGHT(dbo_X.ITEM, 9)=[PN:])) 
ORDER BY dbo_X.COMPONENT 

当前不工作而不是s如果我有语法问题或正在尝试使用IIf /如果不正确。

回答

0

iif()是一个表达式,而不是一个子句。所以,你不能那样使用它。

在另一方面,你可以这样做:

SELECT STUFF, MORE_STUFF 
FROM dbo_X 
WHERE ([Description{D}PartNumber{P}:] = 'D' AND dbo_X.ItemDesc LIKE '*'&[Desc:]&'*') OR 
     ([Description{D}PartNumber{P}:] <> 'D' AND RIGHT(dbo_X.ITEM, 9) = [PN:])) 
ORDER BY dbo_X.COMPONENT; 

哦,甚至不要求iif()

顺便说一句,如果[Description{D}PartNumber{P}:]可能有NULL值(只需使用nz()函数),则表达式稍微复杂一点。

+0

试过了,但它仍然会提示所有3个输入。想要根据第一个输入'D'或'P'只提示1个Desc或PN。 (注意:在[PN]后删除第二个逗号) – cixelsyd

+2

无论逻辑如何,要运行查询,Access引擎需要知道所有命名参数的值,因此需要全部三个提示。 – Parfait

+1

@cixelsyd。 。 。 Parfait是正确的。 MS Access在查询的编译阶段提示输入值,而不是执行阶段。 –

1

考虑调整您的工作流程并使用专门的用户界面(如MS Access窗体),而不要依赖查询参数弹出窗口,这些弹出窗口在最佳设计中不是接收命名参数值的标准方式。,和PIN::

  1. 说明(d),部分号码(P)说明创建的三个文本框形式,其可为有条件地链接字符长度进行验证(锁定值/不可见)的第一个框。

  2. 保存两个查询指向表单控件:

    SELECT 
    STUFF, 
    MORE_STUFF 
    FROM dbo_X 
    WHERE (RIGHT(dbo_X.ITEM, 9)=Forms!myform![PN:]) 
    ORDER BY dbo_X.COMPONENT 
    
    SELECT 
    STUFF, 
    MORE_STUFF 
    FROM dbo_X   
    WHERE dbo_x.ItemDesc LIKE '*'& Forms!myform![Description:] &'*' 
    ORDER BY dbo_X.COMPONENT 
    
  3. 在相同的新形式,放置一个命令按钮来输出查询和具有经由VBA或宏按钮取决于描述调用相应的查询(D),PartNumber(P)。通过这种方法,所有参数都可以在窗体上满足,不会出现弹出窗口。

    If Forms!myform![Description(D), PartNumber(P)] = 'D' Then 
        DoCmd.OpenQuery "DescriptionQuery" 
    Else 
        DoCmd.OpenQuery "PinQuery" 
    End If 
    
+0

伟大的反馈,感谢所有! – cixelsyd