Название: Как создать виртуальную таблицу или правильно редактируемый QSQLQuery? Отправлено: PavelVX от Февраль 28, 2012, 07:47 Есть источник данных(любой из odbc, pqsl, sqlite), хочу создать виртуальную таблицу в памяти, в которую возьму все необходимые данные с источника данных. При изменении данных в виртуальной таблице, буду посылать источнику sql запрос на обновление, не перезапрашивая все данные.
как такое реализовать или где почитать об этом? Название: Re: Как создать виртуальную таблицу? Отправлено: Bepec от Февраль 28, 2012, 07:48 Читать про Model-View, читать про SQL. Понять. Сесть. Написать. Успехов!
Название: Re: Как создать виртуальную таблицу? Отправлено: PavelVX от Февраль 28, 2012, 08:15 Ответ хороший, лаконичный.
только он не раскрыл следующий момент: Если я делаю model на основе view в базе, то для того, что бы у пользователя показать им же измененные данные, мне надо отослать изменения в источник и перезапросить данные снова. А вот как сделать так, что бы пользователь увидел у себя обновленные данные без перезапроса? Название: Re: Как создать виртуальную таблицу? Отправлено: Bepec от Февраль 28, 2012, 08:21 При запросе в БД, у тебя появляется локальная копия данных. С ней ты можешь делать всё что хочешь, в том числе и менять.
Чтобы обновить данные с базы, необходимо в любом(ЛЮБОМ) случае отправить запрос на данные, получить/сверить/обновить для пользователя. То есть, запрашивать ты будешь в любом случае, потому только тебе решать, КОГДА их запрашивать, делать ли этот запрос явным(видимым для пользователя), или же скрывать и давать полную иллюзию "обновляемых данных без обновления". Так более полно, нет? update: показывать изменённые данные без запроса с базы - возможно это хорошо, но по мне серьёзный недостаток - пользователь будет думать, что уже изменил данные и они в базе... А потом мало ли что, вдруг сеть упала/сервер повис/админ пиво пролил на ИБП. А пользователь будет с добрым видом думать - как хорошо, что я Название: Re: Как создать виртуальную таблицу? Отправлено: PavelVX от Февраль 28, 2012, 08:45 То-есть делаем так:
1. создаем редактируемого наследника qsqlquery 2. переопределяем метод получения новых данных 3. обновление источника данных ставим ручками 4. затягиваем данные 5. при редактировании отправляем запрос на обновление источника , поскольку метод получения переопределен, то новые данные оно не получит. хмм, похоже идею уловил, СПАСИБО! Название: Re: Как создать виртуальную таблицу? Отправлено: Bepec от Февраль 28, 2012, 08:57 У каждого свои пути, пусть идея у тебя отличная от моей, но ... Успехов ;)
В 1 сообщении поменяй название темы на "%название_темы%[РЕШЕНО]" Название: Re: Как создать виртуальную таблицу? [решено] Отправлено: PavelVX от Март 26, 2012, 11:52 Унаследовал свою модель от QSqlQueryModel. В ней переопределил
bool setData(const QModelIndex &index, const QVariant &value, int role); В ней обновляются/добавляются данные на сервере. Все работает. Но как в QTableView, которое завязано на данный источник, перерисовать новые данные, без setQuery???? В своем setData, в конце, если обновление на серваке прошло удачно, делаю так: if (ok) QSqlQueryModel::setData(index, value); но все равно не помогает. Похоже, что значение все таки не записывается в локальный источник данных. Название: Re: Как создать виртуальную таблицу? [решено] Отправлено: Пантер от Март 26, 2012, 12:00 Попробуй сигнал заэммитить
http://doc-snapshot.qt-project.org/4.8/qabstractitemmodel.html#dataChanged Название: Re: Как создать виртуальную таблицу? [решено] Отправлено: PavelVX от Март 26, 2012, 12:50 class myModel : public QSqlQueryModel { //наследуем
bool ok = setDataToQuery(...); //на серваке все нормально апдейтит if (ok) qDebug() << QSqlQueryModel::setData(index, value); //а вот сохранение в локальной копии не идет выводит false то-есть setData почему-то не может записать изменения. Хотя для данной колонки flags |= Qt::ItemIsEditable; Ничего не понимаю. Название: Re: Как создать виртуальную таблицу? [решено] Отправлено: Kolobok от Март 26, 2012, 13:52 Цитировать The base class implementation returns false. This function and data() must be reimplemented for editable models. Название: Re: Как создать виртуальную таблицу? Отправлено: PavelVX от Март 27, 2012, 05:22 А что делать-то тогда? Как не перезапрашивая данные показать измененное значение???
Как вообще создать таблицу в памяти и оперировать с неё селектами, инсертами и апдейтами вообще без привязки к БД? На примере МС аксес: там можно в приложении создать локальную таблицу и с ней работать, обновлять её из внешнего источника, удалять, добавлять записи. Обновлять из нее внешние БД. Должно же быть что-то подобное в Qt P.S. судя по всему такое невозможно на Qt. Все модели, работающие с SQL запросами, только для чтения. А если их наследовать и переделывать под редактирование, то они, при изменении одной строки, тащят заново весь запрос. А это полный трындец при тяжелом запросе и большом количестве активных пользователей. http://www.prog.org.ru/topic_12792_15.html |