| |
|
|
- 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 |
|
|
| |
|
|
|
« 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 |
|
|
| |
|
|
|
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
|
|
|
| |
|
|
|
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 |
|
|
| |
|
|