AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Query und FindNearest
Thema durchsuchen
Ansicht
Themen-Optionen

Query und FindNearest

Ein Thema von WEBSTER · begonnen am 30. Aug 2005 · letzter Beitrag vom 31. Aug 2005
Antwort Antwort
WEBSTER

Registriert seit: 24. Apr 2003
Ort: Bergisch Gladbach
28 Beiträge
 
#1

Query und FindNearest

  Alt 30. Aug 2005, 21:31
Datenbank: Paradox • Version: 7 • Zugriff über: BDE
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
Wer etwas anders macht, aber nicht besser, der sollte besser etwas anderes machen.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Query und FindNearest

  Alt 31. Aug 2005, 07:19
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.
Andreas
  Mit Zitat antworten Zitat
WEBSTER

Registriert seit: 24. Apr 2003
Ort: Bergisch Gladbach
28 Beiträge
 
#3

Re: Query und FindNearest

  Alt 31. Aug 2005, 07:25
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
Wer etwas anders macht, aber nicht besser, der sollte besser etwas anderes machen.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Query und FindNearest

  Alt 31. Aug 2005, 07:32
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
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: Query und FindNearest

  Alt 31. Aug 2005, 07:34
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:
WHERE AWB >= :AWB1 AND AWB <=:AWB2 Parameter :AWB1 wird mit '398' gefüllt; Parameter :AWB2 wird mit '398zzzzzzzzzzzz' gefüllt.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Query und FindNearest

  Alt 31. Aug 2005, 08:43
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
... and AWB < :AWB2 benutzen
Und AWB2 würde ich so füllen:
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.
  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:44 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