Neuigkeiten:

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

Mobiles Hauptmenü

Zwei Unterberichte im Hauptbericht.....

Begonnen von WilliR, Juli 16, 2025, 15:00:04

⏪ vorheriges - nächstes ⏩

WilliR

Hallo miteinander,
jetzt hoffe ich dass mir irgendwer weiter helfen kann.
Mit meinen Access-Wissen bin ich hier leider völlig am Ende.

Folgendes.....und wahrscheinlich habe ich grundlegende Schritte schon falsch umgesetzt.

Es gibt einen Bericht mit Namen "Frisch_Festbeton3"
Über ein Listenfeld "LF1" im Formular suche ich den gewünschten Datensatz.
Alle Daten sind im Berichtskopf untergebracht und der Ausdruck passt.

Nun zum Problem.....
Ebenfalls im Berichtskopf habe ich nun 2 Unterberichte eingefügt, die mir
aus der gleichen Tabelle wie dar Hauptbericht "WuerfelF01W01" den jeweiligen nächsten Datensatz
anzeigen, bzw. Drucken sollen.
Kriterium für den jeweilig nächsten Datensatz ist das Feld "RezeptSorte"...dieses muss auch bei den folgenden zwei Datensätzen gleich wie im Hauptbericht sein.
Auf dem gesamten Bericht werden demnach drei Datensätze abgebildet.
Sollte aber nur nach dem Filterkriterium nur ein weiterer Datensatz vorhanden sein, soll der zweite Unterbericht leer sein.
Derzeit sind die zwei Unterberichte "Unterbericht1" u. "Unterbericht2"  mit dem Hauptbericht gebunden. Mit den Feldern "LieferscheinNr" und "RezeptSorte"
Im Rahmen meiner bescheidenen Möglichkeiten habe ich alles Probiert. Bekomme das aber leider nicht hin.
Wäre sehr Dankbar um Hilfe
l.G. Willi

Bitsqueezer

Hallo,

Du kannst beliebig viele Unterberichte in einen Bericht einbauen. Die verbundenen Felder stellen dabei das Filterkriterium für den Unterbericht dar. Wenn der Filter dabei keinen Datensatz findet, sollte auch der Unterbericht entsprechend leer sein.

Viel mehr kann man aus Deiner Beschreibung nicht entnehmen.

Gruß

Christian

WilliR

Danke für Deine schnelle Antwort.
Es gibt definitiv mind. zwei Datensätze nach dem im Listenfeld ausgewählten Datensatz.
Aber wie beomme ich es hin, dass die im Unterbericht1 und Unterbericht2 mit gedruckt werden.
Der ausgewählte wird ja im Hauptbericht angezeigt. Nur eben nicht die nachfolgenden in den Unterberichten!

Bitsqueezer

Hallo,

wenn es doch die gleiche Art Datensätze sind, die im Hauptbericht dargestellt werden - warum dann einen Unterbericht?
Du kannst doch einfach den Report für alle 3 Datensätze ausgeben, der Bericht rendert dann alle 3 nacheinander im gleichen Layout.

Ansonsten mußt Du halt in der Hauptabfrage das Kriterium für die jeweils anderen beiden Unterberichte zur Verfügung stellen. Beispielsweise, indem Du eine Unterabfrage in die Feldliste der Hauptabfrage einbaust, die den nächsten und übernächsten Datensatz liest und von dort den Wert bezieht, den Du zur Filterung der Unterberichte einsetzen willst.

Das Ergebnis kannst Du dann für die Verknüpfung zwischen Haupt- und Unterbericht verwenden.

Gruß

Christian

Knobbi38

Hallo Willi,

dafür brauch man keine Unterberichte, sondern so etwas kann man auch über die Eigenschaft Report.NextRecord, vorzugsweise unter Verwendung von Gruppierungen, steuern. Das setzt allerdings eine richtige Sortierung voraus.

Eine andere Alternative wäre auch mit Code, z.B. so, wie man es auch in ungebundenen Reports machen würde.

Gruß Knobbi38

MzKlMu

Hallo,
ich muss jetzt doch schon wieder mit dem Datenmodell um die Ecke kommen.  :)
Wenn alle Daten aus einer Tabelle kommen (was ja geschrieben wurde) so liegt vermutlich ein Strukturfehler vor.

Hat die Datenbank mit Prüfwürfeln für die Betongüte zu tun ?

Wenn es mehrere Tabellen gibt, so sollten Beziehungen angelegt sein. Wenn das so ist, zeige mal ein Bild des Beziehungsfensters.

Kannst Du bitte mal die Aufgabe der DB beschreiben ?
Gruß Klaus

WilliR

Hallo Klaus,
Hallo miteinander,
ja, es geht um eine Datenbank für Prüfwürfel.
Der Ausdruck beinhaltet eben die Grunddaten der drei Datensätze.
Nur bestimmte Daten sollten direkt nebeneinander dargestellt werden.
Deshalb dachte ich mir bilde ich das mit Unterformularen ab.
Beim Drucken zeigen die 3 Spalten jetzt natürlich immer die gleichen Daten an.
Wie bekomme ich es hin, dass Unterformular1 und Unterformular 2 eben die nächsten geilterten Daten anzeigen?

Die Antwort von Christian mit "Bericht rendern" verstehe ich leider nicht.

Evtl. wäre in der Hauptabfrage für den Bericht das Kriterium für die Unterformulare der richtige Weg.
Aber wie sollte so ein kriterium aussehen ?

Kannst Du bitte mal die Aufgabe der DB beschreiben ?
Es geht um eine Betonlabor Anwendung.......
Im Programmteil "Frisch Festbeton" werden Prüfungsdaten erfasst.
Ein Ausdruck unter anderem gibt ein Prüfzeugnis aus. (mit jeweils drei Prüfkörper)
Aller drei Prüfkörper sind mit der gleichen Betonrezeptur "RezeptSorte" erstellt.
Ich suche im Listenfeld den ersten Probkörper aus. Die ein Teil der zwei weiteren Datensätze mit der gleichen "RezeptSorte" sollen im Unterformular1 und Unterformular2 abgebildet werden.
V.G. Willi

MzKlMu

Hallo,
gibt es nur diese eine Tabelle
wie sieht die Struktur der Tabelle(n) aus ?
Gibt es Beziehungen (wenn es mehrere Tabellen sind) ?

Eigentlich sollte es mindestens 2 Tabellen geben.

- Rezeptur
- Prüfwürfel (mit Fremdschlüssel zur Rezeptur)

Wenn die Datenbank nach den Regeln (Normalisierung) aufgebaut ist, wirst Du hier mit Sicherheit keine Unterberichte brauchen.
Gruß Klaus

WilliR

Hallo,
Ja, alle relevanten Daten sind in einer Tabelle "WuerfelF01W01"
Die Struktur.....
Nr(ID)
LieferscheinNr
RezeptSorte
U.v.m.....

Es gibt keine Beziehungen.

Bis auf die Bindung Hauptbericht...Unterbericht mit dem Feld "RezeptSorte"
V g Willi

MzKlMu

Hallo,
wie gesagt, Du brauchst hier mindestens 2 Tabllen.

In einer Tabelle wird die Rezeptur erfasst und in der 2. Tabelle die Prüfungen.

Bei einem Bericht zeigt man dann in einem Gruppenkopf die Rezeptur an und im Detailbereich dann die Prüfungen.

Alles ganz einfach und ohne Unterberichte.

Zeige mal ein Bild des Tabellenentwurfs dass man alle Tabellenfelder sieht.
Und markiere die Felder die zur Rezeptur gehören und die Felder für die Prüfungsdaten.

Anmerkung:
Der jetzige Tabellenaufbau ist für eine Datenbank ungeeignet.
Du solltest Dich mit den Grundlagen zu Access beschäftigen.

Siehe hierzu:
https://www.access-tutorial.de/
Gruß Klaus

WilliR

Hallo,
Upps...Das wäre dann ein größerer Datenbank Umbau.
Ich dachte die Datenherkunft der beiden Unterberichte könnte evtl. mit VBA bewerkstelligt werden.
Die Anwendung läuft eigentlich Top. Der Bericht mit den drei Datensätze wäre die Kür.
Aber wenn das mit meinem Datenmodell nicht zu machen ist, muss ich das Projekt wohl beim Versuch belassen.
Danke trotzdem

Bitsqueezer

Hallo,

ein Bericht ist ja erst mal nur eine Vorlage, eine Blaupause, ein Design.
"Rendern" ist einfach, diese mit Daten zu befüllen und daraus den eigentlichen Bericht auszugeben.
Ist ein Begriff aus der Grafik, z.B., um fotorealistische Bilder per Berechnung aus einem 3D-Modell zu berechnen.

Ich bin in letzter Zeit sehr viel mit Blender unterwegs, daher sorry für den Begriff... paßt allerdings trotzdem.. :)

Es ist schwierig zu sagen, wie Du mit dem vermutlich falschen Datenmodell nun zum richtigen Ergebnis kommst. In einem korrekt aufgesetzten Datenmodell kann man das recht einfach bewerkstelligen und auch beantworten.

Wenn dagegen eigentlich eine Excel-Tabelle vorliegt (Konzept: Alles in eine Tabelle packen...), hat das nicht viel mit einem Datenmodell im Sinn einer Datenbank zu tun und da müßtest Du z.B. mal eine Demodatenbank zusammenstellen, die alle relevanten Tabellen (naja, ist dann ja nur eine.. ) sowie den Bericht enthält, eine Beschreibung, wie der Bericht am Ende aussehen soll, die Abfrage(n), die Du dazu benutzt hast, und ein paar Demodatensätze, die alles beinhalten, was man da so sehen können soll (anonymisierte Daten, falls geschäftlich relevant). Das dann hier hochladen, dann kann man sich das ansehen und eine Aussage dazu treffen.

Gruß

Christian

WilliR

#12
Hallo Christian,
in einem vorhergehenden Versuch hatte ich die 3 aufeinanderfolgenden Datensätze abgebildet bekommen.
Allerdings im Detailbereich. Hier habe ich aber das Problem dass ich die Formatierung (Spaltenbreite) nicht so klein bekomme, dass die Daten nebeneinander Platz haben (Bericht muss Hochkant sein)
Ich vermute das hängt mit dem Bezeichnugsfeld zusammen. Das ich aber nur links vom ersten Datensatz brauche.
So habe ich eben dann gemeint dass das mit Unterberichten besser zu bewerkstelligen ist.
Anbei der Code der im Detailbereich funktioniert.
V.G. Willi

Dim rs As DAO.Recordset, rs2 As DAO.Recordset
  Dim strSQL As String, strRezeptSorte As String
  Dim lngCurrentRow As Long
  Dim i As Integer

  ' Überprüfen, ob ein Element im Listenfeld ausgewählt ist
  If Me!LF1.ListIndex = -1 Then
    MsgBox "Bitte wählen Sie einen Eintrag im Listenfeld aus.", vbExclamation
    Exit Sub
  End If

  ' Den Wert der ausgewählten Rezeptsorte ermitteln
  strRezeptSorte = Me!LF1.Column(4) '  Annahme: Die Rezeptsorte ist die erste Spalte
  lngCurrentRow = Me!LF1.ListIndex

  ' SQL-Abfrage erstellen, um die Datensätze zu filtern
  strSQL = "SELECT * FROM WuerfelF01W01 WHERE RezeptSorte = '" & strRezeptSorte & "' ORDER BY Nr" ' ID als Beispiel für Sortierung, anpassen

  ' Den Recordset öffnen
  Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)

  ' Den Recordset bis zum aktuell ausgewählten Datensatz navigieren
  rs.MoveFirst
  For i = 0 To lngCurrentRow
      If Not rs.EOF Then
          rs.MoveNext
      Else
          Exit For
      End If
  Next i

  ' Die nächsten beiden Datensätze (oder weniger, falls weniger vorhanden sind) verarbeiten
  If Not rs.EOF Then
    Set rs2 = CurrentDb.OpenRecordset("SELECT * FROM WuerfelF01W01 WHERE RezeptSorte = '" & strRezeptSorte & "' ORDER BY Nr", dbOpenSnapshot)
    rs2.MoveFirst
    For i = 0 To lngCurrentRow + 2
        If Not rs2.EOF Then
            rs2.MoveNext
        Else
            Exit For
        End If
    Next i

    ' Bericht öffnen und filtern
    'Druckt sofort aus
    'DoCmd.OpenReport "Frisch_Festbeton3", acViewNormal, , "RezeptSorte = '" & strRezeptSorte & "'", acWindowNormal '  Bericht und Tabellenname anpassen
   
    'Druckt die Vorschau aus
    DoCmd.OpenReport "Frisch_Festbeton3", acPreview, , "RezeptSorte = '" & strRezeptSorte & "'", acWindowNormal '  Bericht und Tabellenname anpassen
   
    DoCmd.Maximize ' Optional: Bericht maximieren
  Else
      MsgBox "Keine weiteren Datensätze mit der gleichen Rezeptsorte gefunden.", vbInformation
  End If

  ' Aufräumen
  If Not rs Is Nothing Then rs.Close
  If Not rs2 Is Nothing Then rs2.Close
  Set rs = Nothing
  Set rs2 = Nothing

Bitsqueezer

Hallo,

das sieht ein wenig so aus, als hätte es eine KI ausgespuckt... ;)
(Wogegen prinzipiell nichts spricht, nur muß man aufpassen, weil die KI auch nicht immer richtige Ergebnisse produziert - man sollte also schon selbst verstehen, was da passiert.)

Sowas hier ist z.B. völlig gaga (sorry, wenn Du das warst):

  rs.MoveFirst
  For i = 0 To lngCurrentRow
      If Not rs.EOF Then
          rs.MoveNext
      Else
          Exit For
      End If
  Next i

Um zu einem bestimmten Datensatz zu kommen, nimmt man in einem Recordset entweder FindFirst oder schränkt durch entsprechende WHERE-Bedingung gleich auf den gesuchten Datensatz ein.

Darüber hinaus, wenn man durch ein Recordset geht, nimmt man eine Do-While oder Do-Loop-Schleife, die als Abbruchbedingung EOF verwendet, kein For/Next mit Exit For, außer es hat einen sinnvollen Grund.

Das Listcontrol sollte für eine Auswahl aus einer ID und einem lesbaren Text bestehen. Die ID ist durch Angabe der Breite von 0cm versteckt und dann ist der Wert (Value) der Listbox die ausgewählte ID.

"SELECT *" sollte man grundsätzlich vermeiden. Immer genau nur die Felder angeben, die man wirklich auslesen will. Dazu gibt es so viele Artikel und Beiträge, die Gründe darfst Du gern selbst raussuchen.

Die zweite Schleife macht auch keinen Sinn, es werden hier auch nicht "die nächsten beiden Datensätze verarbeitet", wie im Kommentar steht. Du holst vielmehr alle Datensätze mit der Rezeptsorte aus der Tabelle und gehst dann alle Datensätze von 0 bis zur lngCurrentRow +2 durch, also 0 bis 17, wenn diese 15 war. Du machst aber nichts damit, es wird nichts "verarbeitet", Du wanderst einfach nur mit MoveNext durch das Recordset.

Danach öffnest Du den Bereicht mit dem Filter auf die Rezeptsorte, was also gar nichts mit Deinen beiden Recordsets zu tun hat. Die werden in beiden Schleifen einfach nur durchlaufen, ohne irgendeinen Sinn.

Der Aufruf der Berichte ist ja nicht Bestandteil einer Schleife.

Übrigens: Nach dem Einfügen von Code in den Forentext, diesen hier markieren und oben das "Code"-Icon klicken. Dann wird er ordentlich formatiert und ist leichter lesbar. Bitte ebenso verfahren, wenn Du mal SQL-Code hier einstellst.

Dennoch sagt das alles nun nichts über Deine Datenbank aus und wie die Daten vorliegen.
Ich denke, Dein Bericht hat lediglich zufällig für eine Konstellation funktioniert, aber die Programmierung hier ist leider sinnfrei.

Wie gesagt, ohne Deine Datenbank zu kennen, kann man hier nicht mehr dazu sagen. Siehe oben.

Gruß

Christian


MzKlMu

#14
allo,
mir scheint, da hat men einfach eine Exceltabelle gehabt und die hat man dann versucht in Access abzubilden. Was aber regelmäßig schief geht.

Das Problem beginnt schon damit, dass man in einer Datenbanktabelle die Reihenfolge der Datensätze nicht zuverlässig ist. Angezeigt wird die Tabelle mit der Sortierung des Primärschlüssels.
Es wird also ein Kriterium in der Tabelle benötigt, das die Reihenfolge zweifelsfrei bestimmt, sonst wird das auf Dauer mit den 2 nachfolgenden Datensätzen ohnehin nicht funktionieren.

Wenn die Datenbank richtig aufgebaut wird, lässt sich die gewünschte Darstellung im Bericht völlig problemlos und ohne einen einzigen Buchstaben VBA Code realisieren.
Gruß Klaus