Access2010 Abfrage mit Kriterien vom Formular

Hallo liebe Community,
ich bin gerade dabei eine Abfrage in Access zu erstellen, jedoch habe ich ein paar Probleme bei der Bestimmung der Kriterien.
Ich habe mir ein Ungebundens Formular gebastelt (txt_dateVon; txt_dateBis; kombi_mitarbeiter; kombi_schulung; kombi_team; kombi_ist; kombi_soll) diese Felder (die DS erhalten sie von anderen Abfragen) möchte ich nun als Kriterium für meine Abfrage nutzen.
Dies klappt auch schon ganz okay, jedoch ist als ich
Wie [Forms]![frm_MATZ_Auswertung]![com_mitarbeiter] Oder Wie [Forms]![frm_MATZ_Auswertung]![com_mitarbeiter] Ist Null hinzugefügt habe ist die Abfrage gigantisch groß geworden und die SQL-Ansicht ist blanker Horror ^^

Aber auch mit der großen Abfrage funktioniert es dennoch ganz gut jedoch weiß ich jetzt nicht wie ich noch weitere Kriterien hinzufügen kann.

Wenn ich auf dem ungebunden Formular im Kombi_team etwas hinterlege dann zeigt mir dieser auch Schulungen an die garnicht dazu gehören ich möchte das mir immer nur Schulungen angezigt werden die mit „MZ*“ beginnen jetzt erhalte ich jedoch auch die BE001 und Co. Schulugen mit angezeigt , wie kann ich das noch in die Abfrage hinzufügen?

Und ein weiter Punkt sind die Von-Bis Daten dort möchte ich die Datensätze nach dem Datum Filtern dazu habe ich auch schon folgendes gefunden:
Zwischen [Forms]![frm_MATZ_Auswertung]![kombi_DateVon] UND [Forms]![frm_MATZ_Auswertung]![kombi_DateBis]
jedoch hat dies nicht geklappt.

Aber ich glaube das es einfacherer wäre wenn die Abfrage nicht so riesig und unübersichtlich geworden wäre.

Ist es den normal das wenn ich bei einem Feld in der Abfrage nur
"Wie [Forms]![frm_MATZ_Auswertung]![com_mitarbeiter] Oder Wie [Forms]![frm_MATZ_Auswertung]![com_mitarbeiter] Ist Null " hinzufüge das dann auch alle anderen Felder irgendwelche Kreterien erhalten?
denn so ist die Abfrage ja so groß geworden.

hier ein kleiner vorgeschmack:
SELECT tbl_mitarbeiter.pname, tbl_conn_mitarbeiter_schulung.tbl_schulung, tbl_schulung.titel, tbl_mitarbeiter.tbl_team, tbl_conn_mitarbeiter_schulung.tbl_iststatus, tbl_conn_mitarbeiter_schulung.tbl_sollstatus
FROM tbl_mitarbeiter INNER JOIN (tbl_schulung INNER JOIN tbl_conn_mitarbeiter_schulung ON tbl_schulung.lfdnr = tbl_conn_mitarbeiter_schulung.tbl_schulung) ON tbl_mitarbeiter.pnr = tbl_conn_mitarbeiter_schulung.tbl_mitarbeiter
WHERE (((tbl_mitarbeiter.pname) Like [Forms]![frm_MATZ_Auswertung]![com_mitarbeiter]) AND ((tbl_conn_mitarbeiter_schulung.tbl_schulung) Like [Forms]![frm_MATZ_Auswertung]![com_schulung]) AND ((tbl_mitarbeiter.tbl_team) Like [Forms]![frm_MATZ_Auswertung]![com_team]) AND ((tbl_conn_mitarbeiter_schulung.tbl_iststatus) Like [Forms]![frm_MATZ_Auswertung]![com_ist]) AND ((tbl_conn_mitarbeiter_schulung.tbl_sollstatus) Like [Forms]![frm_MATZ_Auswertung]![com_soll])) OR (((tbl_mitarbeiter.pname) Like
… und davon noch gefühlte 40 Zeilen mehr…

kann mir jemand helfen bei der Abfrage oder mit mir zusammen die abfrage neu gestallten das sie nicht so unübersicht wird?

Mit einem Recordset fals das wieder vorgeschlagen wird, möchte ich an dieser stelle nicht verwenden den ich denke das es auch Access mal so schaffen kann vernüftig zu Arbeiten den momentan funzt es ja auch ganz gut und wenn dann nur noch 1-2 Kriterien dazu kommen dann soltle meiner meinung nach Access das schon packen.

Gruß und über Hilfe wäre ich sehr sehr dankbar
Vielen dank und bis bald
Fizzo361

HI also ich habe die Abfrage erstmal verworfen und nochmal neu angefangen, jedoch habe ich weiterhin probleme mit der zusammensetzung der Abfragekriterien.

Aktueller Stand:
SELECT tbl_conn_mitarbeiter_schulung.erstschulung, tbl_mitarbeiter.pname, tbl_conn_mitarbeiter_schulung.tbl_schulung, tbl_schulung.titel, tbl_mitarbeiter.tbl_team, tbl_conn_mitarbeiter_schulung.tbl_iststatus, tbl_conn_mitarbeiter_schulung.tbl_sollstatus
FROM tbl_mitarbeiter INNER JOIN (tbl_schulung INNER JOIN tbl_conn_mitarbeiter_schulung ON tbl_schulung.lfdnr = tbl_conn_mitarbeiter_schulung.tbl_schulung) ON tbl_mitarbeiter.pnr = tbl_conn_mitarbeiter_schulung.tbl_mitarbeiter
WHERE (((tbl_conn_mitarbeiter_schulung.erstschulung) Between [Forms]![frm_MATZ_Auswertung]![txt_date1] And [Forms]![frm_MATZ_Auswertung]![txt_date2]) AND ((tbl_mitarbeiter.pname) Like [Forms]![frm_MATZ_Auswertung]![com_mitarbeiter]) AND ((tbl_conn_mitarbeiter_schulung.tbl_schulung) Like „MZ*“) AND ((tbl_mitarbeiter.tbl_team) Like [Forms]![frm_MATZ_Auswertung]![com_team])) OR (((tbl_conn_mitarbeiter_schulung.erstschulung) Between [Forms]![frm_MATZ_Auswertung]![txt_date1] And [Forms]![frm_MATZ_Auswertung]![txt_date2]) AND ((tbl_conn_mitarbeiter_schulung.tbl_schulung) Like „MZ*“) AND ((tbl_mitarbeiter.tbl_team) Like [Forms]![frm_MATZ_Auswertung]![com_team]) AND ((([tbl_mitarbeiter].[pname]) Like [Forms]![frm_MATZ_Auswertung]![com_mitarbeiter]) Is Null)) OR (((tbl_conn_mitarbeiter_schulung.erstschulung) Between [Forms]![frm_MATZ_Auswertung]![txt_date1] And [Forms]![frm_MATZ_Auswertung]![txt_date2]) AND ((tbl_mitarbeiter.pname) Like [Forms]![frm_MATZ_Auswertung]![com_mitarbeiter]) AND ((tbl_conn_mitarbeiter_schulung.tbl_schulung) Like „MZ*“) AND ((([tbl_mitarbeiter].[tbl_team]) Like [Forms]![frm_MATZ_Auswertung]![com_team]) Is Null)) OR (((tbl_conn_mitarbeiter_schulung.erstschulung) Between [Forms]![frm_MATZ_Auswertung]![txt_date1] And [Forms]![frm_MATZ_Auswertung]![txt_date2]) AND ((tbl_conn_mitarbeiter_schulung.tbl_schulung) Like „MZ*“) AND ((tbl_mitarbeiter.tbl_team) Like [Forms]![frm_MATZ_Auswertung]![com_team]) AND ((([tbl_mitarbeiter].[pname]) Like [Forms]![frm_MATZ_Auswertung]![com_mitarbeiter]) Is Null) AND ((([tbl_mitarbeiter].[tbl_team]) Like [Forms]![frm_MATZ_Auswertung]![com_team]) Is Null)) OR (((tbl_conn_mitarbeiter_schulung.erstschulung) Between [Forms]![frm_MATZ_Auswertung]![txt_date1] And [Forms]![frm_MATZ_Auswertung]![txt_date2]) AND ((tbl_conn_mitarbeiter_schulung.tbl_schulung) Like „MZ*“) AND ((([tbl_mitarbeiter].[pname]) Like [Forms]![frm_MATZ_Auswertung]![com_mitarbeiter]) Is Null) AND ((([tbl_mitarbeiter].[tbl_team]) Like [Forms]![frm_MATZ_Auswertung]![com_team]) Is Null) AND (([Forms]![frm_MATZ_Auswertung]![com_team]) Is Null)) OR (((tbl_conn_mitarbeiter_schulung.erstschulung) Is Null) AND ((„Oder“) Is Null));

Jetzt muss ich aber unbedingt ein Datum angeben sonst werden garkeine DS angezeigt und wenn ich nur im Feld team etwas eintrage findet er auch keine Daten mehr… Aber eine Kombi aus Datum und Team kann die Abfrage und spuckt mir DS aus.

Aber dennoch kaum nehme ich die bsp.: [frm_MATZ_Auswertung]![com_team]) Is Null rein wächst die Abfrage enorm an und ich verliere dann schnell den Überblick…

Hoffe ihr habt noch Ideen für mcih auf lager wie ich es vereinfachen könnte.?

Gruß
Fizzo361

Hallo,

lass den Quatsch mit den Formularfeldverweisen und Zusammensetzen vieler solcher Kriterien im Abfrageentwurf.

Von „Recordsets“ in diesem Zusammenhang dürfte auch niemand gesprochen haben, eher vom „Zusammensetzen“ der Where-Condition mit Hilfe von VBA…

Dabei ist auf die Datentypen exakt(!) Rücksicht zu nehmen und zu berücksichtigen, dass Datumswerte in SQL im USA- oder ISO-Format vorliegen müssen.

Prinzipiell:

Dim strKrit as String, strSQl as String

strSQL = "select \* from Tabelle" 

If Not Isnull( Me!Textfeld1) Then strKrit = strKrit & " and TabellenTextfeld1 ='" & Me!Textfeld1 & "'"

strKrit & " and TabellenTextfeld2 Like '\*" & Me!Textfeld2 & "\*'"


If Not Isnull( Me!Zahlfeld1) Then strKrit = strKrit & " and TabellenZahlfeld1 = " & Me!Zahlfeld1

If Not IsNull (Me!Datumsfeld1) Then strKrit = strKrit & " and TabellenDatumsfeld1 = " & Format (Me!Datumsfeld1, "\#yyyy-mm-dd\#")

strKrit = strKrit & " and TabellenDatumsfeld2 Between " & Format (nz(Me!Datumsfeld2,#01/01/1900#), "\#yyyy-mm-dd\#") & " and " & Format (nz(Me!Datumsfeld3,#01/01/2100#), "\#yyyy-mm-dd\#") 

strKrit = Mid (strKrit,6) 

strSQl = StrSQL & " Where " & strKrit

Debug.Print strSQL 'SQL-String im Direktfenster zur Prüfung ausgeben

Me.Recordsource =StrSQL 'oder wo auch immer den SQL-String weiter benutzen.

Hallo df6gl,
danke für deine antwort, ich habe es probiert so wie du sagtest umzusetzten, jedoch bräuchte ich noch etwas hilfe :wink:
hier erstmal der aktuelle Code vom Button-Event:
Private Sub btn_auswertung_Click()
Dim strKrit As String
Dim strSQl As String
Dim strKrit2 As String
Dim strSQl2 As String

strSQl = „select * from tbl_conn_mitarbeiter_schulung“

strKrit2 = strKrit2 & „tbl_schulung = ‚MZ*‘“ 'Immer nur Schulungen aus der Tabelle die mit MZ anfangen, das muss immer mit drin sein, gedacht als zweites Festen Kreterium
Debug.Print strKrit2

If Not IsNull(Me!txt_date1) Then 'Finde MZ schulungen zwischen Von und Bis
strKrit = strKrit & " erstschulung = " & Format(Me!txt_date1, „#yyyy-mm-dd#“)
strKrit = strKrit & " erstschulung Between " & Format(Nz(Me!txt_date2, #1/1/1900#), „#yyyy-mm-dd#“)
strKrit = Mid(strKrit, 6)
'Ausgabe: StrSQL = select * from tbl_conn_mitarbeiter_schulung Where schulung = #2015-02-01# erstschulung Between #2015-02-23#
End If

If Not IsNull(Me!com_mitarbeiter) Then 'Finde MZ Schulungen vom Mitarbeiter
strKrit = strKrit & "tbl_mitarbeiter = " & Me!com_mitarbeiter
'Debug.Print Me!com_mitarbeiter
'Ausgabe: strSQL = select * from tbl_conn_mitarbeiter_schulung Where tbl_mitarbeiter = 361
End If

If Not IsNull(Me!com_schulung) Then
strKrit = strKrit & „tbl_schulung = '“ & Me!com_schulung & „’“
'Debug.Print Me!com_schulung
'Ausgabe: strSQL = select * from tbl_conn_mitarbeiter_schulung Where tbl_schulung = ‚MZ100‘
End If

If Not IsNull(com_team) Then
'Team infos stehen in einer anderen Tabelle
strSQl2 = „SELECT tbl_mitarbeiter.tbl_team FROM tbl_mitarbeiter“ ‚bezug auf andere Tabelle daher zweiten strSQL-String
strKrit = strKrit & „tbl_team = '“ & Me!com_team & "‘"
'Debug.Print Me!com_team
'Ausgabe: strSQL = select * from tbl_conn_mitarbeiter_schulung Where tbl_team = ‚MATZ‘
End If

If Not IsNull(com_ist) Then
strKrit = strKrit & "tbl_iststatus = " & Me!com_ist
'Debug.Print Me!com_ist
'Ausgabe: strSQL = select * from tbl_conn_mitarbeiter_schulung Where tbl_iststatus = 4
End If

If Not IsNull(com_soll) Then
strKrit = strKrit & "tbl_sollstatus = " & Me!com_soll
'Debug.Print Me!com_soll
'Ausgabe: strSQL = select * from tbl_conn_mitarbeiter_schulung Where tbl_sollstatus = 4
End If

strSQl = strSQl & " Where " & strKrit
Debug.Print strSQl

End Sub

Bei zwei Punkten war ich mir unklar, der erste war das ich ja nur schulungen angezeigt bekommen möchte die mit MZ* beginnen und der zweite knackpunkt für mich war die Information über das Team, den diese Info steht in einer anderen Tabelle welche aber über Beziehungen miteinander verknüft sind.

Und jetzt habe ja bloß den Fall angedeckt das der Nutzer immer nur eine Eingabe macht bzw nur einen Filter auswählt aber wie setzte ich nun diese Conditionen alle zusammen?
Denn die angabe der nach was nun gefiltert werden soll kann immer unterschiedlich sein.

habe ich ansonsten die obigen Conditionen richtig bestimmt?
Gruß
Fizzo361

Edit: Wenn ich zwei Filter angebe erhalte ich solch einen strSQL-String: select * from tbl_conn_mitarbeiter_schulung Where tbl_mitarbeiter = 361tbl_team = ‚BC-MO-NS‘ muss das bloß noch mit einem „AND“ verknüpft werden?

Danke und bis später
Fizzo361

Hallo,

wenn Du meinen Beispiel-Codes ansiehst, findest du bei jedem Vergleich ein „and“ davor…

Gruß
Franz,DF6GL

Ups ja da hast du wohl recht die habe übersehen :wink:
hab Sie jetzt hinzugefügt und erhalte folgenden strSQl:
select * from tbl_conn_mitarbeiter_schulung Where rstschulung = #2015-02-01#and erstschulung Between #2015-02-24#and tbl_mitarbeiter = 361and tbl_schulung = 'C1’and tbl_team = 'MATZ’and tbl_iststatus = 4and tbl_sollstatus = 4

jetzt frage ich mich warum steht hinter dem Where rstschulung statt erstschulung?

und dann habe ich folgendes mit dem String versucht:

'Variante 1
Me.RecordSource = strSQl
stDocName = „rpt_MATZ_Schulung_Auswertung“
DoCmd.OpenReport stDocName, acViewDesign
Reports(stDocName).RecordSource = Me.RecordSource
DoCmd.OpenReport stDocName, acViewPreview
'Variante 2
'DoCmd.OpenReport „rpt_MATZ_Schulung_Auswertung“, acViewPreview, , , , strSQl

bei Variante 1 soll ich gleich per PopUp ein Parameterwert für rstschulung eingeben, dann nochmal das gleich für tbl_team und meldet allerdings der Bericht einen Error erstmal das er zugro0 sei und den Bereich überschreite aber schlimmer ist das er mir folgendes anmeckert:
habe beim Bericht Öffnen-Event

Private Sub Report_Open(Cancel As Integer)
Me.RecordSource = Me.OpenArgs
End Sub

Fehlermeldung Unzuverlässige verwendung von Null
Lautzeitfehler ‚94‘… warum ?

und bei der 2.Variante :
dort werde ich wieder nach rstschulung,team gefragt dann kommt wieder die Meldung das der bericht zugroß sei und dann werde ich wieder nach rstschulung,team UND ausdr1 gefragt, und anschließend erhalte ich einen leeren Bericht… hab ich nur was vergessen oder ist stimmt noch etwas nicht mit dem strSQl?

Wäre euch oder bzw dir df6gl sehr dankbar wenn du dir nochmal kurz die Zeit für mich nehmen könntest und mir ein paar tips gibst :smiley:

Also in diesem Sinne vielen dank und bis später
Fizzo361

Noch eine andere Frage:
Muss ich den Bericht schon vorab erstellen mit den textfeldern und Co.? oder reicht ein leerer Bericht und als Datensatzquelle dann unser strSQl verwenden?

Berichte sind mir leider noch relativ unbekannt

Gruß und vielen Dank
Fizzo361

Hallo,

vermutlich liest Du nicht GENAU meinen Code…

Dort steht jeweils VOR dem „And“ noch ein Leerzeichen…

erst muss mal der SQL-String stimmen, alles Andere sind erst mal Folgefehler.

Variante 2 sollte passen:

.

DoCmd.OpenReport „rpt_MATZ_Schulung_Auswertung“, acViewPreview, , , , strSQl
.
.
Private Sub Report_Open(Cancel As Integer)
if Not Isnull(me.Openargs) Then Me.RecordSource = Me.OpenArgs
End Sub

Gruß
Franz,DF6GL

Hallo,

Muss ich den Bericht schon vorab erstellen mit den textfeldern
und Co.? oder reicht ein leerer Bericht und als
Datensatzquelle dann unser strSQl verwenden?

Natürlich muss ein Bericht schon vorher erstellt werden, bevor er benutzt werden kann und die Textfelder erscheinen auch nicht von allein, wenn man dem Bericht lediglich eine Datenherkunft zuweist…

Gruß
Franz,DF6GL

HI df6gl,
ohh mensch peinlich haste recht das leerzeichen habe ich völlig übersehen, habs jetzt aber hinzugefügt und die neuen Ausgaben auch im Code als Kommentar hinterlegt.

If Not IsNull(Me!txt_date1) Then 'Finde MZ schulungen zwischen Von und Bis
strKrit = strKrit & " and erstschulung = " & Format(Me!txt_date1, „#yyyy-mm-dd#“)
strKrit = strKrit & " and erstschulung Between " & Format(Nz(Me!txt_date2, #1/1/1900#), „#yyyy-mm-dd#“)
strKrit = Mid(strKrit, 6)
'Ausgabe: StrSQL = select * from tbl_conn_mitarbeiter Where erstschulung = #2015-02-01# and erstschulung Between #2015-02-27#
End If

If Not IsNull(Me!com_mitarbeiter) Then 'Finde MZ Schulungen vom Mitarbeiter
strKrit = strKrit & " and tbl_mitarbeiter = " & Me!com_mitarbeiter
'Debug.Print Me!com_mitarbeiter
'Ausgabe: strSQL = select * from tbl_conn_mitarbeiter Where and tbl_mitarbeiter = 361
End If

If Not IsNull(Me!com_schulung) Then
strKrit = strKrit & " and tbl_schulung = ‚" & Me!com_schulung & "‘"
'Debug.Print Me!com_schulung
'Ausgabe: strSQL = select * from tbl_conn_mitarbeiter Where and tbl_schulung = ‚C1‘
End If

If Not IsNull(com_team) Then
'Team infos stehen in einer anderen Tabelle
strSQl2 = „SELECT tbl_mitarbeiter.tbl_team FROM tbl_mitarbeiter“ 'bezug auf andere Tabelle daher zweiten strSQL-String
strKrit = strKrit & " and tbl_team = ‚" & Me!com_team & "‘"
'Debug.Print Me!com_team
'Ausgabe: strSQL = select * from tbl_conn_mitarbeiter Where and tbl_team = ‚MATZ‘
End If

If Not IsNull(com_ist) Then
strKrit = strKrit & " and tbl_iststatus = " & Me!com_ist
'Debug.Print Me!com_ist
'Ausgabe: strSQL = select * from tbl_conn_mitarbeiter Where and tbl_iststatus = 4
End If

If Not IsNull(com_soll) Then
strKrit = strKrit & " and tbl_sollstatus = " & Me!com_soll
'Debug.Print Me!com_soll
'Ausgabe: strSQL = select * from tbl_conn_mitarbeiter Where and tbl_sollstatus = 4
End If

strSQl = strSQl & " Where " & strKrit
Debug.Print strSQl

und wenn ich alle felder mit daten befülle erhalte ich folgenden strSQl:
select * from tbl_conn_mitarbeiter_schulung Where erstschulung = #2015-02-01# and erstschulung Between #2015-02-28# and tbl_mitarbeiter = 361 and tbl_schulung = ‚A1‘ and tbl_team = ‚MATZ‘ and tbl_iststatus = 4 and tbl_sollstatus = 4

Allerdings glaube ich das tbl_team nicht stimmt da diese information nicht in der tabelle tbl_conn_mitarbeiter_schulungen vorkommt, sondern mittels beziehungen zwischen der tbl_mitarbeiter und tbl_conn_mitarbeiter_schulung oder sehe ich das falsch?

wie bindet man den nun noch eine zweite Tabelle als strSQl ein?
also bsp strSQl = „select * from tbl_mitarbeiter“??

Gruß und ein schönes Wochenende
Fizzo361

Hallo,

strSQl = „select * from tbl_mitarbeiter Inner Join tblAndereTabelle on tbl_Mitarbeiter.Fremdschlüsselfeld= tblAndereTabelle.Primärschlüsselfeld…“

oder wie die Beziehungen halt definiert sind.

Gruß
Franz,DF6GL

Hallo und sorry für die später antwort, war leider verhindert ,

Danke df6gl für dein Hinweis, habe nun soeben das mal versucht umzusetzten jetzt war ich mir nur nicht sicher ob die Where Kondition auch gleich mit rein sollte?
oder soll die zwei StrSQl und StrSQl2 mit einem And verknüpfen?
hier erstmal mein String, hoffe der passt?
also Laut dem Abfrage Designer soltle es passen:

SELECT tbl_mitarbeiter.pnr, tbl_mitarbeiter.tbl_team
FROM tbl_mitarbeiter
INNER JOIN tbl_conn_mitarbeiter_schulung
ON tbl_mitarbeiter.[pnr] = tbl_conn_mitarbeiter_schulung.[tbl_mitarbeiter]
WHERE tbl_mitarbeiter.tbl_team = Me!com_team
GROUP BY tbl_mitarbeiter.pnr, tbl_mitarbeiter.tbl_team, tbl_conn_mitarbeiter_schulung.tbl_mitarbeiter

Allerdings sagt mir der Kompiler das ich die Syntax flasch sei und makerit mir den String rot…
Aber so ganz verstanden wie ich nun am Ende den strSQl an den Bericht übergebe ist mir noch unklar.

Gruß Fizzo361