Neuigkeiten:

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

Mobiles Hauptmenü

Mehrere Gruppierungen und Summenberechnungen in einem Bericht

Begonnen von Seth666, September 25, 2015, 09:38:45

⏪ vorheriges - nächstes ⏩

Seth666

Hallo zusammen,

ich möchte in einem Bericht mehrere unterschiedliche Gruppierungen und Summenberechnungen unterbringen, und das auch noch für einen bestimmten auszuwählenden Zeitraum (Ist das überhaupt möglich?).

Folgende Ausgangsgrundlage:

In einer Tabelle gibt es 4 unterschiedliche Personen die Aufträge vergeben können. Diese 4 Personen kommen aus 2 Fachabteilungen (jeweils 2 Personen pro Fachabteilung). Bei den jeweiligen Aufträgen dieser Personen können maximal 3 Rechnungssummen und 3 Auszahlungssummen vorhanden sein. Zusätzlich gibt es noch 3 mögliche Rechnungsdatums. Die Tabelle ist also von den Feldern her vereinfacht so aufgebaut:

Feld 1: ID
Feld 2: Auftraggber
Feld 3: Rechnungssumme 1
Feld 4: Rechnungssumme 2
Feld 5: Rechnungssumme 3
Feld 6: Auszahlungssumme 1
Feld 7: Auszahlungssumme 2
Feld 8: Auszahlungssumme 3
Feld 9: Rechnungsdatum 1
Feld 10: Rechnungsdatum 2
Feld 11: Rechnungsdatum 3

Jetzt möchte ich in einem Bericht folgendes anzeigen lassen:

zuerst soll eine Parameterabfrage den Rechnungszeitraum eingrenzen. Würde ich in einer Abfrage normalerweise über Parameter->[vonDatum] und [bisDatum] als Kriterium für Rechnungsdatum 1 bis 3 machen. Aber da kommen ja jetzt noch mehrere mögliche Filteroptionen. Der Bericht soll mir also für ein zuvor ausgewählendes vonDatum/bisDatum folgendes anzeigen:

1. Summe von Rechnungssumme 1-3 für Auftraggeber 1 oder 2
2. Summe von Auszahlungssumme 1-3 für Auftraggeber 1 oder 2
3. Summe von Rechnungssumme 1-3 für Auftraggeber 3 oder 4
4. Summe von Auszahlungssumme 1-3 für Auftraggeber 3 oder 4

Bekommt man das in einer Abfrage überhaupt hin oder muss ich mir da was aus mehreren Abfragen zusammenbasteln?

Gruß
Marcus

DF6GL

Hallo,

bevor Du Dich in Tricksereien verlierst,  normalisiere die Tabelle (bzw. die ganze Datenstruktur) und baue den Bericht darauf auf. Dann kannst Du nach Belieben gruppieren, sortieren, berechnen  und weitere schöne Dinge anstellen...  8)


Seth666

Hallo Franz,

das normalisieren der Tabelle ist denke ich zu spät, da schon zuviele Daten darin enthalten sind. Irgendwie muss es doch per VBA oder so möglich sein die verschiedenen Summenbildungen im Bericht oder einer Abfrage durchzuführen. Wie wäre das mit einem bericht mit Unterberichten, die auf unterschiedlichen Abfragen basieren?

Gruß
Marcus

DF6GL

Hallo,

Zitatdas normalisieren der Tabelle ist denke ich zu spät

es ist nie zu spät...  die Daten (egal wie viele) allein sind auch jetzt noch in normalisierte Daten (Tabellenstruktur) überführbar.   

Du kannst  ja mal die von Dir schon selber angedachte (Trick-)Lösung verfolgen..

Soll heißen, für jede Gruppe der zusammengehörenden Textfelder  (xxx1,  xxx2,   xxx3) einen Bericht mit passender Abfrage erstellen und diese in einen vierten Bericht (enthält ID und Auftraggeber) als Unterberichte einbauen.


Seth666

Ich habe die Idee mit den Unterberichten mal weiterfolgt, allerdings bereitet die Sache mit den zuvor anzugebenden Parametern für die Eingrenzung des Rechnungszeitraums noch Probleme.

Ich habe testweise mal 3 Abfragen erstellt.
1.) Abfrage 1 für SummevonRechnungssumme 1 und SummevonAuszahlungssumme 1 für Auftraggeber 1oder2. 3x Rechnungsdatum 1 (1xBedingung vonDatum/bisDatum, 1xMin (Gruppierung), 1xMax (Gruppierung)

2.) Abfrage 2 für SummevonRechnungssumme 2 und SummevonAuszahlungssumme 2 für Auftraggeber 1oder2. 3x Rechnungsdatum 2 (1xBedingung vonDatum/bisDatum, 1xMin (Gruppierung), 1xMax (Gruppierung)

3.) Abfrage 3 für SummevonRechnungssumme 3 und SummevonAuszahlungssumme 3 für Auftraggeber 1oder2. 3x Rechnungsdatum 3 (1xBedingung vonDatum/bisDatum, 1xMin (Gruppierung), 1xMax (Gruppierung)

Klicke ich jede Abfrage mal einzeln an, werde ich nach dem [von Datum] und [bis Datum] gefragt und anschließend werden die Rechnungs-/Auszahlungssummen und das minimale und maximale Rechnungsdatum innerhalb des zuvor ausgewählten Zeitraums angezeigt.

So weit so gut.
Auf Basis dieser 3 Abfragen habe ich 3 entsprechende Berichte erstellt. Jeden Bericht einzeln geöffnet das gleiche, Abfrage Zeitraum, anschließend Anzeige von Rechnungs-/Auszahlungssummen und das minimale und maximale Rechnungsdatum.

Jetzt habe ich einen 4. Bericht erstellt und die 3 zuvor genannten Berichte als Unterberichte eingebaut. Jetzt habe ich nur folgendes (logisches) Problem: Ich werde beim Öffnen des 4. Berichts 3x (für die 3 Unterberichte) nach dem Rechnungszeitraum (vonDatum, bisDatum) gefragt, was natürlich nervig ist, da der auszuwählende Zeitraum ja für alle 3 Unterberichte/Abfragen gelten soll. Gibt es da eine Möglichkeit das der Zeitraum nur einmal abgefragt wird und dann an die Abfragen der Unterberichte weitergegeben wird?

DF6GL

Hallo,

die einzelnen Abfragen müssten erst per VBA mit den Kriterien versorgt und danach der Bericht geöffnet werden. Die z. Z. in den Abfragen enthaltenen Parameter müssen entfernt werden.

z.B:


Dim db as Database
set db = Currentdb
db.Querydefs!Abfrage1.SQL =" select ..........  where [Rechnungsdatum 1] between " & Format(Me!vonDatum,"\#yyyy-mm-dd\#) & " and " & Format(Me!bisDatum,"\#yyyy-mm-dd\#)
db.Querydefs!Abfrage2.SQL =" select ..........  where [Rechnungsdatum 2] between " & Format(Me!vonDatum,"\#yyyy-mm-dd\#) & " and " & Format(Me!bisDatum,"\#yyyy-mm-dd\#)
db.Querydefs!Abfrage3.SQL =" select ..........  where [Rechnungsdatum 3] between " & Format(Me!vonDatum,"\#yyyy-mm-dd\#) & " and " & Format(Me!bisDatum,"\#yyyy-mm-dd\#)

Docmd.Openreport "rptRechnungen",acpreview,,"ID = " & Me!ID


Die Unterberichte müssen über das ID-Feld mit dem Hauptbericht verknüpft werden.

Seth666

Bei welcher Ereignisprozedur müsste der VBA-Code denn plaziert werden? "Bei Laden", "Beim Öffnen" in der Berichtseigenschaft?

Und wie mache ich das mit der ID? Generiere ich mir da eine neue (die Auftrags-ID der einzelnen Aufträge kann ich ja nicht nehmen, da ich die dazugehörigen Rechnungssummen ja in der Funktion aufsummiere)? Z.B. eine ID die ein aktuelles Datumsfeld ist? Sorry, wie Du bestimmt mekrst bin ich in puncto VBA und Access-Aufbau nicht gerade der Fortgeschrittenste...

DF6GL

Hallo,

das gehört  z. B. in die Click-Ereignisprozedur einer Formularschaltfläche.

Wenn die die Berichtsdaten nicht von der ID abhängen, brauchst Du die Verknüpfungseigenschaften auch nicht benutzen und das Öffnungskriterium bei Openreport kann auch entfallen.

MaggieMay

Hallo,

du kannst die Kriterien auch mit Hilfe von Funktionsaufrufen in die Abfrage holen.
Ein Beispiel dazu findest du in der Access-FAQ 3.15.
Freundliche Grüße
MaggieMay

Seth666

@Franz: Die Berichtsdaten hängen zwar nicht von einer (Auftrags-)ID ab, aber von einem zuvor per Parameter festzulegenden von-bis-Datum (ich will ja nicht die Rechnungssumme über den kompletten Datenbestand angezeigt bekommen, sondern nur für einen bestimmten Abrechnungszeitraum). Wenn ich jetzt die Parameter aus den Abfragen lösche und den Bericht mit den 3 integrierten Unterberichten öffne, kommt natürlich keine Abfrage des gewünschten Zeitraums und es werden alle Rechnungssummen angezeigt. Geht also so nicht.

@MaggieMay: Leider werde ich aus der Hilfe nicht ganz schlau (bin ein Access-Dummie).  Wie erstelle ich die Funktion in den Abfragen? Zur Zeit sehen die 3 Abfragen so aus wie im Anhang dargestellt. Und wo würde ich den Code

Public Function fctSendVar() ' hier evtl. noch den Typ angeben

  fctSendVar = DeineGlobaleVariable

End Function

platzieren?


DF6GL

Hallo,

zu den Parametern habe ich mich schon geäußert.
Allerdings ist die dargestellte Berichtsabfrage so nicht zu gebrauchen, wenn Datumsbereiche eingeschränkt werden sollen.  Dazu müssen die Datumsfelder mit in die Abfrage aufgenommen werden.  Wenn dadurch aber die geweünschte Gruppierung "flöten" geht, dann ist es sinnvoller, die Gruppierung(en) und Berechnungen im Bericht selber zu machen und die Berechnungen/Gruppierungen aus der Abfrage heraus zu nehmen..

Seth666

Hallo Franz,

zu der Abfrageansicht (angehängtes JPG) muss ich dazu sagen, dass ich das Feld "Rechnungsprüfung 1 am" noch einmal zusätzlich in der Abfrage hatte. Dieses Feld hatte als Funktion "Bedingung" und als Kriterium "zwischen [von Datum] und [bis Datum]", wobei [von Datum] und [bis Datum] als Parameter in der Abfrage deklariert waren. Mit dieser Abfrage hatte die Zeitraumeingrenzung auch wunderbar funktioniert. Vor dem Öffnen wurde ich nach [von Datum] und [bis Datum] gefragt und nach der Eingabe wurde die akkumulierte Rechnungssumme, die akkumulierte Auszahlungssumme sowie das minimale und das maximale Rechnungsdatum innerhalb des zuvor ausgewählten Zeitraum angezeigt. Wunderbar also, nur beim Öffnen des Berichts (bzw. der 3 Unterberichte) wurde der Zeitraum 3x abgefragt und nicht wie gewünscht nur einmal.

Gruß
Marcus

DF6GL

Hallo,


ZitatDieses Feld hatte als Funktion "Bedingung" und als Kriterium "zwischen [von Datum] und [bis Datum]", wobei [von Datum] und [bis Datum] als Parameter in der Abfrage deklariert waren.

Hast Du denn mein vor-vorletztes Posting nicht verstanden?

Seth666

Meinst Du

Zitatdas gehört  z. B. in die Click-Ereignisprozedur einer Formularschaltfläche.

Wenn die die Berichtsdaten nicht von der ID abhängen, brauchst Du die Verknüpfungseigenschaften auch nicht benutzen und das Öffnungskriterium bei Openreport kann auch entfallen.

Deswegen hatte ich ja die Parameterabfrage aus der Abfrage entfernt....

Sorry, ich weiß ich bin ein schwerer Fall  :-\

DF6GL

Hallo,

nein, ich meinte das so, wobei die "select...." -Teile eben dem Abfrage-SQL-String entsprechen. Abfrage1-Abfrage3 sind die Abfragen für die 3 Unterberichte:

ZitatDie z. Z. in den Abfragen enthaltenen Parameter müssen entfernt werden.

z.B:



Code: [Auswählen]

Dim db as Database
set db = Currentdb
db.Querydefs!Abfrage1.SQL =" select ..........  where [Rechnungsdatum 1] between " & Format(Me!vonDatum,"\#yyyy-mm-dd\#) & " and " & Format(Me!bisDatum,"\#yyyy-mm-dd\#)
db.Querydefs!Abfrage2.SQL =" select ..........  where [Rechnungsdatum 2] between " & Format(Me!vonDatum,"\#yyyy-mm-dd\#) & " and " & Format(Me!bisDatum,"\#yyyy-mm-dd\#)
db.Querydefs!Abfrage3.SQL =" select ..........  where [Rechnungsdatum 3] between " & Format(Me!vonDatum,"\#yyyy-mm-dd\#) & " and " & Format(Me!bisDatum,"\#yyyy-mm-dd\#)

Docmd.Openreport "rptRechnungen",acpreview,,"ID = " & Me!ID



Die Unterberichte müssen über das ID-Feld mit dem Hauptbericht verknüpft werden.