April 18, 2021, 01:46:19

Neuigkeiten:

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


Datum in Abfrage wird nicht erkannt

Begonnen von ReneB, März 26, 2021, 12:23:53

⏪ vorheriges - nächstes ⏩

ReneB

Hallo Leute,

wahrscheinlich bin ich einfach zu doof, den Fehler zu erkennen, aber ich komme aktuell nicht weiter.
Ich habe aus einer Labornummer: 200701/998 erst den linken Teil selektiert: 20.07.01 und versucht ein Grundformatierung als Datum vorzunehmen. Dann habe ich über DatSeriell versucht ein ordentliches Datum zu erzeugen. Sieht auch gut aus: 01.07.2020. Das Problem ist, das die Abfrage mein Datum nicht zu erkennen scheint, denn sobald ich ein Kriterium einfüge, geht eine Paramenterabfrage auf und er fragt nach dem Feld, welches ich eigentlich abfragen wollte. Also scheint er den Wert nicht als Datum zu interpretieren. Wenn ich allerdings diese Abfrage in eine neue implementiere funkioniert das Kriterium tadellos.
Kann mir hier jemand weiterhelfen?

Danke
Rene


ebs17

Zitatdenn sobald ich ein Kriterium einfüge, geht eine Paramenterabfrage auf
Natürlich. Siehe Grundlagen - SQL ist leicht (11) - Reihenfolge der Abfrageabarbeitung
Der WHERE-Teil wird vor dem SELECT-Teil ausgeführt, daher ist der Name des berechneten Feldes unbekannt. Man muss also im WHERE-Teil die Berechnung zum Inhalt verwenden.
Mit freundlichem Glück Auf!

Eberhard

ReneB

Hallo Leute,

Sorry das ich mich jetzt erst melde, hatte aktuell keine Zeit für meine Datenbank. Ich poste hier mal den SQL code.

SELECT AuftraegeVerpackt_tbl.BatchNr, Format(Left([BatchNr],6),"00\.00\.00") AS Batch_Dat, Format(DateSerial(Left([Batch_Dat],2),Mid([Batch_Dat],5,2),Right([Batch_Dat],2)),"dd/mm/yyyy") AS Dat_Echt
FROM AuftraegeVerpackt_tbl
WHERE ((Year([Dat_Echt])=Year(Date())));

Ich habe bereits versucht über Parameter das Feld "Dat_Echt" zu definieren, funktioniert aber auch nicht.
Kann mir jemand sagen, wie ich das Feld Dat_Echt definieren muss, damit die Abfrage mit dem Kriterium umgehen kann?

Danke sehr.


DF6GL

April 07, 2021, 10:58:01 #4 Letzte Bearbeitung: April 07, 2021, 11:14:19 von DF6GL
Hallo,

wenn nur das Jahr berücksichtigt werden soll, dann genügt:


.
SELECT BatchNr, DateSerial("20" & Left([Batch_Nr],2),Mid([Batch_Nr],3,2),Mid([Batch_Nr],5,2)) AS Dat_Echt
FROM AuftraegeVerpackt_tbl
WHERE "20" & Left([BatchNr],2) = Year(Date())


Der Alias eines Feldes kann nicht in einem Kriterium verwendet werden, weil die Where-Condition vor der Selektion der Ausdrücke in der Selectliste ausgewertet wird und im Kriterium noch nicht bekannt ist.



Bei
Zitat..... DateSerial("20" & Left([Batch......
kann "20" & auch entfallen.


Zudem sind solche "Datums-Vergewaltigungen" nicht sehr performant.

ebs17

Das Problem beginnt bereits damit:
Zitataus einer Labornummer: 200701/998
Warum erzeugt man mit Begeisterung Ausdrücke, mit denen man nicht wirklich umgehen kann und die einem nur Probleme bereiten.
Aus Gründen der 1. Normalform und auch alleine schon aus funktionellen Gründen heraus sollten die atomaren Einzelinformationen in  getrennten Tabellenfeldern gespeichert sein, Batch_Dat als Date, LfdNr als Long. Den Gesamtausdruck kann man zum Angucken simpel in einer Abfrage erzeugen. Das Trennen gelingt ja offensichtlich, es sollte nur einmalig stattfinden und danach die Werte in die Tabellenfelder eingetragen werden. Dann könnte man die Informationen auch wirksam indizieren.

Zusammenstellung der Labornummer in einer Abfrage für weitere Verwendung:
SELECT
   Format(Batch_Dat, "yymmdd") & "/" & LfdNr AS Labornummer [, WeitereFelder]
FROM
   AuftraegeVerpackt_tbl

Deine ursprüngliche Abfrage würde dann so aussehen können und dabei eine Indexnutzung zulassen.
SELECT
   BatchNr,
   Batch_Dat
FROM
   AuftraegeVerpackt_tbl
WHERE
   Batch_Dat BETWEEN DateSerial(Year(Date()), 1, 1)
      AND
   DateSerial(Year(Date()), 12, 31)
Vielleicht fällt bereits auf, dass hier ganz wenig gerechnet wird, nämlich beide Zeitgrenzen genau einmal, nicht aber diese Ausdrücke pro Datensatz.
Einfachheit gibt auch weniger Möglichkeiten, Fehler einzubauen.

Mit freundlichem Glück Auf!

Eberhard

ReneB

Hallo,

danke für die Hilfe. Ich habe mich für die Lösung von DF6GL entschieden. Funktioniert super.
Vieleicht sollte ich kurz erklären, daß die Batch-Nr dem System so zur Verfügung gestellt wird und nicht getrennt nach Datum und Nummer. Da ich herausfinden muss, welche die letzte Nummer im aktuellen Jahr ist, fiel mir ehrlich gesagt nichts besseres ein, als die Batch-Nr zu trennen und nach dem aktuellen Jahr zu filtern.
Jetzt bin ich froh, daß ich ein Stück weiter bin und möchte mich für die Unterstützung hier im Forum echt bedanken.

Super das es Euch gibt.

Grüsse Rene