| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Datum überprüfen (1491 mal gelesen)
|
wasc Mitglied Bautechniker
Beiträge: 52 Registriert: 15.04.2005 Windows 2000, ACAD2005, P4 2,8
|
erstellt am: 14. Okt. 2005 23:47 <-- editieren / zitieren --> Unities abgeben:
hallo ! wie kann ich nach eingabe eines datums in einer edit_box (attribut eines blocks)überprüfen ob es sich wirklich um ein "richtiges" datum handelt ? damit meine ich erstens das ausschliesen von tippfehlern sowie die korrektheit des datums selbst. der grund der prüfung ist folgender: da die daten über einen dxf-import in ein "grafisches Informationssystem (GIS)" laufen, muss das datum unbedingt korrekt sein sonst wird der import abgebrochen. das datum müsste folgendes format aufweisen: z.b.: 12.1.2005 oder 1.12.2005 besten dank für die tipps im voraus walter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 15. Okt. 2005 11:01 <-- editieren / zitieren --> Unities abgeben: Nur für wasc
Das ist ein nichttriviales Problem, dessen Lösung vor allem davon abhängt, wie das Ziel definiert ist: Soll nur geprüft werden, ob die Eingabe ein gültiges Datum sein könnte (z.B. 29.02.2001), der ob es auch ein gültiges Datum IST. Wenn ich mich recht erinnere, gab es einen 29.2.2000, aber keinen 29.2.1900). Solche Probleme fängt man sich ruckzuck ein, wenn historische Daten ins Spiel kommen, und das kann bei solchen Anwendungen durch alte Zeichnungen/Baugenehmigungen/... usw. durchaus mal der Fall werden. Technisch würde ich das so lösen: Mein PCRE-Paket (PerlCompatible Regular Expressions - gibt es bei Cadwiesel gratis) verwenden und einen reguläre Suchausdruck für eine Datumseingabe auf die Eingabe loslassen. Wird in der Eingabe ein gültiges Datum gefunden und existieren keine überflüssigen Zeichen, dann handelt es sich um eine valide Eingabe. Die notwendigen Regular Expressions findet man im Netz - nicht nur 'mögliches Datum', sondern auch 'gültiges Datum' (mit Anwendung aller Schaltjahrregeln). Diese Vorgehensweise ist z.B. auch die gängige Technik beim Testen von URIs oder Email-Adressen, obwohl da die Sache noch deutlich komplexer wird, da man ja TLD-Listen usw. vorhalten muss. Gruß, Axel Strube-Zettler <edit> Selbstverständlich lassen sich dann auch Eingaben transformieren: 2005/10/15 (american) =>15.10.2005 15. Oktober 05 (deutsch) =>15.10.2005 15.10.05 (auch deutsch) =>15.10.2005 2005-15-10 (irgendwo gibt's auch das) =>15.10.2005 Und noch ein ganz anderer Ansatz: Eine Website suchen, bei der Datumsangaben über drei getrennte Dropdownliste eingegeben werden. Wenn die Site ein 'historisches Thema' hat (mein Tipp: irgendwas für Genealogen), dann lässt sich die Schaltjahr-Validierung vielleicht im JavaScript-Code entdecken. Den Algorithmus kann man dann nach Lisp übersetzen. </edit> ------------------ Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze [Diese Nachricht wurde von mapcar am 15. Okt. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 17. Okt. 2005 08:51 <-- editieren / zitieren --> Unities abgeben: Nur für wasc
Hallo Walter, ich habe ein bißchen probiert. Die folgende Funktion prüft das eingegebene Datum auf Plausibilität. Das Problem mit den Schaltjahren, das z.B. 1900 keins war bin ich so umgangen, daß nur die Jahre 1980 - 2099 zulässig sind. Was Du dann noch einbauen könntest wäre eine Prüfung auf ungültige Zeichen, oder, naja, ich glaube da gibt es noch so einiges, was man falsch eingeben könnte, wenn man will. Der Aufruf ist folgendermaßen: (datum_pruef "17.10.2005") Code:
(defun datum_pruef (string / liste error sj schaltjahre) (setq error t) (if (vl-string-search "." string) (progn ;;;schaltjahre von 1980 - 2099 => wenn durch 4 teilbar (setq sj 1976) (repeat 30 (setq schaltjahre (cons (setq sj (+ sj 4.0)) schaltjahre))) (while (vl-string-search "." string) (setq liste (cons (substr string 1 (vl-string-search "." string)) liste) string (substr string (+ 2 (vl-string-search "." string))))) (setq liste (reverse (cons string liste))) ;;;Prüfung Tag (cond ((or (< (atoi (car liste)) 1) (> (atoi (car liste)) 31)) (alert "\nDer Tag ist falsch.") (setq error nil)) ((and (member (atoi (cadr liste)) '(2 4 6 9 11)) (= (atoi (car liste)) 31)) (alert "\nDer Tag ist falsch.") (setq error nil)) ((and (= (atoi (cadr liste)) 2) (= (atoi (car liste)) 30)) (alert "\nDer Tag ist falsch.") (setq error nil)) ((and (= (atoi (cadr liste)) 2) (= (atoi (car liste)) 29)) (if (not (member (atof (caddr liste)) schaltjahre)) (progn (alert "\nDer Tag ist falsch, kein Schaltjahr.") (setq error nil))))) ;;;Prüfung Monat (cond ((or (<= (atoi (cadr liste)) 0) (> (atoi (cadr liste)) 12)) (alert "\nDer Monat ist falsch.") (setq error nil))
) ;;;Prüfung Jahr (Festlegung kleinstes Jahr 1980, größtes Jahr 2099) (cond ((or (< (atoi (caddr liste)) 1980) (>= (atoi (caddr liste)) 2099)) (alert "\nDer Monat ist falsch.") (setq error nil)) ) ) (progn (alert "als Trennzeichen muß eine Dezimalpunkt verwendet werden.") (setq error nil))) error )
------------------ viele Grüße
Jörn [Diese Nachricht wurde von joern bosse am 17. Okt. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 17. Okt. 2005 11:31 <-- editieren / zitieren --> Unities abgeben: Nur für wasc
wie wärs damit ? statt da viel herumzurechnen : VBScript kann mit Datums rechnen (defun TestDatum ( datum / math ret) (vl-load-com) (setq math (vlax-get-or-create-object "ScriptControl")) (vlax-put math "Language" "VBScript") (if (= -1 (vlax-invoke math "EVAL" (strcat "IsDate(\"" datum "\")"))) (setq ret (vlax-invoke math "EVAL" (strcat "cstr(CDate(\"" datum "\"))"))) (setq ret nil) ) (vlax-release-object math) ret ) (testdatum "29.02.1900") nil (testdatum "28.2.1900") "28.02.1900" (testdatum "15. Oktober 2005") "15.10.2005" (testdatum "15. Wetlgesundheitstag 2005") nil
[Diese Nachricht wurde von fuchsi am 17. Okt. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wasc Mitglied Bautechniker
Beiträge: 52 Registriert: 15.04.2005 Windows 2000, ACAD2005, P4 2,8
|
erstellt am: 17. Okt. 2005 13:18 <-- editieren / zitieren --> Unities abgeben:
hallo ! danke für die schnellen antworten !! mapcar: danke auch für die antwort !! vor allem gratulation für deine lisp seiten !! hab schon sehr viel davon und daraus gelernt ! die funktionen sind super beschrieben und leicht verständlich !!! jorn bosse: danke für die antwort ! da ich anfänger bin ist dieser code für mich auch verständlich !! fuchsi: danke auch für die antwort ! da ich mit VBSkript noch sehr wenig zu tun hatte, ist es ein bisschen schwer für mich nachzu- vollziehen was da genau passiert !! der code funktioniert aber super !!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 17. Okt. 2005 13:53 <-- editieren / zitieren --> Unities abgeben: Nur für wasc
Zitat: Original erstellt von wasc: danke auch für die antwort ! da ich mit VBSkript noch sehr wenig zu tun hatte, ist es ein bisschen schwer für mich nachzu- vollziehen was da genau passiert !! der code funktioniert aber super !!!
ich verwende das VB Scripting sehr häufig in Lisp, da man damit alles machen kann, was die VB Scriptsprache ermöglicht. Es gibt z.B.: zwar ein Alert in Lisp, jedoch kein OK Cancel Abfrage oder ien Inputbox. Das ist mit diesem Tools sehr leicht realisierbar (defun InputBox ( _prompt _title _default / math ret) (vl-load-com) (setq math (vlax-get-or-create-object "ScriptControl")) (vlax-put math "Language" "VBScript") (setq ret (vlax-invoke math "EVAL" (strcat "Inputbox(\"" _prompt "\",\"" _title "\",\"" _default "\")"))) (vlax-release-object math) ret ) (inputbox "geben sie einen Vornamen ein " "AutoCad" "Toni") (defun MsgBox ( _prompt _buttons _title / math ret ) (vl-load-com) (setq math (vlax-get-or-create-object "ScriptControl")) (vlax-put math "Language" "VBScript") (setq ret (vlax-invoke math "EVAL" (strcat "Msgbox(\"" _prompt "\"," _Buttons ",\"" _title "\")"))) (vlax-release-object math) ret ) (MsgBox "Wollen sie das wirklich löschen ?" "vbYesNo+vbQuestion" "AutoCad" ) ------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|