Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi In Paradox suche (https://www.delphipraxis.net/55605-paradox-suche.html)

Angel4585 24. Okt 2005 08:01

Datenbank: Paradox • Version: 7 • Zugriff über: TTable Komponente und TDataSource

In Paradox suche
 
Hallo zusammen

Sagen wir mal ich habe eine Datenbank mit x-Spalten jede Spalte von einem anderen Typ.

Jetzt will ich eine Suchfunktion machen bei der ich zum Beispiel alle Einträge in denen 'X' vorkommt anzeigen lassen und die anderen eben nicht. Ich dachte ich kann das irgendiwe über einen Filter machen, jetzt fehlen mir allerdings

erstens die Operatoren dafür (ich brauche sowas wie *X* denke ich nur geht das so leider nicht)
zweitens kommt ne Fehlermeldung : Fehlende Typübereinstimmung in Ausdruck.
Kommt vermutlich daher das ich alle Felder durchsuchen will, auch Integerfelder.

Hat jemand Vorschläge wie man das lösen könnte?

trifid 24. Okt 2005 08:49

Re: In Paradox suche
 
Verwende TQuery und SQL
SQL-Code:
SELECT *
FROM Tabelle
WHERE Feld1 like '%X%'
AND  Feld2 like '%X%'
AND  FeldN like '%X%'
Zitat:

vermutlich daher das ich alle Felder durchsuchen will, auch Integerfelder.
wahrscheinlich können Integer-Typen kein 'X' annehmen :gruebel:

MrSpock 24. Okt 2005 08:54

Re: In Paradox suche
 
Hallo Angel4585,

du solltest dazu ein TTableobjekt nehmen und das Array Fields in einer Schleife durchlaufen, aber was erwartest du denn als Ergebnis, wenn du ein Integer Feld nach "X" filterst?

Das sieht dann etwa wie folgt aus:

Delphi-Quellcode:
myTable.First;
while not myTable.EOF do
begin
  for i := 0 to myTable.FieldCount-1 do
  begin
    gefunden := (Fields[i].AsString = suchString);
    if gefunden then
    // ...
  end;
  myTable.Next;
end;

Angel4585 24. Okt 2005 09:06

Re: In Paradox suche
 
Zitat:

du solltest dazu ein TTableobjekt nehmen und das Array Fields in einer Schleife durchlaufen, aber was erwartest du denn als Ergebnis, wenn du ein Integer Feld nach "X" filterst?
Also ein Ergebnis darf es natürlich nicht geben. Es soll diese Spalte einfach nicht durchsuchen nur wie kann ich das unterscheiden ob das jetzt Integer oder ein String Feld ist, wenn ich eine Funktion für die gesamte Tabelle schreibe in der ich nach strings und nach Zahlen suchen kann?


Zitat:

Verwende TQuery und SQL
SQL-Code: markieren
SELECT *
FROM Tabelle
WHERE Feld1 like '%X%'
AND Feld2 like '%X%'
AND FeldN like '%X%'
Edit: Hups jetzt hab ich glatt auf absenden geklickt.. wie dumm.

MitSQL hab ich noch nie was gemacht.
Ich hab mir das aber gerade angeschaut nur handelt es sich um eine Tabelle mit 60 Spalten und da ist es ein bisschen mühsam jeden Spaltennamen einzeln anzugeben. Wie mach ich das jetzt das ich alle Spaltennamen in einer Schleife auslesen kann?

joachimd 24. Okt 2005 09:10

Re: In Paradox suche
 
Zitat:

Zitat von Angel4585
Jetzt will ich eine Suchfunktion machen bei der ich zum Beispiel alle Einträge in denen 'X' vorkommt anzeigen lassen und die anderen eben nicht. Ich dachte ich kann das irgendiwe über einen Filter machen,...

Nicht sicher, ob Paradox das kann:
Delphi-Quellcode:
Table.Filter:= '"X" $ feldname';
Table.Filtered:=True;

marabu 24. Okt 2005 09:10

Re: In Paradox suche
 
Hallo Angel,

wenn du mit der Komponente TTable arbeiten willst, dann kannst du nur tail recursion in der property Filter eintragen. Für erweiterte Suchmuster musst du einen event handler für das Ereignis OnFilterRecord schreiben. Im folgenden Beispiel gehe ich davon aus, dass du SearchStr mit 'x' initialisiert hast, deine Suche nicht case sensitive sein soll und nur String-Felder untersucht werden sollen:

Delphi-Quellcode:
procedure TDataForm.TableFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
var
  i: integer;
begin
  with DataSet do
  begin
    Accept := false;
    for i := 0 to Pred(FieldCount) do
    begin
      Accept := Accept or (Fields[i].DataType = ftString)
        and AnsiContainsText(Fields[i].AsString, SearchStr);
      if Accept then
        Break;
    end;
  end;
end;
Grüße vom marabu

Angel4585 24. Okt 2005 09:16

Re: In Paradox suche
 
Zitat:

wenn du mit der Komponente TTable arbeiten willst, dann kannst du nur tail recursion in der property Filter eintragen. Für erweiterte Suchmuster musst du einen event handler für das Ereignis OnFilterRecord schreiben. Im folgenden Beispiel gehe ich davon aus, dass du SearchStr mit 'x' initialisiert hast, deine Suche nicht case sensitive sein soll und nur String-Felder untersucht werden sollen:
Delphi-Quellcode:
 procedure TDataForm.TableFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
var
  i: integer;
begin
  with DataSet do
  begin
    Accept := false;
    for i := 0 to Pred(FieldCount) do
    begin
      Accept := Accept or (Fields[i].DataType = ftString)
        and AnsiContainsText(Fields[i].AsString, SearchStr);
      if Accept then
        Break;
    end;
  end;
end;

Also wenn ich das richtig sehe werden nur felder mit Typ ftString durchsucht. Aber es sollen ja alle Felder durchsucht werden. Also wenn der Suchwert eine 1 ist sollen alle Zahlenfelder(Integer und Fließkomma) durchsucht werden

Angel4585 24. Okt 2005 09:19

Re: In Paradox suche
 
Ich habe das mit SQL mal so gemacht:

Delphi-Quellcode:
  SQL.Clear;
  SQL.Add('SELECT * FROM "Int.db"');
  temp:='WHERE '+Fields.Fields[0].FieldName+' LIKE '+QuotedStr('%'+suchstring+'%');
  for i:= 1 to Fields.Count - 1 do
   temp := temp +' OR '+Fields.Fields[i].FieldName+' LIKE '+QuotedStr('%'+suchstring+'%');
  SQL.Add(temp);
ist das so ok?

Edit: wenn ich das so mache kommt die Meldung Listenindex(0) überschritten. D.h. doch das die Tabelle irgendwo nicht drin sthet wo sie aber drinstehen sollte. oder?

marabu 24. Okt 2005 09:49

Re: In Paradox suche
 
Martin, in deinem thread hast du gefragt, wie du dein Suchproblem mit der Komponente TTable lösen kannst. Eine Lösung habe ich gegeben. Ich habe die Bedingungen genannt unter denen mein Code funktioniert. Wenn du auch in anderen Feldern suchen willst, dann musst du die Bedingungen anpassen. Wenn du die Feldtyp-Prüfung wegnimmst, dann werden auch Zahlenwerte durchsucht. Für BLOB-Felder wirst du etwas mehr Aufwand treiben müssen. Wenn du das alles nicht kannst, dann bib Laut und es wird dir geholfen, aber bitte tue mir und den anderen Profis im Forum einen Gefallen:

Nenne die Invarianten deines Problems. Wenn die Komponente TTable für den Lösungsansatz irrelevant ist, dann schreibe bei der Angabe zum Zugriff nur BDE rein. Der Einsatz von TQuery in Verbindung mit LOCALSQL vereinfacht den Umgang mit komplexen Suchmustern ('*abc*123*'). Wenn du sowas brauchst, dann sage es vorher - es ist ein wertvoller Hinweis für jeden Helfer.

Ob du LOCALSQL einsetzt oder nicht, du wirst über die Felder iterieren müssen, damit dein Code nicht irgendwann bricht.

Nichts für ungut.

marabu

Angel4585 24. Okt 2005 10:00

Re: In Paradox suche
 
Sorry wegen der TTable, hatte es anfangs darauf aufgebaut allerdings habe ich bei der Forensuche bemerkt das es scheinbar mit einer TQuery und SQL einfacher geht und hab das Thema deswegen aufgegriffen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:10 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