Russian Qt Forum

Qt => Базы данных => Тема начата: PavelVX от Февраль 28, 2012, 07:47



Название: Как создать виртуальную таблицу или правильно редактируемый 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: показывать изменённые данные без запроса с базы - возможно это хорошо, но по мне серьёзный недостаток - пользователь будет думать, что уже изменил данные и они в базе...
А потом мало ли что, вдруг сеть упала/сервер повис/админ пиво пролил на ИБП. А пользователь будет с добрым видом думать - как хорошо, что я УСПЕЛ(как он думает) внести данные о переводе в 15 млн $ по контракту :D


Название: 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