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 ⏩

joerg_w

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


DF6GL

Hallo,

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


.
.
sAuswahl = sAuswahl & "'" & itm & "',"
.
.

joerg_w

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.

DF6GL

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

joerg_w

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




DF6GL

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..

database

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

joerg_w

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" ?

DF6GL

@database


aijaijaijai 



LOL, muß lachen.     :D

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


database

#9
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!

DF6GL

HAllo,



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

joerg_w

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




database

#12
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.

joerg_w

Projektnummer=Vorgangsnummer ... hab' mich nur undeutlich ausgedrückt.

Ich fang dann mal an zu basteln ;)

joerg_w

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