2016-09-15 9 views
0

Ich möchte separate Abfragen kombinieren, die zur Benutzereingabe in einer einzigen Abfrage aufgefordert werden.SQL WHERE in IIF mit Benutzereingabe

Q1 Fordert Benutzer 9-stellige ITEM (PN) ein:

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

Q2 Fordert Benutzer einen Teil von ItemDesc (Beschreibung) eingeben:

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

Mein Denken ist IIf zu verwenden Führen Sie eine einzelne WHERE-Anweisung basierend auf Benutzereingabe aus:

Derzeit nicht funktioniert und nicht s Wenn ich Probleme mit der Syntax habe oder versuche, IIf/If unsachgemäß zu verwenden.

Antwort

0

iif() ist ein Ausdruck, keine Klausel. Also, du kannst es nicht so benutzen.

Auf der anderen Seite können Sie tun:

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; 

Oh, und dass nicht einmal iif() erforderte.

Übrigens ist der Ausdruck ein bisschen komplizierter, wenn [Description{D}PartNumber{P}:] einen NULL Wert haben könnte (verwenden Sie einfach die nz() Funktion).

+0

dass versucht, aber es fordert nach wie vor für alle drei Eingänge. Möchte nur für 1 von Desc oder PN auf der Grundlage der ersten Eingabe "D" oder "P" fragen. (Hinweis: Entfernen Sie das zweite Komma nach [PN]) – cixelsyd

+2

Unabhängig von der Logik muss die Access-Engine zum Ausführen der Abfrage die Werte aller benannten Parameter kennen, daher alle drei Eingabeaufforderungen. – Parfait

+1

@cixelsyd. . . Parfait ist richtig. MS Access fordert während der Kompilierungsphase der Abfrage die Werte auf, nicht die Ausführungsphase. –

1

Überlegen Sie, Ihren Arbeitsablauf anzupassen und eine dedizierte Benutzerschnittstelle wie MS Access-Formulare zu verwenden und sich nicht auf Abfrageparameter-Popups zu verlassen, die im besten Design nicht die Standardmethode zum Empfangen von Werten benannter Parameter sind.

  1. Erstellen einer Form von drei Textfelder für Beschreibung (D), Part (P), Desc: und PIN: Werte, die für die Zeichenlänge validiert werden kann, bedingt verknüpft (gesperrt/nicht sichtbar) mit der ersten Box.

  2. Speichern beide Abfragen zeigen Kontrollen bilden:

    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. Auf der gleichen neues Formular, legen Sie eine Befehlsschaltfläche zum Ausgangsabfragen und haben auf diese Schaltfläche über VBA oder Makro die entsprechende Abfrage aufrufen je nach Beschreibung (D), Teilenummer (P). Und mit diesem Ansatz werden keine Pop-ups auftreten, da alle Parameter auf dem Formular erfüllt sind.

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

Tolles Feedback, danke an alle! – cixelsyd