Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Abfrage verlangt Parametereingabe (Nach Variablenübergabe)

Begonnen von joerg_w, Oktober 06, 2010, 14:32:41

⏪ vorheriges - nächstes ⏩

database

Hallo Jörg,

ZitatIm Direktfenster steht:

ist das ein Ausschnitt oder alles was mit Debug.Print strSQL ausgegeben wird?
Wenn das nämlich alles ist, dann fehlt ein Teil - nämlich der SELECT-Teil und daher würde es mich nicht wundern, wenn
ZitatLaufzeitfehler 3129: Unzulässige SQL-Anweisung; 'DELTELE', 'INSERT', 'SELECT', 'PROCEDURE', oder 'UPDATE' erwartet.
ausgegeben wird.


joerg_w

SELECT steht dabei

ZitatSELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, T_Leistungsstunden.Stunden, T_Leistungsstunden.Datum FROM T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr WHERE T_Leistungsstunden.VorgangsNr IN ('20030-1000-101') ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;
SELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, T_Leistungsstunden.Stunden, T_Leistungsstunden.Datum FROM T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr WHERE T_Leistungsstunden.Status IN ('AKT') ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;
WHERE T_Leistungsstunden.Person IN ('Holger') AND T_Leistungsstunden.VorgangsNr IN ('20030-1000-101') AND T_Leistungsstunden.Status IN ('AKT') ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;

Ich habe gerade noch ein bisschen rumprobiert. Es läuft so:

Keine Auswahl: Finktioniert // alle Datrnsätze werden angezeigt

Nur Namen: Laufzeitfehler
Nur Vorgang: Funktioniert: Die gewählten Vorgänge werden angezeigt
Nur Status: Ich werde gebeten einen Parameterwert für T_Leistungsstunden.Status einzutragen

Danke & Gruß




database

Hallo hallo,

da hast du was zusammenkopiert, die Ausgabe ist kaum möglich!

Lösche bitte mal ALLE Einträge im Direktfenster raus

und lasse NUR dieses Debug.Print arbeiten:

'SQL-String kontrollieren
Debug.Print strSQL   


Alle anderen Debug.Prints bitte vorher auskommentieren (mit einfachem Hochkomma)


DF6GL

Hallo,

ich würde das eigentliche Kriterium und den SQL-String in unterschiedlichen Variablen behandeln, sonst könnte mehrmals " where" im Ergebnis stehen und auch mehrmals das gesamte Select-Statement. (wie debug.print zeigt)

joerg_w

Puh...ich weiß noch nicht wie eine Ausgabe normalerweise auszusehen hat ;)

Btw: Tausend Dank für die Mühe! Hier alle Infos:

Wenn man aus allen Listen wählt, sieht's so aus (Führt zu Laufzeitfehler):

ZitatWHERE T_Leistungsstunden.Person IN ('Jörg') AND T_Leistungsstunden.VorgangsNr IN ('20010-1000-101') AND T_Leistungsstunden.Status IN ('AKT') ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;

Wenn man nur den Namen wählt (Laufzeitfehler):

ZitatWHERE T_Leistungsstunden.Person IN ('Jörg') ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;

Wenn man nur die Vorgangsnummer wählt (funktioniert!):

ZitatSELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, T_Leistungsstunden.Stunden, T_Leistungsstunden.Datum FROM T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr WHERE T_Leistungsstunden.VorgangsNr IN ('20010-1000-101') ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;

Wenn man nur den Status wählt (Parametereingabe verlangt):

ZitatSELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, T_Leistungsstunden.Stunden, T_Leistungsstunden.Datum FROM T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr WHERE T_Leistungsstunden.Status IN ('AKT') ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;


Hier der Code, wie ich ihn verwende (kopiert aus diesem thread und die Oistennamen angepasst (Personen--> Liste0; Vorgänge --> Liste9; Status--> Liste 13)

Private Sub Befehl2_Click()
    Dim sAuswahlPerson As String
    Dim sAuswahlVorgang As String
    Dim sAuswahlStatus As String
    Dim strSQL As String
    Dim itm As Variant
    Dim chkWhere As Boolean

    'SQL-Grundgerüst zusammenstellen

    strSQL = "SELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, " & _
                   "T_Leistungsstunden.Stunden, T_Leistungsstunden.Datum " & _
                   "FROM T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr "

    'Die Listenfelder einzeln auf Auswahlen abfragen - beginnen mit Personen
    For Each itm In Me!Liste0.ItemsSelected
        itm = Me!Liste0.ItemData(itm)
        sAuswahlPerson = sAuswahlPerson & "'" & itm & "',"
    Next itm

    'Liste aufbereiten
    If Len(sAuswahlPerson) > 0 Then
        'Letztes Komma wieder abziehen
        sAuswahlPerson = Left(sAuswahlPerson, Len(sAuswahlPerson) - 1)
    End If
    '################################################
    'Liste mit Vorgängen
    For Each itm In Me!Liste9.ItemsSelected
        itm = Me!Liste9.ItemData(itm)
        sAuswahlVorgang = sAuswahlVorgang & "'" & itm & "',"
    Next itm

    'Liste aufbereiten
    If Len(sAuswahlVorgang) > 0 Then
        'Letztes Komma wieder abziehen
        sAuswahlVorgang = Left(sAuswahlVorgang, Len(sAuswahlVorgang) - 1)
    End If
    '################################################
    'Liste mit Stati
    For Each itm In Me!Liste13.ItemsSelected
        itm = Me!Liste13.ItemData(itm)
        sAuswahlStatus = sAuswahlStatus & "'" & itm & "',"
    Next itm

    'Liste aufbereiten
    If Len(sAuswahlStatus) > 0 Then
        'Letztes Komma wieder abziehen
        sAuswahlStatus = Left(sAuswahlStatus, Len(sAuswahlStatus) - 1)
    End If
   
    '################################################################
    'Festlegen der WHERE-Klausel
    'für die ausgewählten Personen
    If Len(sAuswahlPerson) > 0 Then
        strSQL = srtrSQL & "WHERE T_Leistungsstunden.Person IN (" & sAuswahlPerson & ")"
        chkWhere = True
    End If
   
    If Len(sAuswahlVorgang) > 0 Then
        If chkWhere = True Then    'für ausgewählte Personen UND Vorgänge
            strSQL = strSQL & " AND T_Leistungsstunden.VorgangsNr IN (" & sAuswahlVorgang & ")"
        Else
            'für ausgewählte Projekte
            strSQL = strSQL & "WHERE T_Leistungsstunden.VorgangsNr IN (" & sAuswahlVorgang & ")"
            chkWhere = True
        End If
    End If

    If Len(sAuswahlStatus) > 0 Then
        If chkWhere = True Then 'für ausgewählte Personen UND / ODER Vorgänge UND Stati
            strSQL = strSQL & " AND T_Leistungsstunden.Status IN (" & sAuswahlStatus & ")"
        Else
            'für ausgewählte Stati
            strSQL = strSQL & "WHERE T_Leistungsstunden.Status IN (" & sAuswahlStatus & ")"
            chkWhere = True
        End If
    End If
    '#################################################################
    'Anfügen der Sortieranweisung

    strSQL = strSQL & " ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;"

    'SQL-String kontrollieren
    Debug.Print strSQL

    CurrentDb.Querydefs!A_Auswertung_gesamt.SQL = strSQL
   
    'Öffnen der Abfrage
    Dim stDocName As String

    stDocName = "A_Auswertung_gesamt"
    DoCmd.OpenQuery stDocName, acNormal, acEdit
End Sub



database

OK, nähern wir uns der Sache ganz vorsichtig,

Vorgänge passen --- soweit gut,

die Parameter eingabe-Aufforderung würde mich interessieren, wie lautet die genau?
Für mich weist das darauf hin, dass ein Feld verwendet wird, das mit dem verwendeten Namen nicht existiert!

database

@DF6GL
"  (wie debug.print zeigt) "

meinst du nicht, dass das mehrere Debug.Print - Ausgaben im Direktfenster sind bzw. waren?
Ich glaube durch das Setzen der Variablen chkWhere in den einzelnen Blöcken der WHERE- Klauselerstellung auf True ist das Vorkommen von mehreren WHEREs nicht mehr möglich - oder sehe ich das falsch?

DF6GL

#22
Hallo,

mein Vorschlag:
.
Dim strKrit as String
.
.
.    
   '################################################################
   '

   If Len(sAuswahlPerson) > 0 Then
       strKrit = srtrKrit & " AND T_Leistungsstunden.Person IN (" & sAuswahlPerson & ")"
    End If
   
   If Len(sAuswahlVorgang) > 0 Then
        strKrit = strKrit & " AND T_Leistungsstunden.VorgangsNr IN (" & sAuswahlVorgang & ")"
   End If

   If Len(sAuswahlStatus) > 0 Then
           strKrit = strKrit & " AND T_Leistungsstunden.Status IN (" & sAuswahlStatus & ")"
    End If


if Len (strKrit) > 0 then strSQL = strSQL &  " Where " &  mid(strKrit,6)

   '#################################################################

   'Anfügen der Sortieranweisung    
strSQL = strSQL & " ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;"  
'SQL-String kontrollieren    
Debug.Print strSQL    
CurrentDb.Querydefs!A_Auswertung_gesamt.SQL = strSQL
.
.



PS:

"ist das Vorkommen von mehreren WHEREs nicht mehr möglich"


ja, das kann natürlich sein, habe die Kombinatorik da jetzt nicht durchgecheckt....

Mit dem Trennen der SQL-Klauseln von den Kriterien erübrigt sich das Ganze und wird m. E. auch noch übersichtlicher.


joerg_w

Parameterwert eingeben
T_Leistungsstunden.Status
Eingabefeld mit Cursor

Gebe ich einen Wert ein, der in meinen Daten unter Status auch vorkommt, werden alle Datensätze mit diesem Wert angezeigt.

joerg_w

@DF6GL: Wenn ich Dich richtig verstehe, ersetzt Dein Vorschlag diesen Bereich:

  '################################################################
    'Festlegen der WHERE-Klausel
    'für die ausgewählten Personen
    If Len(sAuswahlPerson) > 0 Then
        strSQL = srtrSQL & "WHERE T_Leistungsstunden.Person IN (" & sAuswahlPerson & ")"
        chkWhere = True
    End If
   
    If Len(sAuswahlVorgang) > 0 Then
        If chkWhere = True Then    'für ausgewählte Personen UND Vorgänge
            strSQL = strSQL & " AND T_Leistungsstunden.VorgangsNr IN (" & sAuswahlVorgang & ")"
        Else
            'für ausgewählte Projekte
            strSQL = strSQL & "WHERE T_Leistungsstunden.VorgangsNr IN (" & sAuswahlVorgang & ")"
            chkWhere = True
        End If
    End If

    If Len(sAuswahlStatus) > 0 Then
        If chkWhere = True Then 'für ausgewählte Personen UND / ODER Vorgänge UND Stati
            strSQL = strSQL & " AND T_Leistungsstunden.Status IN (" & sAuswahlStatus & ")"
        Else
            'für ausgewählte Stati
            strSQL = strSQL & "WHERE T_Leistungsstunden.Status IN (" & sAuswahlStatus & ")"
            chkWhere = True
        End If
    End If
    '#################################################################

database

Hallo Jörg,

ZitatGebe ich einen Wert ein, der in meinen Daten unter Status auch vorkommt, werden alle Datensätze mit diesem Wert angezeigt.
...auch wenn du einen Wert eingeben würdest, der in deinen Daten nicht vorkommt darf kein Laufzeitfehler entstehen - es werden dann keine Daten angezeigt

bitte kontrolliere nochmal gaaaanz genau  .....  den Namen des Feldes in der Tabelle  T_Leistungsstunden  ob das wirklich  S t a t u s  heißt.

Access erkennt dieses Feld nicht mit diesem Namen - da kann was nicht stimmen!

@Franz

sieht gut aus Franz und spart dazu auch ein paar Zeilen - toll

@joerg
JA


joerg_w

ZitatAccess erkennt dieses Feld nicht mit diesem Namen - da kann was nicht stimmen!

Tut's auch nicht. Das Feld "Status" gehört zur Tabelle T_Vorgang und heisst eigentlich A-Status. Sorry
(wie gesagt - die Basis der DB kommt nicht von mir - sonst hätte ich vermutlich selbst schneller geschaltet).


DF6GL

Hallo,

wenn das Ding A-Status heißt, setze den Namen überall (im Code) unbedingt in Eckklammern:

[A-Status]

database

Na denn im SQL String ausbessern!

und ....  Das mit dem Laufzeitfehler....

Zitatbei den Laufzeitfehlern fehlt aber doch der gesamte Select-Teil.. ?
Ja Franz - muss er woh oder übel ...   *plärrrr*

hier liegt der Hund begraben!
strSQL = srtrSQL & "WHERE T_Leistungsstunden.Person IN (" & sAuswahlPerson & ")"

*aaaaarggghhh*
bitte auf strSQL umbessern!