2016-09-15 4 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 

私の思考はにIIf関数を使用することです

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」に基づいて、DescまたはPNの1つのみをプロンプトしたいと思います。 (注:[PN]の後に2番目のカンマを削除してください) – cixelsyd

+2

ロジックに関係なく、クエリを実行するには、Accessエンジンはすべての名前付きパラメータの値を知る必要があります。 @cixelsyd。 – Parfait

+1

。 。パフェは正しい。 MS Accessは、実行フェーズではなく、クエリのコンパイルフェーズ中に値の入力を求めています。 –

1

ワークフローを調整し、MS Accessのフォームなどの専用ユーザーインターフェイスを使用し、名前付きパラメータの値を受け取る標準​​的な方法ではない最適なデザインのクエリパラメータのポップアップには依存しないことを検討してください。

  1. DESC 、製品型番(P)説明(D)のための3つのテキストボックスのフォームを作成:、及びPIN:条件付きでリンクされた文字の長さのために検証することができる値(ロック/最初のボックスで表示されません)。

  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

関連する問題