QSqlTableModel->setFilter() mit "ORDER BY" möglich?
-
Hallo.
Ich versuche schon seit einigen Tagen mir einen Filter. Aber leider scheitert es immer am "ORDER BY".Beispiel:
Funktinoiert nichtmodel->setFilter("name LIKE 'a%' ORDER BY birthday"); model->select();
Funktioniert
model->setFilter("name LIKE 'a%'"); model->select();
Nach einigem Lesen im Netz, bin ich zu dem Schluss gekommen, daß "ORDER BY" in setFilter() nicht funktioniert. Stimmt das?
Und gibt es da alternative Möglichkeiten?
-
Was sollte das für einen Sinn haben?
-
Nochmal genauer was ich eigentlich möchte. Das war nur ein Beispiel, weil mir aufgefallen ist, daß Order By dort nicht funktioniert.
Als Model habe ich eine SQLite Datenbank mit folgendem Inahlt. Als View eine QTableView.
id name address city birthday entryYear changeDate ---------- ----------------- ------------- -------------- ---------- ---------- ------------------- 3 adolf, First name Homestreet-22 00815-blablubb 2013-01-25 2013-01-25 2013-01-25 13:00:57 4 aal, First name Homestreet-22 00815-blablubb 2013-01-25 2013-01-25 2013-01-25 13:03:24 5 bumsbaer, First n Homestreet-22 00815-blablubb 2013-02-02 2013-01-25 2013-01-25 13:03:59 6 rrr, re Homestreet-22 00815-blablubb 2013-01-23 2013-01-25 2013-01-25 13:40:27 7 c, First name Homestreet-22 00815-blablubb 2013-01-20 2013-01-25 2013-01-25 13:40:49 9 aal, First name Homestreet-22 00815-blablubb 2013-01-25 2013-01-25 2013-01-25 16:38:56
Die soll so angezeigt werden: Geordnet nach den kommenden Geburtstagen (Monat) und dann nach Namen. Ein setSort geht ja nur mit kompletten Spalten.
select * from members where name LIKE '%' ORDER BY name, date(strftime('%m', birthday));
id name address city birthday entryYear changeDate ---------- --------------- ------------- -------------- ---------- ---------- ------------------- 4 aal, First name Homestreet-22 00815-blablubb 2013-01-25 2013-01-25 2013-01-25 13:03:24 9 aal, First name Homestreet-22 00815-blablubb 2013-01-25 2013-01-25 2013-01-25 16:38:56 3 adolf, First na Homestreet-22 00815-blablubb 2013-01-25 2013-01-25 2013-01-25 13:00:57 5 bumsbaer, First Homestreet-22 00815-blablubb 2013-02-02 2013-01-25 2013-01-25 13:03:59 7 c, First name Homestreet-22 00815-blablubb 2013-01-20 2013-01-25 2013-01-25 13:40:49 6 rrr, re Homestreet-22 00815-blablubb 2013-01-23 2013-01-25 2013-01-25 13:40:27
Soetwas z.B fuktioniert: Zeigt die kommenden 30. Geburtstage an:
model->setFilter("birthday < date('now', '-29 years') AND birthday > date('now', '-30 years')"); model->select();
Meine Frage ist nun, ob ich das irgendwie mit den vorgegebenen Mittel lösen kann? Oder, ob ich mein eigenes Model und/oder ein eigenes Delegate schreiben muß?
-
Das Order By im Filter würde dir gar nichts bringen, weil das ist ja nur ein Filter, da kanns dir egal sein, in welcher Reihenfolge die Werte kommen.
Du willst die komplette Query ändern oder etwas flexibler sortieren. Entweder machst du eine View in der Datenbank, oder du leitest von QSortFilterProxyModel ab und überschreibst lessThan. Musst schauen, was bei dir mehr Sinn macht oder perfermanter ist.
Delegates haben damit gar nichts zu tun.
-
Hallo. Leider komme ich momentan nicht weiter.
Ich will erstmal die Geburtstage nur nach Monaten sortieren, um sicher zu gehen, daß ich überhaupt auf dem richtigen Weg bin.
Der Filter:
#include "mysortfilterproxymodel.h" #include <QStringList> MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent) { } bool MySortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { QString leftData = sourceModel()->data(left).toString(); QString rightData = sourceModel()->data(right).toString(); //("yyyy-MM-dd") -> So sind die Daten im Model abgespeichert QStringList leftDate = leftData.split("-"); QStringList rightDate = rightData.split("-"); return leftDate[1].toInt() >= rightDate[1].toInt(); }
In der Hauptdatei:
void CentralWidget::nextBirthday() //Wird durch eine QAction aufgerufen { MySortFilterProxyModel *mySortFilterProxyModel = new MySortFilterProxyModel(this); mySortFilterProxyModel->setSourceModel(model); }
Wie rufe ich überhaupt die lessThan() - Funktion auf? Muß ich da ein bestimmtes Signal auslösen? Und welches wäre das?
Und die View müsste ich ja dann eigentlich auch wieder aktualisieren?
Entweder machst du eine View in der Datenbank...
Was meinst du damit?
-
lessThan heißt kleiner und da solltest du eher auf kleiner und nicht auf größer gleich prüfen
Es wäre besser, wenn die Daten im Model als QDateTime und nicht als String stehen würden.Du musst das Proxy Model ja auch auf dem View setzen.
view->setModel(proxyModel);Das kannst du ja auch gleich machen, nicht erst nach einem Klick. Sortiert wird dann z.B. über den Header. Kannst die Sortierung aber natürlich auch manuell auslösen.
lessThan wird von der Basisklasse aufgerufen, du musst dich da um nichts kümmern. Wenn du manuell sortieren willst, kannst du z.B. auf dem Model (Proxy Model) sort aufrufen.Das mit der View meinte ich so, dass du eine View in der Datenbank erstellst, die die Daten deinen Wünschen entsprechend sortiert bereitstellt.
-
...
-
Swordfish schrieb:
Tät' mich auch interessieren, da ein sql-view nicht ordered-by sein kann.
Erwischt, da hab ich überhaupt nicht mitgedacht.