Problem mit RegExp/Suchanfrage

Alles rund um die Programmierung mit Qt
Antworten
bob446
Beiträge: 35
Registriert: 15. August 2009 11:28

Problem mit RegExp/Suchanfrage

Beitrag 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
arj
Beiträge: 45
Registriert: 1. Juni 2009 13:51
Wohnort: Ihringen

Beitrag von arj »

Eventuell kannst Du mehrere Filter hintereinanderschalten?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
bob446
Beiträge: 35
Registriert: 15. August 2009 11:28

Beitrag 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
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

UND mit RegExp

Beitrag 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)");
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
bob446
Beiträge: 35
Registriert: 15. August 2009 11:28

Beitrag 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
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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)
bob446
Beiträge: 35
Registriert: 15. August 2009 11:28

Beitrag 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*");
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Was für ein Model hast jetz genommen?
bob446
Beiträge: 35
Registriert: 15. August 2009 11:28

Beitrag von bob446 »

Ein QSqlTableModel

Code: Alles auswählen

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

AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Bist auf ner View?

Test ist eine Spalte mit varchar als datentyp?

Hast jetz "" oder '' verwendet??
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
bob446
Beiträge: 35
Registriert: 15. August 2009 11:28

Beitrag 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 !
Antworten