QSortFilterProxyModel und Relationale Datenbanken

Alles rund um die Programmierung mit Qt
Antworten
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

QSortFilterProxyModel und Relationale Datenbanken

Beitrag von pfusterschmied »

Hi,

Ich stelle Daten aus einer MySQL DB in einer QTableView mittels eines QSqlRelationalTableModel dar. Dies klappt auch wunderbar.

Mit einigen Combos und CheckBoxes würde ich gerne die Ausgabe in der Tabelle filtern.

Nun habe ich zwei Probleme:

1. Problem:
Wie kann ich eine Abfragekombination erstellen?
Wenn ich mit setFilterRegExp() eine Filterung durchführe, werden natürlich die Zustände der anderen Combos ignoriert.

Code: Alles auswählen

proxyModel->setFilterRegExp(comboBoxEPTerm->currentText() );
Ich habs auch schon mit PatternSyntax versucht. Damit kann ich zumindest eine Combo und ein Suchfeld einschließen, aber nicht alle 3 Combos.

Code: Alles auswählen

void tableModel::filterRegExpChanged()
{
	QRegExp::PatternSyntax syntax = QRegExp::PatternSyntax(comboBoxEPTerm->itemData(comboBoxEPTerm->currentIndex()).toInt());
	Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive;
	QRegExp regExp(lineEditSearch->text(),caseSensitivity,syntax);
    	proxyModel->setFilterRegExp(regExp);

	personTableView->setModel(proxyModel);	
}
Vielleicht kann mir ja jemand einen Tipp geben wie ich eine gute Abfrage hinbekomme: if (combo1->currentText() == "Hans" && combo2->currentText() == "2002" .... proxyModel->setFilterRegExp(regExp);

2. Problem:
Ich verwende Relationale DB. Wenn ich nun eine Suche durchführe und den Datensatz bearbeiten möchte löst mir das ProxyModel die Relationen nicht auf. Es stehen zwar die richtigen Einträge in der Tabelle, wenn ich sie jedoch verändern will kann ich nicht mehr aus einer ComboBox die Relations auswählen sondern nur den Text ändern. Wenn ich den Text ändere und speicher verschewindet der ganze Eintrag (Ist klar, da dann die Relationen nicht mehr passen). Wie kann ich nun in einem QSortFilterProxyModel mit Relationen arbeiten???

Ich dachte es müsste irgendwie mit ModelIndex und mapFromSource gehen... aber da hänge ich total.

[PS.:] Ich hab eine ähnliche Frage beireits im Forum gestellt, bitte köpft mich nicht!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QRegExp("(Hans|2002|...)");

oder QSortFilterProxyModel::filterAcceptsRow überschreiben.
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von pfusterschmied »

Danke für die Antwort,

hab zwar noch Probleme bei der Umsetztung (no match operator | ...), aber da es (nach genauerer Suche) im Assistant auch erklärt wird werde ich das schon hinbekommen..... :oops:

Hat jemand vielleicht noch eine Idee für mein zweites Problem?
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von pfusterschmied »

Danke deines Hinweises und dem Assistant konnte ich nun eine simple ODER Abfrage erstellen:

Code: Alles auswählen

QRegExp("("+ lineEdit->text() +"|"+ comboBox->currentText() + ")");
Ich trau mich das fast nicht fragen, aber wie kann ich eine UND Abfrage erstellen ???
Dies funktioniert nicht:

Code: Alles auswählen

QRegExp("("+ lineEdit->text() +"&&"+ comboBox->currentText() + ")");
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das ergibt ja auch keinen Sinn wie kann ein Text gleichzeitig "Hans" und "2002" sein?

Ansonsten s. meine Antwort weiter oben.
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von pfusterschmied »

Ich habe mein ProxyModel so definiert, dass es in allen Tabellen sucht.
Bei den Daten handelt es sich um ein Anmeldesystem. Sprich die Personen können sich für Prüfungen jedes Jahr /Semester anmelden. Nun kann es natürlich sein, dass sich eine Person für die Prüfung 2000 und 2001 angemeldet hat.

Ich möchte nun zB. herausfiltern ob sich eine bestimmte Person 2002 angemeldet hat oder nicht oder ob eine Person die Prüfung 2001 bestanden hat oder nicht..... usw.

gibst da eine Lösung?

Kann mir jemand sagen ob nun Relationale DB in diesem Model unterstützt werden?
NoobSaibot
Beiträge: 99
Registriert: 27. Januar 2005 15:55

Beitrag von NoobSaibot »

Wenn du erfahren möchtest ob eine Person sich für das Jahr 2001 UND für das Jahr 2002 angemeldet hat, dann wirst du da an einem SQL JOIN nicht vorbei kommen.
Antworten