Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Ungebundenen Hauptbericht mit zwei Filtern

Begonnen von Domm, November 28, 2017, 13:11:39

⏪ vorheriges - nächstes ⏩

Domm

Hallo, ich schon wieder...
Kann man mir noch helfen???
Die Situation:
Von einem Formular aus soll ein ungebundener Bericht geöffnet werden.
In diesem sind mehrere UnterB mit unterschiedlichen Filtern.
Beim Öffnen sollen aber alle UnterB  nach zwei weiteren Kriterien gefiltert werden: WocheAktuell und TagAktuell.
Daher habe ich im HauptB zwei ungebundene Textfelder gleichen Namens platziert (Format: Allgemeine Zahl). Die UnterB beziehen sich im Kriterium auf diese Werte.
Der Code zum Öffnen:
DoCmd.OpenReport "rptEinteilung", acViewPreview, , _
                     "[WocheAktuell] = '" & Me!AuswahlWoche & "' " & _
                 "And [TagAktuell] = '" & Me!AuswahlTag & "'"

Der Bericht wird ohne Daten angezeigt. Wenn ich den Bericht händisch öffne, zeigt er die ungebundenen Felder natürlich auch leer an. Wenn ich die Felder in Steuerelementinhalt mit einer Zahl fülle, werden die UnterB korrekt angezeigt.

Habe verschiedene Berichte erstellt mit immer dem gleichen Ergebnis. Wenn ich einen gebundenen Bericht erstelle, in dem ich als Filter die oben benannten Textfelder einstelle, werden die Parameterwerte eingefordert, welche eigentlich per VBA übermittelt werden sollen. Ist das verständlich?
Egal, wie ich es anstelle, die ungebundenen Textfelder  werden nicht gefüllt.
Google hat unzähliche Threads zum Thema ,,Bericht mit mehreren Filtern", aber nix passt auf mein Problem...
Weiß jemand einen Rat?
Dankeschön im Voraus!

Gruß Domm

Beaker s.a.

Hallo,
Einen ungebundenen Report kannst du nicht filtern, - gibt ja keine Datensätze.
Übergebe die beiden Werte mit dem Parameter "OpenArgs", und fülle die beiden Textfelder damit
DoCmd.OpenReport _
              ReportName:="rptEinteilung", _
              View:=acViewPreview, _
              OpenArgs:= Me!AuswahlWoche & ";" & Me!AuswahlTag


Private Sub Report_Open(Cancel As Integer)
    Dim vOA as Variant
    vOA = Split(Me.OpenArgs, ";")
    Me!Textfeld1 = vOA(0)
    Me!Textfeld2 = vOA(1)
'@edit
'evtl. musst du die Unterberichte noch aktualisieren
    Me!upcErsterUB.Form.Requery

End Sub


gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Domm

Grüß Dich, Ekkehard! Schön, dass Du mir hilfst.
Nach Eintrag der Codes finden sich die zwei. Soweit schon ein Erfolg.
Allerdings gibts eine Fehlermeldung (2448): Sie können diesem Objekt keinen Wert zuweisen.
Das betraf im ersten Versuch das erste Textfeld; als ich die Zeile mit Hochstrich deaktiviert habe, kam die Meldung auch beim zweiten.
Änderungen an Format der Textfelder haben nichts bewirkt, auch Einstellungen am Bericht haben nicht geholfen.
Allerdings möchte ich noch loswerden, dass ich nie und nimmer ohne Hilfe auf Deine Argumentation gekommen wäre! Nach meinen Vorstellungen hatte ich gedacht, man kann die Felder ganz leicht füllen...
Als es dann nicht ging, war ich der Meinung, dass nur irgendwo ein Komma fehlt oder ein Hochstrich zuviel ist. Siehste mal!
Gruß Domm

Beaker s.a.

Hallo,
ZitatAllerdings gibts eine Fehlermeldung (2448): Sie können diesem Objekt keinen Wert zuweisen.
Schau mal ob bei den beiden Textfeldern irgendwas in der Eigenschaft
"Steuerlementinhalt" drin steht. Das müsstest du löschen.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

Ich würde dazu tendieren, die Parameter a la FAQ 3.15 zu übermitteln.
Grüße von der (⌒▽⌒)

Domm

Hallo Ihr Zwei,
leider bin ich im Mom unterwegs und hab keinen Zugriff auf die DB.
Morgen früh folge ich der Empfehlung von Ekkehard, obwohl ich sicher bin, die Textfelder wieder jungfräulich gemacht zu haben.
Die Lösung von DonKarl werde ich erst mal verinnerlichen. Vermutlich muss ich mir dazu nochmal Hilfe holen; die Aussage kann ich so einfach nicht auf mein Beispiel umbauen. (Kenntnisstand Newbie)
Vielen Dank jedenfalls erstmal für Eure Zeit.
Gruß Domm

Beaker s.a.

Hallo,
ZitatDie Lösung von DonKarl
ist sicher die elegantere. Du brauchst dann zwei davon
Public Function AuswahlWoche() ' hier evtl. noch den Typ angeben
   AuswahlWoche = Nz(Forms.DeinFormular.AuswahlWoche, ErsatzWoche)
End Function

Public Function AuswahlTag() ' hier evtl. noch den Typ angeben
   AuswahlTag = Nz(Forms.DeinFormular.AuswahlTag, ErsatzTag)
End Function

Das Formular muss dazu aber immer geöffnet sein.
Mit diesen beiden Functions ersetzt du in der Abfrage deines Berichtes
die jetzigen Platzhalter (Textfelder). Bei Fragen zeige die Abfrage (SQL).
Die beiden ungebundenen Textfelder entfallen dadurch ersatzlos.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Domm

Hallo Ekkehard,
der Bericht wird vom Formular aus geöffnet, wenn dort die Parameter vorher eingestellt wurden.
Also bedeutet, es ist grundsätzlich geöffnet. Das war auch mein gedanklicher Ansatz: übergebe die Variablen aus dem Formular an die zwei Textfelder...
Das Thema ist Dir sicher noch bekannt: Abiturienten sollen für ihr Kolloquium eingeteilt werden.
Im o.g. Form wird die Einteilung auf die Prüfungsräume und Uhrzeiten vorgenommen.
Der Bericht soll gefiltert anzeigen,
-in welcher der beiden Prüfungswochen
-an welchem (der fünf) Wochentage
-vor- oder nachmittags die Kurse stattfinden.
Die Tageszeit kann vernachlässigt werden, da pro Tag grundsätzlich nur vor- oder nachmittags geprüft wird.
Also zwei Variable.
Ungefiltert ergibt das 10 Berichtsseiten; damit wäre mein Problem schon aus der Welt.
Aber eleganter ist es natürlich, den jeweiligen Tag filtern zu können.
Schönen Abend!
Gruß Domm

Frithjiof

Hallo Domm,

kannst du die Datenquelle(n) der Unterberichte nicht filtern bevor du den Bericht aufrufst.

Datenquelle Bericht1 z.B. qryBericht1.sql = "select tab.* from tab  where ...."

Frithjof

Domm

Hallo, schnell mal die Mittagspause kreativ auffüllen...
@Beaker s.a.
Der Hauptbericht hat keine SQL (LOGO). Die Unterberichte sind bis auf den Filter <Position> identisch:
SELECT qryKandKursUnion.KandKursID, [Kandidat] & " (" & [MemoA] & ")" AS AnzKandidat, qryKandKursUnion.KursA, qryKandKursUnion.WocheA, qryKandKursUnion.TagA, qryKandKursUnion.TageszeitA, Format([StdBeginn],"Short Time") AS AnzStdBeginn, Format([StdEnde],"Short Time") AS AnzStdEnde, Format([DauerPause],"Short Time") AS AnzPause, qryKandKursUnion.PositionA, tblZimmer.Zimmer
FROM ((qryKandKursUnion INNER JOIN qryZeitenUndPausen ON qryKandKursUnion.StundeA = qryZeitenUndPausen.ZeitID) INNER JOIN tblZimmer ON qryKandKursUnion.ZimmerA = tblZimmer.ZimmerID) INNER JOIN tblWoche ON qryKandKursUnion.WocheA = tblWoche.WocheID
WHERE (((qryKandKursUnion.WocheA)=[AuswahlWoche]) AND ((qryKandKursUnion.TagA)=[AuswahlTag]) AND ((qryKandKursUnion.PositionA)=1));


Zu den Anhängen:
Im Form sind OBEN 3 Optionsgruppen; die sind für die weitere Zuordnung und! für die Filter des Berichtes vorgesehen.

Was hältst Du von der Möglichkeit, eine tblTage zu gründen, die als Datensatzquelle für den Bericht dient. Dann muss ich zwar die Struktur der Verknüpfungstabelle ändern, hätte aber einen nachvollziehbaren Filterausdruck.
Im Mom werden- ausgehend vom Montag der Prüfungswochen- die weiteren 4 Tage berechnet. Damit hab ich zwei Filterwerte: WocheA und B, dazugehörige Tage 1 bis 5. Mit der neuen Tab hab ich nur noch einen Filterwert. weißt Du, wie ich das meine?

@Frithjiof
schön, dass du dich einmischst!
Die Datenquellen sind im Form gefiltert (siehe Anhang). Jetzt muss diese "Tabelle" nur noch auf einen Bericht projeziert werden. Natürlich fehlt noch das Layout und diverse Informationen, aber inhaltlich wäre es OK, das Form genau so auszudrucken.

Nur zum Verständnis (falls die Darstellung zu Grundsatzdiskussionen verleitet): [Position] legt fest, in welcher Spalte der Lehrer den jeweiligen Kurs anzeigen lassen möchte. Die Spaltenanzahl von 10 ist mehr als genug. Pro Raum und Tageszeit werden nie mehr als 5 Schüler geprüft.
Wenn ich die Kriterien lösche, habe ich statt einer Seite max. 10. Das ist insofern OK., weil sowieso jeder Tag an die Kursleiter verteilt werden muss. Aber mein Kampf gilt nicht dem Abnicken, sondern der Lösung. Falls Ihr sowieso nix Besseres zu tun habt...  :-*
Gruß Domm

Frithjiof

Hallo Domm.
Am Einfachsten erscheint es mir für jeden Unterbericht eine Abfrage zu erstellen.

qryUBE1, qryUBE2 ...

und vorm Öffnen des Berichts in die Abfragen den SQLstring zu schreiben,



varPositionA=1

strsql= " SELECT qryKandKursUnion.KandKursID, [Kandidat] & ' (' & [MemoA] & ')' AS AnzKandidat, qryKandKursUnion.KursA, qryKandKursUnion.WocheA, qryKandKursUnion.TagA, " _
& " qryKandKursUnion.TageszeitA, Format([StdBeginn],'Short Time') AS AnzStdBeginn, Format([StdEnde],'Short Time') AS AnzStdEnde, Format([DauerPause],'Short Time') AS AnzPause, " _
& " qryKandKursUnion.PositionA, tblZimmer.Zimmer " _
& " FROM ((qryKandKursUnion INNER JOIN qryZeitenUndPausen ON qryKandKursUnion.StundeA = qryZeitenUndPausen.ZeitID) " _
& " INNER JOIN tblZimmer ON qryKandKursUnion.ZimmerA = tblZimmer.ZimmerID) INNER JOIN tblWoche ON qryKandKursUnion.WocheA = tblWoche.WocheID " _
& " WHERE (((qryKandKursUnion.WocheA)=[AuswahlWoche]) AND ((qryKandKursUnion.TagA)=[AuswahlTag]) AND ((qryKandKursUnion.PositionA)=" & varPositionA & "));"

qryUBE1.sql = strsql



Frithjof

Beaker s.a.

Hallo,
Es ging doch darum, das hier statt auf Felder im Hauptbericht, die IMO
auch so
Me.Parent.Textfeld
referenziert sein sollten, wenn das die Abfrage eines Unterberichtes ist,
auf Funktionen zurückgegriffen werden soll.
Das sähe dann so aus. Unter der Voraussetzung das [AuswahlWoche] und [AuswahlTag] die Textfelder waren
ZitatWHERE (((qryKandKursUnion.WocheA)=AuswahlWoche()) AND ((qryKandKursUnion.TagA)=AuswahlTag()) AND ((qryKandKursUnion.PositionA)=1))
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Domm

Jetzt muss ich Eure Beiträge erst mal zerpflücken, um sie zu verstehen.
Frage: Werden SQL- Anweisungen auch als Code dargestellt?
@Frithjiof
Jeder UB greift auf die gleiche Abfrage zu (qryKandKursUnion) , das Kriterium in [Position] wird dann im Form verankert. Meintest Du, ich soll 10 query anlegen?
Wie ich sehe, hast Du die Variable (1) nach oben gelegt. Hat das eine tiefere Bewandnis auf die Abläufe oder folgst Du damit nur den Konventionen?
Was passiert mit der Zeile qryUBE1.sql = strsql?
@Beaker s.a.
Leider ist mir bei Deinem Satz die Puste ausgegangen. ich bin doch bloß ein Hausl ;)
Meinst Du, der Zugriff auf die Variablen soll nicht über das Kriterium in den UB, sondern über den Code beim Öffnen des HB erfolgen?
Soll ich noch etwas zum Aufklären anhängen?
Gruß Domm

Beaker s.a.

Hallo Domm,
ZitatLeider ist mir bei Deinem Satz die Puste ausgegangen
Sorry, zu viel auf einmal. Also noch mal langsam.
Du wolltest zwei Felder auf einem HBer befüllen, mit denen der UBer
gefiltert wird.
Dann kam der Vorschlag von Lachtaube bezügl. Function in der Abfrage
(DS-Herkunft des UBer). Das geht dann ohne die beiden Textfelder.
Du hattest diese beiden Felder in deiner Abfrage so
ZitatWHERE (((qryKandKursUnion.WocheA)=[AuswahlWoche]) AND ((qryKandKursUnion.TagA)=[AuswahlTag]) AND ((qryKandKursUnion.PositionA)=1));
Wenn das die beiden Felder auf dem HBer sind, müssen die mit
Me.Parent.NameTextfeld
angesprochen werden (Me = UBer, Parent = HBer).

Bezügl. Einsatz der Function(s) hatte ich geschrieben,
ZitatMit diesen beiden Functions ersetzt du in der Abfrage deines Berichtes
die jetzigen Platzhalter (Textfelder)
was dann so aussieht wie in meinem letzten Post
ZitatWHERE (((qryKandKursUnion.WocheA)=fctAuswahlWoche()) AND ((qryKandKursUnion.TagA)=fctAuswahlTag()) AND ((qryKandKursUnion.PositionA)=1))
(Den Functions habe ich diesmal ein Prefix verpasst damit es deutlicher
wird. Hatte Lachtaube schon so, sorry für Versäumnis.)
Hoffe es ist jetzt klarer was ich ausdrücken wollte. Es sind halt zwei Wege,
die zum Erfolg führen sollten.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Frithjiof

Hallo Domm.
Jeder Unterbericht enthält ja ein QueryDef als Datensatzquelle. Mit meinem Vorschlag muss daher nichts zusätzlich gemacht werden. Die Datensatzquellen werden lediglich mit einem eigenen Namen versehen und so über das Datenbankfenster und für VBA einfach zugänglich.
Es ist auch möglich die Datensatzquelle in den jeweiligen Unterberichten zu manipulieren.
Es reicht aus ein beliebiges QueryDef 10 mal zu kopieren und z.B. so zu benennen <qryUBE1> -  <qryUBE10>.

Der sqlstring wird vorm Laden des Berichts  in die  QueryDefs geschrieben

Hier jetzt der ganze Code
Sub test()
    Dim dbs As DAO.Database
    Dim qry As DAO.QueryDef
    Dim strSQL As String
    Dim i As Integer
   
    Set dbs = CurrentDb

    For i = 1 To 10    'für zehn QueryDefs  <qryUBE1> -  <qryUBE10>
       
        Set qry = dbs.QueryDefs("qryUBE" & i) ' Abfrage qryUBE1 öffen
       
        strSQL = "SELECT qryKandKursUnion.KandKursID, [Kandidat] & ' (' & [MemoA] & ')' AS AnzKandidat, qryKandKursUnion.KursA, qryKandKursUnion.WocheA, " _
            & " qryKandKursUnion.TagA, qryKandKursUnion.TageszeitA, Format([StdBeginn],'Short Time') AS AnzStdBeginn, Format([StdEnde],'Short Time') AS AnzStdEnde,  " _
            & " Format([DauerPause],'Short Time') AS AnzPause, qryKandKursUnion.PositionA, tblZimmer.Zimmer " _
            & " FROM ((qryKandKursUnion INNER JOIN qryZeitenUndPausen ON qryKandKursUnion.StundeA = qryZeitenUndPausen.ZeitID) " _
            & " INNER JOIN tblZimmer ON qryKandKursUnion.ZimmerA = tblZimmer.ZimmerID) INNER JOIN tblWoche ON qryKandKursUnion.WocheA = tblWoche.WocheID " _
            & " WHERE (((qryKandKursUnion.WocheA)=[AuswahlWoche]) AND ((qryKandKursUnion.TagA)=[AuswahlTag]) AND ((qryKandKursUnion.PositionA)=" & i & "));"
       
        qry.SQL = strSQL                ' neue Sql Anweisung reinschreiben
        qry.Close
    Next i
    Set qry = Nothing
    dbs.Close
    Set dbs = Nothing
End Sub


Wenn [AuswahlWoche] und [AuswahlTag] Feldwerte aus dem Formular sind kann man die auch aus der Abfrage rauszeihen und durch die Werte ersetzten:

          & " WHERE (((qryKandKursUnion.WocheA)=" & me.auswahlwoche & ") AND ((qryKandKursUnion.TagA)=" & me.auswahltag & ") AND ((qryKandKursUnion.PositionA)=" & i & "));"


Frithjof