![]() |
Nächstes Datum errechnen
Hi,
ich habe eine List mit Daten von Terminen in meinem Programm. Diese Daten sind in einer Listview mit der vsreport Ansicht. Die Reihenfolge der Termine ist unabhänhig wann sie stattfinden. Wie kann ich jetzt den Eintrag ermitteln, der als nächstes zutrifft. Also wenn ich in einer Listview folgende Daten habe: Zitat:
MFG Lars Wiltfang |
Re: Nächstes Datum errechnen
.. wandelt doch die Daten nach TDate um und addiere eins dazu.
das war wohl etwas daneben. erst lesen dann schreiben. Grüße Klaus |
DP-Maintenance
Dieses Thema wurde von "Sharky" von "Windows API / MS.NET Framework API" nach "Sonstige Fragen zu Delphi" verschoben.
Und was hat das mit API zu tun? |
Re: Nächstes Datum errechnen
Dazu fällt mir nur ein: sortieren und ggf. in einer Schleife vergleichenderweise durchlaufen.
|
Re: Nächstes Datum errechnen
Wie soll das mit der Schleife gehen. Man muss ja alle Einträge mit jedem andere Eintrag jeweils vergleichen oder? Dauert das nicht recht lange? Wenn man 100 Einträge hat wären dass dann 10000 Durchläufe? Kannst du mir da mal einen Ansatz geben wie ich das mit der Schleife angehe?
|
Re: Nächstes Datum errechnen
Ich sag doch: erst sortieren (ggf. in einer 2. Liste im Speicher, dann musst Du Dir den ItemIndex dazu aber auch merken). Dann fängst Du beim ersten Eintrag an und schaust, ob es größer als heute ist. Falls nicht, nächster Eintrag usw. Ansonsten Schleife verlassen.
|
Re: Nächstes Datum errechnen
Und wie sortiert man in einer Listview?
|
Re: Nächstes Datum errechnen
Zitat:
Delphi-Quellcode:
????
ListView.Items.sort := true;
|
Re: Nächstes Datum errechnen
Das Datum steht aber leider erstens nicht in der Caption und zweitens sind auch manchmal Geburtstage dabei sodass ein Jahr wie 1980 die Sortierung zerstören würde.
|
Re: Nächstes Datum errechnen
Zitat:
![]() |
Re: Nächstes Datum errechnen
Zitat:
|
Re: Nächstes Datum errechnen
Mein Vorschlag (ohne Sortieren): Du gehst die ganze Liste durch und betrachtest dabei ein Datum nur, wenn es größer oder gleich "heute" ist. Hast du so ein Datum gefunden, merkst du dir dessen ItemIndex und wie weit es von heute entfernt ist. Danach gehst du die Liste weiter durch und wenn du auf ein Datum triffst, dass zwar größer oder gleich "heute" ist, aber näher an heute als das bisher gemerkte, dann ersetzt du den bisher gemerkten ItemIndex durch den aktuellen und natürlich ebenfalls den Wert, in dem du dir merkst, wie weit das Ganze von heute entfernt ist. Den letzten Schritt wiederholst du bis zum Ende der Liste.
Die Laufzeit sollte linear sein und man muss die Items in der Liste nicht sortieren. Nur Programmieren musst du das kleine Schleifchen noch selbst. ;) Bis denn Bommel Hm, bin ich jetzt der Depp, der die Arbeit für ihn gemacht hat...? ;) |
Re: Nächstes Datum errechnen
Das wäre auch eine Möglichkeit, aber die muss auch erst einmal geschrieben werden ;)
|
Re: Nächstes Datum errechnen
Ok, dann habe ich nur noch zwei Fragen: Wie schaffe ich es nur Tag und Datum von so einem Datum: 01.01.1950 zu nehmen und wie kann ich daraus einen Integer machen oder kann man Objekte vom Date Typ auch einfach mit < und > vergleichen?
|
Re: Nächstes Datum errechnen
TDate = TDateTime = double. Und wenn alle Einträge im Format "dd.mm.yyyy" sind, kann man das Jahr ja mit dem Copy-Befehl abschneiden.
|
Re: Nächstes Datum errechnen
Was hast du bisher in delphi gemacht, dass du nicht einmal DecodeDate() kennst?
Welchen würde ein Datumstyp machen wenn man ihn vergleichen kann? Übrigens ist ein TDate(Time) ein Double |
Re: Nächstes Datum errechnen
Ich habe das Jahr jetzt erstmal außen vor gelassen und mich der Schleife gewidmet. Ich habe es so versucht wie Bbommel gesagt hatte:
Also mein Ansatz sieht so aus:
Delphi-Quellcode:
Ich weiß, das ist noch lange nicht alles aber ich habe das Gefühl, dass ich eine falsche Schleife benutze, oder? Wenn ich jetzt mit g weitermache und prüfe ob es einen noch kleineren Eintrag gibt muss ich ganz viele for Schleifen machen. Welche Schleife ist da besser?
var
i: Integer; g: integer; k: integer; begin for i := 0 to Listview1.Items.count - 1 do begin if StrToDate(DateToStr(Now)) < StrToDate(Listview1.Items.Item[i].SubItems.Strings[0]) then begin g := i; k := Listview1.items.count - g; end; |
Re: Nächstes Datum errechnen
Du brauchst doch nur das Minimum zu suchen. Übrigens:
Zitat:
|
Re: Nächstes Datum errechnen
Ich steht auf m Schlauch. Kann mir nicht bitte jemand sagen wie ich jetzt das Minimum hinkriege? Es ist bestimmt ganz einfach aber ich komm nicht drauf. Ich habs jetzt wirklich versucht so gut ich konnte. :(
|
Re: Nächstes Datum errechnen
Stichworte:
- BubbleSort - QuickSort An dem einen Ende ist das Minimum am anderen ist das Maximum. Minimum ist dann erreicht wenn alle anderen Werte größer sind. Grüße Klaus |
Re: Nächstes Datum errechnen
Dir fehlen immer noch jegliche Delphi- bzw. Programmier-Grundlagen, Larsi. Aber so ziemlich komplett.
Nimm dir eine Variable, die den Minimum-Wert repräsentiert und initialisiere diese mit dem Startwert deiner Liste. Gehe alle Werte in einer Schleife durch, vergleiche sie und weise der Variablen immer den aktuell geprüften Wert zu, sofern dieser kleiner ist, als der Variablenwert. Fertigen Code bekommst du von mir definitiv keinen. Gruß Edit: Oh, da war einer schneller. |
Re: Nächstes Datum errechnen
Ist das so richtig: :oops: ?
Delphi-Quellcode:
var
i: Integer; g: integer; k: integer; begin for i := 0 to Listview1.Items.count - 1 do begin if StrToDate(DateToStr(Now)) < StrToDate(Listview1.Items.Item[i].SubItems.Strings[0]) then begin g := i; if k < Listview1.items.count - g then k := Listview1.items.count - g; end; |
Re: Nächstes Datum errechnen
Hast du Deddys Beitrag gelesen?
Gehe den Source doch einmal selbst genau durch und frage dich, was du da machst bzw. was du da kopiert hast. Was macht das hier denn:
Delphi-Quellcode:
Wofür nutzt du überhaupt "g"?
StrToDate(DateToStr(Now))
|
Re: Nächstes Datum errechnen
Zitat:
|
Re: Nächstes Datum errechnen
Um ehrlich zu sein, glaube ich dir das. Dann wirst du ja umso besser wissen, wieso du das gemacht hast. Ich weiß es nämlich nicht, denn das, worauf ich dich hingewiesen hab und was du wieder vollkommen ignoriert hast, ist etwas unsinnig. Das würdest du aber sofort merken, wenn du nachvollziehen würdest, was du da gemacht hast.
Wie gesagt, gehe das einmal Schritt für Schritt durch, wenn du das nicht auf den ersten Blick siehst. Verwende auch sinnvolle Variablennamen, das gehört zum ordentlichen Programmierstil und erspart dir viele Fehler. Gerade der letzte Vergleich: Wenn k kleiner ist als das zu vergleichende Datum, dann weißt du k einen neuen Wert zu. Willst du das? Ich denke nicht. |
Re: Nächstes Datum errechnen
Wie sucht man denn das Minimum? Wenn Du diese Frage beantworten kannst, hast Du doch schon die Lösung.
|
Re: Nächstes Datum errechnen
Oder wenn er die Beiträge hier lesen würde. Die Komplettlösung wurde in Schriftform bereits genannt, aber das interessiert ihn wohl nicht, da kein Code enthalten war. :(
|
Re: Nächstes Datum errechnen
Hai Larsi,
noch ein Tipp von mir. Halte Daten immer in einer Variable/Liste die dem Typ am besten entspricht. Ein Datum gehört also in eine Variable/Liste vom Typ TDate! Zum Anzeigen wandelst Du diese in Strings um; aber nie zum arbeiten/berechnen :!: |
Re: Nächstes Datum errechnen
Ist der Ansatz besser?
Delphi-Quellcode:
Also in einem kleinem Test von mir klappts aber vielleicht ist das auch nur Zufall.
var
i: Integer; g: integer; begin g := 1; for i := 0 to Listview1.Items.count - 1 do begin if StrToDate(DateToStr(Now)) < StrToDate(Listview1.Items.Item[i].SubItems.Strings[0]) then begin if StrToDate(Listview1.Items.Item[i].SubItems.Strings[0]) < StrToDate(Listview1.Items.Item[g].SubItems.Strings[0]) then g := i; end; end; ShowMessage(Inttostr(g)); end; |
Re: Nächstes Datum errechnen
Zitat:
|
Re: Nächstes Datum errechnen
Zitat:
|
Re: Nächstes Datum errechnen
Also das hilft mir jetzt weniger weiter. Ich habe jetzt mal 10 Einträge erstellt und mein Programm hat den richtigen erkannt.
|
Re: Nächstes Datum errechnen
Na dann ist ja alles in Butter.
|
Re: Nächstes Datum errechnen
Moin, Moin Larsi,
wäre es Dir möglich, deinen Code etwas zu formatieren, so wie du den hinknallst, blickt keiner durch. Vermute Du wohl auch nicht. Nix für ungut, wäre doch ein schöner Vorsatz für das neue Jahr, den Code vernünftig zu strukturieren. |
Re: Nächstes Datum errechnen
Außerdem hast Du immer noch nicht erklärt, was Du mit
Zitat:
|
Re: Nächstes Datum errechnen
Ich glaube sogar, so blöd es klingt, Larsis Code funktioniert bis auf den Startindex:
Delphi-Quellcode:
Was für eine Lösung, die ist reif für die Code-Library. :mrgreen:
var
i: Integer; g: integer; begin g := 1; // was das soll weiß nur Larsi, eine 0 könnte ich noch verstehen // er geht in einer Schleife alle Einträge durch ... for i := 0 to Listview1.Items.count - 1 do begin // ... prüft nach dem Konvertierungs-Gewurschtel von "Now" ob die Einträge in der Zukunft liegen ... if StrToDate(DateToStr(Now)) < StrToDate(Listview1.Items.Item[i].SubItems.Strings[0]) then begin // ... und dann, ob der Eintrag, der in der Schleife überprüft wird, // kleiner ist als der Index des Minimum-Eintrags (Index g) ... if StrToDate(Listview1.Items.Item[i].SubItems.Strings[0]) < StrToDate(Listview1.Items.Item[g].SubItems.Strings[0]) then // ... und setzt den neuen Min-Index falls der Listeneintrag kleiner ist g := i; end; end; ShowMessage(Inttostr(g)); end; Edit: Kommentare angepasst. |
Re: Nächstes Datum errechnen
Zitat:
zu spät... noch eine Variante für die Code Libary :mrgreen:
Delphi-Quellcode:
Vorraussetzung ist, daß dein Datum als Item steht und nicht als Subitem.
function NachstesDatum : TDate;
var MinDate: TDate; I: integer; begin MinDate:= Now; for I := 0 to ListView1.Items.Count - 1 do begin if StrToDate(Listview1.Items.Item[i].Caption) > Now then begin if MinDate = Now then begin MinDate:= StrToDate(Listview1.Items.Item[i].Caption); end else begin if (StrToDate(Listview1.Items.Item[i].Caption) < MinDate) then begin MinDate:= StrToDate(Listview1.Items.Item[i].Caption); end; end; end; Result:= MinDate; end; end; PS: wird kein Eintrag in der Zukunft gefunden kriegst du das "heutige Datum zurück. |
Re: Nächstes Datum errechnen
@Sharky:
Jetzt wo ich ernsthaft selber versucht habe trotz meiner fehlenden Delphi Kenntnisse auf die Lösung des Problems zu kommen und wirklich mit meinem Delphi Latein am Ende bin hilft mir so ein Beitrag wie "Nein" nicht weiter. Sharky, als Moderator sollte dir das klar sein, das du mir damit nicht hilfst. Und da die Lösung zumindest bei einem Beispiel funktioniert bin ich noch mehr überfordert wenn man mir nicht mal sagt warum der Code falsch ist. Und wie ich jetzt sehe stimmt mein Code sogar. Wem fehlen hier die Delphi Kenntnisse? @Alle: Ich habe mir sehr wohl ALLE eure Beiträge doppelt durchgelesen und zu verstehen. *kopfschüttel* :cry: |
Re: Nächstes Datum errechnen
Mit richtigen Geburtstagen würde das aber nicht funktionieren (es sei denn, es handelt sich um Säuglinge, die im aktuellen Jahr geboren wurden).
|
Re: Nächstes Datum errechnen
Warte mal bis übermorgen :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:29 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