Datumsprüfung?

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Datumsprüfung?

Beitrag 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
Zuletzt geändert von Wolfgang_B am So, 16. Mai 2021 17:50, insgesamt 1-mal geändert.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Datumsprüfung?

Beitrag von georg »

Hallo, Wolfgang -


welches Xbase-Part verwendest Du denn?

Wenn Du XbpDatePicker() verwendest, sollte das Datum gültig sein.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Datumsprüfung?

Beitrag von Wolfgang_B »

xbpSLE!
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Datumsprüfung?

Beitrag 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)
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Datumsprüfung?

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Datumsprüfung?

Beitrag 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
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Datumsprüfung?

Beitrag 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.
Zuletzt geändert von georg am So, 16. Mai 2021 19:16, insgesamt 1-mal geändert.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: Datumsprüfung?

Beitrag 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.
Gruß Dominik
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Datumsprüfung?

Beitrag 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.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Datumsprüfung?

Beitrag 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.
Herzlich,
Tom
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: Datumsprüfung?

Beitrag von Dominik Krebs »

Exakt.
Am besten du schaust einfach mal in die Dokumentation, das ist dort gut beschrieben.
Empty ist übrigens eine meiner Lieblingsfunktionen 🤣
Gruß Dominik
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Datumsprüfung?

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Datumsprüfung?

Beitrag 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
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Datumsprüfung?

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Datumsprüfung?

Beitrag von Wolfgang_B »

das erklärt natürlich alles. Bis zur nächsten Jahrtausendwende muß sich Alaska dann was einfallen lassen :-)

Besten Dank!!
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Datumsprüfung?

Beitrag 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().
Herzlich,
Tom
Antworten