crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как вставить запись в SQL-модель и не перечитывать потом всей таблицы ?
masterlan
  опции профиля:
сообщение 10.3.2010, 22:50
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 1.3.2010
Пользователь №: 1497

Спасибо сказали: 0 раз(а)




Репутация:   0  


Привет коллеги.
Перечитал все доступные мне источник Qt-информации, но так пока и не могу понять, как оформить нижеследующий сценарий работы приложения.

Приложение работает с информацией хранящейся на SQL-сервере.

Эпизод работы приложения:

1. ТАБЛИЧНАЯ ФОРМА отображает результат сложного SELECT-а из нескольких таблиц SQL-сервера.
Изменять ТАБЛИЧНУЮ ФОРМУ прямо с экрана запрещено. (есть кнопки - "Изменить" "Добавить" )

2. При их нажатии отрывается специальная ФОРМА для коррекции/добавления записи.
После закрытия этой ФОРМЫ выполняется серия UPDATE/INSERT-выражений меняющих таблицы на SQL-сервере.

3. Есть на ТАБЛИЧНОЙ ФОРМЕ кнопка "Удалить".
Её нажатие влечёт за собой серию DELETE/UPDATE-выражений также меняющих таблицы на SQL-сервере.

4. После проведённого изменения/добавления/удаления на SQL-сервере ТАБЛИЧНАЯ ФОРМА должна отразить новое состояние данных.

ВНИМАНИЕ ! Изменяли/добавляли/удаляли всего ОДНУ логическую запись сложного SELECT-а !

Как перечитав ТОЛЬКО её ОДНУ из базы отобразить её новое состояние в ТАБЛИЧНОЙ ФОРМЕ ?
Если произошло добавление как добавить ТОЛЬКО новую строку в ТАБЛИЧНУЮ ФОРМУ ?
Ну и естественно при удалении как удалить соответствующую строку из ТАБЛИЧНОЙ ФОРМЫ не перечитывая весь сложный SELECT заново ?

В приложении описанный эпизод повторяется МНОГОкратно , потому хочется его сделать оптимальным.

Связка QSqlTableModel+QTableView не подходит, т.к. порождает неоправданно частые селекты к таблицам.
Да и таб.формы опираются на сложные селекты , а не на таблицы.
О существовании VIEW и STORED PROCEDURE как альтернативы знаю, только куда частые перезапросы денешь?
Сделал submitAll() и тем самым родил перезапрос. :(

Связка QSqlQueryModel+QTableView объявлена как READ-ONLY.
Говорят - реализуй flags(), setData() и будет тебе EDIT-ABLE.
Только не говорят как сделать (INSERT/DELET)-ABLE.

И что теперь делать ?
Неужели "руками" из QSqlQuery заполнять QTableWidget и уже в нём ins/edit/del организовывать?

Приложение, о котором пишу, содержит около 70 табличных форм и к ним столько же форм редактирования строк.
Да плюс 100 репортов.
В базе более 100 таблиц. Есть среди них со 100 тыс. записей и всё это будет утолщятся.
Представляете себе реакцию приложения на исправление одной опечатки в одном слове одного поля одной табличной формы со 100 тыс записей
при перезапросах всего селекта ! Правим одну букву, а перечитываем ....
Ну жалко ведь барышень-операторов заполняющих ежедневно базу новыми документами.
А как быть - пока не знаю.

Java-Swing-Postgresql аналог вышеупомянутого приложения уже дорос до верcсии 3.034.
Теперь вот обратно хочу переехать(перевести приложение) на родной С++ (с него когда то ушёл в яву).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 20.3.2010, 21:18
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


masterlan, QSqlTableModel+QTableView не так уж и плох если сабкласить модель с мануал сабмит.
Эх, была ни была! Вот, держи мою модельку:

Table_Model::Table_Model(QObject *parent) :
        QSqlTableModel(parent)
{
    setEditStrategy(QSqlTableModel::OnManualSubmit);
}

Qt::ItemFlags Table_Model::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QSqlQueryModel::flags(index);
    if (index.column()) flags |= Qt::ItemIsEditable;
    return flags;
}

bool Table_Model::setData(const QModelIndex &index, const QVariant &value, int role)
{
    bool lResult = QSqlTableModel::setData(index, value, role);
    if (lResult) {
        QSqlRecord rec = record(index.row());
        if (value.toString().isEmpty()) rec.setNull(index.column());
        else rec.setValue(index.column(), value);
        rec.setGenerated(index.column(), true);
        lResult = updateRowInTable(index.row(), rec);
    }
    return lResult;
}

QVariant Table_Model::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (section < 0 || role != Qt::DisplayRole) return QVariant();
    if (orientation == Qt::Vertical) return index(section, 0).data();
    return QSqlTableModel::headerData(section, orientation,  role);
}


Только пока с добавлением элементов не разобрался ещё =) Попозже займусь. Если кто знает, приму в дар подсказку =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.3.2010, 21:40
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(masterlan @ 11.3.2010, 1:50) *
Говорят - реализуй flags(), setData() и будет тебе EDIT-ABLE.
Только не говорят как сделать (INSERT/DELET)-ABLE.
ну создай тему типа "SqlQueryModel со вставкой/удалением данных" , т.к. тема узкая обсуждение быстрее пойдёт и конкретнее будет.

П.С. я не вижу принципиальных проблем, т.к. есть insertRow/deleteRow
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 4.4.2020, 18:21