Letzter Datensatz wird nicht eingelesen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Letzter Datensatz wird nicht eingelesen

Beitrag von catweasel »

Moin

Ich schreibe gerade ein kleines Programm um Daten für Blutdruckmessungen einzugeben und in einem Chart anzeigen zu lassen.
Allerdings bekomme ich einfach nicht die letzten Werte aus der Datenbank ausgelesen.

Die Daten werden in einer CSV-Datei gespeichert:

Code: Alles auswählen

2012-03-01,Morgens,[b]132[/b],85,57,False
2012-03-01,Abends,[b]147[/b],89,67,False
2012-03-02,Morgens,[b]142[/b],91,57,False
2012-03-02,Abends,[b]143[/b],87,69,False
2012-03-03,Morgens,[b]143[/b],87,69,False
2012-03-03,Abends,[b]150[/b],91,63,False
2012-03-04,Morgens,[b]158[/b],92,58,True
2012-03-04,Abends,[b]145[/b],99,99,False
So versuche ich die Daten mit TLineSeries anzuzeigen und in eine ListBox zu schreiben:

Code: Alles auswählen

Systole.SeriesColor:=clgreen;
  for zeile:=1 to form1.DBGrid1.DataSource.DataSet.RecordCount do
    with form1.DBGrid1.DataSource.DataSet do begin
      RecNo := Zeile;
      ListBox1.Items.Add(inttostr(zeile));  //Test
      ListBox1.Items.Add(Fields[2].AsString);  //Test
      Systole.AddXY(Zeile, Fields[2].AsInteger, 'Text',clgreen);   //Systole in Chart zeichnen
    end; //with


Es werden alle Daten bis auf den letzten Datesatz korrekt dargestellt.
Mit dem Befehl:

Code: Alles auswählen

form1.DBGrid1.DataSource.DataSet.RecordCount
wird zwar die korrekte Anzahl der Einträge geholt (hier 8 Einträge), allerdings bekomme ich nicht den letzten Wert (hier 145) sondern der vorletzte Wert (158) wird wiederholt:

So werden die Werte werden als Blutdruckwert (Systole) angezeigt:

Code: Alles auswählen

1. 132
2. 147
3. 142
4. 143
5. 143
6. 150
7. 158
8. [b]158[/b]
Woran kann das liegen das ich nicht den letzten Wert bekomme??

Gruß
Michael

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Letzter Datensatz wird nicht eingelesen

Beitrag von Antrepolit »

Und womit greifst du auf die CSV-Datei zu?
Benutzt du eine ADO-Datasource? Das wäre nämlich der interessantere Teil, der weiterhelfen würde.

Grob gesagt liegt das hieran:

Code: Alles auswählen

for zeile:=1 to form1.DBGrid1.DataSource.DataSet.RecordCount do
    with form1.DBGrid1.DataSource.DataSet do begin
      RecNo := Zeile;
Es müsste so aussehen:

Code: Alles auswählen

form1.DBGrid1.DataSource.DataSet.First;
while NOT form1.DBGrid1.DataSource.DataSet.eof do
begin
  ListBox1.Items.ADD(inttostr(zeile));  //Test
  ListBox1.Items.ADD(DBGrid1.DataSource.DataSet.FIELDS[2].AsString);  //Test
  Systole.AddXY(Zeile, DBGrid1.DataSource.DataSet.FIELDS[2].AsInteger, 'Text',clgreen);   //Systole IN Chart zeichnen
end;
For Schleifen sollte man da benutzen, wo mit konstanten werten iteriert wird. Datensätze gehören genau nicht dazu, da sich die Anzahl stets ändert.
Und tu' dir selber einen Gefallen, und vermeide with-Blöcke. Spätestens wenn du zwei davon verschachtelst, kannst du dir Bugs einfangen, die du lange
suchen gehst.
Grüße, Antrepolit

care only if your os is really burning

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: Letzter Datensatz wird nicht eingelesen

Beitrag von catweasel »

Antrepolit hat geschrieben: Es müsste so aussehen:
Danke für den Tip. Ich habe es mit Deiner Hilfe jetzt so gemacht und es funktioniert :)

Code: Alles auswählen

//Systole in Chart zeichnen
  zeile:=1;
  Systole.SeriesColor:=clgreen;
  form1.DBGrid1.DataSource.DataSet.First;
  while NOT form1.DBGrid1.DataSource.DataSet.eof do
  begin
    Systole.AddXY(Zeile,  form1.DBGrid1.DataSource.DataSet.FIELDS[2].AsInteger, 'BlaBlub',clgreen);
    form1.DBGrid1.DataSource.DataSet.Next;
    inc(zeile);
  end;
Eine blöde Frage habe ich dann aber doch noch:
Wann/Wo wird eigendlich der Text ausgegeben den ich unter AddXY (...'BlaBlub'...) eingegeben habe??

Gruß
Michael

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Re: Letzter Datensatz wird nicht eingelesen

Beitrag von Thomas B. »

Antwort zur TChart-Frage:
Der Text wird sichtbar, wenn Du im Objektinspektor bei der (Line)Series --> Marks --> Style auf z.B. smslabel setzt.
Schau Dir mal das Beispiel in '...Lazarus\components\tachart\demo\basic' an.

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: Letzter Datensatz wird nicht eingelesen

Beitrag von catweasel »

Thomas B. hat geschrieben:Antwort zur TChart-Frage:
Der Text wird sichtbar, wenn Du im Objektinspektor bei der (Line)Series --> Marks --> Style auf z.B. smslabel setzt.
Schau Dir mal das Beispiel in '...Lazarus\components\tachart\demo\basic' an.
Danke für den Hinweis

Gruß
Michael

Antworten