MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 27.12.2017, 05:48   #1
Chris97724
MOF User
MOF User
Standard Acc2007 - Parameterabfrage aus 2 Spalten (Datum, Uhrzeit) zur Selektion nach Schichtsystem

Hallo zusammen,

ich hoffe, ihr habt Weihnachten gut gefeiert und überstanden.

Folgendes Problem:

Aktuell kann ich Daten aus einem Archiv über die Spalte "Datum" mithilfe einer Parameterabfrage zu einer weiteren Tabelle hinzufügen (Dateneingrenzung).

Es gibt noch die Spalte "Uhrzeit" die quasi die Buchungszeiten zum jeweiligen Datum angibt. Darüber kann man nun feststellen, in welcher Schicht gebucht wurde (Früh-, Spät- oder Nachtschicht).

Der Code aktuell lautet folgendermaßen:

Code:

INSERT INTO Rohdatentabelle (Belegnummer, Materialnummer, Stückzahl )
SELECT Belegnummer, Materialnummer, Stückzahl
FROM Datenarchiv
WHERE Datum BETWEEN (ParameterVon) and (ParameterBis);
Das funktioniert soweit. Wie könnte ich da jetzt noch die Uhrzeit mit ins Spiel bringen?

z. B. wenn der Beleg vom 2.12.2017 um 04:00:00 Uhr früh ist, dann soll das noch zum 1.12.2017 gehören, da bis 05:59:59 Uhr die Nachtschicht des Vortages läuft.
Ist das relativ einfach zu realisieren bzw. hat jemand schon spontan eine konkrete Idee? Meine SQL-Kenntnisse sind relative begrenzt. Würde das dennoch gerne irgendwie einbauen.

EDIT:
Mir ist etwas eingefallen, und zwar wenn ich im Datenarchiv eine berechnete Hilfsspalte erstelle. Hierzu habe ich eine Formel erstellt, welcher nur leider gar nicht funktioniert. Irgendwas stimmt mit der Syntax nicht. Die Spalte berechnet, wenn die Uhrzeit >= 0 Uhr und kleiner als 6 Uhr ist, dann Datum minus 1, ansonsten Datum (alles zwischen 0 Uhr und 05:59:59 Uhr gehört also noch zum Vortag. Die berechnete Spalte soll also ein Datum ausgeben.

Code:

Wenn([Uhrzeit]>="00:00:00" Und [Uhrzeit]<"06:00:00";[Datum]-1;[Datum])
Fehlermeldung: Der Ausdruck konnte nicht gespeichert werden, weil sein Ergebnistyp (z. B. Binär oder NULL) vom Server nicht unterstützt wird


Danke schonmal im Voraus für eure Hilfe.

Viele Grüße
Christian

Geändert von Chris97724 (27.12.2017 um 07:37 Uhr).
Chris97724 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 27.12.2017, 07:38   #2
Nouba
MOF Guru
MOF Guru
Standard

Datum und Uhrzeit zu trennen ist eher suboptimal. Wenn Du gleichlange 8-Std.-Schichten hast (6:00, 14:00, 22:00) kannst Du jeweils 6 Stunden vom Zeitpunkt subtrahieren. den neuen Zeitanteil mit 3 multiplizieren, davon den Ganzzahlwert ermitteln und 1 hinzuaddieren. Hier ein Beispiel aus dem VBA-Direktbereich:
Code:

dt = #2017-12-22#
zt1 = #05:58:00#
zt2 = #06:00:00#
zt3 = #13:55:33#
zt4 = #14:00:00#
zt5 = #21:59:59#
zt6 = #22:59:59#

dt1 = CDate(dt + zt1 - #06:00:00#)
dt2 = CDate(dt + zt2 - #06:00:00#)
dt3 = CDate(dt + zt3 - #06:00:00#)
dt4 = CDate(dt + zt4 - #06:00:00#)
dt5 = CDate(dt + zt5 - #06:00:00#)
dt6 = CDate(dt + zt6 - #06:00:00#)

? Int(dt1);Int((dt1 - int(dt1)) * 3) + 1;". Schicht"
21.12.2017  3 . Schicht

? Int(dt2);Int((dt2 - int(dt2)) * 3) + 1;". Schicht"
22.12.2017  1 . Schicht

? Int(dt3);Int((dt3 - int(dt3)) * 3) + 1;". Schicht"
22.12.2017  1 . Schicht

? Int(dt4);Int((dt4 - int(dt4)) * 3) + 1;". Schicht"
22.12.2017  2 . Schicht

? Int(dt5);Int((dt5 - int(dt5)) * 3) + 1;". Schicht"
22.12.2017  2 . Schicht

? Int(dt6);Int((dt6 - int(dt6)) * 3) + 1;". Schicht"
22.12.2017  3 . Schicht
Nouba ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 27.12.2017, 08:04   #3
Chris97724
Threadstarter Threadstarter
MOF User
MOF User
Standard

Guten Morgen Nouba,

vielen Dank für Deine Rückmeldung.

Ich glaube das ist zu kompliziert für mich. Im Endeffekt reicht es mir wenn die berechnete Spalte einfach wieder ein Datum zurückgibt. Uhrzeiten zwischen 00:00:00 und 06:00:00 Datum des Vortags, ansonsten aktuelles Datum belassen. Die Aufteilung in einzelne Schichten ist gar nicht notwendig.

Hintergrund: Über meine Parameterabfrage wenn ich über das neue Datum eingrenze, habe ich auch die Zeiträume zwischen 0 und 6 Uhr mit drin, auch wenn es eigentlich ein anderes Datum ist.

Aktuell stimmt meine Syntax nur irgendwie nicht. Oder geht das so gar nicht mit meiner WENN-Formel aus dem Eingangspost?
Chris97724 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 27.12.2017, 12:16   #4
Beaker s.a.
MOF Koryphäe
MOF Koryphäe
Standard

Hallo Christian,
Code:

>="00:00:00"
Code:

zt1 = #05:58:00#
Fällt dir was auf?
Du musst die Uhrzeit SQL-konform übergeben.
gruss ekkehard

__________________

--
S.M.I.²L.E.
Beaker s.a. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 28.12.2017, 10:20   #5
Chris97724
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo ekkehard,

vielen Dank für Deine Rückmeldung.

Ich berechne ja in der Tabelle eine neue Spalte über den Ausdrucks-Generator. Ich dachte dass das wohl die einfachste Lösung für mein Problem ist. Wenn ich die Uhrzeit so wie Du meintest mit der Raute am Anfang und am Ende der Uhrzeit anpasse, kommt immernoch eine Fehlermeldung.
Chris97724 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 28.12.2017, 10:45   #6
ebs17
MOF Guru
MOF Guru
Standard

Code:

SELECT 
   Belegnummer, 
   Materialnummer, 
   Stückzahl,
   Datum + (Uhrzeit >= #0:00:00# AND Uhrzeit < #6:00:00#) AS Schichtdatum
FROM 
   Datenarchiv 
WHERE 
   Datum BETWEEN [ParameterVon}
      AND 
   [ParameterBis]

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 28.12.2017, 12:30   #7
Beaker s.a.
MOF Koryphäe
MOF Koryphäe
Standard Ot

Code:

Datum + (Uhrzeit >= #0:00:00# AND Uhrzeit < #6:00:00#) AS Schichtdatum
Wann lerne ich es endlich so zu denken, - einfach geil.

__________________

--
S.M.I.²L.E.
Beaker s.a. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 28.12.2017, 13:11   #8
ebs17
MOF Guru
MOF Guru
Standard

@ekkehard: Das "Denken" ist recht oft kein eigentlicher kreativer Akt, sondern nur ein "Abschreiben" von etwas Vorhandenem, das man gesehen und nicht gleich wieder vergessen hat. Das Letztere ist wohl die eigentliche Leistung, die aber für jeden möglich sein sollte.
Eine Lösung beinhaltet in der Regel ein Prinzip. Wenn man das erkennt und in der Lage ist, nicht nur eine Lösung so wie sie ist zu kopieren, sondern das Lösungsprinzip variabel anzuwenden (=> sinngemäß abzuschreiben), dann kommt man ein großes Stück weiter.

Alter ermitteln ist als Lösung sicher sehr vielen vertraut. Hieraus könnte man auch das Rechnen mit Logik ableiten, unabhängig von Geburtstag und Alter.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 28.12.2017, 13:44   #9
Beaker s.a.
MOF Koryphäe
MOF Koryphäe
Standard

Hallo Eberhard,
Möglich schon, klappt aber nicht immer. Die FAQ 2.7 kannte ich wohl,
habe ich aber nie gebraucht und deshalb nie abgeschrieben (und
verinnerlicht).
Sinngemässes Abschreiben klappt aber immer besser.
gruss ekehard

__________________

--
S.M.I.²L.E.
Beaker s.a. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.01.2018, 06:19   #10
Chris97724
Threadstarter Threadstarter
MOF User
MOF User
Standard

Zitat: von ebs17 Beitrag anzeigen

Code:

SELECT 
   Belegnummer, 
   Materialnummer, 
   Stückzahl,
   Datum + (Uhrzeit >= #0:00:00# AND Uhrzeit < #6:00:00#) AS Schichtdatum
FROM 
   Datenarchiv 
WHERE 
   Datum BETWEEN [ParameterVon}
      AND 
   [ParameterBis]

Hallo Eberhard,

War leider über Silvester einige Tage weg, daher erst jetzt die späte Rückmeldung.

Vielen Dank für Deinen Code. Leider bringt er nicht das Ergebnis welches ich benötige. Wenn ich z. B. Datum 04.12.2017 bis 04.12.2017 eingebe, dürfte er mir nur Datensätze auswählen die am 04.12.2017 um 06:00:00 Uhr losgehen (da alles davor ja noch zum Vortag gehört) und spätestens um < 06:00:00 Uhr des Folgetages aufhören. also quasi 24 Stunden von 06:00 Uhr bis 06:00 Uhr.

Habe mal Beispiele ausgewählt, welche er mir aktuell noch selektiert aber nicht mehr selektieren dürfte (wenn ich z. b. 04.12.2017 als Parameter eingebe)

04.12.2017 01:09:36 Uhr
=> Das Datum dürfte er nicht nehmen da es noch zum Vortag gehört (da vor 06:00:00 Uhr. Auswahl nur, wenn ich 03.12.2017 als Parameter eingebe).

Zudem hat er im Abfrageergebnis aus dem Datum einfach den 03.12.2017 gemacht und somit den Datensatz verfälscht.
Chris97724 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.01.2018, 09:12   #11
ebs17
MOF Guru
MOF Guru
Standard

Zitat:

das Ergebnis welches ich benötige

... sollte man derart erzielen, indem man den Filter geeignet setzt.. Im Beispiel ging es primär darum zu zeigen, wie man das Datum zur Schicht berechnen könnte.

Im weiteren Verlauf sollte man sich vor Augen halten, wie eine SQL-Anweisung abgearbeitet wird: Nach dem Checken des FROM-Teils (wo kommen Daten her) wird der WHERE-Teil ausgeführt. Die Zeitraumbegrenzung erfolgt in der angezeigten Abfrage also auf das Datum so wie es in der Tabelle steht. Diesen Effekt erlebst Du.
Erst nach Filterung wird der SELECT-Teil angezeigt und dabei auch die Berechnung nach dem Schichtdatum ausgeführt.

Zum Vergegenwärtigen:
Code:

SELECT 
   Belegnummer, 
   Materialnummer, 
   Stückzahl, 
   Uhrzeit, 
   Datum AS Kalenderdatum, 
   Datum +(Uhrzeit >= #0:00:00# AND Uhrzeit < #6:00:00#) AS Schichtdatum 
FROM 
   Datenarchiv

Wenn folglich die Anforderung so ist, dass man nach dem Schichtdatum filtern will, muss man erst das Schichtdatum berechnen und kann danach nach diesem filtern. Die Abfrage sieht dann ein wenig anders aus.

Bei einem berechneten Feld steigt eine Indexnutzung aus, weswegen bei größeren Datenmengen da eher Auswirkungen auf die Abfrageperformance zu erwarten sind. Deswegen zeige ich eine solche Variante auch nicht als allererste, sondern so etwas sollte sinnvoll (spätest möglich) in den sonstigen Kontext eingebettet werden.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}
Dein Dankeschön: DBWiki=>Spende

Geändert von ebs17 (04.01.2018 um 09:54 Uhr).
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 06.01.2018, 11:58   #12
Chris97724
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hi zusammen,

ich habe mich gerade nochmal damit beschäftigt und bin auf eine neue Idee gestoßen, die aber wohl syntaktisch noch nicht ganz korrekt ist. Könnte das so funktionieren?

Code:

INSERT INTO Rohdatentabelle (Belegnummer, Materialnummer, Stückzahl )
SELECT Belegnummer, Materialnummer, Stückzahl
FROM Datenarchiv
WHERE Datum BETWEEN (ParameterVon) and (ParameterBis)
	AND [Datum = (ParameterVon) AND Uhrzeit >= "06:00:00"]
	AND [DATEADD(day,1,(ParameterVon) AND Uhrzeit < "06:00:00"];
Chris97724 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 06.01.2018, 12:21   #13
ebs17
MOF Guru
MOF Guru
Standard

Eigentlich hätte ich ein anderes (ein) Feedback erwartet.

Zitat:

Könnte das so funktionieren?

Der einfachste Weg wäre, es auszuprobieren, und für den ist es am einfachsten, der die Tabellen mit den Daten bereits hat.

(Syntaktisch) Funktionieren und eine sinnvolle zielgerichtete Maßnahme können dann zweierlei sein. Bei einem Kopieren von Daten aus einem Archiv in Rohdaten mit unbekanntem Ziel ist eine Beurteilungsmöglichkeit nicht gegeben. Mit gleichem Ergebnis könnte man auch die Würfel befragen.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 06.01.2018, 12:34   #14
Chris97724
Threadstarter Threadstarter
MOF User
MOF User
Standard

Zitat: von ebs17 Beitrag anzeigen

Eigentlich hätte ich ein anderes (ein) Feedback erwartet.

Sorry, normalerweise mache ich das doch immer :-) Das habe ich gerade in der Eile leider total vergessen. Ich wollte nur schnell meinen Geistesblitz hier kundtun

Ich danke Dir natürlich für Deine Ausführungen. Ich habe auch versucht das umzusetzen. War leider nicht von Erfolg gekrönt und es kam leider nicht das raus was ich mir erhofft hatte. Wahrscheinlich komme ich mit der Denkweise noch nicht so ganz klar und kann daher wenig mit anfange.

Mir ist jetzt nur das noch eingefallen wie ich zur erhofften Lösung kommen könnte. Daher war mir jetzt nur wichtig, ob das syntaktisch totaler Mist ist oder ob das wirklich funktionieren könnte.
Chris97724 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 06.01.2018, 12:48   #15
ebs17
MOF Guru
MOF Guru
Standard

Zitat:

Wenn folglich die Anforderung so ist, dass man nach dem Schichtdatum filtern will, muss man erst das Schichtdatum berechnen und kann danach nach diesem filtern.

Wenn Du das nicht umsetzen kannst, dann frage ich mich, was Du umsetzen kannst.

Mein Fehler ist sicherlich, das ich zuviel geschrieben habe und zuviele Worte und weitere ergänzende Hinweise den einen oder anderen Geist an der Stelle verwirren.

Zitat:

ob das wirklich funktionieren könnte

Tastatur und Maus sind mit Hochspannung belegt oder von Pockenbakterien überzogen?

Was auffallen sollte:
"06:00:00" <> #6:00:00#

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}
Dein Dankeschön: DBWiki=>Spende

Geändert von ebs17 (06.01.2018 um 12:57 Uhr).
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.