Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Nächstes Datum errechnen (https://www.delphipraxis.net/126657-naechstes-datum-errechnen.html)

Larsi 30. Dez 2008 09:46


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:

19.03
15.06
1.1
23.3
Und heute der 30.12 ist, wie kann ich es dann erreichen, dass der 1.1 makiert wird, weil der als nächstes dran ist. Natürlich können die Daten variieren. :)


MFG Lars Wiltfang

Klaus01 30. Dez 2008 09:49

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 30. Dez 2008 09:49

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?

DeddyH 30. Dez 2008 09:52

Re: Nächstes Datum errechnen
 
Dazu fällt mir nur ein: sortieren und ggf. in einer Schleife vergleichenderweise durchlaufen.

Larsi 30. Dez 2008 09:58

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?

DeddyH 30. Dez 2008 10:04

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.

Larsi 30. Dez 2008 10:09

Re: Nächstes Datum errechnen
 
Und wie sortiert man in einer Listview?

Klaus01 30. Dez 2008 10:10

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von Larsi
Und wie sortiert man in einer Listview?

Delphi-Quellcode:
ListView.Items.sort := true;
????

Larsi 30. Dez 2008 10:15

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.

Sharky 30. Dez 2008 10:16

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von Larsi
Und wie sortiert man in einer Listview?

Eine Antwort auf diese Frage findest Du hier. Alternativ kann man auch versuchen nachzudenken.

mkinzler 30. Dez 2008 10:19

Re: Nächstes Datum errechnen
 
Zitat:

Alternativ kann man auch versuchen nach zu denken.
Warum das, wenn sich doch immer einer findet, der das für ihn macht :zwinker:

Bbommel 30. Dez 2008 10:22

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...? ;)

DeddyH 30. Dez 2008 10:27

Re: Nächstes Datum errechnen
 
Das wäre auch eine Möglichkeit, aber die muss auch erst einmal geschrieben werden ;)

Larsi 30. Dez 2008 10:34

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?

DeddyH 30. Dez 2008 10:37

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.

mkinzler 30. Dez 2008 10:37

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

Larsi 30. Dez 2008 10:54

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:
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;
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?

DeddyH 30. Dez 2008 10:59

Re: Nächstes Datum errechnen
 
Du brauchst doch nur das Minimum zu suchen. Übrigens:
Zitat:

Delphi-Quellcode:
StrToDate(DateToStr(Now))

:?:

Larsi 30. Dez 2008 11:07

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. :(

Klaus01 30. Dez 2008 11:10

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

Matze 30. Dez 2008 11:12

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.

Larsi 30. Dez 2008 11:15

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;

Matze 30. Dez 2008 11:17

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:
StrToDate(DateToStr(Now))
Wofür nutzt du überhaupt "g"?

Larsi 30. Dez 2008 11:18

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von Matze
was du da kopiert hast.

Wieso kopiert? Der gesamte Code stammt von mir.

Matze 30. Dez 2008 11:22

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.

DeddyH 30. Dez 2008 11:24

Re: Nächstes Datum errechnen
 
Wie sucht man denn das Minimum? Wenn Du diese Frage beantworten kannst, hast Du doch schon die Lösung.

Matze 30. Dez 2008 11:25

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. :(

Sharky 30. Dez 2008 11:26

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 :!:

Larsi 30. Dez 2008 11:55

Re: Nächstes Datum errechnen
 
Ist der Ansatz besser?
Delphi-Quellcode:
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;
Also in einem kleinem Test von mir klappts aber vielleicht ist das auch nur Zufall.

Sharky 30. Dez 2008 11:59

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von Larsi
Ist der Ansatz besser?...

Nein

DeddyH 30. Dez 2008 12:01

Re: Nächstes Datum errechnen
 
Zitat:

Zitat von Sharky
Zitat:

Zitat von Larsi
Ist der Ansatz besser?...

Nein

Kurz, knackig, korrekt :thumb:

Larsi 30. Dez 2008 12:07

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.

DeddyH 30. Dez 2008 12:10

Re: Nächstes Datum errechnen
 
Na dann ist ja alles in Butter.

Missionar 30. Dez 2008 12:13

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.

DeddyH 30. Dez 2008 12:15

Re: Nächstes Datum errechnen
 
Außerdem hast Du immer noch nicht erklärt, was Du mit
Zitat:

Delphi-Quellcode:
StrToDate(DateToStr(Now))

eigentlich bezweckst.

Matze 30. Dez 2008 12:16

Re: Nächstes Datum errechnen
 
Ich glaube sogar, so blöd es klingt, Larsis Code funktioniert bis auf den Startindex:

Delphi-Quellcode:
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;
Was für eine Lösung, die ist reif für die Code-Library. :mrgreen:

Edit: Kommentare angepasst.

haentschman 30. Dez 2008 12:17

Re: Nächstes Datum errechnen
 
Zitat:

Die fehlen immer noch jegliche Delphi-Grundlagen.

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ß
Ok...quäl dich nicht weiter 8) ich habe heute meinen sozialen Tag. :thumb:


zu spät... noch eine Variante für die Code Libary :mrgreen:
Delphi-Quellcode:
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;
Vorraussetzung ist, daß dein Datum als Item steht und nicht als Subitem.
PS: wird kein Eintrag in der Zukunft gefunden kriegst du das "heutige Datum zurück.

Larsi 30. Dez 2008 12:18

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:

DeddyH 30. Dez 2008 12:18

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).

mkinzler 30. Dez 2008 12:21

Re: Nächstes Datum errechnen
 
Warte mal bis übermorgen :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 Uhr.
Seite 1 von 3  1 23      

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