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 31.10.2019, 09:45   #1
doppelmeter
Neuer Benutzer
Neuer Benutzer
Standard Acc2016 - Abfrage mit Wenn-dann-Funktion fehlerhaft?

Hallo zusammen,

habe eine Abfrage mit einer Wenn-Dann-Funktion gebaut und so wie es aussieht, liefert die Funktion bei gleichen Bedingungen unterschiedliche Ergebnisse.
Ich werde es im Folgenden beschreiben verbunden mit der Bitte, dass sich das mal jemand anschaut.

Aus einer Tabelle mit vielen erfassten Zeiten soll eine Monatsliste erstellt werden.
Über eine Benutzeroberfläche werden die entsprechenden Parameter eingestellt. (siehe 01_FehlerhafteAbfrage_Formular.png)

Die dazugehörige Tabelle sieht folgendermaßen aus:
(siehe 02_FehlerhafteAbfrage_Tabelle.png)

Die Abfrage in SQL-Form sieht aus wie in 03_FehlerhafteAbfrage_AbfrageinSQL.png

In 04_FehlerhafteAbfrage_Abfrage.png ist dann das Ergebnis zu sehen.
Die rot markierten Stellen haben alle in der Gesamtzeit die Zahl 9 stehen. Damit müsste laut Abfrage dann bei Pausenzeit 0,50 stehen. Dies trifft auch in 4 von 6 Fällen zu.
Die Frage ist, warum in 2 Fällen das Ergebnis 0,75 ist?

Hier nochmals der Abfrageteil
Pausenzeit: Wenn([Gesamtzeit]=0;"0,00";Wenn([Gesamtzeit]>9;"0,75";"0,50"))

Wer findet den Fehler?
Angehängte Grafiken
Dateityp: png 01_FehlerhafteAbfrage_Formular.PNG (18,5 KB, 14x aufgerufen)
Dateityp: png 02_FehlerhafteAbfrage_Tabelle.PNG (31,5 KB, 13x aufgerufen)
Dateityp: png 03_FehlerhafteAbfrage_AbfrageinSQL.PNG (30,3 KB, 18x aufgerufen)
Dateityp: png 04_FehlerhafteAbfrage_Abfrage.PNG (70,8 KB, 14x aufgerufen)
doppelmeter ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 31.10.2019, 09:59   #2
ebs17
MOF Guru
MOF Guru
Standard

Grauenhafte Tabellenstruktur (Aufzählungsfelder), dadurch kommt erst eine "Notwendigkeit" von IIF-Kaskaden. Das Ding möchtest Du sicherlich nicht zu einer richtigen Datenbank in echter Verwendung ausbauen ...?

Statt Fehlersuche würde ich einen Neuaufbau vorschlagen, der sich an gängigen Standards wie Datenmodellierung und Normalisierung orientiert.

__________________

Ein freundliches Glück Auf!

Eberhard

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

Geändert von ebs17 (31.10.2019 um 10:57 Uhr).
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 31.10.2019, 10:49   #3
knobbi38
MOF User
MOF User
Standard

Hallo doppelmeter,

ich würde dir dringend anraten, dem Vorschlag von Eberhard zu folgen, und die Felder mit Indizes in einer separaten Tabelle zu erfassen.

Zu deinem Problem:
Wenn du Felder vom Typ 'Date' addierst, ist das Ergebnis auch vom Type 'Date'. Dein Vergleich [Gesamtzeit] vom Typ 'Date' mit einer Zahl kann also nur bedingt funktionieren.

Ulrich
knobbi38 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 07.11.2019, 13:40   #4
doppelmeter
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo zusammen,

zuerst mal danke für den Hinweis mit der Tabellenstruktur und den Hinweis mit dem Vergleich Datums-/Zahlenfeld.

Die Datenbank werde ich vorerst nicht umbauen, da von den durchnumerierten Feldern nur eines benutzt wird.
Auch hat es keinerlei Einfluss auf die gestellte Aufgabe, von der BIS-Zeit die VON-Zeit abzuziehen und über eine IIF-Abfrage einen Vergleich mit der Zahl 9 durchzuführen, was zu unterschiedlichen Ergebnissen führen kann wegen dem Vergleich eines Datumfeldes mit einer Zahl.

Aber wie kann dann dieser Vergleich durchgeführt werden? Welche Funktion wird benötigt, um einen korrekten und wahrheitsgetreuen Wert zu bekommen.
Das Ergebnis bei diesem Vergleich war ja immer die Zahl 9. Warum dann unterschiedliche Werte bei der Auswertung der IIF-Abfrage rauskommen, ist mir nicht ersichtlich.
Kann mir bitte jemand die Funktion nennen, mit der ein eindeutiges und immer gleiches Ergebnis für die IIF-Klausel möglich ist.
Beispiel:
Es ist egal, ob ich 18:00h - 09:00 abziehe oder 17:00 - 08:00. Das Ergebnis ist eigentlich immer die Zahl 9.
doppelmeter ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 07.11.2019, 14:00   #5
Josef P.
MOF Guru
MOF Guru
Standard

Hallo!

Zitat:

Das Ergebnis ist eigentlich immer die Zahl 9.

Hast du das geprüft oder nur die angezeigte Zahl betrachtet?

9,0000000001 ist z. B. größer als 9, wird aber vermutlich auch als 9 angezeigt werden.
Stichwort: Gleitkommazahl

Kennst du die DateDiff-Funktion?

mfg
Josef

Geändert von Josef P. (07.11.2019 um 14:06 Uhr).
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 07.11.2019, 14:08   #6
knobbi38
MOF User
MOF User
Standard

Hallo doppelmeter,

nochmal:
es geht um die Datentypen, die du verwendest und das ist dein Denkfehler.
Wenn du 18:00h - 09:00h abziehst, ist das Ergebnis 0,375! und nicht 9.

Im Direktfenster:
Code:

? #18:00# - #09:00#
 0,375                          ' Datentyp double!

? CDate(#18:00# - #09:00#)
09:00:00                        ' Datentyp date!

? DateDiff("h",#18:00#,#09:00#) ' Die Differenz beträgt in Stunden: -9
-9                              ' Datentyp Variant(long)
Ich hoffe, daß das jetzt etwas klarer geworden ist.

Ulrich
knobbi38 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 07.11.2019, 14:14   #7
Josef P.
MOF Guru
MOF Guru
Standard

Hallo!

@Ulrich:
0,375 * 24 = 9
.. die mathematische Logik im Code passte schon.
Es ist ein Gleitkommazahlenproblem.

zum Ausprobieren:
Code:

Dim diffWert As Double

diffWert = ((#6:00:00 PM# - #9:00:00 AM#) * 24)
Debug.Print diffWert, diffWert - 9, diffWert > 9

diffWert = ((#5:00:00 PM# - #8:00:00 AM#) * 24)
Debug.Print diffWert, diffWert - 9, diffWert > 9
mfg
Josef
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 07.11.2019, 14:29   #8
knobbi38
MOF User
MOF User
Standard

@Josef:
ich hatte die Multiplikation mit 24 übersehen.

Gruß Ulrich
knobbi38 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 07.11.2019, 17:28   #9
doppelmeter
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Und wie bekommt man dieses jetzt in eine Abfrage, wenn die Zeitwerte in Tabellenfeldern stehen.
diffWert = ((#6:00:00 PM# - #9:00:00 AM#) * 24)

Zeit 1: (diffwert([Zeitbis01]-[Zeitvon01]))*24
funktioniert so nicht (fehlerhafte Syntax)
doppelmeter ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 07.11.2019, 18:24   #10
Josef P.
MOF Guru
MOF Guru
Standard

Hallo!

"diffWert" aus Beitrag #7 ist eine Variable und keine Funktion.

Um genauere Werte aus Datumsdifferenzen zu erhalten, eignet sich wie bereits erwähnt die DateDiff-Funktion.
Tipp: Lass dir von DateDiff die Differenz in Minuten oder Sekunden zurückgeben und vergleiche damit. Dann hast du einen Ganzzahlenvergleich.

Wie DateDiff anzuwenden ist, lasse ich dich selbst herausfinden.
Vorgekautes merkt man sich nicht so gut.

mfg
Josef
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 07.11.2019, 19:44   #11
Jimmy_Star
MOF User
MOF User
Standard Hi

Ganz folgen kann ich dir nicht aber ich denke du bekommst das in der Abfrage mit dem Kriterium „Schalter“ gelöst. Ist für die Abfragen ein mächtiges Werkzeug, siehe auch Stochastik.

Anbei eine Syntax als Beispiel, bisschen rumprobieren ...

Lg Jimmy
Angehängte Grafiken
Dateityp: jpeg D5676BD6-4482-4A38-A152-3BE4E388FC9B.jpeg (79,9 KB, 7x aufgerufen)

__________________

————————————————————-
quod erat demonstrandum
Jimmy_Star ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 08.11.2019, 15:41   #12
doppelmeter
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Lösung gefunden, Thema erledigt, Auswertung korrekt.

? DateDiff("h",#18:00#,#09:00#)


In der Abfrage lautet die Syntax folgendermassen:
Zeitdiff1: DatDiff("h";[Zeit_von_01];[Zeit_bis_01])
WICHTIG: Trennung erfolgt durch Strichpunkt ( und nicht durch Komma (,)
doppelmeter ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 08.11.2019, 18:50   #13
Josef P.
MOF Guru
MOF Guru
Standard

Hallo!

Zitat:

WICHTIG: Trennung erfolgt durch Strichpunkt

In der SQL-Ansicht und in VBA gehört ein Komma.
In der Abfrage-Entwurfsansicht wird aus dem Komma ein Strichpunkt.

zu "Lösung gefunden":
Code:

? DateDiff("h",#18:00#,#09:00#)
Wie soll das Ergebnis bei 09:00 Uhr bis 18:30 Uhr aussehen?

mfg
Josef
Josef P. 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 11:41 Uhr.



Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2019, 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.