Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Ein Suchbegriff in mehreren Feldern finden (https://www.delphipraxis.net/10179-ein-suchbegriff-mehreren-feldern-finden.html)

Tyler 13. Okt 2003 10:04


Ein Suchbegriff in mehreren Feldern finden
 
Hello Again :)

folgendes:

Table.Locate('feld1', Suchstring, [loPartialKey]);

findet ja im Feld1 den Suchstring auch wenn er nur ein Teil des Feldinhalts darstellt, wie jedoch finde ich meinen Suchstring in mehr als einem Feld?

Theoretisch ja so (laut Delphi-Hilfe):

Table.Locate('feld1;feld2', Suchstring, [loPartialKey]);

Das führt aber zu folgendem Fehler:
... raise exception class EVariantInvalidArgError with message "Invalid Argument" ...

Hm, gut, hab ich es also mal so probiert (streng nach Delphi-Hilfe):

Table.Locate('feld1;feld2', VarArrayOf([Suchstring, Suchstring]), [loPartialKey]);

Passiert natürlich garnichts... logisch...

Meine Frage also nun: Wie lokalisiere ich einen Suchbegriff in mehreren Feldern?

vielen Dank schonmal im Vorraus
mfG

APP 13. Okt 2003 11:23

Re: Ein Suchbegriff in mehreren Feldern finden
 
Hallo,

so auf die Schnelle würde ich SQL empfehlen,
aber bei Locate würde ich vermuten, dass die
Felder Schlüsselfelder und vom gleichen Typ sein müssen.

Gib uns ein paar Infos zur DB, den Feldtypen und dem Inhalt.

Nach kurzem Test mit DBdemos kommt doch noch was:

Delphi-Quellcode:
Table1.Locate('NAME;AREA', VarArrayOf(['House Cat', 'New Orleans']), [loPartialKey]);

Tyler 13. Okt 2003 12:37

Re: Ein Suchbegriff in mehreren Feldern finden
 
also zur Datenbank:

Ich benutz das alte DBaseIII+ Format, bei den beiden Feldern handelt es sich einmal um ein Textfeld und einmal um ein Integerfeld, ich hab´s auch schon mit 2 gleichen Feldern versucht, führt zur gleichen Fehlermeldung wenn ich nur einen Suchstring angebe.

Die Zeile von dir hab ich ja wie gesagt schon probiert, führt zwar zu keiner Fehlermeldung, ergibt aber auch kein Suchergebnis... ich denk mal wenn ich ein VarArrayOf angebe, müssen beide Suchbegriffe gleichzeitig vorkommen (UND-Verknüpft), ich brauch aber eine ODER-VErknüpfung...

... und SQL möcht ich unter gar keinen Umständen benutzen... wirklich :)

danke erstma
mfG

Memo 13. Okt 2003 12:54

Re: Ein Suchbegriff in mehreren Feldern finden
 
Zitat:

Zitat von APP
aber bei Locate würde ich vermuten, dass die
Felder Schlüsselfelder und vom gleichen Typ sein müssen.

Nein müssen sie nicht.
Zitat:

ich brauch aber eine ODER-VErknüpfung
Du erhälst ja eine Rückgabe über gefunden bzw. nicht gefunden. Dann machs doch mal so:
Delphi-Quellcode:
if (Table.Locate('feld1', VarArrayOf([Suchstring]), [loPartialKey])) or
   (Table.Locate('feld2', VarArrayOf([Suchstring]), [loPartialKey]))then
   begin
   ...

APP 13. Okt 2003 12:55

Re: Ein Suchbegriff in mehreren Feldern finden
 
Hallo Tyler,

Zitat:

ich brauch aber eine ODER-VErknüpfung...
davon war aber bei Deiner 1. Fragestellung nie die Rede!

IMHO würde ich meinen, dass Locate nur dann funkt, wenn alle Kriterien erfüllt sind
Zitat:

OH: Locate returns true if a record is found that matches the specified criteria and that record is now active
und dann nur einen Datensatz zurückliefert.

Alternativ könntest Du ja mit "Filter" arbeiten, da bekommst Du
Datenmengen zurück.
Suche mal nach Hier im Forum suchenFilter Datenbank hier im Forum.

P.s. Warum wehrst Du Dich so gegen SQL? :gruebel:
Damit hättest Du alle Möglichkeiten :mrgreen:

APP 13. Okt 2003 12:58

Re: Ein Suchbegriff in mehreren Feldern finden
 
Hallo Memo,
Zitat:

Zitat von Memo
Delphi-Quellcode:
if (Table.Locate('feld1', VarArrayOf([Suchstring]), [loPartialKey])) or
   (Table.Locate('feld2', VarArrayOf([Suchstring]), [loPartialKey]))then
   begin
   ...

Damit bekommt er nur den ersten gefundenen Datensatz zurück (z.B. von Feld1),
auch wenn beide Locate-Kriterien erfüllt sind.

Memo 13. Okt 2003 13:27

Re: Ein Suchbegriff in mehreren Feldern finden
 
Hallo App,
Zitat:

Zitat von APP
Damit bekommt er nur den ersten gefundenen Datensatz zurück (z.B. von Feld1),
auch wenn beide Locate-Kriterien erfüllt sind.

Oder nur eine. Was hast du sonst erwartet? Er wollte es doch genauso haben, oder hab ich was überlesen? Ebend "or".
Zitat:

P.s. Warum wehrst Du Dich so gegen SQL?
Damit hättest Du alle Möglichkeiten
IMHO, locate in dem Fall auch reicht!?
Und, korrigier mich rühig, aber ich lese nichts über mehrere Datensätze die zurückgegeben werden sollen. Also wozu braucht er jetzt den Filter(bezogen auf die Fragestellung)?

Tyler 13. Okt 2003 13:55

QLRe: Ein Suchbegriff in mehreren Feldern finden
 
Aaaalso, erstmal vielen Dank für eure Bemühungen:

Warum kein SQL?

ICh hab das schon öfter mal beschrieben, u.a. gerade erst hier:
http://www.delphipraxis.net/internal...ct.php?t=11346

Das hat wirklich nichts mit Ignoranz zu tun, ich kann eine gefilterte Datenmenge aus SQL hier einfach nicht gebrauchen, siehe eben meine Erklärung im o.g. Thread ;)

Zitat:

Du erhälst ja eine Rückgabe über gefunden bzw. nicht gefunden.
Leider nicht, suche ich nur in einem DB-Feld, was ja soweit gut funktioniert, springt er eben direkt zum Datensatz... aber egal, soll nicht zum Gegenstand einer Diskussion werden :shock: :D

Zitat:

if (Table.Locate('feld1', VarArrayOf([Suchstring]), [loPartialKey])) or
(Table.Locate('feld2', VarArrayOf([Suchstring]), [loPartialKey]))then
begin
Das bringt mich ja leider nicht weiter, weil, mal als Beispiel:
Der gesuchte Datensatz befindet sich in feld1 an 10. Stelle und in feld2 an 5. Stelle,
mit der Abfrage oben würde ich ja jetzt auf den Datensatz in 10. Stelle springen, und den viel früher verfübaren Datensatz in feld2 völlig ausser Acht lassen und somit vllt sogar vergessen.... nicht sehr praktisch :)

Achja, und ich brauch schon einen Datensatz der zurückgegeben wird, und zwar möchte ich, wie man es von der allgemeinen Suchfunktion (Strg+F) her kennt, das der Zeiger auf diesen Datensatz springt, ein Filter hilft hier, wie schon erwähnt, nicht weiter, weil dann kann ich ja auch SQL benutzen ;)

mfG und Danke soweit :)

Memo 13. Okt 2003 14:29

Re: Ein Suchbegriff in mehreren Feldern finden
 
Also machen wir noch einen Versuch:
Delphi-Quellcode:
var x,y : Integer;
begin
  if Table.Locate('feld1', 'Suchstring', [loPartialKey]) then
     x := Table.RecNo;
  if Table.Locate('feld2', 'Suchstring', [loPartialKey]))then
     y := Table.Recno;
  if (x=0) and (y = 0) then ShowMessage('nix gefunden') else
  begin
    if (y < x) and (y<>0) then
      Table.RecNo := y else
    if (x < y) and (x <> 0) then
      Table.RecNo := x;
  end;

Tyler 13. Okt 2003 14:50

Re: Ein Suchbegriff in mehreren Feldern finden
 
hmm.. verdammt, das klingt sehr einfach, ich hoffe jetzt kommt nicht der Gedanke auf, ich war nur zu faul n Algorithmus zu suchen... ich dachte es gibt dafür ne strenge Befehlsdefinition.. nagut, also vielen Dank für den Code memo :)

mfG

APP 13. Okt 2003 20:07

Re: Ein Suchbegriff in mehreren Feldern finden
 
Hallo Memo,

Zitat:

Zitat von Memo
...Oder nur eine. Was hast du sonst erwartet? Er wollte es doch genauso haben, oder hab ich was überlesen? Ebend "or".

Zitat:

...IMHO, locate in dem Fall auch reicht!?
Und, korrigier mich rühig, aber ich lese nichts über mehrere Datensätze die zurückgegeben werden sollen. Also wozu braucht er jetzt den Filter(bezogen auf die Fragestellung)?
es ist jetzt wohl schon zu spät, um darüber zu diskutieren ob und was
ich erwartet und nicht gelesen habe, aber Du hast nun ja eine für Tyler
befriedigende Lösung gefunden, obwohl auch Du (so wie ich) zuerst
in die falsche Richtung tendiert bist.

Zum Code würde ich noch Folgendes hinzufügen:

Delphi-Quellcode:
VAR
   x, y                           : Integer;
BEGIN
   X := 0; // auf 0 Setzten da die Variablen sonst undefiniert
   Y := 0; // sind und 'nix gefunden' nicht angestoßen wird.
p.s.: Wobei wir wieder bei den Datenmengen sind:
Zitat:

Zitat von Tyler
allgemeinen Suchfunktion (Strg+F)

springt nacheinander zu jedem gefundenen Satz, obige Funktion nur zum Ersten gefundenen...

Tyler 14. Okt 2003 07:20

Re: Ein Suchbegriff in mehreren Feldern finden
 
Danke nochmal für die Hinweise :)

Was ich noch hinzufügen möchte:

Die Funktion funktioniert warscheinlich einwandfrei (bin noch nicht zum Testen gekommen), aber leider bietet sie nicht die Geschwindigkeit mit der der normale Locate-Befehl zum Datensatz springt...

als Beispiel:
Hab hier ne DB mit 5000 Datensätzen, suche ich nach einem Datensatz der weiter hinten vorkommt mit Locate, springt Delphi innerhalb einer Sekunde auf diesen Datensatz, suche ich aber mit z.B. der o.g. Funktion, kann das ganz 5-10 Sekunden dauern... das ist tragisch.

Naja, warscheinlich muss ich mir dazu ne Fremdkomponente raussuchen

vielen Dank nochmal

Memo 14. Okt 2003 10:30

Re: Ein Suchbegriff in mehreren Feldern finden
 
Zitat:

Zitat von Tyler
Die Funktion funktioniert warscheinlich einwandfrei (bin noch nicht zum Testen gekommen), aber leider bietet sie nicht die Geschwindigkeit mit der der normale Locate-Befehl zum Datensatz springt...

Ähm, du bist noch nicht zum testen gekommen, weist aber das sie nicht nicht die selbe Geschwindigkeit hat? Ich nahm eigentlich nicht an, dass der Code die unnormale Variante des Locate-Befehls verwendet.

Zitat:

Zitat von Tyler
Hab hier ne DB mit 5000 Datensätzen, suche ich nach einem Datensatz der weiter hinten vorkommt mit Locate, springt Delphi innerhalb einer Sekunde auf diesen Datensatz, suche ich aber mit z.B. der o.g. Funktion, kann das ganz 5-10 Sekunden dauern... das ist tragisch.

Das kann an vielen Faktoren liegen. Ich hab es gerade mit einer Table mit exakt 6725 Datensätzen getestet und konnte kein Geschwindigkeitsproblem feststellen.
Hast du viele Datenintensive Steuerelemete an der Table zu hängen, so werden die bei jedem Durchlauf aktuallisiert. Das könnte man durch Table.DisableControls verhindern.
Oder evt. liegt es an deiner Tabelle. Nichts für ungut, aber DBASEIII(Ashton Tate lässt grüssen) mit Delphi ist irgendwie wie ein Ferrari mit Holzrädern. Ich hab hier noch irgendwo ein kleines Konvert.-Tool rumliegen falls Interesse besteht, melde dich einfach.


Zitat:

Zitat von Tyler
Naja, warscheinlich muss ich mir dazu ne Fremdkomponente raussuchen

Eine Fremdkomonente? :shock: Die was können soll?

@App
Zitat:

Zitat von APP
es ist jetzt wohl schon zu spät, um darüber zu diskutieren ob und was
ich erwartet und nicht gelesen habe, aber Du hast nun ja eine für Tyler
befriedigende Lösung gefunden, obwohl auch Du (so wie ich) zuerst
in die falsche Richtung tendiert bist.

Das lag, so wie meistens, daran, dass die entscheidende Information erst hinterher kam. Aber wie du siehst ist auch mein Lösungsansatz nicht zufriedenstellend. Also ist es wohl noch nicht zu spät.
Zitat:

Zitat von APP
p.s.: Wobei wir wieder bei den Datenmengen sind:

Na lass mal einen konkreten Lösungsansatz gucken.

APP 14. Okt 2003 12:34

Re: Ein Suchbegriff in mehreren Feldern finden
 
Hallo Memo
hier bittschön:

Das liefert die Datensatzmenge nach einem ODER zurück
Delphi-Quellcode:
PROCEDURE TForm1.Button1Click(Sender: TObject);
BEGIN
  // Noch immer DBDemos!
  Table1.Filtered := False;
  BEGIN
    Table1.Filter := 'NAME = ' + QuotedStr('House Cat') + 'OR AREA = ' + QuotedStr('Fish Bowls');
  END;
  Table1.Filtered := True;
  // 1. Datensatz
  Table1.First;
END;
Das ist die CTRL+F Funktion
Delphi-Quellcode:
PROCEDURE TForm1.Button3Click(Sender: TObject);
BEGIN
  // Ctrl+F
  Table1.Next;
  // am Ende zurück zum Start
  IF (Table1.Eof = True) THEN
    Table1.First;
END;

Tyler 14. Okt 2003 16:34

Re: Ein Suchbegriff in mehreren Feldern finden
 
@memo:

du hattest recht, hätte nicht gedacht das ein grid und vllt. 10 db-edit´s soviel ausmachen: nach

Table.DisableControls

gings dann auch sehr flott zur Sache :D

@app

Danke, als Filter wirklich ausgereift und brauchbar, werd ich garantiert drauf zurückgreifen, aber ich wollt die Datenmenge ja beibehalten :)


Danke euch beiden für eure Mühen, hat mir auf jedenfall viel weitergeholfen :)

mfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 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-2025 by Thomas Breitkreuz