TDBF und Einfügen von Datensätzen ?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

TDBF und Einfügen von Datensätzen ?

Beitrag von PeterS »

Hallo zusammen,

ich habe mir ein Code-Beispiel aus dem Netz zusammen gebaut,
und - weil ich es so brauchen kann - in ein TFrame gepackt. Siehe Anhang.
.
Screenshot.png
Screenshot.png (21.31 KiB) 2460 mal betrachtet
.
Nun wird im Beispiel-Code die "erste Spalte" von TDBF automatisch gefüllt, mit

Code: Alles auswählen

FieldDefs.Add( 'ID', ftAutoInc, 0, True);
Kann man trotzdem Datensätze einfügen ?
Wird dann diese erste Spalte automatisch "upgedatet" ?
Dateianhänge
demo_from_forum.zip
(160.08 KiB) 53-mal heruntergeladen

wp_xyz
Beiträge: 5189
Registriert: Fr 8. Apr 2011, 09:01

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von wp_xyz »

ftAutoInc bedeutet, dass der Wert in der ID-Spalte automatisch erhöht wird, du musst (kannst) diesem Feld keinen Wert zuweisen. Wenn du einen neuen Record erzeugst, dann wird er entsprechend dem aktuellen Index im Grid einsortiert. Da, lt deinem Code, das Feld ID als Primär-Index dient, erscheint der neue Record also immer am Ende. Übrigens: auch wenn du einen Record irgendwo in der Mitte löschst, wird die Lücke in der ID-Abfolge nicht aufgefüllt.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von Zvoni »

Prinzipell (Hat nix mit DBF zu tun):
Solche "surrogate" Primary Keys würde ich nie (oder zumindest nur als ReadOnly) irgendwo anzeigen.
Wie ich in deiner Form sehe, hast du ein ORDER BY ID
Das ergibt in den absolut seltensten Fällen Sinn
(Es geht hier auch ein wenig um "Usability" einer Form gegenüber dem User).

Prinzipell gilt auch für AutoInc PrimaryKeys, dass man für diese in einem INSERT oder UPDATE einen Wert vorgeben kann.
Sie unterliegen aber (oder zumindest sollten) strengsten Constraints, welche HOFFENTLICH vom DBMS selbst schon vorgegeben werden.
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von PeterS »

Ich muss vorweg sagen, ich habe das Code-Beispiel erstmal unkritisch fast unverändert übernommen.
wp_xyz hat geschrieben: Fr 20. Sep 2024, 00:24 ftAutoInc bedeutet, dass der Wert in der ID-Spalte automatisch erhöht wird, du musst (kannst) diesem Feld keinen Wert zuweisen.
Hab ich gesehen, das ergibt sich aus dem Beispiel-Code.
wp_xyz hat geschrieben: Fr 20. Sep 2024, 00:24 Wenn du einen neuen Record erzeugst, dann wird er entsprechend dem aktuellen Index im Grid einsortiert. Da, lt deinem Code, das Feld ID als Primär-Index dient, erscheint der neue Record also immer am Ende. Übrigens: auch wenn du einen Record irgendwo in der Mitte löschst, wird die Lücke in der ID-Abfolge nicht aufgefüllt.
Ich hatte das ID Feld erstmal drin gelassen weil ich in meinem persönlichen Code ein TDateTime Feld eingefügt habe.
Und das läßt sich - laut Lazarus Fehlermeldung beim compilieren - nicht indexieren.

Ich überlege gerade ob ich einfach ein Integer-Feld mit TDate mache - Integer läßt sich ja indexieren.
Wäre aber dann redundanter Datenmüll in Bezug auf das von mir eingeführte TDateTime Feld :(


Zur Erklärung: in meiner Datenbank schreibe ich 1x täglich den "Endstand" meiner Meßwerte in die Datenbank.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von Zvoni »

PeterS hat geschrieben: Fr 20. Sep 2024, 10:25 Zur Erklärung: in meiner Datenbank schreibe ich 1x täglich den "Endstand" meiner Meßwerte in die Datenbank.
Das heisst, du hast ein eindeutiges Tagesdatum pro Zeile?
Übrigens: Anstatt TDateTime (Was sich nicht indexieren lässt), wie wäre es mit UNIXEPOCH? Ist ein Integer.....

Denk dran: Wie du eine Information ANZEIGST hat nichts mit zu tun, wie du sie SPEICHERST
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

charlytango
Beiträge: 1086
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von charlytango »

Nur wieder mal meine 2 cents...

Als jemand der etliche Jahre mit DBF Programmierung auf dem Tacho hat (auch große Systeme mit Compound Indizes und mehr als 1 Mio Records pro Tabelle).

DBF kann schon was, ist aber heutzutage etwas aus der Zeit gefallen.

Ich empfehle, SQLite zu benutzen. Auch wenn diese Datenbank schräge Eigenschaften hat, halte ich diesen Ansatz doch für ausbaufähiger.
Gleich mit SQL zu beginnen bringt IMHO Vorteile. Und eine spätere Migration auf andere SQL Datenbanken ist dann im Aufwand übersichtlich.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von Zvoni »

charlytango hat geschrieben: Fr 20. Sep 2024, 11:18 Nur wieder mal meine 2 cents...

Als jemand der etliche Jahre mit DBF Programmierung auf dem Tacho hat (auch große Systeme mit Compound Indizes und mehr als 1 Mio Records pro Tabelle).

DBF kann schon was, ist aber heutzutage etwas aus der Zeit gefallen.

Ich empfehle, SQLite zu benutzen. Auch wenn diese Datenbank schräge Eigenschaften hat, halte ich diesen Ansatz doch für ausbaufähiger.
Gleich mit SQL zu beginnen bringt IMHO Vorteile. Und eine spätere Migration auf andere SQL Datenbanken ist dann im Aufwand übersichtlich.
Hallelujah. Preiset den Herrn... :-)
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von PeterS »

Zvoni hat geschrieben: Fr 20. Sep 2024, 10:37 Denk dran: Wie du eine Information ANZEIGST hat nichts mit zu tun, wie du sie SPEICHERST
Jep - habe ich gestern schon herausgefunden und umgesetzt.
Statt der nativen Werte in der DB - z.B. Watt-Stunden - werden kWh angezeigt, mit einer Nachkomma-Stelle.

Code: Alles auswählen

procedure TFrameDbaseControl.ClientDataSet1fFirstGetText(Sender: TField; var aText: string;
  DisplayText: Boolean);
begin
  try
    { Dynamically display the contents of the fFirst field into the Label. }
    aText:= FloatToStrF( Sender.AsInteger / 1000, ffnumber, 1, 1) +' kWh';
  except
    { Ensure Text remains the same. }
    aText:= IntToStr( Sender.AsInteger);
  end;
end;    
Zvoni hat geschrieben: Fr 20. Sep 2024, 10:37 Das heisst, du hast ein eindeutiges Tagesdatum pro Zeile?
Übrigens: Anstatt TDateTime (Was sich nicht indexieren lässt), wie wäre es mit UNIXEPOCH? Ist ein Integer.....
Ja, Datum + Uhrzeit "letzter Daten-Input". Also konkret z.B. 2024-09-20 23:59:320

UNIXEPOCH - muss ich mich mit befassen - es gibt ja etliche Diskussions-Threads zum Thema TDateTime <=> andere Datum/Zeit-Formate.
Nicht daß ich da in eine Falle laufe .. :D
Zuletzt geändert von PeterS am Fr 20. Sep 2024, 13:01, insgesamt 1-mal geändert.

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von PeterS »

charlytango hat geschrieben: Fr 20. Sep 2024, 11:18 Nur wieder mal meine 2 cents...
Als jemand der etliche Jahre mit DBF Programmierung auf dem Tacho hat (auch große Systeme mit Compound Indizes und mehr als 1 Mio Records pro Tabelle).
DBF kann schon was, ist aber heutzutage etwas aus der Zeit gefallen.
Ich empfehle, SQLite zu benutzen. Auch wenn diese Datenbank schräge Eigenschaften hat, halte ich diesen Ansatz doch für ausbaufähiger.
Gleich mit SQL zu beginnen bringt IMHO Vorteile. Und eine spätere Migration auf andere SQL Datenbanken ist dann im Aufwand übersichtlich.
Mir ist völlig klar daß das DBF Format "aus der Zeit gefallen ist".
Bei derzeit geplanten 365 Datensätzen pro Jahr = 1 Datensatz pro Tag halte ich das für vertretbar.

Um wieviel MB wird denn eine EXE-Datei "aufgeblasen" wenn man
eine echte, moderne (SQL ?) Datenbank-Implementierung an ein Lazarus-Projekt "dranhängt" ?

REM: ich bin ein Freund des KISS-Prinzips (= Keep It Simple, Stupid)

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von PeterS »

Zvoni hat geschrieben: Fr 20. Sep 2024, 10:37 Anstatt TDateTime (Was sich nicht indexieren lässt), wie wäre es mit UNIXEPOCH? Ist ein Integer.....
Okay .. also einfach vor dem Schreiben / Lesen in die DBF umwandeln mit

https://www.freepascal.org/docs-html/rt ... ounix.html
https://www.freepascal.org/docs-html/rt ... etime.html

???

Sieben
Beiträge: 292
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von Sieben »

Ja, Datum + Uhrzeit "letzter Daten-Input". Also konkret z.B. 2024-09-20 23:59:320
Ich würde das - genau so wie in deinem Beispiel - im Format ISO8601 in einem Textfeld speichern - ist indexierbar und jederzeit problemlos lesbar, auch mit externen Tools.
Um wieviel MB wird denn eine EXE-Datei "aufgeblasen" wenn man eine echte, moderne (SQL ?) Datenbank-Implementierung an ein Lazarus-Projekt "dranhängt" ?
Bei SQLite minimal, du brauchst nur einmalig die DLL im entsprechenden Systemverzeichnis und kannst dann in jeder Anwendung mit den entsprechenden Komponenten darauf zugreifen.

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von PeterS »

Sieben hat geschrieben: Fr 20. Sep 2024, 12:01
Um wieviel MB wird denn eine EXE-Datei "aufgeblasen" wenn man eine echte, moderne (SQL ?) Datenbank-Implementierung an ein Lazarus-Projekt "dranhängt" ?
Bei SQLite minimal, du brauchst nur einmalig die DLL im entsprechenden Systemverzeichnis und kannst dann in jeder Anwendung mit den entsprechenden Komponenten darauf zugreifen.
Okay, das ist nicht so gut für eine "Portable App".
Das bedeutet, ich müßte die DLL mitschleppen.
Sowas würde ich gerne vermeiden.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von Zvoni »

PeterS hat geschrieben: Fr 20. Sep 2024, 13:03
Sieben hat geschrieben: Fr 20. Sep 2024, 12:01
Um wieviel MB wird denn eine EXE-Datei "aufgeblasen" wenn man eine echte, moderne (SQL ?) Datenbank-Implementierung an ein Lazarus-Projekt "dranhängt" ?
Bei SQLite minimal, du brauchst nur einmalig die DLL im entsprechenden Systemverzeichnis und kannst dann in jeder Anwendung mit den entsprechenden Komponenten darauf zugreifen.
Okay, das ist nicht so gut für eine "Portable App".
Das bedeutet, ich müßte die DLL mitschleppen.
Sowas würde ich gerne vermeiden.
Wobei es möglich ist, entweder sqlite komplett statisch einzubinden (wobei ich noch nirgends ein funktionierendes Beispiel gesehen habe),
oder die sqlite3.dll als Ressource in die EXE hinein zu kompilieren.
Ablauf dann wie folgt:
Programm startet
Check ob sqlite3.dll dort ist, wo es sein soll (neben der EXE oder ggfs. Unterordner)
Falls nein, extrahiere die DLL aus der Ressource, und speicher sie eben dort ab
Falls ja.....
Feuer frei
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von PeterS »

Zvoni hat geschrieben: Fr 20. Sep 2024, 13:23 Wobei es möglich ist, entweder sqlite komplett statisch einzubinden (wobei ich noch nirgends ein funktionierendes Beispiel gesehen habe),
oder die sqlite3.dll als Ressource in die EXE hinein zu kompilieren.
Ablauf dann wie folgt:
Programm startet
Check ob sqlite3.dll dort ist, wo es sein soll (neben der EXE oder ggfs. Unterordner)
Falls nein, extrahiere die DLL aus der Ressource, und speicher sie eben dort ab
Falls ja.....
Feuer frei
Ja, stimmt, das könnte man so machen.

Kennst Du zufällig ein vergleichbares Code-Beispiel für SQL-Anbindung,
wie ich es hier für DBF angehängt habe, in meinem Eingangs-Post ?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TDBF und Einfügen von Datensätzen ?

Beitrag von af0815 »

Gnerell kann man den AutoID nutzen und hängt seine Felder einfach dazu. Damit hat man einmal einen eindeutigen Index, der nicht von irgendwelchen Werten abhängt, wie das Datum (Tagespart zB). Man muss die Spalte ja nirgends dem Benutzer anzeigen, dafür ist sichergestellt das der Wert Tabelleneinzigartig ist. Und die komponeneten haben ein Primärschlüssel für die eindeutige zuordnung, der sich nicht mehr ändert, selbst wenn alle anderen Werte sich ändern. Ist auch ein Vorteil.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten