TDBF : suche

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

TDBF : suche

Beitrag von malabarista »

Ich habe mich nun durch viele Tutorials zum Thema TDBF gewühlt, aber eine Frage blieb offen:
Wie mache ich eine Suche, wenn es nicht der Index ist ?

Beispiel:
eine DB mit den 5 Feldern: name, vorname, land, ort, plz
Der index liegt auf dem Feld name.
Ich möchte nun alle Datensätze finden mit plz=78464
Wie muss diese Suchabfrage aussehen ?
Besondere Anforderung: das Ergebnis soll nach dem Feld name sortiert sein.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TDBF : suche

Beitrag von Michl »

Siehe http://wiki.freepascal.org/Lazarus_Tdbf ... ng_filters. Generell würde ich aber SQLite für einfache Datenbankanwendungen vorziehen (SQL-Unterstützung ist mMn sehr vorteilhaft und SQLite ist sehr gut dokumentiert).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TDBF : suche

Beitrag von malabarista »

Sicher ist SQLite die bessere Alternative...
Normalerweise arbeite ich sehr viel mit mysql-Datenbanken.

In diesem Fall ist mein Problem : man kann einem Anwender nicht zumuten Sqlite zu installieren. Das geht in dies Hose...
Und dann wäre wieder viel Fernwartung angesagt. Und das wollte ich vermeiden.
Aber wahrscheinlich werde ich eine eigene kleine Datenbank einsetzen.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1624
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TDBF : suche

Beitrag von corpsman »

sqllite must du unter windows nicht installieren, das legst du einfach als DLL ins App verzeichnis.

Unter Linux ist es auch kein Problem "sudo apt-get install sqlite3"
--
Just try it

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TDBF : suche

Beitrag von malabarista »

ja, das wäre schön.

Allerdings bin ich schon gleich über das erste Problem gestolpert:
bei mir im Objektinspektor werden keine TSQlite3-Componenten angezeigt wie z.B.
TSQLite3Connection,
TSQLTransaction,
TSQLQuery
Diese gibt es anscheinend nicht, obwohl ich die neueste Version von Lazarus habe....

Habt ihr eine Idee, was mir da fehlt ?

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TDBF : suche

Beitrag von malabarista »

gefunden: unter Linux muss man eine spezielle Leiste öffnen.

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

Re: TDBF : suche

Beitrag von wp_xyz »

Naja, manchmal will man keine zusätzliche DLL haben, und da ist eine kleine dbf-Datei durchaus nicht verkehrt. In dem beigefügten Demoprojekt zeige ich, wie man hier Daten suchen und filtern kann. Beachte, das durchsuchte Feld PLZ ist nicht indiziert, so wie ursprünglich angefragt.
Dateianhänge
dbf_filter.zip
(2.62 KiB) 91-mal heruntergeladen

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TDBF : suche

Beitrag von malabarista »

ja, es ist immer wieder beachtlich, welche Funktionen sich finden, wenn man in die Tiefe steigt.
Ich finde diese Filter-Funktion sehr interessant.

Gibt es auch noch eine Möglichkeit festzustellen, wieviele Elemente durch den Filter gefunden wurden ?

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

Re: TDBF : suche

Beitrag von wp_xyz »

Bei einigen Datenbanktypen kann man mit der Dataset-Eigenschaft RecordCount to Anzahl der gefilterten Datensätze abfragen; bei dbf erhalte ich aber nur die Anzahl der ungefilterten. Da TDbf auch kein SQL kann, bleibt nur, die gefilterten Datensätze von Anfang bis Ende durchzulaufen und mitzuzählen:

Code: Alles auswählen

function CountRecords(ADataset: TDataset): Integer;
var
  bm: TBookmark;
begin
  Result := 0;
  ADataset.DisableControls;
  bm := ADataset.GetBookmark;
  try
    ADataset.First;
    while not ADataset.EoF do begin
      inc(Result);
      ADataset.Next;
    end;
    ADataset.GotoBookmark(bm);
  finally
    ADataset.FreeBookmark(bm);
    ADataset.EnableControls;
  end;
end; 
Dabei wird mit Hilfe von DisableControls/EnableControls verhindert, dass beim Zählen die Records im Grid durchlaufen; auch wird ein Bookmark gesetzt, so dass hinterher wieder auf den aktiven Record zurückgesprungen werden kann.

Ach und übrigens: Auf den Link zu den Filtern hat dich weit oben schon Michl hingewiesen. Haste offenbar nicht gelesen...

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TDBF : suche

Beitrag von malabarista »

Das sieht nun insgesamt (zusammen mit dem Tutorial von Michl) ziemlich gut aus.
Schade, dass die wenigen TDBF-Tutorials, die es gibt, so schlecht zu finden sind.
Vielleicht mache ich mal eine aktuelle Liste...

Antworten