Seite 1 von 1

QTablemodel.submitAll() verschluckt Update

Verfasst: 2. April 2008 14:08
von Baz
Hi,

ich hab ein etwas komisches Problem. Ich versuche eine Zeile eines Tablemodels per record zu updaten, sobald ich aber dann submitAll() aufrufe, enthält die geupdatete Zeile wieder die alten Werte. Was noch merkwürdiger ist, ist die Tatasche, dass der Code eigentlich 1:1 von einer anderen Stelle kopiert ist, wo er anstandslos funktioniert

Konstruktor:

Code: Alles auswählen

tmNotes = new QSqlTableModel(this);
tmNotes->setTable(tableName);
tmNotes->setEditStrategy(QSqlTableModel::OnManualSubmit);
tmNotes->select();
UpdateMethode: Die Funktion iteriert über die neuen Datensätze, löscht den Datensatz, falls das DelDate != 0 ist, updatet den Datensatz, falls die id vorhanden ist oder fügt den Datensatz ein, falls die id in der Datenbank noch nicht vorhanden ist.

Code: Alles auswählen

for (int i = 0; i < updatedRecords.size(); i++)
{
	tmNotes->setFilter("id = " + QString::number(updatedRecords.id));
	tmNotes->select();
	// Deleted
	if (updatedRecords.delDate != 0)
	{				
		if (tmNotes->rowCount() == 1)
		{
			tmNotes->removeRow(0);
		}
		tmNotes->setFilter("");
		tmNotes->select();
	}
	else
	{
		record.setValue("id", updatedRecords.id);
		.
		.
		.
		.
		(viele Updatefelder)
	}
	// Falls der Datensatz existiert wird er updated
	if (tmNotes->rowCount() == 1)
	{
		if (!tmNotes->setRecord(0, record))
		{
			tmNotes->setFilter("");
			tmNotes->select();
			return;
		}
	} 
	else
	{
		if (!tmNotes->insertRecord(-1, record))
		{
			tmNotes->setFilter("");
			tmNotes->select();
			return;
		}
	}
	// Logisch, hier sind noch alle Daten korrekt
	QMessageBox::information(this, "vorher", record.value("subject").toString());

	record = tmNotes->record(0);
	// Hier sind die Daten immer noch korrekt, also in der Cached-Table
	QMessageBox::information(this, "nachher", record.value("subject").toString());

	if (!tmNotes->submitAll())
	{
		return;
	}

	record = tmNotes->record(0);
	// Nicht mehr korrekt
	QMessageBox::information(this, "schluss", record.value("subject").toString());
}
Ich bin wie gesagt etwas verwirrt, ich wüsste einfach nicht wo da ein Fehler sein könnte... submitAll() gibt true zurück, der letzte Sql Fehler ist auch leer.

Gruß Baz

Verfasst: 3. April 2008 11:28
von abelmi
Die Methode setRecord() scheint nicht mit ManualSubmit zu arbeiten, wenn ich den Sourcecode von QSqlTableModel richtig interpretiere.

Außerdem speichert das QSqlTableModel bei submitAll() nur die Änderungen, die im Cache sind. Nach dem Speichern setzt submitAll() dann ein select() ab und lädt dadurch leider alle Werte neu aus der Datenbank.

Einen Lösungsvorschlag habe ich noch nicht, aber ich denke noch darüber nach.

Verfasst: 3. April 2008 11:57
von Baz
Hm okay - mein Leben hängt jetzt auch nicht unbedingt an dem ManualSubmit. Ich werd nachher mal RowChanged ausprobieren, vielleicht löst sich das Problem damit. Danke schonmal für die Idee, werd die Ergebnisse nachher posten

Verfasst: 4. April 2008 12:00
von Baz
Also ich habs mal ausprobiert, der EditMode ändert an der grundsätzlichen Problematik nichts, wenn ich allerdings auf RowChange stelle und das submitAll() weglasse, dann haut er mir den Code beim nächsten setFilter() um die Ohren - also das scheint ma nich zu klappen :|