Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi memo Feld in Datenbank durchsuchen (https://www.delphipraxis.net/84531-memo-feld-datenbank-durchsuchen.html)

Jacuzzi 18. Jan 2007 08:06

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

memo Feld in Datenbank durchsuchen
 
Ich habe eine kleine Paradox db, in dieser möchte ich eine Volltextsuche realisieren.
Jedoch funktioniert anscheinend die Suche in der db nicht, welche den Feldtyp 'memo' besitzen.

Hier ein kleiner bescheidener Auszug aus mein Quellcode:

Delphi-Quellcode:
procedure titel_einlesen(sfilter :string); // sfilter = zu suchender Text
begin
  Form1.lb_titel.Clear;
  Form1.Table1.First;

  repeat
    if (pos(sfilter,Form1.Table1.FieldValues['Titel']) <> 0) or
       (pos(sfilter,Form1.Table1.FieldValues['Problem']) <> 0) or
       (pos(sfilter,Form1.Table1.FieldValues['Loesung']) <> 0) then
      Form1.lb_titel.Items.Add(Form1.Table1.FieldValues['Titel']);

    Form1.Table1.Next;
  until Form1.Table1.Eof;
end;
Es soll jedes Feld eines Datensatz der db durchsucht werden.
Wenn in einem Feld des Datensatz der gesuchte Text vorhanden ist, dann soll der 'Titel' dieses Datensatzes in eine Listbox geschrieben werden.



MfG Jacuzzi.

mkinzler 18. Jan 2007 08:18

Re: memo Feld in Datenbank durchsuchen
 
Warum läßst du nicht die Datenbank die Arbeit machen (SQL)?

freak4fun 18. Jan 2007 08:35

Re: memo Feld in Datenbank durchsuchen
 
Zitat:

Zitat von mkinzler
Warum läßst du nicht die Datenbank die Arbeit machen (SQL)?

Wie denn das? :shock:

MfG
freak

Jacuzzi 18. Jan 2007 08:38

Re: memo Feld in Datenbank durchsuchen
 
Mit SQL hab ich auch schonmal probiert.
Geht aber irgednwie nicht:

Delphi-Quellcode:
   
Form1.Query1.SQL.Text := 'SELECT * FROM problemloesung WHERE Titel ' + sfilter;
   
repeat
  Form1.lb_titel.Items.Add(Form1.Query1.FieldValues['Titel']);
until Form1.Query1.Eof;

btw. Die Paradox Datenbank liegt lokal und läuft ohne BDE!

mkinzler 18. Jan 2007 08:40

Re: memo Feld in Datenbank durchsuchen
 
Zitat:

Wie denn das? Shocked
SQL-Code:
select titel from <tabelle> where titel like '%<suchbegriff>%' or problem like '%<suchbegriff>%' or loesung like '%<suchbegriff>%';

mkinzler 18. Jan 2007 08:41

Re: memo Feld in Datenbank durchsuchen
 
Zitat:

btw. Die Paradox Datenbank liegt lokal und läuft ohne BDE!
Wenn du TTable nimmst, verwendest du die BDE!

Jacuzzi 18. Jan 2007 09:08

Re: memo Feld in Datenbank durchsuchen
 
Zitat:

Zitat von mkinzler
Zitat:

btw. Die Paradox Datenbank liegt lokal und läuft ohne BDE!
Wenn du TTable nimmst, verwendest du die BDE!

nö :wink:
Ich wende die Table einfach auf die lokale Datenbank an, ohne BDE Zugriff.



Zitat:

Zitat von mkinzler
SQL-Code:
select titel from <tabelle> where titel like '%<suchbegriff>%' or problem like '%<suchbegriff>%' or loesung like '%<suchbegriff>%';

Das geht auch nicht:

Delphi-Quellcode:
    Form1.Query1.SQL.Text := 'SELECT titel FROM problemloesung WHERE titel LIKE %sfilter% OR problem LIKE %sfilter%  OR loesung LIKE %sfilter%';

repeat
  Form1.lb_titel.Items.Add(Form1.Query1.FieldValues['titel']); // hier bekomm ich die Fehlermeldung "Query1: Das Feld 'titel' wurde nicht gefunden"
  Form1.Table1.Next;
until Form1.Query1.Eof;

mkinzler 18. Jan 2007 09:12

Re: memo Feld in Datenbank durchsuchen
 
Zitat:

ö Wink

Ich wende die Table einfach auf die lokale Datenbank an, ohne BDE Zugriff.
Was für eine Komponente verwendest du?

Jacuzzi 18. Jan 2007 09:19

Re: memo Feld in Datenbank durchsuchen
 
Zitat:

Zitat von mkinzler
Zitat:

nö :wink:

Ich wende die Table einfach auf die lokale Datenbank an, ohne BDE Zugriff.
Was für eine Komponente verwendest du?

-> TTable

mkinzler 18. Jan 2007 09:44

Re: memo Feld in Datenbank durchsuchen
 
Dann verwendest du auch die BDE!

Jacuzzi 18. Jan 2007 09:49

Re: memo Feld in Datenbank durchsuchen
 
okay :roteyes:

Auch wenn ich in der BDE dafür gar keinen Eintrag hab?



Das hier geht auch nich:

Delphi-Quellcode:
   
Form1.Query1.Active := False;
Form1.Query1.SQL.Text := 'SELECT * FROM problemloesung WHERE titel LIKE "sfilter" OR problem LIKE "sfilter" OR loesung LIKE "sfilter"';
Form1.Query1.Active := True; // "Fehler: Variante des Typs (Null) konnt nich in den Typ (String) konvertiert werden."

Gerous 18. Jan 2007 10:21

Re: memo Feld in Datenbank durchsuchen
 
Das Ganze ist doch schon fast richtig ;)

probiers mal so:

Delphi-Quellcode:
Form1.Query1.SQL.Text := 'SELECT * FROM problemloesung WHERE titel LIKE ''%' + sfilter + '%'' OR problem LIKE ''%' + sfilter + '%'' OR loesung LIKE ''%' + sfilter + '%''';

Jacuzzi 18. Jan 2007 10:31

Re: memo Feld in Datenbank durchsuchen
 
Super, das hab ich jetzt kurz vorher auch schon rausgefunden :D
Aber trotzdem Danke.


Delphi-Quellcode:
Form1.Query1.Active := False;
Form1.Query1.SQL.Text := 'SELECT * FROM problemloesung WHERE titel LIKE ''%' + sfilter + '%'' OR problem LIKE ''%' + sfilter + '%'' OR loesung LIKE ''%' + sfilter + '%''';
Form1.Query1.Active := True;

while not Form1.Query1.Eof do
begin
  Form1.lb_titel.Items.Add(Form1.Query1.FieldValues['titel']);
  Form1.Query1.Next;
end;
Nochmal zusammenfassend zum Quellcode:
- Volltextsuche der Query in der db
- gefundene Einträge in Listbox schreiben

Jacuzzi 23. Jan 2007 10:53

Re: memo Feld in Datenbank durchsuchen
 
So, weiter gehts :D


Ich suche in den "Titeln" nach verschiedenen Strings -> AND-verknüpft
funkioniert alles soweit:

Delphi-Quellcode:
   
Query1.SQL.Text := 'SELECT * FROM ''' + DB_NAME + ''' WHERE (titel LIKE ''%' + fwoerter[1] + '%'')
                                                        AND (titel LIKE ''%' + fwoerter[2] + '%'')';

Jetzt will ich aber bestimmte Zeichen von der Suche ausschließen -> also AND-NOT-verknüpft
funktioniert NICHT:

Bsp: "1" und "2" finden, welche keine "3" enhalten

Delphi-Quellcode:
   
Query1.SQL.Text := 'SELECT * FROM ''' + DB_NAME + ''' WHERE (titel LIKE ''%' + fwoerter[1] + '%'')
                                                        AND (titel LIKE ''%' + fwoerter[2] + '%'')
                                                    AND NOT (titel LIKE ''%' + fwoerter[3] + '%'')';

Kann ich das überhaupt mit SQL realisieren?
Wie mach ich das?


Jacuzzi.

Jürgen Thomas 23. Jan 2007 11:55

Re: memo Feld in Datenbank durchsuchen
 
Hallo,
versuch es einmal mit zusätzlichen Klammern.
Delphi-Quellcode:
Query1.SQL.Text := 'SELECT * FROM ''' + DB_NAME + ''' WHERE (titel LIKE ''%' + fwoerter[1] + '%'')
                                                        AND (titel LIKE ''%' + fwoerter[2] + '%'')
                                                    AND ( NOT (titel LIKE ''%' + fwoerter[3] + '%'') )';
Es sollte grundsätzlich mit SQL möglich sind. Wenn Du Pech hast, überschreitest Du allenfalls die Fähigkeiten von LocalSQL.

Gruß Jürgen

marabu 23. Jan 2007 12:33

Re: memo Feld in Datenbank durchsuchen
 
Hallo Hannes,

das NOT gehört in LocalSQL zum LIKE:

SQL-Code:
... AND titel NOT LIKE :titel ...
Grüße vom marabu

Jacuzzi 24. Jan 2007 08:42

Re: memo Feld in Datenbank durchsuchen
 
@ marabu
So funktioniert das leider nicht.

Bei mir klappt das nur so:
Delphi-Quellcode:
     
// erster zu suchender String
Query1.SQL.Text := 'SELECT * FROM ''' + DB_NAME + ''' WHERE (titel LIKE ''%' + fwoerter[0] +
  '%'' OR problem LIKE ''%' + fwoerter[0] + '%'' OR loesung LIKE ''%' + fwoerter[0] + '%'')';

// weitere zu suchende Strings (anfügen)
for i := 1 to length(fwoerter)-1 do
  Query1.SQL.Text := Query1.SQL.Text + ' AND (titel LIKE ''%' + fwoerter[i] +
    '%'' OR problem LIKE ''%' + fwoerter[i] + '%'' OR loesung LIKE ''%' + fwoerter[i] + '%'')';

// auszuschließende Strings (anfügen)
for i := 0 to length(fwoerter_)-1 do
  Query1.SQL.Text := Query1.SQL.Text + ' AND (NOT (titel LIKE ''%' + fwoerter_[i] +
    '%'' OR problem LIKE ''%' + fwoerter_[i] + '%'' OR loesung LIKE ''%' + fwoerter_[i] + '%''))';
So funktioniert das aber auch nur wenn ich nur einen String ausschließe...
wenn ich zwei oder mehrere Strings auschließen will, dann wird alles rausgefiltert.
Liegt wahrscheinlich daran, dass es dann so aussieht:

AND (NOT (... OR ...)) AND (NOT (... OR ...))

wobei es aber bei mehreren Ausschließungen sicher so sein müsste:

AND (NOT (... OR ... OR ... OR ...))


:roll:

marabu 24. Jan 2007 13:53

Re: memo Feld in Datenbank durchsuchen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

dein Fall ist tatsächlich etwas komplizierter. Ich habe dir mal eine Demo angehängt, die dir den Ansatz über eine konjunktive Normalform zeigt.

Freundliche Grüße

Jacuzzi 24. Jan 2007 14:53

Re: memo Feld in Datenbank durchsuchen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank!

Dein Programm ist sicherlich funktionsfähig und durchdacht, aber für mich undurchsichtig.

Ich hab mir da jetzt schon selber was gebastelt, sicherlich für Außenstehende auch nich ganz durchsichtig, aber funktionell. :-D
Für alle die es interessiert, hier mein Proggie.



MfG Jacuzzi. :cheers:


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