Entwickler-Ecke
Datenbanken - SQL -Suche im MEMOFELD
bockwurst - Fr 27.07.07 11:10
Titel: SQL -Suche im MEMOFELD
Hallo zusammen,
ich habe nach einer Woche immer noch keine Lösung, wie ich mit TQuery in einer Datenbank, in einem Memofeld, suchen kann. Und zwar OHNE Berücksichtigung der Groß-/Kleinschreibung.
Ich habe die ganzen Foren abgesucht. Immer fand ich viele Fragen, abe keine Antworten!
Bitte helft mir!
Auch habe ich nach Komponeten gesucht. Doch alles ohne Erfolg.
Ich benutze die BDE und Parodox und kann dies nicht ändern.
Bitte sagt mir wie ich richtig suchen kann. Es eilt!
Vielen Dank
Andreas Orban
karsten mueller - Fr 27.07.07 11:36
Titel: selbes Problem
Ich habe das selbe Problem und würde mich auch über einen Lösungsvorschlag freuen.
LG
ZeitGeist87 - Fr 27.07.07 12:00
SQL:
SQL-Anweisung
1:
| select SPALTE from TABELLE where SPALTE like '%BEGRIFF%'; |
Delphi:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var begriff: String; begin; begriff:= ''; begriff:= '%' + suchbegriff + '%'; Query1.sql.text:= 'select SPALTE from TABELLE where SPALTE like ''' + begriff + ''' '; Query1.open;
end; |
Wichtig ist bei einer MEMO-Spalte in der Datenbank, dass du dir ihre Werte einzeln holen musst.
Du kannst sie also nicht zusammen mit anderen Spalten abfragen.
Wichtig: Tabelle/Spalte muss Case-Insensitive angelegt sein..
LG
Stefan
bockwurst - Fr 27.07.07 13:13
Hallo
wie kann ich den "Tabelle/Spalte muss Case-Insensitive angelegt sein.." setzen?
Kann ich dies nur beim Erstellen der Datenbank tun, oder auch in Programm, vor der Suche?
Ich habe noch Paradox9.
Andreas Orban
ZeitGeist87 - Fr 27.07.07 13:35
Hallo!
Hab gerade nachgeschaut..das ist das Problem bei Paradox..du kannst nicht case-insensitive suchen...das beste wäre ein zusätzliches feld, in dem du dir alles in Großbuchstaben speicherst, dann kannst du bequem suche.
Ablauf:
Suchbegriff: AUTO
Memo1 (case-sensitive): Heute hab ich mir ein neues Auto gekauft.
Memo2 (alles groß): HEUTE HAB ICH MIR EIN NEUES AUTO GEKAUFT.
Suche in Memo2 nach AUTO -> Fund -> ID(s) holen -> über ID(s) -> Texte aus Memo1
Wäre meine Lösung.
LG
Stefan
bockwurst - Fr 27.07.07 13:57
Danke ZeitGeist87,
aber eine extra Spalte kann ich in die datenbanken nicht mehr extra einfügen. Die sind ja alle beim Kunden und es ist nicht nur eine Tabelle sondern viele viele viele.
Einfacher wöre es mit einer Komponente wie "TPDJDDBSearch" . Dei habe ich mir heruntergeladen. Allerdings zeigt sie im Grid keine "Auswahl" an, sondern springt immer (bei allen ungefilterten angezeigten datensätze) zum nächsten Suchdatensatz.
Hast Du eine Idee wie ich mir meine TQuery selbst ableiten kann und ein UPPER einbauen kann. Ich habe im Quellcode schon gesucht. Ich weiß allerdings nicht, wo ich anfangen soll.
Andreas Orban
ZeitGeist87 - Fr 27.07.07 14:05
Hmm..du könntest dir alle Memos holen, mit der ID
SQL-Anweisung
1:
| select MEMO, PrimaryKey from TABELLE |
und dann gehst du in deinem Query/DBGrid jedes einzelne Memo mit der Funktion
POS durch und merkst dir die ID in der es vorkam und gibst es anschließend aus..
Ist nicht gerade performant, aber es funktioniert und wenn du nen Fortschrittsbalken einbaust, ist das für den Kunden halb so schlimm :)
LG
Stefan
bockwurst - Di 31.07.07 11:53
@ ZeitGeist87:
Vielen Dank. Aber bei über 50000 Datensätze und über das Netz. Es ist zu langsam, weil jeder Datensatz von Server zum Client geschickt werden muß und dort geprüft wird und eine neuer Datensatz gelsen werden muß. Query (SQL) filtert die Datensätze schon beim Server. Wogegen bei bei der Eigenschaft TQuery.Filter auch jeder datensatzsatz zum Client geschickt/geprüpft werden muß.
Ich suche jetzt schon eine ganze Zeit nach einer Komponente, die eine Query ist und Datensatz /mit Sql "Case-insensitive" filtern kann.
Kennt ihr welche????????
Andreas Orban
ZeitGeist87 - Di 31.07.07 11:58
Da denk ich, wirst du kein Glück haben!
Das Problem liegt hier nämlich beim Design der Datenbankengine.
Wenn diese Caseinsensitive nicht unterstützt, kann eine Komponente auch nichts daran ändern, ausser dass sie vielleicht im Hintergrund im Prinzip wie mein Beispiel arbeitet / arbeiten wird.
Aber ich lasse mich gern eines Besseren belehren.
LG
Stefan
bockwurst - Di 31.07.07 13:11
@ ZeitGeist87: Doch es gibt Komponenten die dies können. Aber sie springen immer zum nächsten Datensatz. Eine heißt PDJDBSearch. Abwer ich will doch eine Art Query!
kkausp - Di 31.07.07 14:06
bockwurst hat folgendes geschrieben: |
@ ZeitGeist87:
Vielen Dank. Aber bei über 50000 Datensätze und über das Netz. Es ist zu langsam, weil jeder Datensatz von Server zum Client geschickt werden muß und dort geprüft wird und eine neuer Datensatz gelsen werden muß. Query (SQL) filtert die Datensätze schon beim Server. Wogegen bei bei der Eigenschaft TQuery.Filter auch jeder datensatzsatz zum Client geschickt/geprüpft werden muß.
|
Du hast doch was von Paradox/BDE geschrieben?!, da macht der "Server" garnichts.
bockwurst - Di 31.07.07 14:55
@ kkausp: Ja, der Server ist nur eine reine "Festplatte". Aber trotzdem wird dann jeder Datensatz einzeln geschickt und es dauert seine Zeit. Bei Query werden nur die "Ergebnisse" über das Netz geschickt.
Und auch wenn immer geschrieben wird, Paradox sei nicht netzwerkfähig, kann ich nur sagen, es geht! Was soll ich sagen, ich weiß, Paradox ist nicht toll, die BDE auch nicht. Aber ich habe nichts anderes! Ich brauche auch nichts anders, nur eben diese blöde Query ide "case-sensitive" kann bzw. nicht kann.
Andreas
jasocul - Di 31.07.07 15:12
Paradox ist netzwerkfähig. Es ist keine Client/Server-Datenbank. Dass nur die Ergebnisse übers Netz geschickt werden, ist nicht richtig.
Dein Problem ist mit einer Komponente so nicht lösbar. Die Alternative, ein zweites, aufbereitetes Memo-Feld zu benutzen, wurde ja schon genannt.
Paradox unterstützt leider keinen vollständigen SQL-Standard. Deswegen fehlt z.B. auch die Upper-Funktion. Das hat auch nichts mit der TQuery-Komponente zu tun, sondern nur mit den Einschränkungen von Paradox.
Wenn Du die Alternative nicht nutzen willst oder kannst, kann man auch noch auf andere Datenbanken zurück greifen, die so etwas können. Da gibt es auch kostenlose und leicht bedienbare. Du hast also 3 Möglichkeiten:
1. Du benutzt ein zweites Memo-Feld
2. Du verarbeitest jeden Datensatz bei der Suche lokal
3. Du nimmst eine richtige Datenbank
Mehr fällt mir dazu nicht ein.
bockwurst - Di 31.07.07 15:23
@ jasocul: OK ich muß es wohl einsehen.
kannst du mir sagen, wie und wo ich jeden einzelen datensatz prüfen kann. Ich habe eine SQL-Abfrage von TQuery. Diese liefert Ergebnisse.
ein Beispiel
SELECT * FROM test a
WEHERE (a.Feld like "%Anton") and
...
(a.Blobfeld like "%Eingabe%")
Ich habe eine Query eine Datasiurce und ein DBgrid
andreas
jasocul - Di 31.07.07 15:35
Pauschal kann man das nicht beantworten.
Vermutlich musst Du ein paar Dinge am Handling ändern. So, wie Du es vorhast, musst Du mit Zwischenergebnissen arbeiten. Da kommst Du dann mit einem TQuery nicht mehr aus und musst evtl. mit temporären Tabellen oder Abfragen im Speicher arbeiten. Ich halte das für zu umständlich.
Mein Tipp, wenn Du wirklich nicht von Paradox weg kannst:
Nimm für alle betroffenen Felder jeweils ein weiteres Feld, wo die Daten in Großschrift dann drin stehen. Dafür musst Du einmal die Tabellen überarbeiten und das BeforePost-Event nutzen. In dem Ereignis füllst Du dann fortan die sekundären Felder. Dadurch stellst Du sicher, dass die Case-Insensitive abfragen kannst.
Du musst natürlich einmal ein kleines Programm schreiben, dass dann die Felder einmalig korrekt füllt.
kkausp - Di 31.07.07 15:52
Ich habe ja nicht bezweifelt, das es netzwerkfähig ist, sondern "Bei Query werden nur die "Ergebnisse" über das Netz geschickt."
Als kleiner Tip zur Erhöhung der Perfomance das Verzeichnis für die temp Dateien (session.privatedir) nach lokal legen.
KK
bockwurst - Mi 01.08.07 09:43
@ kkausp: war nicht böse von mir gemeint. Ich bin über jede Hilfe doch sehr dankbar.
Aber trotzdem ist mein Problem noch nicht gelöst.
Vielleicht kann mir einer sagen, warum Upper(Bolbfeldtext) nicht funkt. Es kann nicht an Paradox liegen, weil es mit Delphi 1 (16bit) funkte. Kann also nur an Delphi5 oder BDE 32 liegen. Ich würde gerne ein neues Upper schreiben, daß Blobfeldinhalte in Großbuchstaben oder auch Kleinbuchstaben umwandelt. Ich weiss aber allerdings nicht wo ich da "ändern" soll. Ist es in TQuery?
Könnt ihr da weiterhelfen.
Besten Dank
Andreas Orban
Amiga-Fan - Mi 01.08.07 09:45
mit Firebird funktioniert upper() mit blobfeldern auch nicht.... aber dafür gibts ja containing...
bockwurst - Mi 01.08.07 13:59
Ich gebe es auf mit SQL Case-insensitive in einem Blob zu suchen (Paradox und BDE)!
Nun wollte ich ein neues Blob Feld erzeugen und mit Großbuchstaben füllen (wie von zeitGeist87 vorgeschlagen). Mein Bosse meint aber, ich sollte kein neues Blob_feld nehmen, sondern lieber ein Stringfeld mit 255 Zeichen. Die Restlichen zeichen zuverlieren sei akzeptabel.
Nun Gut, Chefe ist König!
Ich habe jetzt ein neues Feld hinztugefügt. Nennen wir es NeuFeld.
Dies habe ich mit SQL so gemacht.
Delphi-Quelltext
1: 2:
| UPDATE datenbank ADD NeuFeld CHAR(255) |
Jetzt meine Frage. Wie kann ich jetzt am Besten die Zeichen vom Blobfeld in mein neues Feld bringen.
ich würde gern folgendes machen.
Delphi-Quelltext
1: 2:
| UPDATE datenbank set NeuFeld = Blobfeld |
doch leider geht dies nicht (unschiedliche Typen). Muß ich jetzt mit einer TTable jeden datensatz von NeuFeld von "Hand" setzen, oder gibt es da einen schönen Trick?
Ich würde es gern mit SQL (localSQL) machen, weil es schneller geht und weniger Fehler auftretten.
Andreas
ZeitGeist87 - Mi 01.08.07 14:36
So hätt ichs gemacht:
Jeden Datensatz vom Blob auslesen -> in String speichern -> upper(string) -> in neues Feld speichern..
jasocul - Mi 01.08.07 15:22
SQL-Anweisung
1: 2:
| UPDATE datenbank set NeuFeld = Blobfeld |
Evtl. geht das irgendwie, aber dann hast Du in dem Feld immer noch nicht die Daten in Großbuchstaben drin. Und da ein UPPER mit Paradox nicht funktioniert, musst Du das wohl mit einem kleinen Delphi-Programm lösen. Also so, wie ZeitGeist87 das vorgeschlagen hat.
bockwurst - Mi 01.08.07 15:56
@ ZeitGeist87: so habe ich es auch jetzt gemacht. Allerdings dachte ich, es würde bei sehr vielen Datensätze lange dauern (jeden Satz lesen, editieren & schreiben). Aber auch die gute alte TTable ist gar nicht mal so langsam und so hat sie es auf einem 3000MHz Athlon, für 50000 datensätze nicht mehr als 1-2 Sekunden gebraucht.
Ja ja, manchmal kann man doch noch sehr viel lernen!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!