Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu EncodeDateWeek (https://www.delphipraxis.net/137565-frage-zu-encodedateweek.html)

cugar 23. Jul 2009 14:38


Frage zu EncodeDateWeek
 
Hallo,
versuche gerade folgendes:
1. Datum der letzten Lieferung liegt vor, zB 13.07.2009
2. Es gibt ein Enddatum (per Eingabe) zB. 29.07.2009
3. Es gibt ein Intervall zB 1 (dh jede Woche liefern oder 2 für alle 2 Wochen usw)

Es sollen mir alle Tagen ausgegeben werden, die hier zutreffen, dh:
20.07.2009
27.07.2009

Mein Versuch bis jetzt:
1. Mit Kalenderwoche_ermitteln(LSLIEFERDATE.Value) bekomme ich die Kalenderwoche der letzten Lieferung
2. Mit Kalenderwoche_ermitteln(LSLIEFERDATE.Value) + AUTOINTERVALL.Value die Kalenderwoche der nächsten Lieferung

Jetzt möchte ich schauen ob der Montag in der neuen Kalenderwoche noch <=Enddatum ist, bevor ich diese Tage auswerten kann:
EncodeDateWeek(YearOf(LSLIEFERDATE.Value),Kalender woche_ermitteln(LSLIEFERDATE.Value) + AUTOINTERVALL.Value,1);

Was ich nicht verstehe, die Function EncodeDateWeek benötigt vorne eine Jahreseingabe (bei mir im Moment Jahr aus dem Datum der letzten Lieferung). Was ist wenn das Jahr zB (wie aktuell) 2009 ist, aber nach dieser Formel der Montag in 2010 kommt???
Gibt es eine Fehlermeldung und ich muss das Jahr erhöhen oder wie??

Viele Grüsse
Andreas Bremer

PS. Einfach zu dem Datum der letzten Lieferung 7 addieren (mit Schleife) geht nicht, manche Kunden werden mehrmals in der Woche automatisch beliefert

samso 23. Jul 2009 17:53

Re: Frage zu EncodeDateWeek
 
Ich verstehe die Schleifen-Bemerkung nicht wirklich. Die folgende Funktion ist aber kompatibel und berücksichtigt den Jahreswechsel (schon fast) korrekt (LSLIEFERDATE.Value darf nicht z.B. 2.1.2010 sein, denn das ist KW53/2009 - aber wer liefert da schon was? :) ).

Delphi-Quellcode:
//Ergibt Montag in <AUTOINTERVALL.Value>-Wochen
NaechsterMontag := EncodeDateWeek(YearOf(LSLIEFERDATE.Value),
                                 Kalenderwoche_ermitteln(LSLIEFERDATE.Value),1) +
                                 AUTOINTERVALL.Value*7;
Ich würde die folgende Variante bevorzugen

Delphi-Quellcode:
//Datum des Wochenanfangs der letzten Lieferung + <AUTOINTERVALL.Value>-Wochen
NaechsterMontag := LSLIEFERDATE.Value - DayOfTheWeek(LSLIEFERDATE.Value) + 
                   AUTOINTERVALL.Value*7 + 1;
P.S. Vielleicht hätte ich mich noch zur Frage äußern sollen? Ja, es gibt eine Fehlermeldung (denn KW 60 gibt es im Jahr 2009 nicht (2010 übrigens auch nicht :) )

cugar 23. Jul 2009 23:32

Re: Frage zu EncodeDateWeek
 
Danke für deine Hilfe.
Bin noch blutiger Anfänger mit viel Talent alles zu kompliziert zu machen :)

Verstehe diese Formel aber nicht ganz:
//Datum des Wochenanfangs der letzten Lieferung + <AUTOINTERVALL.Value>-Wochen
NaechsterMontag := LSLIEFERDATE.Value - DayOfTheWeek(LSLIEFERDATE.Value) +
AUTOINTERVALL.Value*7 + 1;

Wenn ich meine Werte jetzt reinstelle:
NaechsterMontag := 13.07.2009 - 1 + 1 * 7 + 1;

Habs ausprobiert, Delphi gibt hier: 27.07.2009 aus, müßte aber den 20.07.2009 ausgeben

samso 24. Jul 2009 10:26

Re: Frage zu EncodeDateWeek
 
Zitat:

Zitat von cugar
NaechsterMontag := 13.07.2009 - 1 + 1 * 7 + 1;
Habs ausprobiert, Delphi gibt hier: 27.07.2009 aus, müßte aber den 20.07.2009 ausgeben

Wie die Formel ja schon zeigt, kann das ja schlicht nicht sein. Auch ein Windows-PC mit Delphi ist in der Lage 13+7 korrekt auszurechnen. Der Fehler liegt also in der Umsetzung des Codes. (Es war ja auch schon spät.. :wink: ) Gibt es ein Code-Auszug?

angos 24. Jul 2009 12:19

Re: Frage zu EncodeDateWeek
 
Hi,

ich verstehe grad nicht ganz, warum das so kompliziert über KW gerechnet wird. Mein Vorschlag, in welchem auch Jahreswechsel und 53.KW furzegal sein sollten ;):

[EDIT] DU willst den Montag prüfen, daher ein wenig umgebaut^^
Delphi-Quellcode:

function GetLieferzeitpunkte(dtLetzteLieferung, dtEnde: TDateTime): String;
var
  dtPruef: TDateTime;
begin
  dtPruef := dtLetzteLieferung + 7 + DayOfTheWeek(dtLetzteLieferung) + 1
  dtLetzteLieferung := dtLetzteLieferung + 7;
 
  while dtPruef <= dtEnde do
  begin
    Result := Result + DateTimeToStr(dtLetzteLieferung);
    dtLetzteLieferung := dtLetzteLieferung + 7;
    dtPruef := dtPruef + 7;
  end;
end;
Gruß
Ansgar


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

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