AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TFDQuery und positionieren

Ein Thema von Edelfix · begonnen am 5. Okt 2021 · letzter Beitrag vom 6. Okt 2021
Antwort Antwort
Delphi.Narium

Registriert seit: 27. Nov 2017
2.554 Beiträge
 
Delphi 7 Professional
 
#1

AW: TFDQuery und positionieren

  Alt 5. Okt 2021, 16:15
Hat Dein DBGrid die Eigenschaft VisibleRowCount? Wenn ja, dann könntest Du ein (äußerst unschönes) Konstrukt dieser Art verwenden:
Delphi-Quellcode:
  Query.Close;
  Query.SQL.Text := Format('SELECT first %d * FROM Kunden WHERE Vorname >= :Suchbegriff',[DBGrid.VisibleRowCount]);
  Query.Params.ParamByName('Suchbegriff').AsString := EditMitDemSuchbegriff.Text;
  Query.Open;
  Query.Locate('Vorname',EditMitDemSuchbegriff.Text,[]);
Als Anwender käme ich mir aber ziemlich ... vor, wenn meine Suche nur genau ein Ergebnis liefert, mir aber ein paar Ergebnisse mehr angezeigt werden, nur damit die Anzeige voll wird und ich mir daraus dann wieder mein Ergebnis heraussuchen muss.
Wenn's nur ein Ergebnis gibt, ist die Datenbankabfrage schneller und meine Arbeit als Anwender auch, weil ich in den Ergebnissen nicht erst nach dem schauen muss, was ich eigentlich suchte, sondern bei einem Datensatz als Ergebnis recht schnell feststellen kann, ob es auch das gesuchte Ergebnis ist.

Sprich: Wenn die Suche nur einen Datensatz als Ergebnis liefert, dann erwarte ich als Anwender, dass mir auch nur ein Datensatz als Ergebnis geliefert wird (egal, wieviele Datensätze theoretisch oder praktisch oder bildschirmfüllend oder ... angezeigt werden könnten).

select first geht z. B. bei FireBird:
Query.SQL.Text := Format('SELECT first %d * FROM Kunden WHERE Vorname >= :Suchbegriff',[DBGrid.VisibleRowCount]);
Access nennt das select top:
Query.SQL.Text := Format('SELECT top %d * FROM Kunden WHERE Vorname >= :Suchbegriff',[DBGrid.VisibleRowCount]);
MySQL hängt lieber ein Limit hinten an das SQL an:
Query.SQL.Text := Format('SELECT * FROM Kunden WHERE Vorname >= :Suchbegriff limit %d',[DBGrid.VisibleRowCount]);
Das alte Oracle macht es (glaub' ich) eher so:
Query.SQL.Text := Format('SELECT * FROM Kunden WHERE Vorname >= :Suchbegriff ROWNUM <= %d',[DBGrid.VisibleRowCount]);
Und neue Oracle mögen sowas:
Query.SQL.Text := Format('SELECT * FROM Kunden WHERE Vorname >= :Suchbegriff FETCH FIRST %d ROWS ONLY',[DBGrid.VisibleRowCount]);
Andere DB, andere Syntax
Es lebe die datenbankunabhängige Programmierung, die übrigens, wenn das DBGrid nur die tatsächlich gefundenen Ergebnisse anzeigt und nicht aufgefüllt wird, erhalten bleibt. Query.SQL.Text := 'SELECT * FROM Kunden WHERE Vorname = :Suchbegriff'; . Und das können alle schnell

Geändert von Delphi.Narium ( 5. Okt 2021 um 16:17 Uhr)
  Mit Zitat antworten Zitat
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
225 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TFDQuery und positionieren

  Alt 5. Okt 2021, 16:36
Funktioniert leider nicht ganz so wie soll.

Es sollte eigentlich nur positionieren. Durch Top 50 zum Beispiel habe ich im DBGrid nur 50 Einträge.

Es sind dann "Max", "Maximilian" ... und so weiter dabei. Sieht erst einmal gut aus.

Insgesamt sind es aber 124.000 Einträge in der Kunden Datenbank. Jetzt srolle ich weiter runter und ende bei Eintrag 50.

Ich muss die suche wieder entfernen damit ich weiter srollen kann. Dadurch ist aber Positionierung wieder weg.

Es funktioniert nicht wenn ich die Datenmenge begrenze. Es müsste so etwas wie "Order BY" ab dem gesuchten Datensatz sein.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TFDQuery und positionieren

  Alt 5. Okt 2021, 17:02
Hallo,
du könntest statt Locate First/Next benutzen, also von Hand suchen.
Vorher noch ein DisableControls, damit die Suche nicht sichtbar ist.
Und noch die Bookmark-Funktionen zum Merken des aktuellen Datensatzes (vor der Suche).

Besser find ich aber eine Suche direkt in der Query (wie weiter oben schon vorgeschlagen wurde).
Heiko
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.554 Beiträge
 
Delphi 7 Professional
 
#4

AW: TFDQuery und positionieren

  Alt 5. Okt 2021, 17:30
Wenn Du alle Datensätze haben willst, dann musst Du alle Datensätze laden. Dann geht nur Locate auf dem Client und dann geht nur langsam.

Das ist halt so, wenn man viele Daten auf dem Client hat und der dann selber suchen muss, gehen alle Vorteile, die eine Datenbank bietet, verloren.

select * from Kunden WHERE Vorname >= :Suchbegriff liefert Dir alles ab dem Kunden, dessen Name >= Max ist und wenn Du da dann noch ein select * from Kunden WHERE Vorname >= :Suchbegriff order by vorname machst, dann sind alle Kunden ab Max aufsteigend sortiert nach Vorname. Und das können dann auch noch ein paar tausend Sätze zum Scrollen sein, mit entsprechende Laufzeiten. Aber Max wird dabei immer der erste sein, wenn es denn einen Kunden mit dem Vornamen Max geben sollte.
Und nein: Rückwärtsscrollen bis zum Vornamen Anton (o. Ä.) geht dann nicht.

Und wenn man mit Filtern arbeitet und es gibt nur einen Max, dann enthält das DBGrid auch nur einen Datensatz.

Wenn Du wirklich alle Datensätze laden und sehen willst und der Cursor, entsprechend des Suchbegriffes, positioniert werden soll, dann gibt es (meines Wissens) nur Locate und damit ist Deine Frage:
Zitat von Edelfix:
Gibt es eine Alternative?
leider mit Nein zu beantworten.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.367 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TFDQuery und positionieren

  Alt 6. Okt 2021, 11:24
Insgesamt sind es aber 124.000 Einträge in der Kunden Datenbank.
Konzeptioneller Fehler. Kein Anwender muss alle 124.000 Datensätze sehen.
Es müsste so etwas wie "Order BY" ab dem gesuchten Datensatz sein.
Und wie soll die Sortierung in den anderen Bereichen sein?

Ein order by kanst du immer in deine SQL-Abfrage einbauen. Die Einschränkung der Datensätze wäre noch mit einem "like" möglich. Das ist zwar nicht besonders performant, dürfte aber vermutlich immer noch schneller sein, als alle Datensätze zu holen und dann mit einem Locate zu arbeiten.
Peter
  Mit Zitat antworten Zitat
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
225 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TFDQuery und positionieren

  Alt 6. Okt 2021, 12:50
Ein Programm das nur Kunden Daten Anzeigt ist bissen dünne. Natürlich sind da noch andere Masken die mit diesen Daten arbeiten.
Wenn ich nach einem Kunden suche und direkt danach zu der Form mit Rechnungen wechsle dann denn Button „gehe zu Kunden“ klicke und der Kunde ist wegen einer reduzierten Datenmenge nicht vorhanden dann habe ich ein Problem.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.367 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TFDQuery und positionieren

  Alt 6. Okt 2021, 13:47
Wie schon geschrieben, halte ich da etwas für konzeptionell nicht in Ordnung. Lohnt sich aber nicht darüber zu "streiten".

Wenn du die Datenmenge nicht einschränken willst, wirst du mit dem Locate leben müssen.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
692 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: TFDQuery und positionieren

  Alt 6. Okt 2021, 15:24
Ich sehe das genauso. Wenn man nach einem Datensatz sucht, dann bekommt man auch nur den.
- Du könntest FTS (im Fall von einer Textsuche) verwenden und mit
Code:
Contains
suchen. Das liefert eine weichere Ergebnismenge.
- RecordCaching auf "hoch" setzen das sich die Query die Daten schneller zieht hilft wenn es mal ein bisschen mehr ist.
- Nur die nötigen Felder ziehen.
- Pageing / GridMode, muss der Grid aber können.
- Sortierung ändern um die Ergebnisse gleich oben anzuzeigen.

FireDac kann auch FetchAll. Das solltest Du aber nur machen wenn kein Grid an der Query hängt oder Disable-/Enable-Controls verwenden.
Ich würde, falls sowas unbedingt nötig ist, die Daten eher local in einer Memtable puffern und aktualiseren wenn Änderungen in der DB erkannt werden. Das kostet aber einiges an Aufwand für die Verwaltung.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.176 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: TFDQuery und positionieren

  Alt 6. Okt 2021, 23:47
Was mich wundert ist dein Select * from, also ich meine das Sternchen.
Wie viele Spalten hat die Tabelle?
Und was heißt: dauert ewig. Wie lange dauert es?

Evtl. hilft eine 2. Query, die nur die Record-ID und den Kundenvornamen enthält (Select Identifikation, Kundenvorname from Kunden order by Kundenvorname)
Dann auf *diese* 2. Query das Locate anwenden. Die Record-ID merken und im Grid auf diesen Datensatz positionieren.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz