Deutsch
Forum

Datum auf gültig prüfen

 
- Seite 1 -



Walter
Hallo,

Hintergrund: Ich parse einen Text nach Datumswerten (in DB-Format) und errechne aus zwei Datumswerten die Tages-Differenz .

Freeprofan 095, Prfrun32.exe
Set("ErrorLevel", 0)
declare Datum1$,Datum2$,Diff%
'Eingelesene Werte zB
Datum1$=20161001
Datum2$=20161030
'+----------------------------------------------

Proc DeltaTage_DB_Format

    '+----------------------------------------------
    'Berechnet Anzahl von Tagen zwischen 2 Datumswerten
    'Parameter: Anfang, Ende in Datenbankformat
    'Rückgabe Differenz Tage Integer
    Parameters Von$,Bis$
    Return dt("DaysBetween", dt("setdate",DToC$(Von$)), dt("setdate",DToC$(Bis$)))

endproc'DeltaTage_DB_Format

' Hauptprogramm
Diff% = DeltaTage_DB_Format(Datum1$,Datum2$)
messagebox(str$(diff%),"Differenz-Tage",0)

Bei Eingabe gültiger Datumswerte errechnet das Programm die Differenz.
Bei fehlerhaftem Datumswert bricht "setdate" das Programm ohne Möglichkeit einer Reaktion ab.
Gibt es die Möglichkeit, ein Datum auf gültig zu überprüfen, bevor man es verwendet?

LG

Walter
 
03.11.2016  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »


Jörg
Sellmeyer
Ich würde es so machen:
Set("ErrorLevel", 0)
declare Datum1$,Datum2$,Diff%
'Eingelesene Werte zB
Datum1$=20161001
Datum2$=20161030
'+----------------------------------------------

Proc DeltaTage_DB_Format

    '+----------------------------------------------
    'Berechnet Anzahl von Tagen zwischen 2 Datumswerten
    'Parameter: Anfang, Ende in Datenbankformat
    'Rückgabe Differenz Tage Integer
    Set("ErrorLevel", -1)
    Parameters Von$,Bis$
    Var Wert$ = dt("DaysBetween", dt("setdate",DToC$(Von$)), dt("setdate",DToC$(Bis$)))
    'print %error

    If %Error > 0

        'print "Fehler"
        Wert$ = "Fehler"

    EndIf

    Set("ErrorLevel", 0)
    Return Wert$

endproc'DeltaTage_DB_Format

' Hauptprogramm
Var Ergebnis$ = DeltaTage_DB_Format(Datum1$,Datum2$)

If Ergebnis$ = "Fehler"

    '...

Else

    diff% = Val(Ergebnis$)
    'Hier dann die weitere Behandlung

EndIf

Waitinput
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
03.11.2016  
 




Walter
Oho - trickreich!
Herzlichen Dank!
Walter
 
03.11.2016  
 




Michael
W.
einige Routinen aus MwDate
Proc MakeFullYear

    ' Füllt das (eventuell) vergessene Jahrhundert auf.
    ' Y = MakeFullYear( Y )
    Parameters Y%
    Declare ThisCentury%, ThisCenturyRange%
    ThisCentury% = 20
    ThisCenturyRange% = 29'2000 - 2029, sonst 1930 - 1999

    If Y% < 100

        CaseNot Between(ThisCenturyRange%,0,99) : ThisCenturyRange% = 29
        CaseNot Between(ThisCentury%,16,39) : ThisCentury% = Int(dt("GetYear",!now) / 100)

        If Y% <= ThisCenturyRange%

            ' aktuelles Jahr
            Y% = Y% + (ThisCentury% * 100)

        Else

            ' Vorjahr
            Y% = Y% + ((ThisCentury% - 1) * 100)

        EndIf

    EndIf

    Return Y%

EndProc

Proc LastDayInMonth

    ' Liefert den letzten Tag des Monats.
    ' Ultimo = LastDayInMonth( Mo, Y )
    ' -1 = Fehler
    Parameters Mo%, Y%
    Declare Leap%, Ultimo%, LDiM%[12]
    LDiM%[0]=0:LDiM%[1]=31:LDiM%[2]=28:LDiM%[3]=31:LDiM%[4]=30:LDiM%[5]=31:LDiM%[6]=30
    LDiM%[7]=31:LDiM%[8]=31:LDiM%[9]=30:LDiM%[10]=31:LDiM%[11]=30:LDiM%[12]=31
    Ultimo% = -1
    Case Y% < 100 : Y% = MakeFullYear(Y%)
    Leap% = if((((Y% mod 4) = 0) and ((Y% mod 100) <> 0)) or ((Y% mod 400) = 0), 1, 0)' isLeapYear(Y)
    Case Between(Mo%,1,12) : Ultimo% = LDiM%[Mo%] + if( (Mo% = 2) and (Leap% = 1), 1, 0)
    Return Ultimo%

EndProc

Proc isValidDate

    ' Prüft Tag,Monat,Jahr auf Gültigkeit.
    ' ok = isValidDate(D,Mo,Y)
    ' 0 = invalid (false)
    ' 1 = valid (true)
    Parameters D%,Mo%,Y%
    Declare ok%
    ok% = 0
    Case Between(Y%,1600,3999, Mo%,1,12, D%,1,(LastDayInMonth(Mo%,Y%))) : Inc ok%
    Return ok%

EndProc

Proc GetDayDB

    ' Zieht den Tag aus einem DB-Datum.
    ' Day = GetDayDB( DB )
    Parameters DB%
    Return DB% mod 100

EndProc

Proc GetMonthDB

    ' Zieht den Monat aus einem DB-Datum.
    ' Month = GetMonthDB( DB )
    Parameters DB%
    Return Int((DB% mod 10000) / 100

EndProc

Proc GetYearDB

    ' Zieht das Jahr aus einem DB-Datum.
    ' Year = GetYearDB( DB )
    Parameters DB%
    Return Int(DB% / 10000)

EndProc

Proc SetDB

    ' Erstellt aus Tag,Monat,Jahr ein DB-Datum mit Gültigkeitsprüfung.
    ' DB = SetDB(D,Mo,Y)
    ' -1 = Fehler
    Parameters D%,Mo%,Y%
    Declare DB%
    DB% = -1
    Case Y% < 100 : Y% = MakeFullYear(Y%)
    Case isValidDate(D%,Mo%,Y%) : DB% = Y% * 10000 + Mo% * 100 + D%
    Return DB%

EndProc

 
Alle Sprachen
System: Windows 8/10, XProfan X4
Programmieren, das spannendste Detektivspiel der Welt.
03.11.2016  
 




Walter
Ja, das sind sehr nützliche Routinen!
Habe mich sonst wegen der nicht ganz einfachen Verwendung der neuen Datumsfunktionen zusätzlich mit Funktionen aus prfdat32.dll recht gut beholfen.
Danke!
Walter
 
05.11.2016  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

8.784 Betrachtungen

Unbenanntvor 0 min.
H.Brill10.10.2022
Langer30.01.2021
PETER195601.11.2020
p.specht23.02.2020
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie