Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme bei SerienTerminen von einem Kalender (https://www.delphipraxis.net/137833-probleme-bei-serienterminen-von-einem-kalender.html)

gangs-taas 29. Jul 2009 10:55


Probleme bei SerienTerminen von einem Kalender
 
Hey,
Ich schreibe ja im moment an einem Kalender.
Und dieser Kalender bassiert auf den Kalenderwochen.
d.h. er zeigt immer eine ganze woche an.
(das musste vorweg zur info)


so ich möchte nun serien Termine da mit einbinden, also termine die immer wiederkommen.
Wenn das Termine sind die (nur ein beispiel) alle 4 wochen wiederkommen habe ich auch schon rausgefunden wie ich das mach.

also wenn man rechnet

(JetztigeKalenderwoche - StartKalenderwoche ) / dieWiederkehrzeit(also z.b. alle 4 wochen)

wenn das Ergebnis von dieser Rechnung keinen Rest hat dann ist die Jetztige Kalenderwoche eine dieser 4 wochen ....


okay
soweit so gut.


jetzt zu meiner Frage.

wisst ihr wie ich das einbinden könnte, dass ich z.b. jeden letzten mittwoch im Monat einen termin habe ?


weil dann alle 4 wochen zu sagen geht nicht.

mal ist der letzte Mittwoch eines Monates nur 3 oder 5 wochen nach dem vorherigen Termin...

wisst ihr wie ich das überprüfen könnte ?

ich weiß nämlich einfach nicht weiter...



ich hoffe ihr versteht mein Problem ....


danke schon einmal

Jürgen Thomas 29. Jul 2009 15:04

Re: Probleme bei SerienTerminen von einem Kalender
 
Hallo,

wenn du C# lesen kannst (oder es versuchen willst), dann schau einmal den Tipp unter Bestimmung des Datums des letzen Wochentages eines Monats an. Das sollte sich schnell nach Delphi übertragen lassen. (Allerdings habe ich schon länger nichts aktiv in Delphi gemacht, ich müsste erst in der Doku nach den DateTime-Eigenschaften schauen.)

Hinweis: % = modulo

Gruß Jürgen

mkinzler 29. Jul 2009 15:06

Re: Probleme bei SerienTerminen von einem Kalender
 
Ein Blick in die Unit DateUtils könnte auch helfen

gangs-taas 29. Jul 2009 15:27

Re: Probleme bei SerienTerminen von einem Kalender
 
nein ich kann leider kein c#

@mkinzler :

was genau meinst du ?
ich finde da nämlich nichts....

mkinzler 29. Jul 2009 15:32

Re: Probleme bei SerienTerminen von einem Kalender
 
Den letzten Tag eines Monats kann man mit EndOfTheMonth() ermitteln. Den Wochentag eines Datums mit
DayOfTheWeek(). Dann kannst du überprüfen ob der letzte Tag vor dem Mittwoch ist ( dann musst du den Mittoch der Vorwoche nehmen, sonst den Mittwoch dieser Woche)

DeddyH 29. Jul 2009 15:48

Re: Probleme bei SerienTerminen von einem Kalender
 
Ich habe den verlinkten Source mal übersetzt (hoffentlich richtig).
Delphi-Quellcode:
uses DateUtils;

type TWeekDay = DayMonday..DaySunday;

function LastDayOfWeekOfMonth(year,month: Integer;DayOfWeek: TWeekDay): TDate;
var temp: TDate;
begin
  temp := IncMonth(EncodeDateTime(year,month,1,0,0,0,0));
  Result := IncDay(temp,(DayOfWeek - DayOfTheWeek(temp) + 7) mod 7 - 7);
end;

Jürgen Thomas 29. Jul 2009 16:09

Re: Probleme bei SerienTerminen von einem Kalender
 
Hallo DeddyH,

soweit ich es sehe, hast du es im Prinzip richtig übersetzt. Nur mit dem Typ TWeekDay habe ich Zweifel. Unter C# gilt:
Zitat:

Die DayOfWeek-Enumeration ... zählt von 0 für Sonntag bis 6 für Samstag.
Also müsste es unter Delphi genauso gehen, weil Aufzählungstypen ebenfalls bei 0 anfangen:
Delphi-Quellcode:
type TWeekDay = DaySunday..DaySaturday;
Jürgen

DeddyH 29. Jul 2009 16:21

Re: Probleme bei SerienTerminen von einem Kalender
 
Ich habe es mal ausprobiert und es scheint zu funktionieren, da ich ja DayOfTheWeek benutze.

gangs-taas 29. Jul 2009 16:41

Re: Probleme bei SerienTerminen von einem Kalender
 
danke
ich guck mir das morgen in ruhe an und versuch es nachzuvollziehen ^^

danke ^^

DeddyH 29. Jul 2009 16:43

Re: Probleme bei SerienTerminen von einem Kalender
 
Zitat:

Zitat von gangs-taas
danke
ich guck mir das morgen in ruhe an und versuch es nachzuvollziehen ^^

danke ^^

Willst Du Dir das wirklich antun? :)

gangs-taas 29. Jul 2009 21:46

Re: Probleme bei SerienTerminen von einem Kalender
 
ja will ich xD

falls ihr mich falsch verstanden habt:
sorry für die formulierung


danke für eure hilfe


besser ? ^^

Wolfgang Mix 30. Jul 2009 10:52

Re: Probleme bei SerienTerminen von einem Kalender
 
@DeddyH

Wie rufst Du Funktion richtig auf?
Ich erzeuge hier immer Fehler bei der Parameterübergabe.
Gib mal bitte ein Beispiel für diesen Monat

mfg

Wolfgang

DeddyH 30. Jul 2009 11:03

Re: Probleme bei SerienTerminen von einem Kalender
 
Delphi-Quellcode:
ShowMessage(DateToStr(LastDayOfWeekOfMonth(2009,7,DayMonday)));

Wolfgang Mix 30. Jul 2009 11:10

Re: Probleme bei SerienTerminen von einem Kalender
 
Danke, funzt,
hatte DateToStr vergessen!

Zitat:

10 Minuten überlegen ...
mfg

Wolfgang

gangs-taas 1. Aug 2009 21:56

Re: Probleme bei SerienTerminen von einem Kalender
 
hey,
hat einer von euch den algo verstanden ?
also weiß wieso man das so machen muss ?
kann mir das einer erklären ?
ich habe jetzt nämlich eine code der funktioniert aber ich weis nicht wieso...
also ich verstehe die logik dahinter nicht ...
das wurmt mich
könnte mir jemand den algo erklären ?

Wolfgang Mix 1. Aug 2009 22:46

Re: Probleme bei SerienTerminen von einem Kalender
 
Ich würde 'mal den Autor fragen

http://www.mycsharp.de/wbb2/thread.php?threadid=74208

Gruß

Wolfgang

Jürgen Thomas 2. Aug 2009 10:20

Re: Probleme bei SerienTerminen von einem Kalender
 
@Wolfgang
Die Erklärung erschließt sich eher aus der vorherigen Diskussion Funktion für Lezter Sonntag im Monat. Aber weil das Schritt für Schritt entstand, ist es wohl einfacher, dies hier neu zu erklären:

1. Erzeuge ein Datum mit dem Ersten des aktuellen Monats:
Delphi-Quellcode:
temp := EncodeDateTime(year,month,1,0,0,0,0);
2. Mache daraus den Ersten des nächsten Monats:
Delphi-Quellcode:
temp := IncMonth(temp);
3. Gehe davon so viele Tage zurück (!), bis der gewünschte Wochentag erreicht wird:
Delphi-Quellcode:
Result := IncDay(temp, x);  //  mit negativem Integer x
4. Berechne x möglichst schnell. Machen wir es an einem Beispiel deutlich:
a. Suche den letzten Donnerstag im Juli 2009, also für temp = 01.08.2009.
b. Das ist ein Samstag/Sonnabend, also:
Delphi-Quellcode:
x := DayOfTheWeek(temp);  // x = 5 (nur geraten, weil in meiner Doku DayOfTheWeek fehlt)
c. Gesucht wird DayOfWeek.Donnerstag, also 3 bei DeddyH's Definition
d. Für modulo sind vorzugsweise positive Zahlen zu verwenden, also Addition von 7, also:
Delphi-Quellcode:
x := 3 - x + 7;   // x = 5
e. Es dürfen nur Zahlen von 0 bis 6 herauskommen, also modulo:
Delphi-Quellcode:
x := x mod 7;     // x = 5
f. Wenn ich 5 Tage weitergehe, bekomme ich den nächsten Donnerstag, ich will aber den vorherigen:
Delphi-Quellcode:
x := x - 7;       // x = -2
Das unter 3 eingesetzt gibt das Ergebnis.

Schönen Sonntag! Jürgen

Wolfgang Mix 2. Aug 2009 11:53

Re: Probleme bei SerienTerminen von einem Kalender
 
@Jürgen

Vielen Dank für die perfekte Erklärung zur Frage von gangs-taas . Ich hatte schon vermutet, daß so ein Zweizeiler nur aus guter Teamarbeit entstanden sein kann. Ich habe jetzt die von Dir angegebene Quelle aufmerksam studiert und nachvollzogen, wie funktionierender Code perfekt optimiert wird. Diskutieren könnte man nur noch über Namensgebung der Funktion.

Wie man wieder sieht:
Eine Frage an die DP erspart viel Grübelei!

Auch schönen Sonntag

Wolfgang

gangs-taas 2. Aug 2009 13:24

Re: Probleme bei SerienTerminen von einem Kalender
 
vielen dank

jetzt hab ich es auch vestanden xD


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz