Terminberechnungsfunktion
Übersicht

schalliBetreff: Terminberechnungsfunktion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Für mein Programm TERMIvention habe ich vor längerer Zeit hier von onkelz89 einen Code bekommen, den ich so anwende:
Code: [AUSKLAPPEN] Function Betweendays(Tag,Monat,JahrN,enddate)
momdate=Tag+"."+Monat+"."+JahrN While momdate<>enddate If Tag<28 Then Tag=Tag+1 Else If Monat<>2 Then If Monat=1 Or Monat=3 Or Monat=5 Or Monat=7 Or Monat=8 Or Monat=10 Or Monat=12 Then If Tag<31 Then Tag=Tag+1 Else Tag=1 Monat=Monat+1 EndIf Else If Tag<30 Then Tag=Tag+1 Else Tag=1 Monat=Monat+1 EndIf EndIf Else Schaltjahr#=JahrR#/4 If RSet(Schaltjahr#,1)<>0 Then If Tag<28 Then Tag=Tag+1 Else Tag=1 Monat=Monat+1 EndIf Else If Tag<29 Then Tag=Tag+1 Else Tag=1 Monat=Monat+1 EndIf EndIf EndIf EndIf If Monat>12 Then Monat=1 JahrN=JahrN+1 JahrR#=JahrR#+1 EndIf momdate=Tag+"."+Monat+"."+JahrN zahl=zahl+1 Wend Return zahl End Function Mein Problem: Worklog-Zitat: Die Terminfunktion rechnet immer einen Tag dazu, bis das Anfangs- und das Enddatum übereinstimmen. Jetzt sollte eigentlich das Programm eigentlich in eine Endlosschleife geraten, wenn man ihm eine Aufgabe wie von 7.11.2009 bis 6.11.2009. Das tut es aber nicht sondern gibt 29 zurück. Warum weiß ich nicht und bevor ich das nicht weiß, komme ich nicht voran.
Kann mir jemand sagen, warum das oben genannte passiert? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sicher, dass die Datentypen überhaupt richtig sind? Ich meine, gleich in der ersten Zeile sollte das schon mal ein String sein...
Code: [AUSKLAPPEN] momdate=Tag+"."+Monat+"."+JahrN
Edit: Zum eigentlichen Problem: Warum Vergleichst du nicht beide Daten und lieferst -1 zurück, wenn das Enddatum vor dem Startdatum liegt? |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
schalli |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@Xeres: Weil ich dann die ganze Funktion umprogrammieren müsste, und da ist mir eine Endlosschleife, die ich nach eine Zeit stoppen kann lieber. | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eine Endlosschleife ist dir lieber? Na wenn du meinst.
Ich würde das anderes Regeln... BlitzBasic: [AUSKLAPPEN] Local StartDate$="1.2.2004" |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
schalli |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@Xeres: Bei folgender Aufgabe in deinem Code: [AUSKLAPPEN] Local StartDate$="1.2.2004"
Local EndDate$="31.1.2004" gerät das Programm in eine Endlosschleife, bei dieser jedoch nicht: Code: [AUSKLAPPEN] Local StartDate$="1.2.2004"
Local EndDate$="30.1.2004" Hier gibt es -1 zurück, aber es ist doch -2. Na ja, trotzdem danke für den Versuch. EDIT: Bei einer Endlosschleife hätte ich nach vier Jahren abgebrochen, weiter im Vorraus kann man in meinem Programm keine Termine anlegen. Es geht mir nur darum, dass ich weiß, wann ich einen Termin automatisch löschen kann und da hätte meine Idee gereicht. Aber mit negativen Zahlen ist es natürlich besser. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei der Datumsüberprüfung handelt es sich nur um eine Abschätzung. Entweder erhöht man die "Wertigkeit" eines Monats auf 31 Tage...
Code: [AUSKLAPPEN] If ((TagE + MonatE*31 + JahrE*365) - (Tag + Monat*31 + Jahr*365)) < 0 Then Return -1
oder man macht eine längere aber sichere Überprüfung mit If..else usw. code an dieser stelle war doof und nicht funktionsfähig... Die Abschätzung ist sehr viel einfacher als viele Verschachtelte If-Blöcke... Edit2: Okay, so viele sind es doch nicht... Code: [AUSKLAPPEN] If JahrE < Jahr Then
Return -1 ElseIf JahrE = Jahr And MonatE < Monat Then Return -1 ElseIf JahrE = Jahr And MonatE = Monat And TagE < Tag Then Return -1 EndIf Um statt dem Ergebnis -1 (EndDatum liegt vor dem Startdatum) die Anzahl von Tagen zu erhalten, musst du Start- und Enddatum vertauschen und ggf. am schluss mit -1 Multiplizieren und die Zeitliche "Richtung" an zu zeigen. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group