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 ⏩

MaggieMay

Hallo,

so ließe sich die Parameterübergabe per Funktionsaufruf umsetzen:

1. deklariere zwei globale Variablen in einem allgemeinen Modul:
Public pDatVon, pDatBis

2. schreibe darunter folgende Funktionen:
Public Function getDatVon()
    getDatVon = Format(pDatVon,"\#yyyy-mm-dd\#)
End Function
Public Function getDatBis()
    getDatBis = Format(pDatBis,"\#yyyy-mm-dd\#)
End Function


3. schreibe folgenden Code ins Load-Ereignis des Hauptberichts:
pDatVon = InputBox("Bitte Datum-von eingeben:", "Berichtsanforderung", DateAdd("m",-1,Date))
pDatBis = InputBox("Bitte Datum-bis eingeben:", "Berichtsanforderung", Date)
Wenn die Vorgabe eines Defaultwertes keinen Sinn macht, kannst du das natürlich weglassen.

4. ändere den SQL-Code der Abfragen wie folgt:
Select ... From ... Where [Rechnungsdatum 1] Between getDatVon() And getDatBis
Natürlich kannst du auch anstelle der globalen Variablen und Abfrage der Daten per Inputbox aus den "get-Funktionen" direkt auf Formularfelder zugreifen.

Vorteil: Es können gespeicherte Abfragen ohne Anpassung eingesetzt werden.
Freundliche Grüße
MaggieMay

Seth666

Also, ich verzweifle hier langsam...

ich habe die Schritte von MaggieMay mal befolgt, aber ich bekomme fehlerhafte Syntaxmeldungen und unbekannte Ausdrücke. Ich habe mal meine DB in vereinfachter/verkürzter Form eben neu erstellt (inkl. des Moduls) und im Anhang beigefügt. Aber wenn ich auf Bericht4 klicke (der die 3 Unterberichte zu den 3 Abfragen enthält), dann funktioniert nix.

Wo kann denn da der Fehler liegen?

Gruß
Marcus

MaggieMay

#17
Hi,

es fehlen die schließenden Gänsefüßchen in der Format-Anweisung.

Sorry, mein Fehler, aber man hätte drauf kommen können...

Den Datentypenkonflikt verursachen möglicherweise die Leerfelder, um ihn zu beheben, könnte man evtl. die Kriterien umschreiben:
FROM Tabelle1
WHERE  (
((Tabelle1.Auftraggeber)="Meier" Or (Tabelle1.Auftraggeber)="Müller") AND
((Tabelle1.Rechnungsdatum3) Is Not Null)
)
GROUP BY Tabelle1.Auftraggeber
HAVING
(((Tabelle1.Rechnungsdatum3) Between getDatVon() And getDatBis()))
;
Freundliche Grüße
MaggieMay

Seth666

So, Änderungen übernommen, jetzt kommt die Meldung "Sie wollten eine Abfrage ausführen, die den angegeben Ausdruck 'Tabelle.Rechnungsdatum1 Between getDatVon() And getDatBis()' nicht als Teil der Aggregatfunktion einschließt."

Öffne ich die Abfragen in der Entwurfsansicht und wechsel in die SQL-Ansicht steht da Folgendes:

In Abfrage 1:

SELECT Tabelle1.Auftraggeber, Sum(Tabelle1.Rechnungssumme1) AS SummevonRechnungssumme1, Sum(Tabelle1.Auszahlungssumme1) AS SummevonAuszahlungssumme1
FROM Tabelle1
WHERE (((Tabelle1.Auftraggeber)="Meier" Or (Tabelle1.Auftraggeber)="Müller") AND
((Tabelle1.Rechnungsdatum1) Is Not Null))
GROUP BY Tabelle1.Auftraggeber
HAVING (((Tabelle1.Rechnungsdatum1) Between getDatVon() And getDatBis()));

In Abfrage 2:

SELECT Tabelle1.Auftraggeber, Sum(Tabelle1.Rechnungssumme2) AS SummevonRechnungssumme2, Sum(Tabelle1.Auszahlungssumme2) AS SummevonAuszahlungssumme2
FROM Tabelle1
WHERE (((Tabelle1.Auftraggeber)="Meier" Or (Tabelle1.Auftraggeber)="Müller") AND
((Tabelle1.Rechnungsdatum2) Is Not Null))
GROUP BY Tabelle1.Auftraggeber
HAVING (((Tabelle1.Rechnungsdatum2) Between getDatVon() And getDatBis()));

In Abfrage 3:

SELECT Tabelle1.Auftraggeber, Sum(Tabelle1.Rechnungssumme3) AS SummevonRechnungssumme3, Sum(Tabelle1.Auszahlungssumme3) AS SummevonAuszahlungssumme3
FROM Tabelle1
WHERE (((Tabelle1.Auftraggeber)="Meier" Or (Tabelle1.Auftraggeber)="Müller") AND
((Tabelle1.Rechnungsdatum3) Is Not Null))
GROUP BY Tabelle1.Auftraggeber
HAVING (((Tabelle1.Rechnungsdatum3) Between getDatVon() And getDatBis()));

Die o.g. Meldung erhalte ich 3x, dann öffnen sich die Abfrageboxen Eingabe vonDatum und Eingabe bisDatum und danach der Bericht, der allerdings keinen Inhalt (keine 3 Unterberichte) zeigt.

MaggieMay

#19
Hi,

das mit der Gruppierung kann man noch hinkriegen:
SELECT Tabelle1.Auftraggeber,
Sum(Tabelle1.Rechnungssumme3) AS SummevonRechnungssumme3,
Sum(Tabelle1.Auszahlungssumme3) AS SummevonAuszahlungssumme3
FROM Tabelle1
WHERE (
((Tabelle1.Auftraggeber)="Meier" Or (Tabelle1.Auftraggeber)="Müller") AND
(NZ(Tabelle1.Rechnungsdatum3,0) Between getDatVon() And getDatBis())
)
GROUP BY Tabelle1.Auftraggeber
;
aber dann geht's immer noch nicht.

Ich weiß nicht, warum das mit der Datumsformatierung nicht klappt, also versuche es mal hiermit:
SELECT Tabelle1.Auftraggeber,
Sum(Tabelle1.Rechnungssumme1) AS SummevonRechnungssumme1,
Sum(Tabelle1.Auszahlungssumme1) AS SummevonAuszahlungssumme1
FROM Tabelle1
WHERE (
(Nz(Tabelle1.Rechnungsdatum1,0) Between getDatVon() And getDatbis()) And
((Tabelle1.Auftraggeber)="Meier" Or (Tabelle1.Auftraggeber)="Müller"))
GROUP BY Tabelle1.Auftraggeber;

Das gilt entsprechend für alle drei Abfragen.

Und die Funktionen ändern sich wie folgt:
Public Function getDatVon() As Double
    getDatVon = CDbl(DateValue(pDatVon)) 'Format(DateValue(pDatVon), "#yyyy-mm-dd#")
End Function

Public Function getDatBis() As Double
    getDatBis = CDbl(DateValue(pDatBis)) 'Format(DateValue(pDatBis), "#yyyy-mm-dd#")
End Function
Freundliche Grüße
MaggieMay

Seth666

Hallo MaggieMay,

Auch mit diesen Änderungen funktioniert es nicht richtig. Ich habe die entsprechende Datenbank mal beigefügt.

Mache ich einen Doppelklick auf die Abfragen öffnen sich diese zwar ohne Fehlermeldung, es wird in den Feldern (Summenfeldern und Auftraggeberfeld) aber auch nichts angezeigt. Es erfolgt auch keine Datumsabfrage.

Öffne ich den Bericht4, bekomme ich die Fehlermeldung "Laufzeitfehler '13' Typen unverträglich" und im Debugger wird die Zeile

getDatVon = CDbl(DateValue(pDatVon)) 'Format(DateValue(pDatVon), "#yyyy-mm-dd#")

aus dem Modul angezeigt.

Was wäre, wenn man folgende einfachere Programmierungslösung macht:

Wenn ich in einem Berichtsauswahlformular den Bericht4 auswähle öffnet sich ein neues Formular. Darin habe ich 2 Buttons ("Schließen" und "Öffnen") und 2 ungebundene Textfelder. In diesen Textfeldern gebe ich das vonDatum und bisDatum ein. Beim Klick auf den Button "Öffnen" sollen die Abfragen 1 bis 3 die Werte aus den ungebundenen Texfeldern als Kriterium für die Zeitraumeingrenzung nutzen.
Das müsste doch eigentlich einfacher sein als o.g. Lösung, oder? Frage wäre, wie müsste die on-klick-Prozedur des "Öffnen"-Buttons aussehen und wie der Aufbau der Abfragen?

Gruß
Marcus

MzKlMu

Hallo,
im Grunde genommen ist das ein Thema das zeigt, dass eine normalisierte Struktur unbedingt anzustreben ist. Wenn Du am 25.9. begonnen hättest eine normalisierte Struktur anzulegen, wäre das innerhalb einer kurzen Zeit erledigt gewesen. Ohne Unterberichte mit deren Tücken.

Wenn Du bei der Struktur bleiben willst, könnte man auch über eine Unionabfrage nachdenken, die die normalisierte Struktur behelfsmäßig erzeugt.
Dann kann man diese Abfrage für den Bericht verwenden und braucht dann auch keine UBs.
Gruß Klaus

MaggieMay

#22
Sorry, ich hatte vergessen darauf hinzuweisen, dass die Parameter im OPEN-Ereignis des Berichts abgefragt werden müssen.

PS:
Das hättest du eigentlich merken müssen, dass die Datumsabfrage viel zu spät kommt...

Nachtrag:
Der Vorschlag von Klaus ist leicht umzusetzen:
SELECT Abfrage1.Auftraggeber, 1 as Spalte, Abfrage1.SummevonRechnungssumme1 As Rechnungsbetrag, Abfrage1.SummevonAuszahlungssumme1 As Auszahlungsbetrag
FROM Abfrage1;
UNION
SELECT Abfrage2.Auftraggeber, 2, Abfrage2.SummevonRechnungssumme2, Abfrage2.SummevonAuszahlungssumme2
FROM Abfrage2;
UNION
SELECT Abfrage3.Auftraggeber, 3, Abfrage3.SummevonRechnungssumme3, Abfrage3.SummevonAuszahlungssumme3
FROM Abfrage3;

und ein Bericht auf Basis dieser Abfrage schnell erstellt.

Aber auch die Eingabe der Parameter via Formular ist eine gute Idee, ändert aber nichts an der Notwendigkeit einer geeigneten Formatierung der Datumswerte.
Freundliche Grüße
MaggieMay

Seth666

Hallelujah!!!

Problem gelöst! Ich habe jetzt einfach wie zuvor beschrieben ein Formular erstellt mit 2 ungebundenen Textfeldern. Dann einen Button der einen Bericht öffnet. In diesem Bericht 3 Unterberichte die sich auf jeweilige Abfragen beziehen. In diesen Abfragen als Kriterium für das Rechnungsdatum "Zwischen [Forms]![FRM_Zeitraumauswahl_Rechnungsstatistik1]![vonDatum] Und [Forms]![FRM_Zeitraumauswahl_Rechnungsstatistik1]![bisDatum]"

geschrieben und schon funktioniert es wie gewünscht.
Auch wenn es jetzt eine etwas umständlichere und wahrscheinlich programmierungstechnisch unbedarfte Lösung ist Euch Allen vielen Dank für die Eure Hilfe!

Gruß
Marcus