Hallo,
wie kann ich per VBA in eine gruppierte Abfrage ein Kriterium einfügen?
Hintergrund ist folgender:
In einem Formular kann ich die Berichtsausgabe vordefinieren in:
- Detailausgabe mit Zusammenfassung
- Zusammenfassung
- Detailausgabe mit Zusammenfassung je Gruppe
- Zusammenfassung je Gruppe
- Gesamtzusammenfassung (Über alle Gruppen)
- Detailausgabe mit Zusammenfassung nach ausgewählten Gruppen (Auswahl durch Listenfeld)
- Zusammenfassung nach ausgewählten Gruppen (Auswahl durch Listenfeld)
- Gesamtzusammenfassung (Über alle ausgewählten Gruppen)
und Genau der letzte Punkt ist jetzt noch mein Problem.
Ich muss der Abfrage jetzt ein Kriterium geben. Das über eine Funktion
Public Function fctStrVar() As String
fctStrVar = sKriterium
End Function
funktioniert ja nur, wenn es sich nur um ein Kriterium handelt.
Handelt es sich aber um mehrere, oder auch keines, dann geht es nicht.
Scheinbar kann man so etwas nur über VBA lösen.
Nur wie sieht so ein Code aus, mit dem ich auf eine Abfrage zugreife?
Angenommen die Abfrage heißt "qryZusammst" und die Spalten heißen "Feld1", "Feld2" Feld3" "Feld4" usw.
Und für das Feld3 benötige ich nun das Kriterium. Dies kann Beispielsweise so aussehen:
1
2 Oder 3
50 Oder 53 Oder 70...
oder kein Kriterium
Ich müsste dann zusätzlich in dem Code für die Gruppenauswahl (Listenfeld)
ReDim a(0)
Dim var As Variant
Dim itm, I As Long
sWhere = ""
For Each var In Me!Liste4.ItemsSelected
If sWhere > "" Then sWhere = sWhere & " Or "
sWhere = sWhere & "LHA_Los =" & Me!Liste4.ItemData(var)
Next var
If sWhere = "" Then MsgBox "Sie haben keine Auswahl getroffen!": Exit Sub
...
das Kriterium zusammenstellen.
Wie sieht das dann aus?
Und dann müsste ich wenn das Formular geschlossen wird, das Kriterium (Falls vorhanden) sicherheitshalber wieder aus der Abfrage löschen.
Hört sich für mich schon etwas kompliziert an.
Oder gibt es doch eine Möglichkeit, wie ich mehrere Kriterien in eine Funktion bringen kann?
Gruß Hubert
Hallo,
am Einfachsten wäre die Lösung über einen Bericht.. Dort kann nach Belieben gruppiert, sortiert und berechnet werden. Dabei darf (sollte) in der Abfrage keine Gruppierung oder Sortierung angewendet werden.
Aufgerufen wird der Bericht dann in etwa so mit der Kriterien-Angabe:
Docmd.Openreport "rptZusammenstellung" ,,,"Feld3 in (50, 53, 70)"
wobei hier die "Magic Numbers" besser durch Nutzung von Variablen, bzw. (Formular-)-Steuerelementen ersetzt werden sollten.
Hallo Franz,
bisher habe ich diese Zusammenfassung mit einem Unterbericht (gruppierte Abfrage) gelöst, da diese Zusammenfassung ja auch aus einem Detailbereich, Gruppenbereich und Fussbereich besteht. Zudem habe ich da noch prozentuale Auswertung und Mittelwerte in den Bereichen.
Kann ich das alles auch in einem Bericht (mit einer Abfrage) unterbringen?
Da scheint der Berichtsaufbau etwas komplizierter zu werden.
Werde mich damit mal befassen.
Nachtrag:
Kann es sein, dass Du es so verstanden hast, das es bei der Gesamtzusammenstellung um einen extra Bericht handelt?
Dem ist nicht so.
Ich habe 4 Berichte erstellt, welche Unterberichte haben.
- Bericht mit Detailbereich und Unterbericht (Zusammenstellung).
- Bericht ohne Detailbereich und Unterbericht (Zusammenstellung).
- Bericht mit Detailbereich und Unterbericht (Zusammenstellung) nach Gruppen gegliedert.
- Bericht ohne Detailbereich und Unterbericht (Zusammenstellung) nach Gruppen gegliedert.
Der Unterbericht ist immer der Gleiche.
Durch die Selektion der Gruppen durch ein Listenfeld kann ich letztere beiden genannten Berichte ja durch den übergebenen Filter entsprechend ausgeben.
Nun war mein Gedanke, den Unterbericht (Zusammenstellung) zusätzlich im Berichtsfuss unterzubringen (Falls eine Gesamtzusammenstellung erwünscht ist).
Dies funktioniert ja soweit alles. Leider aber nicht, wenn die Gruppen selektiert worden sind. Weil der Unterbericht im Berichtsfuss ja alle Daten aus der Abfrage holt.
Wenn ich jetzt diese Gesamtzusammenstellung einzeln aufrufen würde, müsste Dein Tipp klappen. Aber ich habe ja das alles sozusagen in einem Bericht.
Gruß Hubert
Hi,
du kannst auch einen Unterbericht filtern, wenn du den Filter beim Öffnen des Berichts als OpenArgs-Parameter übergibst und diesen im Open-Ereignis (bzw. Activate) zum Filtern des UB verwendest.
Beispiel:
Private Sub Report_Activate()
If Nz(Me.OpenArgs, "") <> "" Then
Me.UB1.Report.RecordSource = "Select * from " & Me.UB1.Report.RecordSource & " Where " & Me.OpenArgs
End If
End Sub
Die ursprüngliche RecordSource muss allerdings hierfür geeignet sein, d.h. Tabelle oder gespeicherte Abfrage und nicht einfach nur ein SQL-String.
Hallo MaggieMay,
Jetzt haben sich unsere Beiträge überschnitten, da ich meine vorhergehende Antwort überarbeitet habe.
ZitatDie ursprüngliche RecordSource muss allerdings hierfür geeignet sein, d.h. Tabelle oder gespeicherte Abfrage und nicht einfach nur ein SQL-String.
Wie darf ich das jetzt verstehen. Also ich habe die Abfragen erstellt. Diese dienen den Berichten und Unterberichten als Datensatzherkunft. Die Unterberichte sind entsprechend verknüpft.
Was Dein Beispiel anbelangt, da werde ich mich mal damit auseinandersetzen. Wenn ich das jetzt auf die schnelle richtig versanden habe, müsste ich in dem fall für die Gesamtzusammenstellung einen extra Unterbericht erstellen, und an diesen den Filter übergeben?
Gruß Hubert
Ich bins nochmal,
wenn die Gruppen selektiert sind, und ich von dem geöffneten Bericht (Seitenansicht) in den Entwurfsmodus wechsle, dann habe ich im Filter (Bericht-> Daten-> Filter)
den übergebenen Wert vom Listenfeld. Also z.B. LHA_Los =3 Or LHA_Los =4.
Dann bin ich hergegangen, und habe in Unterbericht den Filter gleichgesetzt (manuell eingetragen).
Gehe ich dann wieder in die Seitenansicht, ändert sich im dem besagten Unterformular gar nichts.
Kann es dann sein, das mir das übergeben des Filters an das Unterformular per VBA auch nichts bringt?
Setze ich hingegen in der Abfrage (Datensatzherkunft des Unterberichts) in dem
besagten Feld LHA_Los das Kriterium 3 Oder 4 wird der Bericht korrekt ausgegeben.
Das ist jetzt wirklich eine verzwickte Sache. Scheint wohl darauf hinauszulaufen, das ich die Berichte neu aufbauen muss?
Gruß Hubert
Hallo Hubert,
ich war davon ausgegangen, dass es sich um einen Unterbericht handelt, der zu filtern wäre:
Zitat von: trebuh am September 17, 2015, 15:24:25bisher habe ich diese Zusammenfassung mit einem Unterbericht (gruppierte Abfrage) gelöst
Das kannst du nicht über den (ungespeicherten) Entwurf testen, das muss schon per VBA gelöst werden, so wie ich es gezeigt hatte.
Probiere es doch einfach mal aus.
Hallo MaggieMay,
habe es mit Deinem Vorschlag versucht. Hat aber leider keine Änderung gebracht.
Würde es gerne mal damit versuchen, in die Abfrage direkt per VBA einzugreifen (das habe ich ja auch noch nie gemacht).
Habe mal etwas recherchiert und bin auf so etwas in einem Forum gestoßen:
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM qryInvoice WHERE Monat >= " & Me!cmbFromMonth & " AND Monat <= " & Me!cmbToMonth)
Wenn ich es jetzt richtig interpretiere müsste ist in dem Fall "qryInvoice" die betreffende Abfrage sein und "Monat" das besagte Feld in der Abfrage.
Dann müsste ich quasi je nach Anzahl der Kriterien mir einen entsprechenden String zu recht basteln?
Zitathabe es mit Deinem Vorschlag versucht. Hat aber leider keine Änderung gebracht
Sorry, aber vielleicht hast du es falsch gemacht?
Ohne ein konkretes Testbeispiel werden wir hier wohl nicht weiterkommen. Zumindest fehlt mir die Phantasie, mir aus den bisherigen Informationen einen Bericht zu basteln, an dem man das mal austesten könnte.
Hallo MaggieMay,
ZitatSorry, aber vielleicht hast du es falsch gemacht?
Kein Problem. Das kann sicherlich der Fall sein.
Ein Testbeispiel? Ich könnte Dir die Ganze Anwendung senden. Das alles auseinander zuklabaustern macht glaube ich keinen Sinn, sonst fehlt da irgendwo was.
Also wie gesagt, ich kann Dir die Datenbank zukommenlassen. Solange Du nicht die ganze Datenbank auf den Kopf stellst...
Ganz fertig ist die Anwendung eh noch nicht, aber zumindest läuft´s.
Nachtrag: Vielleicht habe ich den Fehler gefunden... (Vielleicht)
Melde ich wieder
Hallo MaggieMay,
brauche nochmal Deine Hilfe.
Habe endlich wieder mal Zeit gefunden an meiner Datenbank weiterzumachen.
Leider muss ich gestehen, das ich hier nicht weiterkomme.
Im Anhang habe ich eine Datenbank beigefügt, welche im Prinzip das Problem darstellt (Ganz vereinfacht).
Ich habe ein Hauptbericht, mit Details, und ein Unterbericht (Zusammenfassung und Auswertungen).
In dem Button "Bericht" (Formular frm1) habe ich jetzt die "Where" Conditionen zusammengesetzt.
Der Hautbericht wird gefiltert dargestellt. Nur bekomme ich es einfach nicht hin, dieses an den Unterbericht weiterzugeben.
Habe auch schon im Internet nach einer Beispieldatenbank gesucht. Da habe ich nur eine gefunden und diese kann dummerweise nicht downgeloadet werden (Wartungszustand)
http://www.office-loesung.de/ftopic250932_0_0_asc.php (http://www.office-loesung.de/ftopic250932_0_0_asc.php)
Gruß Hubert
Hallo Hubert,
wenn du einen Filterstring als OpenArgs-Parameter übergibst, so musst du ihn beim Öffnen des Berichts auch verwenden, von allein passiert da nichts.
Und zwar geht das folgendermaßen, aus dem Open-Ereignis des Unterberichts heraus:
If Nz(Me.Parent.OpenArgs, "") <> "" Then
' Me.Filter = Me.Parent.OpenArgs ' -> geht nicht
Me.RecordSource = "Select * From " & Me.RecordSource & " Where " & Me.Parent.OpenArgs
End If
aber das hatte ich ja bereits vor ca. drei Wochen geschrieben... ???
Hallo MaggieMay,
:D
Zitataber das hatte ich ja bereits vor ca. drei Wochen geschrieben...
Nicht ganz
Private Sub Report_Activate()
If Nz(Me.OpenArgs, "") <> "" Then
Me.UB1.Report.RecordSource = "Select * from " & Me.UB1.Report.RecordSource & " Where " & Me.OpenArgs
End If
End Sub
Da bekam ich im Open-Ereignis immer eine Fehlermeldung.
If Nz(Me.Parent.OpenArgs, "") <> "" Then
' Me.Filter = Me.Parent.OpenArgs ' -> geht nicht
Me.RecordSource = "Select * From " & Me.RecordSource & " Where " & Me.Parent.OpenArgs
End If
jetzt klappt es: :D :D :D mit dem Filtern.Bekomme jetzt in meiner Hauptanwendung zwar den Fehler Nr.2191 aber diesen kann ich ja gezielt abfangen, da der Unterbericht gefiltert dargestellt wird.
Leider hat sich jetzt noch ein anderes Problem mit einer Abfrage ergeben, welches ich aber in einem neuen Thema schildere.
Gruß und herzlichen Dank :)
Hubert
Hallo Hubert,
ja manchmal muss man einfach verschiedenes ausprobieren bis man ans Ziel kommt.
Fehler 2191 - was will der uns sagen?
Hallo MaggieMay,
Zitatja manchmal muss man einfach verschiedenes ausprobieren bis man ans Ziel kommt.
:D
Ja, das stimmt. Leider ist man da als Laie mit dem Latein sehr schnell am Ende.
ZitatFehler 2191 - was will der uns sagen?
Meine Recherchen zu diesem Fehler haben mich auch nicht weiter gebracht. Die meisten Antworten darauf sind, das man den Fehler abfangen soll. Das hat mich jetzt nur bedingt weitergebracht, da ich mir zwar den Bericht in der Vorschau anzeigen lassen kann, aber spätestens beim Ausdrucken gibt es probleme.
Somit ist das Problem wieder da. Interessanterweise taucht dieser Fehler in der Testdatenbank nicht auf.
Damit Du mal ein konkretes Bild von meiner Datenbank bekommst, und ich in dem Zusammenhang ja noch eine Frage im "Tabellen/Abfragen"-Bereich hier im Forum habe (Gruppierte Abfrage: Feld ohne Funktion hinzufügen. (Funktion Bedingung)), habe ich meine Datenbank so weit verkleinert, um sie hochladen zu können.
Dort habe ich das Beispiel hochgeladen (Mit kurzer Erklärung).
Gruß
Hi,
Fehler 2191 - was will der uns sagen?
das sollte eine Aufforderung sein, uns den Wortlaut der Fehlermeldung mitzuteilen,
mit der Nummer allein kann man doch nichts anfangen.
Hallo MaggieMay,
sorry, dachte wenn ihr die Err.Nummer habt, könnt ihr den Fehler nachsehen.
Fehler 2191 bedeutet:
ZitatSie können die Eigenschaft Datenherkunft nicht mehr einstellen, nachdem
Sie einen Druckvorgang gestartet haben.
Da es in der Testdatenbank funktioniert, gehe ich davon aus, dass das noch mit was andererm in meiner Anwendung zu tun hat. (Habe aber noch nicht herausgefunden was die Ursache ist).
Habe es jetzt aber in sofern gelöst, dass ich einen anderen Weg eingeschlagen habe.
Habe temponäre Tabellen angelegt, in die nur die benötigten Daten für den Bericht reingeschrieben werden.
Somit brauche ich am komplexen Berichtsaufbau nichts ändern.
Funktioniert einwandfrei.
Trotzdem Danke für Deine Tipps. Diese benötige ich sicher noch.
Gruß Hubert
Hallo Hubert.
ZitatBekomme jetzt in meiner Hauptanwendung zwar den Fehler Nr.2191
Wodurch wird dieser verursacht? Befindet sich dort noch Code, der eigentlich hätte entfernt werden sollen?
Zitatdachte wenn ihr die Err.Nummer habt, könnt ihr den Fehler nachsehen
Wie bzw. wo sollte man das deiner Meinung nach nachsehen können?