Neuigkeiten:

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

Mobiles Hauptmenü

Abfrage mit Datumsvergleich erstellen

Begonnen von accessy, Juli 14, 2015, 21:06:46

⏪ vorheriges - nächstes ⏩

accessy

Hallo liebe Experten dieses Forums.
Ich habe mal wieder keinen Plan und weiß nicht weiter.

Ich möchte gern einen Umsatzvergleich haben, der wie folgt definiert ist.
Zeige mir alle DS mit Datum von 1.1.2015 bis heute und alle DS mit Datum 1.1.2014 bis Heute vor einem Jahr.
Also einen Zeitabschnitt des laufenden Jahres mit exakt dem Zeitraum vor einem Jahr.

Ich habe mir das Datumsfeld "Erstellt" als serielle Zahl umgewandelt.
Jetzt habe ich 2 Spalten mit der seriellen Zahl.
"Erstellt" und "Heute"...
Wenn ich in den Kriterien z.B. das eingebe, was im Bild zu sehen ist,
bekomme ich auch das gefiltert.
Aber ich weiß nicht wie ich das eingeben muss, damit ich einen Vergleich zwischen den beiden Jahresabschnitten sehen kann.

Kann mir da jemand ein wenig weiterhelfen?
Danke
Gruß Achim

MaggieMay

Hi,
was genau willst du denn miteinander vergleichen?

Könnte folgende Abfrage evtl. dein Ziel sein:
Select KNR, Kunde, Artikel,
IIF(Year(Erstellt) = Year(Date()) -1, Umsatz, NULL) As Umsatz_Vorjahr, 
IIF(Year(Erstellt) = Year(Date()), Umsatz, NULL) As Umsatz_aktJahr
From Werkzeug_Artikel
Where Erstellt Between DateSerial(Year(Date())-1,1,1) AND DateSerial(Year(Date())-1,30,6) OR Erstellt Between DateSerial(Year(Date()),1,1) AND DateSerial(Year(Date()),30,6)


BTW:
Bei Abfragen bitte stets den SQL-Code zeigen.
Freundliche Grüße
MaggieMay

accessy

Das ist alles so kompliziert. Und von SQL habe ich überhaupt keine Ahnung.

Was will ich haben......Hmmm...tja...
Ich habe einen Kundenumsatz 2015 als Summe bis zum heutigen Tage.
Wenn ich einen prozentualen Vergleich haben will zum Vorjahr,
dann darf ich auch nur den Umsatz 1.1.2014 bis heutiges Datum des letzten  Jahres nehmen.

Ich habe eine Kreuztabelle erstellt, die mir die Jahresumsätze des Kunden von 2004 bis 2015 zeigt. Das sieht so aus.

TRANSFORM Sum(Qry_Werkzeug_Artikel.Umsatz) AS SummevonUmsatz
SELECT Qry_Werkzeug_Artikel.KNR, Kunden.PLZ, Kunden.Ort, Kunden.Kunde
FROM Kunden INNER JOIN Qry_Werkzeug_Artikel ON Kunden.KNR = Qry_Werkzeug_Artikel.KNR
GROUP BY Qry_Werkzeug_Artikel.KNR, Kunden.PLZ, Kunden.Ort, Kunden.Kunde
PIVOT Qry_Werkzeug_Artikel.Jahr;

In dieser Kreuztabelle kann ich das Feld ERSTELLT nicht mit einbringen,
weil ja schon das Feld JAHR als Spaltenüberschrift existiert.

Jetzt dachte ich, mit Hilfe einer Abfrage diesen Vergleichszeitraum als Bedingung zum Filtern zu nehmen.

ebs17

ZitatUnd von SQL habe ich überhaupt keine Ahnung.
Ist das für Dich Programm oder nur eine momentane Zustandsbeschreibung?
Für den zweiten Fall kannst Du weiterlesen.

ZitatIch habe mir das Datumsfeld "Erstellt" als serielle Zahl umgewandelt.
Warum? Auch so ist ein DateTime-Wert vorrangig (intern) eine Zahl, also ein Wert, mit dem man mathematisch rechnen könnte.

Idee: In Deiner Kreuztabelle verwendest Du alle Jahre. Die könnte man auch beim gewünschten Zeitraumvergleich einsetzen, ansonsten filtert man die überflüssigen Jahre weg.

Man verwendet eine (zusätzliche) Jahrestabelle mit den relevanten Jahren. Man könnte diese auch per Abfrage erzeugen:
SELECT DISTINCT Year(Erstellt) FROM Werkzeug_Artikel

Diese ermöglicht dann folgenden Ansatz:
SELECT
   T.KNr,
   T.Umsatz,
   Year(T.Erstellt) AS Jahr
FROM
   Werkzeug_Artikel AS T,
   Jahrestabelle AS J
WHERE
   T.Erstellt BETWEEN DateSerial(J.Jahr, 1, 1)
      AND
   DateSerial(J.Jahr, Month(Date()), Day(Date()))
Mit freundlichem Glück Auf!

Eberhard

accessy

Ich habe es auf anderem Wege versucht zu lösen.
So wie es jetzt ist, funktioniert es.

Und dabei ergibt sich eine andere kleine Problematik.
Das hier steht in der Abfrage in den Kriterien:

>=ZLong(#01.01.2014#) Und <=(ZLong(#01.01.2014#)+DatDiff("d";#01.01.2015#;Jetzt()))


Jetzt brauche ich nur noch das JETZT() gegen den Wert der in der Tabelle steht zu tauschen. Ich habe das JETZT() mit Hilfe des Ausdrucksgenerators gegen den Feldnamen getauscht. Und in der Tabelle Berechnungs_Werte steht im Feld fld_Datum der Wert 30.06.2015.

>=ZLong(#01.01.2014#) Und <=(ZLong(#01.01.2014#)+DatDiff("d";#01.01.2015#;[Berechnungs_Werte]![fld_Datum]))

Das sähe dann so aus, funktioniert aber nicht. Denn beim Start der Abfrage will wird jetzt eine Eingabe für das Feld gefordert.

Das verstehe ich nicht. In dem Feld steht doch das Datum drin.

Ich möchte doch nur das JETZT() gegen den Datumswert des Feldes fld_Datum ersetzen.
Was muss ich da ändern?

Gruß Achim

MaggieMay

Hi,

zeige bitte den SQL-Code der Abfrage.
Freundliche Grüße
MaggieMay

accessy


SELECT CLng([Erstellt]) AS ErstelltZahl, Werkzeug_Artikel.Erstellt, Werkzeug_Artikel.Umsatz, Werkzeug_Artikel.KNR, Werkzeug_Artikel.Kunde, Werkzeug_Artikel.Artikel, Werkzeug_Artikel.Jahr
FROM Werkzeug_Artikel
WHERE (((CLng([Erstellt]))>=CLng(#1/1/2014#) And (CLng([Erstellt]))<=(CLng(#1/1/2014#)+DateDiff("d",#1/1/2015#,Now())))) OR (((Werkzeug_Artikel.Erstellt) Like "*2015"))
ORDER BY Werkzeug_Artikel.Erstellt;


Gruß Achim

MaggieMay

Hi,

die Tabelle "Berechnungs_Werte" kommt in der Abfrage aber doch gar nicht vor.
In welcher Beziehung steht sie zur Tabelle "Werkzeug_Artikel"?
Freundliche Grüße
MaggieMay

accessy

Wenn ich zur Tabelle Werkzeug_Artikel noch die Tabelle Berechnungs_Werte hinzufüge,
gibt es eine Beziehung der ID, mehr nicht.
Starte ich nun die Abfrage, kommt es nicht mehr zur Eingabeaufforderung, aber es kommt auch kein Ergebnis mehr.
Das bedeutet wohl, dass die Abfrage das Feld mit dem Inhalt 30.06.2015 nicht wahrnimmt.
Hier der Code:

SELECT CLng([Erstellt]) AS ErstelltZahl, Werkzeug_Artikel.Erstellt, Werkzeug_Artikel.Umsatz, Werkzeug_Artikel.KNR, Werkzeug_Artikel.Kunde, Werkzeug_Artikel.Artikel, Werkzeug_Artikel.Jahr
FROM Werkzeug_Artikel INNER JOIN Berechnungs_Werte ON Werkzeug_Artikel.ID = Berechnungs_Werte.ID
WHERE (((CLng([Erstellt]))>=CLng(#1/1/2014#) And (CLng([Erstellt]))<=(CLng(#1/1/2014#)+DateDiff("d",#1/1/2015#,[Berechnungs_Werte]![fld_Datum])))) OR (((Werkzeug_Artikel.Erstellt) Like "*2015"))
ORDER BY Werkzeug_Artikel.Erstellt;

MaggieMay

#9
Hi,
Zitatgibt es eine Beziehung der ID
macht das denn auch Sinn?? Was haben die IDs der Tabellen miteinander zu tun?
Gibt es keine Referenz von Werkzeug_Artikel zu Berechnungs_Werte oder umgekehrt?
Freundliche Grüße
MaggieMay

accessy

Ich habe in der Entwurfsansicht "Tabelle hinzufügen" die Tabelle Berechnungs_Werte hinzugefügt.
Automatisch erscheint nun die Beziehungslinie zwischen den beiden Tabellen.
Fett hervorgehoben ist in beiden Tabellen das ID und als Option ist Punkt 1 ausgewählt.
Warum die beiden IDs miteinander verknüpft sich, kann ich nicht sagen.
Ich habe die nicht gesetzt.

Naja, wenn das nicht geht, kann ich ja auch statt des JETZT() eine Variable nehmen und als Input immer das von mir gewünschte Datum eingeben.
Wäre auch ne Möglichkeit. Vielleicht sogar noch besser.

MaggieMay

ZitatAutomatisch erscheint nun die Beziehungslinie zwischen den beiden Tabellen.
das passiert automatisch sobald Access indizierte Datenfelder gleichen Namens findet. Es ist also unbedingt zu vermeiden, in allen Tabellen einen Key namens ID zu haben.

Davon abgesehen sollten die Tabellenbeziehungen über das Beziehungsfenster eingepflegt werden.

Meine sonstigen Fragen hast du damit aber leider nicht beantwortet.
Freundliche Grüße
MaggieMay

accessy

Wenn es sich um diese Frage handelt,
Zitat
Gibt es keine Referenz von Werkzeug_Artikel zu Berechnungs_Werte oder umgekehrt?
dann kann ich die nicht beantworten, weil ich die nicht verstehe.

accessy

Alles Mist. Muss nochmal ganz von vorne anfangen. Habe gerade gemerkt, dass das, was ich hier gebastelt habe, doch nicht funktioniert.
Das ist meine Kreuztabelle

TRANSFORM Sum(qry_Werkzeug_Artikel.Umsatz) AS SummevonUmsatz
SELECT qry_Werkzeug_Artikel.KNR, Kunden.PLZ, Kunden.Ort, qry_Werkzeug_Artikel.Kunde
FROM qry_Werkzeug_Artikel INNER JOIN Kunden ON qry_Werkzeug_Artikel.KNR = Kunden.KNR
GROUP BY qry_Werkzeug_Artikel.KNR, Kunden.PLZ, Kunden.Ort, qry_Werkzeug_Artikel.Kunde
ORDER BY qry_Werkzeug_Artikel.Kunde
PIVOT qry_Werkzeug_Artikel.Jahr;


Und das hier ist die Abfrage mit dem Filterkriterium:

SELECT CLng([Erstellt]) AS ErstelltZahl, Werkzeug_Artikel.Erstellt, Werkzeug_Artikel.Umsatz, Werkzeug_Artikel.KNR, Werkzeug_Artikel.Kunde, Werkzeug_Artikel.Artikel, Werkzeug_Artikel.Jahr
FROM Werkzeug_Artikel
WHERE (((CLng([Erstellt]))>=CLng(#1/1/2014#) And (CLng([Erstellt]))<=(CLng(#1/1/2014#)+DateDiff("d",#1/1/2015#,#4/30/2015#)))) OR (((Werkzeug_Artikel.Erstellt) Like "*2015"))
ORDER BY Werkzeug_Artikel.Erstellt;


Jetzt habe ich mal statt dem JETZT() ein festes Datum eingegeben; und zwar den 30.04.2015.
Die Ergebnisse sind jetzt alle DS von Januar 2014 bis April 2014. das wäre richtig. Aber eigentlich sollten jetzt in der Spalte daneben die DS Januar 2015 bis April 2015 stehen, um dann meinen Prozentualen Vergleich zu berechnen.
Aber es sind immer alle DS des Jahres 2015 drin.

Und das wäre falsch für meine Berechnung in Prozent.
Das wäre dann nämlich der Umsatz des Kunden von Januar 2014 bis April 2014 in prozentualer Differenz zu Januar 2015 bis Juli 2015.

Ich habe mal ins Modul eine Function eingegeben und den Input Wert der Variablen DatVar dann zu übergeben, aber das geht auch nicht.

Public Function DatVar() 'Variable für Datumsvorgabe zur Berechnung der Umsatzvergleiche
Dim Datum_Bis As Date
   DatVar = InputBox("Bitte das Datum (tt.m.jj) eingeben")
End Function


Das Ziel wäre sowieso, dass ich mein Formular starte, das als Datenherkunft die Kreuztabelle hat und die Inputbox mich nach dem Datum fragt.

MaggieMay

Hi,

kannst du eine Beispiel-DB mit Testdaten hochladen? Dann wäre es sicher leichter eine Lösung zu finden.
Freundliche Grüße
MaggieMay