Neuigkeiten:

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

Mobiles Hauptmenü

Vorjahreswerte anzeigen...

Begonnen von datekk, Januar 05, 2015, 15:02:34

⏪ vorheriges - nächstes ⏩

datekk

Ich habe eine Abfrage erstellt welche mit gewisse Umsatzstände nach Quartal und Produkt Anzeigt. Also das Ergebnis ist so:

Quartal    Produkt          Umsatz  Vertragseingang
2015-1    Produkt 1        10000   Alles

Nun möchte ich aber diese Abfrage um den Vorjahresumsatz ergänzen welcher zum gleichen Zeitpunkt wie heute vor einem Jahr dort stand.

Quartal   Produkt          Umsatz      Vertragseingang VorjahresQuartal   Vertragseingang   VJ-Umsatz
2015-1   Produkt 1       10000        Alles                     2014-1                    <=05.01.14         5000
2015-1   Produkt 2       15000        Alles                     2014-1                    <=05.01.14         7000
2015-2   Produkt 1       7000          Alles                     2014-2                    <=05.01.14         3000

Die Spalte Umsatz beinhaltet also die Summe aller vorliegenden Verträge bezogen auf Quartal und Produkt. Die Spalte VJ-Umsatz soll die Summe der Verträge beinhalten, welche bis heute vor einem Jahr eingegangen sind, bezogen auf das Produkt und das Quartal des Vorjahres.

Nur kurz zur Erklärung: Meine Produkte (es sind Magazine) erscheinen 4 mal jährlich neu, daher die Quartalsaufteilung.

In der abgefragten Tabelle befinden sich alle Informationen. Also Quartal, Produkt, Umsatz, Vertragseingang. Das Vorjahresquartal ist anhand des Quartals zu berechnen und der VJ-Umsatz als Summe aller Verträge beschränkt auf den Vertragseingang <=heute vor einem Jahr. Alle Umsätze sind als Summe notwendig.

Ziel ist einen aktuellen Umsatzvergleich zum Vorjahr zu haben. Also wie stellt sich mein aktueller Umsatz pro Quartal pro Produkt im Vergleich zum Vorjahr Stand heute vor einem Jahr dar.

Das ganze möchte ich dann fein in einen Bericht integrieren, Gruppiert nach Quartal und dann nach Produkt.

Also

     Quartal           Produkt           aktueller Umsatz          Vorjahresumsatz
     2015-1
 
                          Produkt 1         10000                          5000
                          Produkt 2         15000                          7000
                          Produkt 3          usw                             usw

                                             Quartalssumme               Vorquartalssumme

(Wie) Ist dies zu realisieren?
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

MzKlMu

Hallo,
nach meiner Meinung ist das Datenmodell grundlegend falsch.
Die Umsätze sind in einer Tabelle zu führen. Und zwar jeweils ein Datensatz je Quartal und Produkt.
Für den Bericht kannst Du dann eine Kreuztabellenabfrage verwenden, die auch gleich summiert.

Wie ist denn die jetzige Tabelle mit den Umsätzen genau aufgebaut?
Gruß Klaus

datekk

#2
Danke für Deine Antwort. Die Datensätze sind genau so erfasst.

Also Tabelle:

ID  Vertragseingang Produkt  Quartal(Ausgabe)  Umsatz
1    10.12.14            1           2015-3                405,5
2    15.03.14            1           2014-3                809,5
3    25.04.14            2           2014-4  1009

usw.

Vielleicht ist auch der Begriff Quartal irreführend... Besser kann man auch Ausgabe oder Version dafür verwenden....

Über eine Kreuztabelle ist der Vertragseingang aber pro Ausgabe nicht variabel definierbar. Es sollen ja für die Vorjahresangaben nur Verträge in die Umsatzsumme einbezogen werden, welche bis genau heute vor nem Jahr vorlagen.
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

MaggieMay

Zeig doch bitte mal den SQL-Code deiner bisherigen Abfrage, evtl. erweitert um "Spalte2" (s. anderen Thread), dann haben wir eine gemeinsame Grundlage.
Freundliche Grüße
MaggieMay

datekk

Bisher ist es nur eine ganz normale Abfrage nach den aktuellen Werten da ich keine Ahnung davon habe, wie ich das mit den Vorjahreswerten hinbekommen kann.


SELECT Magazine.Magazintitel, AngebotAuftrag_Inhalte.Ausgabe, Sum(AngebotAuftrag_Inhalte.Angebotspreis) AS SummevonAngebotspreis
FROM ((AngebotAuftrag_Inhalte INNER JOIN Magazine ON AngebotAuftrag_Inhalte.ID_Magazin = Magazine.ID) INNER JOIN AngebotAuftrag ON AngebotAuftrag_Inhalte.AngebotAuftrag_ID = AngebotAuftrag.ID_AngebotAuftrag) INNER JOIN Vertrieb ON AngebotAuftrag.Vertrieb_ID = Vertrieb.ID_Vertrieb
WHERE (((AngebotAuftrag.Art)="Auftrag") AND ((AngebotAuftrag_Inhalte.ID_Verlag)=1) AND ((AngebotAuftrag.Art)="Auftrag") AND ((Vertrieb.ID_Vertrieb)=GetLoginID()))
GROUP BY Magazine.Magazintitel, AngebotAuftrag_Inhalte.Ausgabe;
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

MaggieMay

Die Abfrage hat leider keinerlei Ähnlichkeit mit dem was du bisher beschrieben hast... :(
Es sollte schon wenigstens die Auswahl des Zeitraums bzw. ein Datenfeld das diesen Zeitraum (-> Quartal) enthält darin vorkommen. Und bislang ging es um Umsätze und nicht um Angebotspreise.

BTW:
Das Kriterium ((AngebotAuftrag.Art)="Auftrag") ist doppelt.
Freundliche Grüße
MaggieMay

datekk

Freilich ist meine Datenbank und deren Namen komplizierter, hier ist es aber ab und an besser, die Dinge einfacher zu benennen.

Die Spalte Vertragseingang wurde eingefügt. Angebotspreis = Umsatz


SELECT Magazine.Magazintitel, AngebotAuftrag_Inhalte.Ausgabe, Sum(AngebotAuftrag_Inhalte.Angebotspreis) AS SummevonAngebotspreis, AngebotAuftrag.Vertragseingang
FROM ((AngebotAuftrag_Inhalte INNER JOIN Magazine ON AngebotAuftrag_Inhalte.ID_Magazin = Magazine.ID) INNER JOIN AngebotAuftrag ON AngebotAuftrag_Inhalte.AngebotAuftrag_ID = AngebotAuftrag.ID_AngebotAuftrag) INNER JOIN Vertrieb ON AngebotAuftrag.Vertrieb_ID = Vertrieb.ID_Vertrieb
WHERE (((AngebotAuftrag.Art)="Auftrag") AND ((AngebotAuftrag_Inhalte.ID_Verlag)=1) AND ((Vertrieb.ID_Vertrieb)=GetLoginID()))
GROUP BY Magazine.Magazintitel, AngebotAuftrag_Inhalte.Ausgabe, AngebotAuftrag.Vertragseingang;

Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

ebs17

ZitatFreilich ist meine Datenbank und deren Namen komplizierter, hier ist es aber ab und an besser, die Dinge einfacher zu benennen.
Für wen ist das besser? Wozu ist das besser?
Bei einer Gebärenden ist die Geschichte mit dem Storch dann auch nicht sonderlich hilfreich.

Generell: Einen Vorjahreswert erhält man, wenn man beim Datum(!) ein Jahr zurückgeht:
DateAdd("yyyy", -1, Datumswert)

Sowie: Eine halbswegs vernünftige Lösung wird man eher nicht gewinnen, wenn man auf eine Abfrage mit drei INNER JOIN's etwas aufpfropft, sondern eher, indem man innerhalb der Abfrage Tabellen anders verarbeitet und  verknüpft. Dazu wären dann Halbwissen und Unwissen zu realen Tabellen und deren Beziehungen nicht hilfreich.
Mit freundlichem Glück Auf!

Eberhard

datekk

@ebs17: Klasse der Vergleich mit der Gebärenden  ;D

Egal wie... manchmal weiß ich einfach nicht wie ich anfangen soll die Dinge schlüssig zu erklären. Daher habe ich nun mal eine Beispieldatei angehangen. Der dortige Bericht beinhaltet das Feld Vorjahresquartal.

In der einfachen Variante sollte dort z.B. im Bereich "2015" in der Zeile des Quartals "2015-1" hinter der 3134 der Betrag des Vorjahresquartals stehen... also hier am Beispiel konkret 1390.

In einer erweiterten Variante sollen bei "Betrag" alle Werte ohne Einschränkung berücksichtigt werden, in der Spalte "Vorjahresvergleich" aber nur Werte mit Vertragsdatum "<= Heute vor einem Jahr" um zu sehen wie der Vertragsstand genau vor einem Jahr aussah.

Freilich kann ich dafür auch immer seperate Berichte erstellen, es wäre aber schön, wenn man das so übersichtlich abbilden könnte. Wenn ich z.B. eine Auswertung meines Steuerberaters erhalte so sehe ich auch meinen aktuellen Umsatz z.B. 01.01.2014 bis 31.05.2014 und in einer Spalte dahinter der Umsatz des Vorjahreszeitraumes also z.B. 01.01.2013 bis 31.05.2013. Damit hat man einen direkten Vergleich der Zahlen und diese Art der Lösung strebe ich für mein Access Projekt auch an.

Ggf. ist es nötig, die Quartalsangabe durch eine zusätliche Spalte mit fixer Datumsangabe zu ergänzen... also 2014-1 = 01.01.2014, 2014-2 = 01.04.2014, 2014-3 = 01.07.2014 usw. um so ggf. rechnerisch die Quartale besser abbilden zu können....

Beste Grüße
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

ebs17

ZitatVielleicht ist auch der Begriff Quartal irreführend... Besser kann man auch Ausgabe oder Version dafür verwenden....
In der "erklärenden" DB: Ist da Quartal eine Ausgabe, die da mal 150, dann mal 380 oder 750 oder 110 kostet? Oder sind das Zahlungseingänge in dem Zeitraum?

2015-4 mit drei Beträgen: Was bedeutet das? Schon verkauft und verbucht?
Mit freundlichem Glück Auf!

Eberhard

ebs17

Bei einer Tabelle in meiner Vorstellung könnten monatliche Umsätze inkl. Vorjahres-Monatsumsätze so ermittelt werden:
PARAMETERS
   Starttag DATE,
   Endetag DATE
;
SELECT
   AJ.ProduktID,
   AJ.Monat,
   AJ.Umsatzsumme AS Umsatz_AJ,
   VJ.Umsatzsumme AS Umsatz_VJ
FROM
   (
      SELECT
         ProduktID,
         Year(Umsatztag) * 100 + Month(Umsatztag) AS Monat,
         SUM(Umsatz) AS Umsatzsumme
      FROM
         TabelleU
      WHERE
         Umsatztag BETWEEN [Starttag] AND [Endetag]
      GROUP BY
         ProduktID,
         Year(Umsatztag) * 100 + Month(Umsatztag)
   ) AS AJ
      INNER JOIN
         (
            SELECT
               ProduktID,
               Year(DATEADD("yyyy", - 1, Umsatztag)) * 100 + Month(DATEADD("yyyy", - 1, Umsatztag)) AS Monat,
               SUM(Umsatz) AS Umsatzsumme
            FROM
               TabelleU
            WHERE
               Umsatztag BETWEEN DATEADD("yyyy", - 1, [Starttag])
                  AND
               DATEADD("yyyy", - 1, [Endetag])
            GROUP BY
               ProduktID,
               Year(Umsatztag) * 100 + Month(Umsatztag)
         ) AS VJ
         ON AJ.ProduktID = VJ.ProduktID
            AND
         AJ Monat = VJ.Monat + 100
Mit freundlichem Glück Auf!

Eberhard

datekk

@ebs17:

kannst Du mal die von dir bearbeitete Datei hier einstellen damit ich mir das mal genauer anschauen kann?`
Man kann das Quartal vielleicht wirklich ähnlich eines Produktes sehen. 2015-4 mit drei Beträgen bedeutet dass bereits jetzt drei Buchungen für dieses Quartal vorliegen.
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

ebs17

Ich kann die "bearbeitete" Datei nicht einstellen, weil sie nicht existiert.

Ich habe die Abfrage live geschrieben, mir dabei eine Tabelle vorgestellt. Deren Struktur (unvollständig) lässt sich dann wiederum aus der Abfrage ablesen:
ProduktID ... Long (Fremdschlüssel)
Umsatztag ... Date
Umsatz ... Currency

Langweilige Routinearbeiten wie Tabellen nach Vorlage erstellen und mit sinnvollen Probedaten füllen überlasse ich gern anderen.
Mit freundlichem Glück Auf!

Eberhard

datekk

#13
Ok. Ich habe es hinbekommen. Und zwar mit einem zusätzlichen Feld in der Abfrage "AusgabeVJ" welche die Vorjahresausgabe via


Val([Ausgabe])-1 & "-" & Mid([Ausgabe],6) AS AusgabeVJ


ermittelt. Danke hierfür an MzKlMu.  ::)

Im Bericht selbst habe ich dann die DomSumme - Funktion benutzt. Neues Textfeld im Berichtskopf (versteckt) mit Vorjahresdatum "TxtDatVJ"


=DatAdd("jjjj";-1;Datum())


Und in den Detailbereich ein weiteres neues Textfeld mit Steuerinhalt =


=DomSumme("Angebotspreis";"AbfrageDOMSUM";"Ausgabe=" & '[AusgabeVJ]' & " AND Magazinname=" & '[Magazintitel]' & " And Vertrieb_ID=" & GetLoginID() & " AND Vertragseingang <= TxtDatVJ")


Weiterhin war eine neue Abfrage nötig da in der Abfrage welche dem Bericht zugrunde liegt Felder berechnet werden und diese Abfrage sich nicht mit dem DomSummen Befehl nutzen ließ.

Jedenfalls habe ich nun soweit das was ich wollte. Bis auf eins.

Das Textfeld in dem nun die Werte stehen nennt sich im Moment noch "Text60".. Das ist eigentlich egal.. Ich würde aber gern nun die Summe von "Text60" im Berichtsfuß bilden. Also habe ich ein neues Feld dort eingefügt mit Steuerelementinhalt


=summe([Text60])


Leider passiert da gar nix. Keine Fehlermeldung, kein Wert, nix.. Das Feld bleibt leer. Woran könnte das liegen? Ggf. dass die Berechnung der Text60 Felder noch dauert und das Summenfeld einfach noch keine Summe hat???
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

MaggieMay

Hallo,

ich denke, du musst die Gesamtsumme ebenfalls mit Hilfe der Domänenfunktion ermitteln. Berechnungen auf Basis von berechneten Feldern unterstützt Access nicht.

Ich verstehe allerdings nicht, warum du die Zwischensummen nicht bereits in der Abfrage berechnest.
Freundliche Grüße
MaggieMay