Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ??? (https://www.delphipraxis.net/181283-fortlaufende-monat-aufzaehlung-stoppt-im-monat-dezember.html)

sammynrw 1. Aug 2014 18:18

Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
Hallo Delphi Freunde

Ich habe ein Problem fortlaufende Monate zu berechnen.

Beispiel:
Vertragsbeginn am 1.8.2014 Vertragsende 1.8.2015

Delphi-Quellcode:
function monatsberechnung(monatfeld: Integer): TDate;
var
  jahr, monat, tag: word;
  Tage : Integer;
begin
  decodedate(now, jahr, monat, tag);

  tage := tag;
   jahr := jahr ;
   monat := monat-1;
   tag := tag - tage+2;

  result := encodedate(jahr, monat + monatfeld, tag) - 1;
end;

Delphi-Quellcode:
function letztertagdesmonats(plusminusmonat : Integer): TDate;
var
  y, m, d: word;
begin
  decodedate(now, y, m, d);
  m := m + 1;
  if m > 12 then
  begin
   y := y + 1;
   m := m;

  End;
  result := encodedate(y, m + plusminusmonat, 1)-1 ;
end;
Jetzt lasse ich eine Schleife laufen:

Delphi-Quellcode:
for i := 1 to Anzahl do
 Form1.rzstringgrid1.Cells[1,i] := DateToStr(monatsberechnung(2))+' - ' + DateToStr(letztertagdesmonats(i)) ;
ich bekomme folgende Datum Werte berechnet:

01.09.2014 - 30.09.2014
01.10.2014 - 31.10.2014
01.11.2014 - 30.11.2014

Danach bekomme ich eine Nachricht: Ungültiges Argument zum Codieren des Datum

Was mache ich falsch ... ich verzweifel langsam :(

Perlsau 1. Aug 2014 18:26

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
Vielleicht wäre es ganz nützlich, in
Delphi-Quellcode:
function monatsberechnung
mal zu überprüfen, ob da für den Monat ein Wert > 12 herauskommt:
Delphi-Quellcode:
  monat := monat + monatfeld;
  if monat > 12 then
  begin
    monat := monat - 12;
    Inc(jahr)
  end;
  result := encodedate(jahr, monat, tag) - 1;
Nachfrage:
Worum geht's eigentlich? Vielleicht gibt es eine einfachere Lösung für die eigentliche Aufgabe?

Der schöne Günther 1. Aug 2014 18:40

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
Hallo-

Die Methoden
Delphi-Quellcode:
StartOfTheMonth(TDateTime)
und
Delphi-Quellcode:
EndOfTheMonth(TDateTime)
kennst du aber, oder?

himitsu 1. Aug 2014 18:42

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
Jupp.
Wieviele Monate hat nochmal ein Jahr?
Und bei mehr ist das "Datum" Natürlich ungültig.
Also mußt du, bei dieser Vorgehensweise, den Monateswert (z.B. via MOD) auf 1 bis 12 begrenzen und den Überlauf (DIV) zum Jahr dazurechnen.

@Perlsau: Das geht dann aber auch wieder nur bis 24. :zwinker:
Entweder als Schleife, oder mathematisch.


Delphi-Referenz durchsuchenMonthsBetween

sammynrw 1. Aug 2014 18:45

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich brauche den Abrechnungszeitraum des monats Beispiel: 01.08.2014 - 31.08.2014 usw.
für ein Stringgrid.

Perlsau 1. Aug 2014 18:51

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
Was benötigst du da? Die Anzahl der Tage?

Zitat:

Zitat von himitsu (Beitrag 1267294)
@Perlsau: Das geht dann aber auch wieder nur bis 24. :zwinker:

Ohne weitere Vorgaben des TE kann man hier keine ordentliche Lösung finden. Mir ging es in obigem Beispiel lediglich darum, aufzuzeigen, daß die berechnete Monatsvariable im Code des TE auch einen Wert > 12 annehmen kann.

Aviator 1. Aug 2014 18:52

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
Schau dich mal, wie von Günther schon genannt, in den Delphi-Referenz durchsuchenDateUtils um. Des Weiteren kannst du zu dem Tag, Monat oder dem Jahr einfach Zahlen addieren. Natürlich musst du aufpassen, dass das errechnete Datum auch ein gültiges Datum ist. Aber ich denke, dass in den DateUtils bereits alles vorhanden ist was du brauchst.

himitsu 1. Aug 2014 18:54

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
In den beiden letzten Posts, vor deiner letzten Antwort, stehen alle Funktionen, welche man für alle Datums- und Zahlenwerte auf deinem Bild benötigt. :roll:

sammynrw 1. Aug 2014 18:55

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
erste tag des monats und der letzte tag des monats ...

aber er rechnet nur bis zum November ... dann kommt die fehler meldung :(

himitsu 1. Aug 2014 18:59

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
Zitat:

Zitat von sammynrw (Beitrag 1267299)
aber er rechnet nur bis zum November ... dann kommt die fehler meldung :(

Und nun lies dir nochmal die alle Antworten durch, denn der Grund wurde mehrfach erklärt und sogar Lösungen genannt.

Auch ein Blick in Delphi-Referenz durchsuchenEncodeDate (siehe VALID/ZULÄSSIG) kann nicht schaden.

Perlsau 1. Aug 2014 19:01

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
Zitat:

Zitat von sammynrw (Beitrag 1267299)
erste tag des monats und der letzte tag des monats ...

aber er rechnet nur bis zum November ... dann kommt die fehler meldung :(

Hast du überhaupt gelesen, was bisher gepostet wurde? Und wenn ja, hast du daran etwas nicht verstanden? Nicht nur ich habe doch bereits ausführlich erläutert, weshalb ein ungültiges Datum entsteht, wenn du einfach Monate addierst, ohne zu überprüfen, ob da nicht ein Wert > 12 herauskommt. Ich weiß ja nicht, wie es sich dort, wo du lebst, verhält, aber hier wo ich lebe hat ein Jahr genau 12 Monate. Einen Monat mit der Nummer 13 gibt es nicht. Auch keinen mit der Nummer 14 oder 15. Ist der Groschen jetzt gefallen?

Wenn du den ersten und den letzten Tag eines Monats benötigst, ist das einfach: der erste Tag ist immer der 1. Der letzte Tag ist der DaysInAMonth. Diese Funktion hatte ich in 10 Sekunden als die richtige erkannt, nachdem ich in der Suchmaske zur Delphi-Referenz einfach Dateutils eingegeben hatte.

himitsu 1. Aug 2014 19:07

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
PS: Dein letztertagdesmonats ist auch noch defekt.
Schau mal genau in deinen IF-Block rein, genau auf den Monat.

(oder verwende einfach die vorhandenen funktionierenden Funktionen der RTL)



Genau deswegen knallt es bereit im Dezember.
Und dann nochmal das bereits genannte Problem, ab der 13. Monatsmiete, da ebenfalls über 12 Monate als Differenz.


Alle Probleme würde man auch gut durch Debuggen finden, indem man sich mal anschaut, was bei den Berechnungen eigentlich raus kommt.

Helmi 1. Aug 2014 19:17

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
Hallo,

das hier ist doch viel rumgerechnet um nichts:

Delphi-Quellcode:
function monatsberechnung(monatfeld: Integer): TDate;
var
   jahr, monat, tag: word;
   Tage : Integer;
begin
{...}

   tage := tag;
{...}
    tag := tag - tage+2;

{...}
end;
Tag ist so ja immer 2

Sir Rufo 1. Aug 2014 19:33

AW: Fortlaufende Monat Aufzählung Stoppt im Monat Dezember ???
 
Erster Tag des Monats (Tag 1 vom aktuellen Monat und Jahr)
Delphi-Quellcode:
function GetFirstDateOfMonth( ADate : TDate ) : TDate;
var
  LYear, LMonth, LDay : word;
begin
  DecodeDate( ADate, LYear, LMonth, LDay );
  Result := EncodeDate( LYear, LMonth, 1 );
end;
Letzter Tag des Monats (ein Tag vor dem 1. Tag des nächsten Monats)
Delphi-Quellcode:
function GetLastDateOfMonth( ADate : TDate ) : TDate;
begin
  Result := IncDay( IncMonth( GetFirstDateOfMonth( ADate ), 1 ), -1 );
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:24 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