SQLite mit verbundenen Tabellen in QTable - editierbar

Alles rund um die Programmierung mit Qt
Antworten
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

SQLite mit verbundenen Tabellen in QTable - editierbar

Beitrag von Chri »

Hi

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);
    
    
Query zusammengefasst:
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 (Im 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);
Selbe Ergebnis - nicht editierbar.

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
Und jetzt blicke ich überhaupt nicht mehr durch:
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
Die Sprache des Technikers ist die Skizze
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

Re: SQLite mit verbundenen Tabellen in QTable - editierbar

Beitrag von Chri »

Korrektur zu 1. Versuch:

Die Tabellenfelder sind doch editierbar (Weswegen sie zuvor nicht editierbar waren, kann ich nicht mehr nachvollziehen), aber die Änderungen werden nicht in die Datenbank geschrieben.

Code: Alles auswählen

   QSqlRelationalTableModel *qmod = new QSqlRelationalTableModel(this, myDB);
    qmod->QSqlQueryModel::setQuery(querytext);
    qmod->setEditStrategy(QSqlTableModel::OnFieldChange);
    ui->tableView_Direkt->setModel(qmod);
    qmod->select();
LG
Chri
Die Sprache des Technikers ist die Skizze
Antworten