Habe ein SQLite-Datenbank mit ein paar Tabellen, die zusammengehängt werden sollen.
Ich verwende ein QSqlRelationalTableModel (qmod), das mit einer QTable verbunden wird.
Der 1. Versuch: eine recht komplexe Query-Abfrage:
Code: Alles auswählen
QString querytext (
"SELECT Geo_Direkt.PR_ID, FL_ID, BT_ID, Bauteile.Kürzel, Bauteile.U_WERT, "
"CASE WHEN Fenster.FE_ID ISNULL THEN Flaeche ELSE - Fenster.Fb * Fenster.Fh / 10000 END AS Flaeche, "
"Bauteile.fi, "
"CASE WHEN Fenster.FE_ID ISNULL THEN Bauteile.U_WERT * Flaeche * Bauteile.fi ELSE - Bauteile.U_WERT * Fenster.Fb * Fenster.Fh / 10000 * Bauteile.fi END AS 'U*Fl*fi', "
"Fenster.FE_ID, "
"Fenster.Bezvor || ' ' || Fenster.Bez || ' ' || Fenster.Beznach AS Fenster, "
"Fenster.Uw,Fenster.Fb * Fenster.Fh / 10000 AS FenFl, "
"Fenster.Uw * Bauteile.fi * Fenster.Fb * Fenster.Fh / 10000 AS 'Uw*Fl*fi', "
"sort "
"FROM Geo_Direkt "
"LEFT JOIN Bauteile USING (BT_ID) "
"LEFT JOIN Fenster USING (FE_ID) "
"WHERE Geo_Direkt.PR_ID = 1" //PR_ID hier der Einfachheit halber als fixe ID
);
qmod->setQuery(querytext);
Tabelle "Geo_direkt", an die mit LEFT JOIN die Tabelle "Bauteile" mittels BT_ID und die Tabelle "Fenster" mittels FE_ID gehängt wird.
Und außerdem zusätzliche berechnende Spalten.
Funktioniert an sich, nur ist die QTable nicht editierbar:
Soviel habe ich schon mitbekommen, dass durch das setQuery die Funktionalität des QSqlRelationalTableModel verloren geht.
Wie man sie wieder editierbar machen kann, weiß ich nicht und außerdem heißt es, dass man setQuery vermeiden soll.
Das ganze Query in settable, setRelation,.. zu übersetzen ist wahrscheinl. nicht möglich (zumindest schaff ich es nicht)
Der 2.Versuch:
Habe nun in der Datenbank eine view "Geo_Direkt_Join" gemacht m DB-Browser, mit dem Query von zuvor), die ich in die QTable lade:
Code: Alles auswählen
QSqlRelationalTableModel *qmod = new QSqlRelationalTableModel(this, myDB);
QSortFilterProxyModel *qmod_P = new QSortFilterProxyModel(this);
qmod->setTable("Geo_Direkt_Join"); //Die View
QString filterstring = "Geo_Direkt_Join.PR_ID='"+QString::number(projID)+"'";
qmod->setFilter(filterstring);
qmod->select(); //Verbinden mit der DB
qmod_P->setSourceModel(qmod);
qmod_P->sort(9,Qt::AscendingOrder);
Der 3.Versuch:
Ok, Internet -> INSTEAD OF - Trigger in der Datenbank, um die Spalte "Flaeche" editierbar zu machen:
Code: Alles auswählen
CREATE TRIGGER view_aktual
INSTEAD OF UPDATE OF Flaeche ON Geo_Direkt_Join
BEGIN
UPDATE Geo_Direkt SET Flaeche=NEW.Flaeche
WHERE FL_ID = OLD.FL_ID
END
Zum Beginn ist Editieren in der QTable nur in der 2.Zeile möglich (???), wenn man dort verändert, verschwindet die Zeile, dafür ist jetzt das Editieren auch in den anderen Zeilen möglich.
Die Zeile ist jedoch nicht echt verschwunden, wenn ich das Ganze neu starte, ist sie wieder da. Die geänderten Wert aller Zeilen werden jedoch in der DB gespeichert.
Meine Frage: Welcher Weg ist prinzipiell am sinnvollsten und was ist mit dem Trigger los?
LG
Chri