Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Query und FindNearest (https://www.delphipraxis.net/52556-query-und-findnearest.html)

WEBSTER 30. Aug 2005 21:31

Datenbank: Paradox • Version: 7 • Zugriff über: BDE

Query und FindNearest
 
Salute,

für die Table gibt es ja die FindNearest Methode.
Wie lautet die Methode für die Query? FindNearest gibt es ja nicht und Locate findet ja nur den genauen Datensatz.

Bitte um Hilfe....

THX
WEBSTER

shmia 31. Aug 2005 07:19

Re: Query und FindNearest
 
Zitat:

Zitat von WEBSTER
für die Table gibt es ja die FindNearest Methode.
Wie lautet die Methode für die Query? FindNearest gibt es ja nicht und Locate findet ja nur den genauen Datensatz.

Dafür gibt es in SQL keine Entsprechung. Ich habe FindNearest allerdings auch noch nie vermisst...
Jedes Problem lässt sich auch ohne FindNearest lösen.

WEBSTER 31. Aug 2005 07:25

Re: Query und FindNearest
 
Salute,

die andere Lösung habe ich schon, nur leider dauer die mir zu lange.

Code:
procedure TLuftfrachtauftraege_auswahl_Form.auftrag_suchen_EditChange( 
   Sender: TObject);
begin
   
   ////////////////////////////////////////////////////////////////////////////// 
   // Alle Luftfrachspeditionsaufträge werden dargestellt

 
   str_sql := 'Select a.Auftraggeber,a.Abhol,a.HZiel,a.Liefer,a.LZiel,a.AbholDat1,a.ErledigtAm,a.AuftragsDat,a.RechNr,';
   str_sql := str_sql + 'l.awb,l.auftragnr from luftfracht_auftrag l, auftrag a where l.auftragnr= a.auftragnr';
   str_sql := str_sql + ' and Upper(AWB) like ' + chr(39) + auftrag_suchen_Edit.Text + '%' + chr(39) + ' ';
   str_sql := str_sql + ' order by awb;';

 
   Screen.Cursor := crHourglass;

 
   tmp_DataSource.DataSet := tmp_query;
   tmp_query.Close;
   tmp_query.sql.clear;
   tmp_query.SQL.Add(str_sql);
   try
      tmp_query.Open;
   except
   end;
   tmp_DataSource.DataSet.First;

 
   Screen.Cursor := crDefault;
end;
Die Attribute awb und l.auftragnr und a.auftragnr haben bereits einen Index. Leider dauert der Select jeweils (bei jedem Tastaturanschlag) ca 1,5 Sekunden. Und das ist einfach zu lange. Als DB habe ich leider Paradox. Mit mir kommt es immer so vor, als würde der Index nicht genommen.......


WEBSTER

Bernhard Geyer 31. Aug 2005 07:32

Re: Query und FindNearest
 
Zitat:

Zitat von WEBSTER
Mit mir kommt es immer so vor, als würde der Index nicht genommen.......

Wird er auch vermutlich nicht.

Du arbeitest mit Like-Abfragen und einem Upper auf dem Feld
SQL-Code:
Upper(AWB) like ' + chr(39) + auftrag_suchen_Edit.Text + '%' + chr(39) + ' ';
Und Paradox wird dafür keinen passenden Index haben. D.h. evtl. wird einfach ein Full-Table-Scan durchgeführt.

shmia 31. Aug 2005 07:34

Re: Query und FindNearest
 
Zitat:

Zitat von WEBSTER
Die Attribute awb und l.auftragnr und a.auftragnr haben bereits einen Index. Leider dauert der Select jeweils (bei jedem Tastaturanschlag) ca 1,5 Sekunden. Und das ist einfach zu lange. Als DB habe ich leider Paradox. Mit mir kommt es immer so vor, als würde der Index nicht genommen.......

Bei Verwendung von LIKE kann kein Index benutzt werden. (Es sei denn, die DB wäre besonders schlau und würde gewisse Sonderfälle anderst behandeln)
Angenommen die bisherige Eingabe von AWB lautet '398'.
Dann wäre die WHERE-Bedingung, die Indexe berücksichtigt:
Delphi-Quellcode:
WHERE AWB >= :AWB1 AND AWB <=:AWB2
Parameter :AWB1 wird mit '398' gefüllt; Parameter :AWB2 wird mit '398zzzzzzzzzzzz' gefüllt.

Jelly 31. Aug 2005 08:43

Re: Query und FindNearest
 
Zitat:

Zitat von shmia
Parameter :AWB1 wird mit '398' gefüllt; Parameter :AWB2 wird mit '398zzzzzzzzzzzz' gefüllt.

Besser: Parameter AWB2 mit 399 füllen, und in der Query stattdessen
SQL-Code:
... and AWB < :AWB2
benutzen :-)
Und AWB2 würde ich so füllen:
Delphi-Quellcode:
AWB2 := copy(AWB1,1,length(AWB1)-1) + chr(ord(AWB1[length(AWB1)]+1) ;
Vorher eventuell noch prüfen ob AWB1 nicht leer ist.

Like Abfragen sind immer langsam, bieten darüber hinaus aber noch mehr als Findnearest. Damit kannst du auch nach beliebigen Stellen im Feld suchen, und nicht nur nach dem was am Anfang steht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz