Seite 1 von 1

Datumsprüfung?

Verfasst: So, 16. Mai 2021 17:48
von Wolfgang_B
wie prüfe ich denn, ob ein Datum gültig ist? Mit diesem Konstrukt kann ich zwar feststellen, daß das Datum leer ist, wenn aber z.B. "16.05. " im Feld oXbp steht kommt kein Fehler.
IF CTOD(oXbp:getData()) == CTOD("")
MSgBox("Fehlerhaftes Datum")
ENDIF

Re: Datumsprüfung?

Verfasst: So, 16. Mai 2021 17:50
von georg
Hallo, Wolfgang -


welches Xbase-Part verwendest Du denn?

Wenn Du XbpDatePicker() verwendest, sollte das Datum gültig sein.

Re: Datumsprüfung?

Verfasst: So, 16. Mai 2021 17:51
von Wolfgang_B
xbpSLE!

Re: Datumsprüfung?

Verfasst: So, 16. Mai 2021 17:56
von Wolfgang_B
Hallo Georg,
XbpDatePicker() wir hier nicht gehen. Der Kunde kann hier ein beliebiges Datum eintragen. Ich möchte nur prüfen, ob das Datum gültig sein kann (richtig geschrieben und datumrechtlich möglich)

Re: Datumsprüfung?

Verfasst: So, 16. Mai 2021 17:59
von georg
Hallo, Wolfgang -


in dem Fall würde ich die Eingabe konvertieren CToD() oder SToD() und prüfen, ob das Eregbnis nicht leer ist.

Alternativ würde ich mir mal SLEPic anschauen, dort kannst Du als Format auch Datum definieren, und dann können auch nur gültige Werte eingegeben werden.

Re: Datumsprüfung?

Verfasst: So, 16. Mai 2021 18:06
von Wolfgang_B
Ob das Feld leer ist oder nicht, sehe ich mit meinem Code. Nur ob das gültig ist oder nicht sehe ich nicht. Hier sagt die Doku allerdings was anderes:
CtoD() returns a date value. When <cDate> is an invalid date, CtoD() returns an empty date.
SLEPic sagt m ir nichts. Finde auch in der Doku nichts darüber

Re: Datumsprüfung?

Verfasst: So, 16. Mai 2021 19:04
von georg
Hallo, Werner -


das ist eine von XbpSLE abgeleitete Klasse, die James Loughner geschrieben hat: http://www.gogalthorp.com/splash

Vorteil: alles in Xbase++ geschrieben, kann also auch relativ leicht angepasst werden.

Re: Datumsprüfung?

Verfasst: So, 16. Mai 2021 19:05
von Dominik Krebs
Hallo Wolfgang,
Solltest du ein ungültiges Datum konvertieren, bekommst du ein leeres zurück.
Dies könntet du auch mit der Funktion Empty() abfragen.

Re: Datumsprüfung?

Verfasst: So, 16. Mai 2021 19:35
von Wolfgang_B
@ Dominik: Wie soll die Abfrage mit EMPTY() aussehen? Das Ergebnis eines leeren Datums ist doch " . . ". Da sind mindestens Punkte drin, also nicht empty.

Re: Datumsprüfung?

Verfasst: So, 16. Mai 2021 19:59
von Tom
@Wolfgang:
Empty() prüft, ob ein Feld oder eine Variable bezogen auf ihren Datentyp leer ist. "" ist ein leeres Stringfeld, "0.00" ein leeres numerisches Feld, " . . " ein leeres Datumsfeld:

Code: Alles auswählen

? Empty(Date()) // .F.
? Empty(Ctod("  .  .     ")) // .T.
? Empty(Ctod("32.01.2021")) // .T.

Re: Datumsprüfung?

Verfasst: So, 16. Mai 2021 21:03
von Dominik Krebs
Exakt.
Am besten du schaust einfach mal in die Dokumentation, das ist dort gut beschrieben.
Empty ist übrigens eine meiner Lieblingsfunktionen 🤣

Re: Datumsprüfung?

Verfasst: Mo, 17. Mai 2021 8:29
von Tom
Und Empty() prüft nicht nur Variablen und Felder, sondern ganz allgemein Ausdrücke. Wie im Beispiel von mir gezeigt.

Ob eine Variable demgegenüber bislang unbelegt/nichttypisiert ist, erfragt man über ValType() bzw. Type(), wobei dann die Antwort "U" bedeuten würde, dass sie noch nicht/noch nie* Werte enthält/enthielt. Oder man vergleicht mit NIL, das wäre dann auch in allen Fällen .T. Und auch dieser Vergleich funktioniert bei Ausdrücken, die eine Rückgabe erzeugen sollten. Das ist vermutlich, was Wolfgang mit seiner irritierten Anmerkung, dass ein leeres Datum wohl doch keine leere Variable wäre, gemeint hat.

Code: Alles auswählen

LOCAL d 
? d // NIL
? ValType(d) // "U"
d := CtoD('  .  .    ')
? Empty(d) // .T.
? ValType(d) // "D"
d := Date()
? Empty(d) // .F.
*wobei man natürlich jede Variable NILen kann, so dass das wieder der Fall ist.

Re: Datumsprüfung?

Verfasst: Mo, 17. Mai 2021 15:52
von Wolfgang_B
Die Prüfung mit EMPTY() stimmt aber nur bedingt. Wenn ein falsches Datum vollständig eingeben wird z.B. "34.01.2021" ist EMPTY() -> .T. .Wenn aber ein unvollständiges Datum in der Form "01.01. " eingegeben wird, ist EMPTY() .F. , d.h. die Prüfung auf ein gültiges Datum schlägt fehl.

Code: Alles auswählen

IF EMPTY(CTOD(oXbp:getData()))
		MSgBox(".T.")
	ELSE
		MSgBox(".F.")
	ENDIF

Re: Datumsprüfung?

Verfasst: Mo, 17. Mai 2021 16:19
von Tom
Das liegt an der automatischen Vervollständigung von Datumseingaben und der Einstellung von SET EPOCH, Wolfgang. Wenn EPOCH belegt ist und ein Datum eingegeben oder zugewiesen wird, dessen Jahreszahl nur zweistellig ist, wird das Jahrhundert aufgefüllt. Wenn die Jahreszahl ganz fehlt, wird der Jahrhundertbeginn übernommen.

Code: Alles auswählen

SET EPOCH TO 2000
? CtoD("01.01.    ") -> 01.01.2000
SET EPOCH TO 0
? CtoD("01.01.    ") -> nix
? Empty(CtoD("01.01.    ")) -> .T.

Re: Datumsprüfung?

Verfasst: Mo, 17. Mai 2021 16:55
von Wolfgang_B
das erklärt natürlich alles. Bis zur nächsten Jahrtausendwende muß sich Alaska dann was einfallen lassen :-)

Besten Dank!!

Re: Datumsprüfung?

Verfasst: Mo, 17. Mai 2021 17:00
von Tom
Gerne! :)

Keine Jahreszahl wird als Jahreszahl "0" gewertet, wonach diese 0 dann auf den Wert aus SET EPOCH bezogen wird.

Anders verhält sich das, wenn man auch den Monat weglässt. Dann erhält man wieder ein ungültiges Datum bzw. ein leeres Datum bei der Umwandlung via CtoD().