Russian Qt Forum
Ноябрь 23, 2024, 22:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как создать виртуальную таблицу или правильно редактируемый QSQLQuery?  (Прочитано 8620 раз)
PavelVX
Гость
« : Февраль 28, 2012, 07:47 »

Есть источник данных(любой из odbc, pqsl, sqlite), хочу создать виртуальную таблицу в памяти, в которую возьму все необходимые данные с источника данных. При изменении данных в виртуальной таблице, буду посылать источнику sql запрос на обновление, не перезапрашивая все данные.
как такое реализовать или где почитать об этом?
« Последнее редактирование: Март 27, 2012, 13:01 от PavelVX » Записан
Bepec
Гость
« Ответ #1 : Февраль 28, 2012, 07:48 »

Читать про Model-View, читать про SQL. Понять. Сесть. Написать. Успехов!
Записан
PavelVX
Гость
« Ответ #2 : Февраль 28, 2012, 08:15 »

Ответ хороший, лаконичный.
только он не раскрыл следующий момент:
Если я делаю model на основе view в базе, то для того, что бы у пользователя показать им же измененные данные, мне надо отослать изменения в источник и перезапросить данные снова.
А вот как сделать так, что бы пользователь увидел у себя обновленные данные без перезапроса?
Записан
Bepec
Гость
« Ответ #3 : Февраль 28, 2012, 08:21 »

При запросе в БД, у тебя появляется локальная копия данных. С ней ты можешь делать всё что хочешь, в том числе и менять.

Чтобы обновить данные с базы, необходимо в любом(ЛЮБОМ) случае отправить запрос на данные, получить/сверить/обновить для пользователя.

То есть, запрашивать ты будешь в любом случае, потому только тебе решать, КОГДА их запрашивать, делать ли этот запрос явным(видимым для пользователя), или же скрывать и давать полную иллюзию "обновляемых данных без обновления".

Так более полно, нет?

update: показывать изменённые данные без запроса с базы - возможно это хорошо, но по мне серьёзный недостаток - пользователь будет думать, что уже изменил данные и они в базе...
А потом мало ли что, вдруг сеть упала/сервер повис/админ пиво пролил на ИБП. А пользователь будет с добрым видом думать - как хорошо, что я УСПЕЛ(как он думает) внести данные о переводе в 15 млн $ по контракту Веселый
« Последнее редактирование: Февраль 28, 2012, 08:33 от Bepec » Записан
PavelVX
Гость
« Ответ #4 : Февраль 28, 2012, 08:45 »

То-есть делаем так:
1. создаем редактируемого наследника qsqlquery
2. переопределяем метод получения новых данных
3. обновление источника данных ставим ручками
4. затягиваем данные
5. при редактировании отправляем запрос на обновление источника , поскольку метод получения переопределен, то новые данные оно не получит.

хмм, похоже идею уловил, СПАСИБО!
Записан
Bepec
Гость
« Ответ #5 : Февраль 28, 2012, 08:57 »

У каждого свои пути, пусть идея у тебя отличная от моей, но ... Успехов Подмигивающий

В 1 сообщении поменяй название темы на "%название_темы%[РЕШЕНО]"
Записан
PavelVX
Гость
« Ответ #6 : Март 26, 2012, 11:52 »

Унаследовал свою модель от QSqlQueryModel. В ней переопределил
        bool setData(const QModelIndex &index, const QVariant &value, int role);
В ней обновляются/добавляются данные на сервере. Все работает. Но как в QTableView, которое завязано на данный источник, перерисовать новые данные, без setQuery?Непонимающий
В  своем setData, в конце, если обновление на серваке прошло удачно, делаю так:
   if (ok) QSqlQueryModel::setData(index, value);
но все равно не помогает. Похоже, что значение все таки не записывается в локальный источник данных.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Март 26, 2012, 12:00 »

Попробуй сигнал заэммитить
http://doc-snapshot.qt-project.org/4.8/qabstractitemmodel.html#dataChanged
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
PavelVX
Гость
« Ответ #8 : Март 26, 2012, 12:50 »

class myModel : public QSqlQueryModel { //наследуем

    bool ok = setDataToQuery(...); //на серваке все нормально апдейтит
    if (ok) qDebug() << QSqlQueryModel::setData(index, value); //а вот сохранение в локальной копии не идет
выводит false
то-есть setData почему-то не может записать изменения. Хотя для данной колонки
flags |= Qt::ItemIsEditable;
Ничего не понимаю.
« Последнее редактирование: Март 26, 2012, 12:53 от PavelVX » Записан
Kolobok
Гость
« Ответ #9 : Март 26, 2012, 13:52 »

Цитировать
The base class implementation returns false. This function and data() must be reimplemented for editable models.
Записан
PavelVX
Гость
« Ответ #10 : Март 27, 2012, 05:22 »

А что делать-то тогда? Как не перезапрашивая данные показать измененное значение???
Как вообще создать таблицу в памяти и оперировать с неё селектами, инсертами и апдейтами вообще без привязки к БД?
На примере МС аксес: там можно в приложении создать локальную таблицу и с ней работать, обновлять её из внешнего источника, удалять, добавлять записи. Обновлять из нее внешние БД. Должно же быть что-то подобное в Qt

P.S. судя по всему такое невозможно на Qt. Все модели, работающие с SQL запросами, только для чтения. А если их наследовать и переделывать под редактирование, то они, при изменении одной строки, тащят заново весь запрос. А это полный трындец при тяжелом запросе и большом количестве активных пользователей.
http://www.prog.org.ru/topic_12792_15.html
« Последнее редактирование: Март 27, 2012, 13:11 от PavelVX » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.153 секунд. Запросов: 23.