Seite 1 von 1

Problem mit RegExp/Suchanfrage

Verfasst: 15. Oktober 2009 11:03
von bob446
Hallo,

ich habe folgende Situation:

Ich greife auf eine SQL-Datenbank zu, um mir meine Daten für meine Anzeige in einer Table View zu besorgen. Dies funktioniert soweit alles. Nun möchte ich dieses Modell mithilfe von Suchanfragen filtern. Dazu habe ich mir ein QSortFilterProxyModel erstellt, welches das Filtern übernimmt. Ich möchte nun mehrere Begriffe eingeben können und diese sollen als UND-Anfrage behandelt werden. Also bei Eingabe von "Test Text " sollen nur Begriffe gefunden werden die Test und Text beinhalten. Ich habe das ganze im Moment mit folgenden Code probiert:

QRegExp regExp(lineEditor->text(), Qt::CaseInsensitive, QRegExp::RegExp);
m_FilterModel->setFilterRegExp(regExp);

Allerdings habe ich noch keine Möglichkeit gefunden, wie man einen Und-Ausdruck formulieren kann.(Ein Oder bekomme mit | hin)
Weiss jemand wie man eine solche Suche mit einer RegExp formuliert? Oder ist es sinnvoller die Anfrage als SQL-Statement zu formulieren? Über Hinweise wäre ich sehr froh!
Vielen Dank und viele Grüße bob446

Verfasst: 15. Oktober 2009 11:35
von arj
Eventuell kannst Du mehrere Filter hintereinanderschalten?

Verfasst: 15. Oktober 2009 12:21
von upsala
Es kommt drauf an, wieviele Einträge in der Datenbank sind. Bei sehr vielen Einträgen würde ich es auf die Datenbank schieben.

Ansonsten kann man den Proxy auch ableiten und selbst etwas modifizieren.

Verfasst: 15. Oktober 2009 12:32
von bob446
Hallo und danke schon einmal für die Antworten. Da es sich um einen im Programmablauf wachsenden Datenbestand handelt wird eine Suchanfrage auf Datenbankebene sinnvoller sein. Auch wenn die Frage blöd klingel mag, aber wie würde man eine solche Suchanfrage formulieren? Ich habe mehrere Spalten(4) und weiss aber nicht genau welche ich durchsuchen muss.Also die Eingabe des Benutzers könnte z.b. Teil1 Eigenschaft1 sein und ich möchte die Einträge finden die Teil1 und Eigenschaft1 erfüllen.
mfg

UND mit RegExp

Verfasst: 15. Oktober 2009 16:20
von bst
Für 2 Begriffe geht:

Code: Alles auswählen

QRegExp re("Text.*Test|Test.*Text");
Ab 3 Begriffen wird das ätzend, nimm dann vielleicht positive Lookaheads:

Code: Alles auswählen

QRegExp re(".(?=.*Test)(?=.*Text)(?=.*Hallo)");

Verfasst: 15. Oktober 2009 16:20
von upsala
Also wenn man Datenbanken arbeiten will, dann sollte man sich auch mit der entsprechenden Datenbankabfragesprache auskennen. Bitte beschäftige dich mit den Grundlagen von SQL.

Verfasst: 16. Oktober 2009 12:12
von bob446
hallo,
ich möchte jetzt folgende Abfrage erstellen:

Code: Alles auswählen

SELECT ID
FROM Tabelle1
WHERE (Tabelle1.text LIKE "*test*")
die Abfrage liefert in MySql und in Access auch das richtige Ergebnis.
Allerdings funktioniert die Abfrage nicht über Qt.
Ich setze meinen Filter wiefolgt:

setFilter
The filter is a SQL WHERE clause without the keyword WHERE (for example, name='Josephine').

Code: Alles auswählen

model->setFilter(Tabelle1.text LIKE "*test*");
Was mache ich falsch? Wie kann ich meine Abfrage richtig formulieren?
Ich hoffe mir kann jemand helfen...Vielen Dank und viele Grüße bob446

Verfasst: 16. Oktober 2009 12:19
von AuE
Welche DB?
Was sagt denn die Hilfe zu LIKE?
Glaube es war nen anderes Zeichen als * bei MSSQL (nicht sicher und auch nicht welches dann)

Verfasst: 16. Oktober 2009 12:33
von bob446
der Begriff LIKE funktioniert auf beiden DB , also MySQL und MS-Access.
Der * ist bei Access als Platzhalter und % bei MySql.
Mein Model in Qt kommt aus einer Access DB.

ich verstehe nur nicht, warum

Code: Alles auswählen

model->setFilter("Tabelle1.text = 'test'");
funktioniert und dieser Aufruf nicht

Code: Alles auswählen

model->setFilter(Tabelle1.text LIKE "*test*");

Verfasst: 16. Oktober 2009 12:38
von AuE
Was für ein Model hast jetz genommen?

Verfasst: 16. Oktober 2009 12:55
von bob446
Ein QSqlTableModel

Code: Alles auswählen

model = new QSqlTableModel;
model->setFilter("Tabelle1.text = 'test'");


Verfasst: 16. Oktober 2009 12:59
von AuE
Bist auf ner View?

Test ist eine Spalte mit varchar als datentyp?

Hast jetz "" oder '' verwendet??

Verfasst: 16. Oktober 2009 16:48
von upsala
Dieser Aufruf

Code: Alles auswählen

model->setFilter(Tabelle1.text LIKE "*test*");
erzeugt einen Compiler-Fehler und keinen SQL-Fehler und sollte bereits im Editor als solcher Angezeigt werden.

Verfasst: 17. Oktober 2009 20:15
von bob446
habe sowohl ' ' und " " ausprobiert ... der code erzeugt keinen compilerfehler...zumindest wird mir keiner angezeigt...muss am montag dann nochmal schauen...kann man meine abfrage also:

SELECT *
FROM Tabelle
WHERE tabelle.test LIKE 'abc' anders abfragen?
wäre für jede hilfe dankbar

edit:
habe den Fehler gefunden :) In der Abfrage-Entwurfsansicht von MS Access wird als Platzhalter * verwendet. Allerdings muss beim Aufruf über QT doch % verwendet werden. Scheinbar wird hier intern noch etwas am Abfrageausdruck verändert. Viele Dank für die zahlreiche Unterstützung !