Neuigkeiten:

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

Mobiles Hauptmenü

Fehler in Abfrage vermeiden

Begonnen von John1994, Juni 19, 2018, 00:07:36

⏪ vorheriges - nächstes ⏩

John1994

Hallo zusammen,

ich habe folgendes Problem.

In meiner Abfrage, werden Arbeitszeiten ausgerechnet.
Leider gibt es Datensätze, die keine Uhrzeiten enthalten und somit in der Abfrage Arbeitszeiten den Inhalt #Fehler enthalten.
Somit können diese Datensätze nicht in meinem Bericht angezeigt werden.

Folgende Daten sind Ausgangssituation:

- Bild Daten Ausgang

Durch folgende Abfrage werden die Daten aufgearbeitet:


SELECT Daten.ID, Daten.Taxi_Nr, Daten.Datum, Daten.Start_Uhrzeit, Daten.Fahrer, Daten.Auftragsnummer,
Daten.Kunde, Daten.Termin, Daten.Start_Adresse, Daten.Ziel,
Daten.Preis, Daten.Bar, Daten.Unbar, Daten.Bemerkung, Daten.Endzeit,

DateAdd("n",-([Start_Uhrzeit]>=#12/30/1899 23:0:0# Or [Start_Uhrzeit]<=#12/30/1899 5:0:0# Or [Endzeit]>=#12/30/1899 23:0:0# Or [Endzeit]<=#12/30/1899 5:0:0#)*5, CDate(Format$([Start_Uhrzeit]-1-[Endzeit],"Long Time"))) AS Arbeitszeit_Nacht,

DateAdd("n",3,[Arbeitszeit_Nacht]) AS Arbeitszeit_Final, Datum+Start_Uhrzeit AS Start,
Datum+Endzeit+Abs(Start_Uhrzeit>Endzeit) AS Ende

FROM Daten

WHERE (((Daten.Datum) Between [Bitte geben Sie das Start Datum ein:] And [Bitte geben Sie das Enddatum ein:]) AND ((Daten.Fahrer)=[Bitte geben Sie den Namen des Fahrers ein:]));



Leider bekomme ich dann als Ergebnis, beiden den Feldern ohne Werte #Fehler.

- Abfrage Ergebnisse

Wie kann ich dies in meiner Abfrage umgehen und die Felder leer lassen?
Vielen Dank für eure Hilfe und einen schönen Start in die Woche.


VG John

DF6GL

Hallo,



warum gibt es überhaupt Felder ohne Werte? Das sollte im Vorfeld schon vermieden werden, wenn Auswertungen davon gemacht werden.

Welche Uhrzeit soll denn benutzt werden im Fall eines leeren Feldes?

Benutze die nz()-Funktion , um einen Ersatzwert bei leeren Felder zu verwenden.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

John1994

Hallo und vielen Dank für deine Antwort.
Die NZ Funktion hab ich auch schon gefunden, muss aber ehrlicherweise eingestehen, dass ich nicht in der Lage bin, diese anzuwenden.

Wenn ich das richtig verstanden habe, müsste in der Abfrage folgendes geschehen:

Aus
DateAdd("n",-([Start_Uhrzeit]>=#12/30/1899 23:0:0# Or [Start_Uhrzeit]<=#12/30/1899 5:0:0# Or [Endzeit]>=#12/30/1899 23:0:0# Or [Endzeit]<=#12/30/1899 5:0:0#)*5, CDate(Format$([Start_Uhrzeit]-1-[Endzeit],"Long Time"))) AS Arbeitszeit_Nacht

wird

[code]NZ(DateAdd("n",-([Start_Uhrzeit]>=#12/30/1899 23:0:0# Or [Start_Uhrzeit]<=#12/30/1899 5:0:0# Or [Endzeit]>=#12/30/1899 23:0:0# Or [Endzeit]<=#12/30/1899 5:0:0#)*5, CDate(Format$([Start_Uhrzeit]-1-[Endzeit],"Long Time"))) AS Arbeitszeit_Nacht)
[/code]

ist das so richtig?
Mein Problem ist, dass ich nicht so richtig weiß, an welcher Stelle ich diese Funktion einbinden soll.
Habe auch schon alles probiert, vom einfügen in den SQL-Code bis zum Einbinden über die Entwurfsansicht.

John1994

So sah der Versuch im Entwurfseditor aus:

Arbeitszeit_Nacht: Nz(DatAdd("n";-([Start_Uhrzeit]>=#23:00:00# Oder [Start_Uhrzeit]<=#05:00:00# Oder [Endzeit]>=#23:00:00# Oder [Endzeit]<=#05:00:00#)*5;ZDate(Format$([Start_Uhrzeit]-1-[Endzeit];"Zeit, lang"))))

Leider ändert sich an der Ausgabe der Abfrage nix.
Der #Fehler wird immer noch angezeigt.

MzKlMu

Hallo,
man kann mit Zeiten nur rechnen, wenn auch eine Zeit da ist. Du brauchst also für NZ einen Ersatzwert. Aber der würde ja das Ergebnis verfälschen.
Du musst also mit Wenn() einfach prüfen ob eines der Zeitfelder leer ist und dann nicht rechnen.
Zeiten kann man auch einfach addieren bzw. Suptrahieren. Da braucht es weder ein Hilfsdatum (12/30/1899) noch eine Formatanweisung (Format$...).
Format hat in Rechenformeln ohnehin nichts verloren. Und in Abfragen wird auch nicht formatiert. Formatiert wird zur Ansicht in Formularen und Berichten.
Wo sind die Grenzen sind zwischen Tag und Nachtarbeit. Und was ist Arbeitszeit_Final mit den 3 Minuten Unterschied ? Erkläre daher mal was Du mit welchen Feldern rechnen willst. Die Formel lässt sich ganz sicher beträchtlich vereinfachen und verkleinern.
Gruß Klaus

John1994

Ich habe eine Tabelle, welche eine Startzeit und eine Endzeit enthält.
Ich subtrahiere die Startzeit von der Endzeit und erhalte so meine Arbeitszeit in Minuten.
Dies soll auch funktionieren, wenn der Tag überspringt.
Des Weiteren muss ich, wenn die Person in 23 Uhr "rein arbeitet" und bis 5 Uhr muss ich 5 Minuten zusätzlich addieren, da hier dann Nachttarif gilt. 

John1994

Die Frage ist, an welcher Stelle ich das Wenn zu setzen habe?
Mein Bericht öffnet ja nicht, weil er ein Problem mit dem #Fehler hat.
Kann ich hier bei der Beimladen()-Funktion des Berichtes schon einhaken?
Und dann die Werte nicht anzeigen lassen?

Mein Bericht enthält jedoch diese Abfrage, ich denke da verschluckt er sich vorher, oder?

MzKlMu

Hallo,
ZitatDes Weiteren muss ich, wenn die Person in 23 Uhr "rein arbeitet" und bis 5 Uhr muss ich 5 Minuten zusätzlich addieren, da hier dann Nachttarif gilt. 
Das habe ich nicht verstanden, was heißt reinarbeitet ?
Und Du hast ja nur 3 Minuten addiert.
Die Abfrage sollte schon den Fehler nicht zeigen.
Die Frage von Franz warum es da überhaupt Datensätze gibt die keine Zeit enthalten hast Du auch nicht beantwortet.
Deine Formeln sind viel zu kompliziert, das geht deutlich einfacher.
Wenn Du Datum und Zeit addierst und dann Start von Ende anziehst hast Du die Arbeitszeit direkt im richtigen Format, auch mitternachtsübergreifend.
Und die 3 Minuten kannst Du einfach mit +3/1440 addieren.

Aber beantworte erst mal alle Fragen.
Gruß Klaus

John1994

Hallo,

danke für deine Antwort: 

Der Import enthält Datensätze mit Zeiten, dass sind die Start und Endzeiten einer Taxifahrt. Diese werden auch mit den entsprechenden Daten geliefert.
Wenn der Taxifahrer jedoch eine Pause macht, liefert der Import nur einen String mit Pause zurück, jedoch in eine neue Zeile. Dazu gibt es jedoch keine Zeiten (weder Start noch Ende).
Er fängt dann einfach wieder mit der nächsten Taxifahrt an.
Ich habe mal ein Bild vom Import angehangen.


Mit den 5 Minuten konntet ihr auch nicht sehe, da ich Holzkopf nicht die gesamte Abfrage aufgeschrieben habe:
Hier ist Sie nun:

SELECT Daten.ID, Daten.Taxi_Nr, Daten.Datum, Daten.Start_Uhrzeit, Daten.Fahrer, Daten.Auftragsnummer, Daten.Kunde, Daten.Termin, Daten.Start_Adresse, Daten.Ziel, Daten.Preis, Daten.Bar, Daten.Unbar, Daten.Bemerkung, Daten.Endzeit, DateAdd("n",-([Start_Uhrzeit]>=#12/30/1899 23:0:0# Or [Start_Uhrzeit]<=#12/30/1899 5:0:0# Or [Endzeit]>=#12/30/1899 23:0:0# Or [Endzeit]<=#12/30/1899 5:0:0#)*5,CDate(Format$([Start_Uhrzeit]-1-[Endzeit],"Long Time"))) AS Arbeitszeit_Nacht, DateAdd("n",3,[Arbeitszeit_Nacht]) AS Arbeitszeit_Final, Datum+Start_Uhrzeit AS Start, Datum+Endzeit+Abs(Start_Uhrzeit>Endzeit) AS Ende
FROM Daten
WHERE (((Daten.Datum) Between [Bitte geben Sie das Start Datum ein:] And [Bitte geben Sie das Enddatum ein:]) AND ((Daten.Fahrer)=[Bitte geben Sie den Namen des Fahrers ein:]));


Hier sind dann auch die 5 Minuten ersichtlich.
Funktioniert ja auch alles, bis auf die leeren Zeilen, was ja klar ist, welche ich aber benötige.
Und damit ich meinen Bericht weiterhin öffnen kann, muss ich diese #Fehler Anzeige irgendwie unterbinden.

MzKlMu

Hallo,
ZitatDas habe ich nicht verstanden, was heißt reinarbeitet ?
Bitte noch beantworten.
Gruß Klaus

John1994

Wenn der Taxifahrer eine Fahrt anfängt und während der Fahrt in den 23 Uhr Abschnitt kommt, soll auch hier die Nachtschicht angewendet werden.

John1994

=Summe([Abfrage_Schichtzettel]![Arbeitszeit_Final])

Diese Abfrage ist die störende im Bericht,ist hier nicht eine WENN Formel sinnvoll?

Beaker s.a.

Hallo John,
ZitatIch habe mal ein Bild vom Import angehangen.
Fehlt leider  :(
...WHERE (((Daten.Datum) Between [Bitte geben Sie das Start Datum ein:] And [Bitte geben Sie das Enddatum ein:]) AND ((Daten.Fahrer)=[Bitte geben Sie den Namen des Fahrers ein:]));
Ich denke du hast einen Import, wozu dann die Parameterabfragen?
Am besten macht man das auch über ein HauptFormular "Fahrer" mit
einem Unterformular "Fahrten". Da kannst du auch autom. die Pausezeile
mit Zeiten versorgen:
Anfang Pause = Ende letzte Fahrt, Ende Pause = Beginn neue Fahrt.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MzKlMu

Hallo,
wo genau sind jetzt die 5 Minuten und wozu hast Du auch 3 Minuten ?

Ich blicke die Berechnungen immer noch nicht.
Gruß Klaus

Lachtaube

Ungetestet:SELECT ID,
       Taxi_Nr,
       Datum,
       Start_Uhrzeit,
       Fahrer,
       Auftragsnummer,
       Kunde,
       Termin,
       Start_Adresse,
       Ziel,
       Preis,
       Bar,
       Unbar,
       Bemerkung,
       Endzeit,
       IIf( [Start_Uhrzeit] IS NULL OR [Endzeit] IS NULL, NULL,
            DateAdd( 'n', -( [Start_Uhrzeit] >= #12/30/1899 23:00:00# OR
                             [Start_Uhrzeit] <= #12/30/1899 05:00:00# OR
                             [Endzeit]       >= #12/30/1899 23:00:00# OR
                             [Endzeit]       <= #12/30/1899 05:00:00# ) * 5,
                     CVDate( Format( [Start_Uhrzeit] - 1 - [Endzeit],
                                     'Long Time' ) ) ) ) AS Arbeitszeit_Nacht,
       IIf( [Start_Uhrzeit] IS NULL OR [Endzeit] IS NULL, NULL,
            DateAdd( 'n', 3, [Arbeitszeit_Nacht] ) ) AS Arbeitszeit_Final,
       Datum + Start_Uhrzeit AS Start,
       Datum + Endzeit + Abs( Start_Uhrzeit > Endzeit ) AS Ende
FROM   Daten
WHERE  [Datum] Between [Bitte geben Sie das Start Datum ein:] AND
                       [Bitte geben Sie das Enddatum ein:] AND
       [Fahrer] = [Bitte geben Sie den Namen des Fahrers ein:];
Grüße von der (⌒▽⌒)