Russian Qt Forum
Ноябрь 23, 2024, 22:26
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Базы данных
>
Как создать виртуальную таблицу или правильно редактируемый QSQLQuery?
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как создать виртуальную таблицу или правильно редактируемый QSQLQuery? (Прочитано 8622 раз)
PavelVX
Гость
Как создать виртуальную таблицу или правильно редактируемый QSQLQuery?
«
:
Февраль 28, 2012, 07:47 »
Есть источник данных(любой из odbc, pqsl, sqlite), хочу создать виртуальную таблицу в памяти, в которую возьму все необходимые данные с источника данных. При изменении данных в виртуальной таблице, буду посылать источнику sql запрос на обновление, не перезапрашивая все данные.
как такое реализовать или где почитать об этом?
«
Последнее редактирование: Март 27, 2012, 13:01 от PavelVX
»
Записан
Bepec
Гость
Re: Как создать виртуальную таблицу?
«
Ответ #1 :
Февраль 28, 2012, 07:48 »
Читать про Model-View, читать про SQL. Понять. Сесть. Написать. Успехов!
Записан
PavelVX
Гость
Re: Как создать виртуальную таблицу?
«
Ответ #2 :
Февраль 28, 2012, 08:15 »
Ответ хороший, лаконичный.
только он не раскрыл следующий момент:
Если я делаю model на основе view в базе, то для того, что бы у пользователя показать им же измененные данные, мне надо отослать изменения в источник и перезапросить данные снова.
А вот как сделать так, что бы пользователь увидел у себя обновленные данные без перезапроса?
Записан
Bepec
Гость
Re: Как создать виртуальную таблицу?
«
Ответ #3 :
Февраль 28, 2012, 08:21 »
При запросе в БД, у тебя появляется локальная копия данных. С ней ты можешь делать всё что хочешь, в том числе и менять.
Чтобы обновить данные с базы, необходимо в любом(ЛЮБОМ) случае отправить запрос на данные, получить/сверить/обновить для пользователя.
То есть, запрашивать ты будешь в любом случае, потому только тебе решать, КОГДА их запрашивать, делать ли этот запрос явным(видимым для пользователя), или же скрывать и давать полную иллюзию "обновляемых данных без обновления".
Так более полно, нет?
update: показывать изменённые данные без запроса с базы - возможно это хорошо, но по мне серьёзный недостаток - пользователь будет думать, что уже изменил данные и они в базе...
А потом мало ли что, вдруг сеть упала/сервер повис/админ пиво пролил на ИБП. А пользователь будет с добрым видом думать - как хорошо, что я
УСПЕЛ
(как он думает) внести данные о переводе в 15 млн $ по контракту
«
Последнее редактирование: Февраль 28, 2012, 08:33 от Bepec
»
Записан
PavelVX
Гость
Re: Как создать виртуальную таблицу?
«
Ответ #4 :
Февраль 28, 2012, 08:45 »
То-есть делаем так:
1. создаем редактируемого наследника qsqlquery
2. переопределяем метод получения новых данных
3. обновление источника данных ставим ручками
4. затягиваем данные
5. при редактировании отправляем запрос на обновление источника , поскольку метод получения переопределен, то новые данные оно не получит.
хмм, похоже идею уловил, СПАСИБО!
Записан
Bepec
Гость
Re: Как создать виртуальную таблицу?
«
Ответ #5 :
Февраль 28, 2012, 08:57 »
У каждого свои пути, пусть идея у тебя отличная от моей, но ... Успехов
В 1 сообщении поменяй название темы на "%название_темы%[РЕШЕНО]"
Записан
PavelVX
Гость
Re: Как создать виртуальную таблицу? [решено]
«
Ответ #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
Сообщений: 5876
Жаждущий знаний
Re: Как создать виртуальную таблицу? [решено]
«
Ответ #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
Гость
Re: Как создать виртуальную таблицу? [решено]
«
Ответ #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
Гость
Re: Как создать виртуальную таблицу? [решено]
«
Ответ #9 :
Март 26, 2012, 13:52 »
Цитировать
The base class implementation returns false. This function and data() must be reimplemented for editable models.
Записан
PavelVX
Гость
Re: Как создать виртуальную таблицу?
«
Ответ #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
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...