Entwickler-Ecke

Datenbanken - Datenbank befüllt immer den ersten Eintrag


Rupert - Fr 19.03.21 13:13
Titel: Datenbank befüllt immer den ersten Eintrag
Ich versuche mit der u.a. Pascal-function in die Datenbank Fronius den aktuellen Wert als letzten Eintrag zu schreiben und danach den ersten zu löschen, wenn mehr als 4 Datensätze geschrieben wurden. (Last in first out)

Solange die Datenbank unter 5 Einträge hat, werden die Werte stets angehängt.
Sobald ich die erste Zeile einmal gelöscht habe, wird diese immer wieder beschrieben.

ich verstehe nicht weshalb, da ich stets zuvor zum letzten Datensatz gehe und ein append bzw. insert anweise.
Weder append, noch insert funktioniert richtig.

Es handelt sich um eine componentACE Datenbank, programmieren tue ich unter Delphi 5

lg
Rupert


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
{ Remark
('"E_Day" : ','Tagesenergie','10155','kW'), //wh
('"E_Total" : ','Gesamtenergie','13312070','kW'), //wh
('"E_Year" : ','Jahresenergie','7033412','kW'), // wh
('"P_Grid" : ','Netzbezug','1791.6800000000001','kW'), //watt
('"P_Load" : ','Verbrauch','-1791.6800000000001','kW'), //watt
('"P_PV" : ','aktuelle PV- Leistung','10','kW'),
('"P_AC_Total" : ','Ohmpilot-Leistung','1861','W'),
('"Temperature" : ','Temperatur f. Ohmpilot','66.599999999999994','°C'),
}


    with Datentabellen.Fronius do
    Begin
      Label1.caption:= inttostr(recordcount); // nur zur Info
      Label1.refresh;

      last;
      Insert; // auch append funktioniert nicht

      FieldByName('E_Day').AsFloat:=FRONIUS_Daten[1];
      FieldByName('E_Total').AsFloat:=FRONIUS_Daten[2];
      FieldByName('E_Year').AsFloat:=FRONIUS_Daten[3];
      FieldByName('P_Grid').AsFloat:=FRONIUS_Daten[4];
      FieldByName('P_Load').AsFloat:=FRONIUS_Daten[5];
      FieldByName('P_PV').AsFloat:=FRONIUS_Daten[6];
      FieldByName('P_AC_Total').AsFloat:=FRONIUS_Daten[7];
      FieldByName('Temperature').AsFloat:=FRONIUS_Daten[8];

      post;
 
      if recordcount >= 5 then begin
        first;
        delete;
      end;
 
    end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconTh69: Rechtschreibfehler im Titel geändert.


jaenicke - Fr 19.03.21 20:51

Genau der Quelltext funktioniert mit einer aktuellen Delphiversion (und einer aktuellen Datenbank). :nixweiss:

Muss es wirklich Delphi 5 aus dem letzten Jahrtausend sein? :shock:


mandras - Fr 19.03.21 22:34

Rupert, ich nehme an, Du meint nicht, daß append oder insert eine Fehlermeldung produzieren.
Sondern daß der neue Datensatz nicht an der Stelle erscheint, die Du erwartest.

Habe ich das soweit richtig verstanden?

Falls ja:

Die, die Datenbanken die ich kenne, können Datensätze nicht gezielt an einer bestimmten Stelle einer Tabelle ablegen
(Ausnahme war glaube ich Paradox).

Es wird hier wahrscheinlich nicht anders sein.

Meine Lösungsidee wäre:

Ein zusätzliches Int-Feld, zB lfdNr, definieren. Abfragen der Tabelle immer mit Sortierung nach lfdNr.

Beim Anhängen eines Datensatzes dieses Feld mit Max(lfdnr aller bestehender Sätze)+1 belegen.
Damit wird der neue Satz immer der letzte bei Abfragen.
Wenn mehr als 5 Sätze in der Tabelle: Dann noch den Satz löschen, dessen lfdNr = min (lfdnr aller Sätze). Das löscht dann immer den ersten Satz der Tabelle.


jaenicke - Sa 20.03.21 00:36

Ach so, stimmt, dann habe ich das falsch verstanden.

Die Zeilen in einer Tabelle können per Definition in beliebiger Reihenfolge erscheinen, wenn keine Sortierung vorgegeben ist. Wann ein Datensatz hinzugefügt wird, hat damit nicht unbedingt etwas zu tun.

Eine Lösung hat ja mandras schon genannt. Dafür verwendet man z.B. Autoinkrement Felder, vorausgesetzt die Tabelle unterstützt das. Ansonsten geht es nur wie von mandras beschrieben manuell.


Sinspin - So 21.03.21 09:09

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Muss es wirklich Delphi 5 aus dem letzten Jahrtausend sein? :shock:

Du schonwieder, Du bist auch aus dem letzten Jahrtausend. Ich zeige mich deswegen trotzdem nicht :shock: :rofl:

Das passiert bei mir erst wenn ich with im Quelltext finde :
user profile iconRupert hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
    with Datentabellen.Fronius do
    Begin
    ...


Rupert - Mi 24.03.21 11:53

user profile iconmandras hat folgendes geschrieben Zum zitierten Posting springen:
Meine Lösungsidee wäre:

Ein zusätzliches Int-Feld, zB lfdNr, definieren. Abfragen der Tabelle immer mit Sortierung nach lfdNr.

Beim Anhängen eines Datensatzes dieses Feld mit Max(lfdnr aller bestehender Sätze)+1 belegen.
Damit wird der neue Satz immer der letzte bei Abfragen.
Wenn mehr als 5 Sätze in der Tabelle: Dann noch den Satz löschen, dessen lfdNr = min (lfdnr aller Sätze). Das löscht dann immer den ersten Satz der Tabelle.


Danke - funktioniert