Autor Beitrag
Rupert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
BeitragVerfasst: Fr 19.03.21 13:13 
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

ausblenden volle Höhe 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.

_________________
Grüße Rupert
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: Rupert
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
    with Datentabellen.Fronius do
    Begin
    ...

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?

Für diesen Beitrag haben gedankt: FinnO
Rupert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
BeitragVerfasst: 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

_________________
Grüße Rupert