PDA

View Full Version : submitAll() not work for updating fields



brokensword
7th October 2008, 11:07
Hello.

I'm using QSqlTableModel:

QSqlTableModel* sqltm = new QSqlTableModel;
sqltm->setTable(table);
sqltm->setFilter(filter);

I'm inserting there one row:

sqltm->insertRow(0);

And modifying data in this row:

sqltm->setData(sqltm->index(0,tab_col::Col1),data1);
sqltm->setData(sqltm->index(0,tab_col::Col2),data2);

And doing submitAll() request:

sqltm->submitAll();

Everything works fine, data inserted to DB.

Then in same session I'm making another set of

sqltm->setData(sqltm->index(0,tab_col::Col1),data3);
sqltm->setData(sqltm->index(0,tab_col::Col2),data4);

operations.

And trying sqltm->submitAll() again.

Nothing happening. Inside submitAll()

case OnManualSubmit:
for (QSqlTableModelPrivate::CacheMap::ConstIterator it = d->cache.constBegin();
it != d->cache.constEnd(); ++it)

"for" cycle skiped.

Anyone have any thoughts?

brokensword
7th October 2008, 13:02
I've discovered that inside calling index() second time:

sqltm->setData(sqltm->index(0,tab_col::Col1),data3);

hasIndex() returns "fail" because second time rowCount() inside hasIndex():


int QSqlTableModel::rowCount(const QModelIndex &parent) const
{
Q_D(const QSqlTableModel);

if (parent.isValid())
return 0;

int rc = QSqlQueryModel::rowCount();
if (d->strategy == OnManualSubmit) {
for (QSqlTableModelPrivate::CacheMap::ConstIterator it = d->cache.constBegin();
it != d->cache.constEnd(); ++it) {
if (it.value().op == QSqlTableModelPrivate::Insert)
++rc;
}
} else if (d->insertIndex >= 0) {
++rc;
}
return rc;
}

-

for (QSqlTableModelPrivate::CacheMap::ConstIterator it = d->cache.constBegin();
it != d->cache.constEnd(); ++it)

didn't increment rc.

So index return correct value just on first call, when there is INSERT row in cache.
Is that a bug?