Autor Beitrag
bockwurst
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: Fr 27.07.07 11:10 
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
Hält's aus hier
Beiträge: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Fr 27.07.07 12:00 
SQL:
ausblenden SQL-Anweisung
1:
select SPALTE from TABELLE where SPALTE like '%BEGRIFF%';					


Delphi:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var begriff: String;
begin;
 begriff:= '';
 begriff:= '%' + suchbegriff + '%';
 
 //Query
 Query1.sql.text:= 'select SPALTE from TABELLE where SPALTE like ''' + begriff + ''' ';
 Query1.open;

 //Verarbeitung
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

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
bockwurst Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
bockwurst Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Fr 27.07.07 14:05 
Hmm..du könntest dir alle Memos holen, mit der ID

ausblenden SQL-Anweisung
1:
select MEMO, PrimaryKey from TABELLE					


und dann gehst du in deinem Query/DBGrid jedes einzelne Memo mit der Funktion Suche in der Entwickler-Ecke 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

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
bockwurst Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
bockwurst Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77
Erhaltene Danke: 1

W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
BeitragVerfasst: Di 31.07.07 14:06 
user profile iconbockwurst 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77
Erhaltene Danke: 1

W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: Mi 01.08.07 09:45 
mit Firebird funktioniert upper() mit blobfeldern auch nicht.... aber dafür gibts ja containing...

_________________
- Leg dich nie mit einem Berufsprogrammierer an
- Wahre Profis akzeptieren keine einfachen Lösungen
bockwurst Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: 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.

ausblenden 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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..

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.