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
Hallo,
es fehlen die Hochkommata, falls es sich bei T_Leistungsstunden.Person um Datentyp Text handelt:
.
.
sAuswahl = sAuswahl & "'" & itm & "',"
.
.
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.
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
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
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..
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
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" ?
@database
aijaijaijai
LOL, muß lachen. :D
solche Gegebenheiten (Verwenden von IDs ) darf man nicht zu oft voraussetzen...
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!
HAllo,
strSQL = srtrSQL & "WHERE T_Leistungsstunden.Person IN (" & sAuswahlPerson & ") " ;D ;D ;D
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
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.
Projektnummer=Vorgangsnummer ... hab' mich nur undeutlich ausgedrückt.
Ich fang dann mal an zu basteln ;)
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
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.
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ß
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)
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)
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
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!
@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?
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.
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.
@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
'#################################################################
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
Hallo,
bei den Laufzeitfehlern fehlt aber doch der gesamte Select-Teil.. ?
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).
Hallo,
wenn das Ding A-Status heißt, setze den Namen überall (im Code) unbedingt in Eckklammern:
[A-Status]
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!
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?
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!
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 ;)
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
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]
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 :)
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 ;).
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!
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