Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: joerg_w am Oktober 06, 2010, 14:32:41

Titel: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 06, 2010, 14:32:41
FUNKTIONIERENDER CODE IM LETZTEN POST

Hallo,

ich bastle gerade an einem Formular. In diesem wählt man in einem Listenfeld Namen aus.
Diese sollen danach in einer Abfrage als Kriterien dienen. Es ist mir mittlerweile gelungen die
gewählten Namen aus der Liste auszulesen und an die Abfrage weiterzugeben.

Allerdings bekomme ich dann für jeden gewählten Namen die Bitte einen Paramter einzugeben.
Unter Kriterien steht nach dem Ausführen des Formulars dann folgendes:

In ([Clemens];[Holger])

Der verwendete Code im Formular sieht so aus:

Private Sub Befehl2_Click()
   Dim sAuswahl As String
   Dim strSQL As String
   Dim itm As Variant

   For Each itm In Me!Liste0.ItemsSelected
       itm = Me!Liste0.ItemData(itm)
       Debug.Print itm
       sAuswahl = sAuswahl & itm & ","
       Debug.Print "gesamt: " & sAuswahl
   Next itm

   If Len(sAuswahl) > 0 Then
       'Letztes Komma wieder abziehen
       sAuswahl = Left(sAuswahl, Len(sAuswahl) - 1)
   End If

   'Ändern der SQL für die Abfrage
   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 " & _
                  "WHERE T_Leistungsstunden.Person IN (" & sAuswahl & ") ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;"
   
   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

Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: DF6GL am Oktober 06, 2010, 14:49:55
Hallo,

es fehlen die Hochkommata, falls es sich bei T_Leistungsstunden.Person um Datentyp Text handelt:


.
.
sAuswahl = sAuswahl & "'" & itm & "',"
.
.
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 06, 2010, 14:57:15
Tausend Dank! Genau das war's.

Letzte Frage: Das Endgültige Ziel ist ein Formular, das es erlaubt z.B. Personen und Projektnummern auszusuchen und dann
einen Bericht anzufordern.

Das hier scheint die Zeile zu sein, die das Kriterium festlegt:

WHERE T_Leistungsstunden.Person IN (" & sAuswahl & ")

Wie kann ich mehrere solcher Kriterien aneinanderhängen?

Dann würde ich den Code so aufbauen:

Auslesen Listenfeld Personen
Auslesen Listenfeld Projektnummern
Auslesen Listenfeld ...

Ändern SQL für die Abfrage

Aufrufen des Berichts, der auf der Abfrage basiert.


Ich denke mit einem funktionierendem Beispiel (personen) kann ich die nötigen Schritte für andere Variablen nachahmen.
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: DF6GL am Oktober 06, 2010, 15:06:32
Hallo,

es handelt sich hier um eine "Where-Condition" in einem SQL.Statement.


Du mußt halt per VBA-String-zusammenbau einen gültigen String hinbekommen.

Dim strKrit1 as string, strKrit2 as string
Dim strSQL as String

strSQL = "select * from tblTabelle Where "
.
' strkrit1 zusammenbasteln
.
.
strKrit1="T_Leistungsstunden.Person IN (" & sAuswahl & ")

' strkrit2 zusammenbasteln, sAuswahl von Listenfeld Projektnummern erzeugen
.
strKrit2=T_Leistungsstunden.Projektnummer IN (" & sAuswahl & ")
.
'alle EinzelStrings aneinanderfügen.
strSQL= strSQL & strKrit1 & " And " & strKrit2

debug.print strSQL
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 06, 2010, 17:10:17
Hallo,

ich hatte gehofft, ich könnte für jedes Listenfeld eine Variable deklarieren (sAuswahl1, sAuswahl2, ...) und dann sowas machen wie


WHERE T_Leistungsstunden.Person IN (" & sAuswahl1 & ") & T_Leistungsstunden.Projektnummer IN (" &sAuswahl2 &") & T_Leistungsstunden.Status IN (" & sAuswahl3 ") ...

Das hätte unter Anderem den Vorteil, dass ich nur erweitern müsste, was ich schon habe.

So wie ich Dich verstanden habe muss ich aber für jede Liste den gesamten SQL-String basteln (strKrit1, stKrit2, etc.) und diese
dann am Ende zusammenfassen als strSQL.

Das schaff ich heute nicht mehr ;) Ich hab in meinem ganzen Leben noch keinen SQL-String "gebastelt"^^ ... schon gar keinen gültigen :D



Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: DF6GL am Oktober 06, 2010, 17:39:33
Hallo,

naja, WIE Du das machst, ist egal, Hauptsache der "gültige SQL-String" kommt hinten heraus.
strSQL ="Select * from tblTAbelle "

strSQL = strSQL & "  WHERE T_Leistungsstunden.Person IN (" & sAuswahlPersonen & ")  AND T_Leistungsstunden.Projektnummer IN (" &  sAuswahlProjektnummer   & ") AND  T_Leistungsstunden.Status IN (" & sAuswahlStatus & ")"

deswegen auch

Debug.print strSQL

um des Ergebnis im Direktfenster zu prüfen


Ob die "AND"s richtig sind, mußt Du selber entscheiden..
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 06, 2010, 17:58:09
Hi,

bei der Variante ...

strSQL = strSQL & "  WHERE T_Leistungsstunden.Person IN (" & sAuswahlPersonen & ")  AND T_Leistungsstunden.Projektnummer IN (" &  sAuswahlProjektnummer   & ") AND  T_Leistungsstunden.Status IN (" & sAuswahlStatus & ")"


müsste dann gewährleistet sein, dass IMMER alle 3 Kriterien zum Tragen kommen. Ist das nicht der Fall führt es zu einem Fehler im SQL-String, der sich so äussert, dass gar keine Ergebnisse geliefert werden.

@DF6GL

"es fehlen die Hochkommata, falls es sich bei T_Leistungsstunden.Person um Datentyp Text handelt"

schien mir zu Anfang nicht so, da die ItemData aus einem Listenfeld zu lesen waren, ging ich davon aus, dass es sich um die IDs handelt.
Dass dann auch noch in der Tabelle die Namen abgelegt sind und nicht deren Schlüssel --- aijaijaijai  :o
;D
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 06, 2010, 18:02:39
Die Personen liegen tatsächlich als Text vor (bei Gelegenheit führe ich einen Schlüssel ein. Alle anderen Spalten haben einen ;). Die Anzahl unserer Mitarbeiter ist allerdings noch überschaubar ... daher geht's erstmal.

Kann ich die Sache irgendwie so einstellen, dass keine Auswahl bedeutet: "Alle Datensätze" ?
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: DF6GL am Oktober 06, 2010, 18:23:07
@database


aijaijaijai 



LOL, muß lachen.     :D

solche Gegebenheiten (Verwenden von IDs ) darf man nicht zu oft voraussetzen...

Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 06, 2010, 18:50:13
Hallo,

@Franz
hahaha, ich glaube halt noch an das Gute im Menschen  ;D ;D ;D

@joerg_w
ZitatKann ich die Sache irgendwie so einstellen, dass keine Auswahl bedeutet: "Alle Datensätze"
das sollte funktionieren.

Abhängig davon wie du deinen Code bis jetzt erweitert bzw. gestaltet hast...
mein bescheidener Vorschlag dazu, aufgebaut auf den vorangegangenen Vorschlägen UND in der Annahme dass es sich bei Projektnummern und Stati ebenfalls um Strings handelt:


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!Liste1.ItemsSelected
       itm = Me!Liste1.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!Liste2.ItemsSelected
       itm = Me!Liste2.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


Oh Mann Programmieren im Forumsfenster ist echt abenteuerlich  ;D ;D

Bitte ausprobieren - Code ist absolut ungetestet daher kann es sein dass irgendwo was klemmt - hoffe ich hab' nichts übersehen:)


EDIT:  Austausch der Projeknummer gegen VorgangsNr!
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: DF6GL am Oktober 06, 2010, 18:54:56
HAllo,



strSQL = srtrSQL & "WHERE T_Leistungsstunden.Person IN (" & sAuswahlPerson & ") "       ;D ;D ;D
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 06, 2010, 19:06:11
Puh...Danke..ich werde es morgen durchlaufen lassen. Ich habe es selbst so hinbekommen, dass ich
die Werte für Person und die Werte für Vorgänge in zwei unterschiedlichen Variablen gesammelt hatte.

Aber ich habe einen Laufzeitfehler bekommen, alsich versucht habe das Ganze bis zur Abfrage hin durchzuführen (Fehler#3075).

Ich bastel morgen einfach mit Deiner Variante weiter. Heute wirds zu spät ;)

"Personen" ist eine Ausnahme in der Datenbank. Aus mir nicht bekannten Gründen (die
Basis habe ich nicht selbst erstellt) dient bei Personen und bei Status ein Textfeld als Schlüssel. Alle anderen
Daten werden so erfasst/identifiziert:

Vorgangsnummern: 20000-10000-100

Kundennummern: 10000


Nacht^^

Jörg



Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 06, 2010, 19:08:34
Hallo,

Code OBEN nach Korrekturvorschlag von Franz geändert.

Das zusätzliche Leerzeichen kommt vom tiefen Seufzen  :D :D :P

Vorgangsnummern ? Ich habe diese nun statt den Projektnummern oben im Code implementiert.
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 07, 2010, 09:36:07
Projektnummer=Vorgangsnummer ... hab' mich nur undeutlich ausgedrückt.

Ich fang dann mal an zu basteln ;)
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 07, 2010, 09:59:53
Hallo,

klappt fast :)

Im Direktfenster steht:

ZitatWHERE T_Leistungsstunden.Person IN ('Alex','Arthur','Clemens','Holger','Jörg') AND T_Leistungsstunden.VorgangsNr IN ('20030-1000-100','20030-1000-101','20030-1000-102','20030-1000-103','20160-1000-100','20160-1000-101','20160-1000-102','20160-1000-103') AND T_Leistungsstunden.Status IN ('AKT') ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;

Es sind also schonmal die richtigen Werte in die richtigen Variablen geschrieben.

Allerdings wird die Abfrage nicht geöffnet und ich erhalte einen Laufzeitfehler:

ZitatLaufzeitfehler 3129: Unzulässige SQL-Anweisung; 'DELTELE', 'INSERT', 'SELECT', 'PROCEDURE', oder 'UPDATE' erwartet.

Klickt man auf debuggen, wird folgende Zeile gelb hinterlegt:

ZitatCurrentDb.Querydefs!A_Auswertung_gesamt.SQL = strSQL


Gruß

Jörg
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 07, 2010, 10:06:18
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.

Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 07, 2010, 10:21:46
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ß



Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 07, 2010, 10:30:52
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)

Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: DF6GL am Oktober 07, 2010, 10:40:16
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)
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 07, 2010, 10:43:48
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


Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 07, 2010, 10:54:06
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!
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 07, 2010, 10:58:45
@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?
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: DF6GL am Oktober 07, 2010, 11:04:17
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.

Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 07, 2010, 11:06:48
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.
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 07, 2010, 11:10:18
@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
    '#################################################################
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 07, 2010, 11:12:10
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
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: DF6GL am Oktober 07, 2010, 11:15:18
Hallo,

bei den Laufzeitfehlern fehlt aber doch der gesamte Select-Teil.. ?

Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 07, 2010, 11:20:50
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).

Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: DF6GL am Oktober 07, 2010, 11:22:12
Hallo,

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

[A-Status]
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 07, 2010, 11:23:29
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!
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 07, 2010, 11:27:25
Zitat von: DF6GL am Oktober 07, 2010, 11:15:18
Hallo,

bei den Laufzeitfehlern fehlt aber doch der gesamte Select-Teil.. ?



Ja. Laufzeitfehler entsteht bei der Personenliste. Un da erscheint auch kein SELECT im Direktfenster.


Ich versuche jetzt mal die Status-Sache zu verbessern und das hier:

strSQL = srtrSQL & "WHERE T_Leistungsstunden.Person IN (" & sAuswahlPerson & ")"

*aaaaarggghhh*
bitte auf strSQL umbessern!


zu ändern. Ich bin im Moment noch auf dem alten Code. Soll ich den neuen einbauen?
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 07, 2010, 11:28:08
Uuups,

ZitatDas Feld "Status" gehört zur Tabelle T_Vorgang

Die ist aber noch nicht in der SQL der Abfrage enthalten, also richtig reinjoinen und die Zuweisung an strSQL dann berichtigen / aktualisieren,

danach probieren wir am Besten mit dem neuen Code weiter!
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 07, 2010, 11:33:38
Ok, ich versuch's erstmal selbst hinzubekommen ;) Ich druck mir den KRam jetzt erstmal aus und versuch zu kapieren, wie die Abfrage zusammengesetzt wird. Ich melde mich mit Erfolg/Misserfolg wieder ;)

Gruß

Jörg

EDIT: Personen geht jetzt ;)
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 07, 2010, 11:35:55
Hallo,

erzeuge die Abfrage im graphischen Abfrageeditor, wechsle dann in die SQL-Ansicht und kopiere die SQL von dort raus (OHNE WHERE und ORDER BY) - ist die einfachste Methode
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 07, 2010, 12:18:07
Ok, hab ich so gemacht.

Das hier ist da, was mir der grafische Editor gebastelt hat:

SELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, T_Leistungsstunden.Stunden, T_Vorgang.[A-Status], T_Leistungsstunden.Datum
FROM T_Vorgang INNER JOIN (T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr) ON T_Vorgang.VorgangsNr = T_Leistungsstunden.VorgangsNr
ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;


Das hier ist mein Verusch das Ganze umzubauen, der mir am nächsten dran erscheint:

strSQL = "SELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, " & _
                    "T_Leistungsstunden.Stunden, T_Vorgang.[A-Status], T_Leistungsstunden.Datum " & _
                    "FROM T_Vorgang INNER JOIN (T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr) ON T_Vorgang.VorgangsNr = T_Leistungsstunden.VorgangsNr"


Im Moment bekomme ich Laufzeitfehler für alle drei Listen. Beispiel Person:

ZitatLaufzeitfehler '3075':

Syntaxfehler (fehlender Operator) in Abfrageausdruck 'T.Vorgang.VorgangsNr = T_Leistungsstunden.VorgangsNrWHERE T_Leistungsstunden.Person IN ('Jörg') ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr'.

Das hier steht im Direktfenster:

ZitatSELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, T_Leistungsstunden.Stunden, T_Vorgang.[A-Status], T_Leistungsstunden.Datum FROM T_Vorgang INNER JOIN (T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr) ON T_Vorgang.VorgangsNr = T_Leistungsstunden.VorgangsNrWHERE T_Leistungsstunden.Person IN ('Jörg') ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;

Jörg
[/quote]
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 07, 2010, 12:25:30
ja,
auf den ersten Blick nicht so schlimm, da fehlen lediglich Leerzeichen!


strSQL = "SELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, " & _
                   "T_Leistungsstunden.Stunden, T_Vorgang.[A-Status], T_Leistungsstunden.Datum " & _
                   "FROM T_Vorgang INNER JOIN (T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr) ON T_Vorgang.VorgangsNr = T_Leistungsstunden.VorgangsNr "



Setze hier nach Vorgangsnummer (ganz am Ende vom String) ein Leerzeichen rein, dann wird WHERE mit Abstand im String stehen und das passt dann

T_Leistungsstunden.VorgangsNrWHERE T_Leistungsstunden.Person

So machts nämlich Probleme

Auf einen neuen Versuch :)
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 07, 2010, 12:37:22
Jaaaaaaaaaa  ;D

Es klappt :) Tausend Dank!!!!

Im Moment klappen alle drei Felder. Damit kann ich die wichtigsten Auswertungen per Klick vornehmen (In welchem Projekt hat wer wie viel gearbeitet  oder: Zeige z.B. alle abgeschlossenen Projekte für die und die Mitarbeiter).

Jetzt läuft's gerade auf mit dem alten Code. Die Frage an die Experten: Besser auf den neuen Vorschlag wechseln oder beim alten bleiben (Never touch a running system ;) )?

Jörg

PS: Die einzige Erweiterung, die ich evtl. noch machen würde, wäre die Abfrage auf bestimmte Zeiträume einzugrenzen. Muss aber so gar nicht heute sein ;).
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: database am Oktober 07, 2010, 12:46:16
Hallo Jörg - schön, dass es nun endlich klappt.

Freilich kannst du ohne größere Probleme den neuen Code auch testen.
Wenn du ganz vorsichtig sein willst, leg dir eine Kopie der aktuellen Version an und teste die neue Variante da - da kannst du nichts verwurschtln.
Wenn dann funktioniert kopierst du ganz einfach die gesamte Prozedur in deine aktuelle Datei.

Ach ja - ein DRINGENDER Hinweis an der Stelle ....  Sichern ist nicht feig, sondern macht Sinn!

In diesem Sinne viel Spaß und Erfolg noch,
bis zum nächsten Mal

Grüße
Peter

p.s. Bitte auch diesen Beitrag in deinem Startbeitrag auf 'Gelöst' stellen - DANKE!
Titel: Re: Abfrage verlangt Parametereingabe (Nach Variablenübergabe)
Beitrag von: joerg_w am Oktober 07, 2010, 13:17:01
Für alle mit ähnlichem Problem: Hier der funktionierende Code:

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_Vorgang.[A-Status], T_Leistungsstunden.Datum " & _
                    "FROM T_Vorgang INNER JOIN (T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr) ON T_Vorgang.VorgangsNr =     T_Leistungsstunden.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 = strSQL & "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_Vorgang.[A-Status] IN (" & sAuswahlStatus & ")"
        Else
            'für ausgewählte Stati
            strSQL = strSQL & "WHERE T_Vorgang.[A-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
   

End Sub