Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Abfrage mit Datumsvergleich erstellen

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

⏪ vorheriges - nächstes ⏩

accessy

Ich habe es gelöst, also meine Vorstellung des Umsatzvergleich geht damit.
Wie kann ich über eine Inputabfrage das

SELECT Werkzeug_Artikel.Erstellt, CLng([Erstellt]) AS ErstelltZahl, 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/31/2014#))) OR (((CLng([Erstellt]))>=CLng(#1/1/2015#) And (CLng([Erstellt]))<=CLng(#1/31/2015#)))
ORDER BY Werkzeug_Artikel.Erstellt;


hintere Datum (31.01.2014 und 31.01.2015) der Abfrage übergeben? Es ist fast eine Art VON ....BIS.
Wenn ich da eine Funktionsvariable einbaue, bekomme ich immer den Hinweis, dass das kein Datum ist.

MaggieMay

Hallo,
ZitatEs ist fast eine Art VON ....BIS.
wieso "fast" und warum willst du nur das Endedatum variabel halten?
ZitatWenn ich da eine Funktionsvariable einbaue, bekomme ich immer den Hinweis, dass das kein Datum ist.
Dann zeige, wie du das machst, inkl. des dazu eingesetzten Funktions-Code.
Freundliche Grüße
MaggieMay

accessy

Ich habe die VBA Function wieder gelöscht. Finde die auch nicht mehr.
War ja auch nur ne Inputbox, die das gewünschte Datum abfragt.

SELECT Werkzeug_Artikel.Erstellt, CLng([Erstellt]) AS ErstelltZahl, 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(#2/15/2014#))) OR (((CLng([Erstellt]))>=CLng(#1/1/2015#) And (CLng([Erstellt]))<=CLng(#2/15/2015#)))
ORDER BY Werkzeug_Artikel.Erstellt;



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;


Ich hatte mal versucht über das DatDiff die Anzahl der Tage vom 1.1. bis zum gewünschten Datum zu nehmen. Dann das Jahr minus 1 als Vergleich zum anderen Jahr mit der selben Anzahl Tage...Aber das ging auch nicht.

Ich versuche es nochmal etwas verständlicher zu  bringen.
Die obere Abfrage dient als Filter, bzw. als Bedingung für die Ausgabe der Kreuztabellenabfrage.

So wie es jetzt im SQL Code zu sehen ist, funktioniert es.
Ich gehe in die obere Abfrage, Entwurfsansicht, ändere das Datum (oben aktuell drin 15.02.  2014 zu 2015) und bekomme einen neuen Vergleich in der Kreuztabelle.
Das ist natürlich ganz schön umständlich.

Daher wollte ich beim Start meines Formulars, dass dann als Datenherkunft diese Abfragen hat, eine Inputbox starten, die mir das gewünschte Datum vorgibt.
Annahme die Inputbox geht auf, ich gebe dann z.B. 31.05.2015 ein.
Jetzt steht in der unteren Bedingung der Kriterien das 31.05.2015 drin,
und automatisch in den Kriterien der Abfrage wird der obere Wert auf 31.05.2014 gesetzt.
Also eigentlich der eingegebene Inputwert minus 1 Jahr.

MaggieMay

Hi,

du kannst hierzu doch eine ganz normale Parameterabfrage einsetzen, in der du Datum-von und Datum-bis eingibst und für die zweite Auswahl davon jeweils ein Jahr abziehst.

Besipiel:
SELECT Werkzeug_Artikel.Erstellt, CLng([Erstellt]) AS ErstelltZahl, Werkzeug_Artikel.Umsatz, Werkzeug_Artikel.KNR, Werkzeug_Artikel.Kunde, Werkzeug_Artikel.Artikel, Werkzeug_Artikel.Jahr
FROM Werkzeug_Artikel
WHERE (
(CLng([Erstellt])>=CLng(DateValue([Datum von:])) And
CLng([Erstellt])<=CLng(DateValue([Datum bis:]))
) OR (
(CLng([Erstellt])>=CLng(DateAdd("y",-1, DateValue([Datum von:]))) And
CLng([Erstellt])<=CLng(DateAdd("y",-1, DateValue([Datum bis:])))
)
ORDER BY Werkzeug_Artikel.Erstellt;


Bzgl. Parameter in Verbindung mit Kreuztabellenabfragen beachte bitte donkarls FAQ 3.18.
Freundliche Grüße
MaggieMay

accessy

Ich bekomme ständig die Fehlermeldung Syntaxfehler....Fehlender Operator im Ausdruck.
Ich weiß gar nicht, welcher da fehlen soll.
DateAdd hat als Syntax (Intervall, Zeit, Datum). Und das scheint mir doch gegeben.
Oder ist das "-1" das Problem?
Hat das bei dir funktioniert?

ebs17

Nebenbei gefragt:
WHERE CLng(Erstellt)>=CLng(#1/1/2014#)

Das Vollstopfen von Vergleichen mit Funktionen findet hier im Thread inflationär statt. Wofür ist das gut und wo lernt man das?

Ich persönlich empfinde bei diesem Anblick da schon so etwas wie körperlichen Schmerz:
- Eine Indexnutzung wird ausgeschlossen. In einer Datenbank (potentiell große Datenmengen) ist das ungeschickt bis "strafbar" und sollte daher auf die Fälle beschränkt werden, wo solches auf Grund der Gestaltung nicht vermeidbar ist.
- Funktionen ausführen bedeutet auch Aufwand, bei datensatzweiser Wiederholung um so mehr. Unnützer Aufwand beeinflusst auch Performance.

Daher: Welchen besonderen Grund gibt es?
Mit freundlichem Glück Auf!

Eberhard

MaggieMay

#21
Hi,

was den Syntaxfehler betrifft, so gibt es zu viele Klammern.
Nimm die öffnenden Klammern vor CLng jeweils weg.

Was die Funktionen betrifft, so ist der Einsatz von CLng und DateValue in diesem Zusammenhang komplett überflüssig.
Freundliche Grüße
MaggieMay

accessy


SELECT Werkzeug_Artikel.Erstellt, ([Erstellt]) AS ErstelltZahl, Werkzeug_Artikel.KNR, Werkzeug_Artikel.Kunde, Werkzeug_Artikel.Artikel, Werkzeug_Artikel.Jahr
FROM Werkzeug_Artikel
WHERE (((([Erstellt]))>=DateValue(#1/1/2015#) And (([Erstellt]))<=(DateValue([Datumsbereich für das aktuelle Jahr:])))) OR (((([Erstellt]))>=DateValue(#1/1/2014#) And (([Erstellt]))<=(DateValue([Datumsbereich für das letzte Jahr:]))))
ORDER BY Werkzeug_Artikel.Erstellt;


Das ist nun die aktuelle Variante, die auch funktioniert.
Ich gebe z.B. 15.5.15...ENTER....und dann 15.5.14 ein.
Ist nicht komfortabel, aber ich bekomme meine gewünschte Lösung eines prozentualen Vergleichs.

Geil wäre es, wenn sich die Abfrage öffnet, die Datumsfrage stellt und das HEUTIGE Datum bereits als Vorschlag da stehen würde.
Dann drücke ich nur Enter und gebe bei der 2. Eingabe das Datum minus 1 Jahr ein.

Aber wie man einbauen kann, weiß ich wirklich nicht.

MaggieMay

#23
Wenn du das heutige Datum haben willst, warum setzt du es nicht direkt in der Abfrage ein?
Und die zweite Eingabe ist komplett überflüssig, da sich das Datum aus dem ersten berechnen lässt.
Die dazu benötigten "Bausteine" wurden doch alle bereits gezeigt, warum denkst du dir immer wieder etwas Neues aus?

Das heutige Datum als Vorschlag lässt sich nur mit einer Input-Box lösen, bzw. mit einem Funktionsaufruf:
WHERE ([Erstellt]>=DateValue(#1/1/2015#) And [Erstellt]<=get_DatumBis())

Public Function getDatumBis()
    get_DatumBis = Format(InputBox("Datum bis eingeben:", Date()), "\#yyyy\/mm\/dd\#")
End Function


Aber auch das von-Datum solltest du variabel halten, oder willst du die Abfrage ständig ändern?
Freundliche Grüße
MaggieMay

accessy

Ich habe alles wieder auf ein festes Datum gesetzt.
Wenn ich es anders haben will, gehe ich die Abfrage und ändere einfach das Datum.

SELECT Werkzeug_Artikel.Erstellt, CLng([Erstellt]) AS ErstelltZahl, 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(#3/31/2014#))) OR (((CLng([Erstellt]))>=CLng(#1/1/2015#) And (CLng([Erstellt]))<=CLng(#3/31/2015#)))
ORDER BY Werkzeug_Artikel.Erstellt;


Wenn ich nämlich das Formular starte bekomme ich die Meldung,
dass die Feldnamen nicht erkannt werden von diesem Join.

Und die Kreuztabellenabfrage kann ich im Entwurf nicht öffnen.
Da komme ich wegen der Fehlermeldung nicht mehr rein.

Ist nicht weiter tragisch. Diesen prozentualen Vergleich schaue ich mir doch nur ganz selten an. Geht doch so auch.

Danke trotzdem für die Hilfe.....

MaggieMay

Es ist alles lösbar... man muss nur sämtliche Details kennen, die dabei eine Rolle spielen.

Zitatdass die Feldnamen nicht erkannt werden von diesem Join.
Wie lautet die konkrete Fehlermeldung und wie sieht der Code (deine Version!) dazu aus?

Eine vermutlich einfacher umzusetzende Lösung wäre, die Datumsangaben per Formular einzutragen und in den Kriterien der Abfrage auf diese zuzugreifen.
Freundliche Grüße
MaggieMay