| |
|
|
Langer | Hallo zusammen,
ich suche nach einem Weg aus der Summe der Tage zwischen zwei Datumswerten die Wochenenden raus zu rechnen. z.B. Urlaubsberechnung von Dienstag den 4.4.2017 bis Dienstag den 11.4.2017 sind incl. 4. und 11. 8 Tage. Urlaubstage aber nur 6 da das Wochenende eh frei ist. Irgendwie will es mir nicht gelinge hierfür eine passende Formel zu erdenken. Hat jemand schon einmal so eine Berechnung angestellt?
Dirk |
|
|
| |
|
|
|
p.specht
| Gültigkeitszeitraum Gregorianischer Kalender? Oder genügt unser Jahrhundert? Welche XProfan-Version (ab X2 gibt es komfortable Funktionen zur Wochentagsberechnung + die Hilfsfunktion dow() Day of Week)
Für ältere Profanversionen wie 11.2a wäre das nachstehende Proc vielleicht ganz brauchbar. Gruss
WindowTitle "Direkte Wochentagsermittlung aus Datum"
' Version 1.02_beta, ohne jede Gewähr oder Garantie
declare da$,dy%,mnth%,fyear%,syear%,kal$,i%,j%,h%,greg%
Window 424,300
nochmal:
cls rgb(0,100,255)
print
print " Algorithmus " + chr$(34) + "Zeller´s Kongruenz" + chr$(34) + " "
print " Quelle: Pfarrer Dr.math. Christian Zeller A.D.1882 "
print
print " Datum [dd.mm.yyyy] = ";
locate 5,24 : input da$
case da$="" : end
dy%=val(left$(da$,2))
mnth%=val(mid$(da$,4,2))
fyear%=val(mid$(da$,7,4))
syear%=val(mid$(da$,9,2))
print
print
if fyear% > 1582 : greg%=1
elseif fyear% < 1582 : greg%=0
elseif fyear% = 1582
if mnth%>10 : greg%=1
elseif mnth%<10 : greg%=0
elseif mnth%=10
if dy%>=15 : greg%=1
elseif dy%<=4 : greg%=0
else
greg%=-1
endif
endif
endif
kal$=" Julianischer Kalender 45vChr-4.10.1582 "
case greg%=1 : kal$=" Gregorianischer Kalender "
case greg%=-1: kal$=" KEIN KALENDER ZUFREFFEND! "
Print kal$
Print " Der " + str$(dy%)+"."+str$(mnth%)+"."+str$(fyear%)+" fällt auf einen ";
if mnth%<3
mnth%=mnth%+12
fyear% = fyear%-1
syear% = syear%-1
endif
h%=-1
if greg%=1
h%=(dy%+int((mnth%+1)*26/10)+syear%+int(syear%/4)+int( int(fyear%/100) /4) + 5*int(fyear%/100) ) mod 7
elseif greg%=0
h%=(dy%+int((mnth%+1)*26/10)+syear%+int(syear%/4)+ 5 + 6* int(fyear%/100) ) mod 7
else
h%=99
endif
if h%=0 : print "Samstag";
elseif h%=1 : print "Sonntag";
elseif h%=2 : print "Montag";
elseif h%=3 : print "Dienstag";
elseif h%=4 : print "Mittwoch";
elseif h%=5 : print "Donnerstag";
elseif h%=6 : print "Freitag";
elseif h%=99: print " "
print " nicht existierenden Zeitraum (wegen "
print " grego. Kalenderreform ausgelassen)";
else : print " fehlerhaften Eingabewert";
endif
print ". "
WaitInput
Goto "nochmal"
Im Prinzip ist nämlich ohnehin Einzeltagsbetrachtung angesagt, wegen der unregelmäßigen Feiertage, die auch noch bundesländerweise verschieden ist. Empfehlenswert: "Kastner: Terminplanung mit Basic auf Commodore" (aniquarisch vielleicht?) |
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 04.04.2017 ▲ |
|
|
|
|
Langer | Hallo p.specht, danke für deinen Post. Das war noch nicht das was ich eigentlich meinte.
Mir ist inzwischen die passende Idee gekommen.
Declare hWin1&, hButton1&, Ende&, hDate1&, hWin2&, hButton2&, hDate2&, Date&, Tage%, A&, b%
hWin1& = @Create("Dialog", %hWnd, "1. Urlaubstag", 100, 100, 200, 200)
hDate1& = @Create("DateEdit", hWin1&, "", 10, 50, 100, 24)
hWin2& = @Create("Dialog", %hWnd, "letzter Urlaubstag", 350, 100, 200, 200)
hButton2& = @Create("Button", hWin2&, "Ende", 10, 90, 180, 24)
hDate2& = @Create("DateEdit", hWin2&, "", 10, 50, 100, 24)
Clear Ende&
WhileNot Ende&
WaitInput
If @GetFocus(hButton2&)
Ende& = 1
EndIf
EndWhile
Def @Date(1) dt("setDate",val(substr$(substr$(@$(1),1," "),-1,".")), val(substr$(substr$(@$(1),1," "),2,".")), val(substr$(substr$(@$(1),1," "),1,".")))
Def @DateDiff(2) dt("DateTimeStr", "dd.mm.yyyy", Date(@$(1))-Date(@$(2)))
Def @DaysBetween(2) val(abs(30-val(substr$(substr$(DateDiff(@$(1),@$(2)),1,"|"),1,"."))))
Var Zeit1$=@GetText$(hDate1&)
Var Zeit2$=@GetText$(hDate2&)
Var d! = dt("SetDate",@GetText$(hDate1&))
Var wtag& = dt("getDoW",d!)
Declare wochentag$
Case wtag& = 1 : wochentag$ = "Montag"
Case wtag& = 2 : wochentag$ = "Dienstag"
Case wtag& = 3 : wochentag$ = "Mittwoch"
Case wtag& = 4 : wochentag$ = "Donnerstag"
Case wtag& = 5 : wochentag$ = "Freitag"
Case wtag& = 6 : wochentag$ = "Samstag"
Case wtag& = 7 : wochentag$ = "Sonntag"
b% = DaysBetween(Zeit1$, Zeit2$)
Tage% = b% + wtag&
Case Tage% < 7 : A& = 0
Case Tage% > 7 : A& = 2
Case Tage% > 14 : A& = 4
Case Tage% > 21 : A& = 6
Case Tage% > 28 : A& = 8
Date& = (DaysBetween(Zeit1$, Zeit2$) + 1) - A&
print Zeit1$
print Zeit2$
print
print DaysBetween(Zeit1$, Zeit2$) + 1;" Tag(e)"
print
print "der erste Tag ist ein " + wochentag$
print
print "das entspricht ";Date&;"Tagen Urlaub"
A& = 0
waitInput
fehlt jetzt noch die Feiertagsüberprüfung, aber da hab ich auch schon eine Idee. Muß ich aber erst testen. |
|
|
| |
|
|
|
p.specht
| |
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 04.04.2017 ▲ |
|
|
|
|
ByteAttack | Ich kann es nur dir sagen wie man es durch Excel machen kann.... [...]
Und für Daten benutze ich die MWDATE.DLL |
|
|
| |
|
|