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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Срочно Помогите с QSqlTableModel!Пожалуйста  (Прочитано 20953 раз)
linuxoid
Гость
« Ответ #15 : Август 10, 2007, 10:21 »

можешь написать примерный код?
Записан
-=QT=-
Гость
« Ответ #16 : Август 10, 2007, 11:05 »

Смотрел сегодня 4.3.1
Там есть пример "Master Detail" в группе SQL там описывается работа с QSqlRelationalTableModel и добавление и удалением данных,
я думаю что прикрутить туда изменение можно тоже.
Записан
linuxoid
Гость
« Ответ #17 : Август 10, 2007, 12:53 »

написал свою модель с помощью setData но почему то не применяются изменения!Помогите!что здесь не так?вот часть кода:



bool MyModel::setData(const QModelIndex &index,const QVariant &value,int /* role */) {
   if (index.column() < 0 || index.column() > 3)
      return false;
   QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
   int id = QSqlQueryModel::data(primaryKeyIndex).toInt();
   bool ok;
   QSqlQuery query;
if (index.column() == 0) {
   query.prepare("update cities set city_name = ? where id = ?");
   query.addBindValue(value.toString());
   query.addBindValue(id);
}else if(index.column() == 1) {
   query.prepare("update articles set article_name = ? where id = ?");
   query.addBindValue(value.toString());
   query.addBindValue(id);
}else if(index.column() == 2) {
   query.prepare("update sales set kol_vo = ? where id = ?");
   query.addBindValue(value.toInt());
   query.addBindValue(id);
}else if(index.column() == 3) {
   query.prepare("update sales set dat_real = ? where id = ?");
   query.addBindValue(value.toDate());
   query.addBindValue(id);
}
   ok = query.exec();
   refresh();
   return ok;
}


void MyModel::refresh() {
   setQuery("select cities.city_name,  articles.article_name, sales.kol_vo, sales.dat_real FROM `sales`, `cities`, `articles` WHERE  sales.sit_key = cities.id_key_city AND sales.art_key = id_key_art ORDER BY  sales.dat_real DESC , cities.city_name");
}
Записан
-=QT=-
Гость
« Ответ #18 : Август 10, 2007, 13:14 »

А использование Qt::EditRole есть ? в data() ---  :roll:
и я бы добавил - db.transaction(); - db.rollback();  - db.commit();

Код:
	if(!q.exec())
{
QMessageBox::critical(0,"",q.lastError().text());
db.rollback();
return false;
}
Записан
linuxoid
Гость
« Ответ #19 : Август 10, 2007, 13:37 »

всё уже почти получилось,вот тока напиши пожалуйста какой-нибудь код(для моего примера или нет не важно) как использовать  Qt::EditRole db.transaction(); - db.rollback(); - db.commit();

добавлено спустя 18 минут:

 вот моя data опиши или покажи код с Qt::EditRole пожалуйста

QVariant MyModel::data(
                  const QModelIndex &index,
                  int role) const {
                     
         QVariant value = QSqlQueryModel::data(index, role);   
         switch (role) {   
            
      case Qt::DisplayRole:      
      case Qt::EditRole:         
                  
                  if (index.column() == 3 && role == Qt::EditRole)   
                     return value.toDate().toString("dd.MM.yyyy");
                              
                        }
   return value;
}
Записан
-=QT=-
Гость
« Ответ #20 : Август 10, 2007, 13:54 »

Код:
QVariant MyModel::data(const QModelIndex &index, int role) const 
{
QVariant value = QSqlQueryModel::data(index, role);
switch (role)
  {
    case Qt::DisplayRole:
    case Qt::EditRole:

    if (index.column() == 3 && role == Qt::DisplayRole)
              return value.toDate().toString("dd.MM.yyyy");
  }
return value;
}


Так должно работать....
Записан
linuxoid
Гость
« Ответ #21 : Август 10, 2007, 14:08 »

всё равно не применяет изменения!

а в setData:
query.prepare("update cities set city_name = ? where id = ?");

id чё указывает может надо id призязанный к определённой таблице указать?

добавлено спустя 3 минуты:

 точно!я добавил
 if(!q.exec())
   {
      QMessageBox::critical(0,"",q.lastError().text());
      db.rollback();
      return false;
   }
и ошибка вылетела Unknown column 'id' in 'where clause' QMYSQL3: Unable to prepare statement
как мне описать id?
Записан
-=QT=-
Гость
« Ответ #22 : Август 10, 2007, 14:36 »

может так :
query.prepare("update cities c set c.city_name = ? where c.id = ?");
Записан
linuxoid
Гость
« Ответ #23 : Август 10, 2007, 14:42 »

пишет:
Unknown column 'с.id' in 'where clause' QMYSQL3: Unable to prepare statement

у меня кстати в таблице cities не id а id_key_city может надо поставить его?
Записан
-=QT=-
Гость
« Ответ #24 : Август 10, 2007, 15:10 »

:mrgreen:  АГА  :mrgreen:  :mrgreen:  :mrgreen:  :mrgreen:
Записан
linuxoid
Гость
« Ответ #25 : Август 10, 2007, 15:50 »

bool MyModel::setData(const QModelIndex &index,const QVariant &value,int /* role */) {
if (index.column() < 0 || index.column() > 3)
return false;
QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
int id = QSqlQueryModel::data(primaryKeyIndex).toInt();
bool ok;
QSqlQuery query;
if (index.column() == 0) {
query.prepare("update cities set city_name = ? where id = ?");
query.addBindValue(value.toString());
query.addBindValue(id);


пожалуйста напиши построчный коммент!
Записан
-=QT=-
Гость
« Ответ #26 : Август 10, 2007, 21:13 »

Цитата: "linuxoid"
bool MyModel::setData(const QModelIndex &index,const QVariant &value,int /* role */) {
if (index.column() < 0 || index.column() > 3)
return false;
///// Типа не попали в вилку и отвали
QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
int id = QSqlQueryModel::data(primaryKeyIndex).toInt();
bool ok;
/// типа получил ID кортежа (в чем я очень сомневаюсь id Непонимающий QSqlQueryModel откуда берется)

QSqlQuery query;
/// Если индекс колонки  0 то выплняем запрос к таблице cities
if (index.column() == 0 ) {
query.prepare("update cities set city_name = ? where id = ?");
query.addBindValue(value.toString());
query.addBindValue(id);


пожалуйста напиши построчный коммент!


Ну что пришло на ум "в пятницу вечером после 2л. пива"
Записан
-=QT=-
Гость
« Ответ #27 : Август 11, 2007, 20:31 »

Ну что получилось ?  (Суббота после шашлыка и ящика пива).
Записан
linuxoid
Гость
« Ответ #28 : Август 13, 2007, 08:56 »

не получается!нужно чтобы менялось значение выбранной ячейки,а

в таблице cities city_name имеет уникальный номер id_key_city
if (index.column() == 0 ) {
query.prepare("update cities set city_name = 'Абакан' where id_key_city = 1");
так вот такая запись меняет все ячейки с именем Абакан в редактируемой таблице на значение, которое я вписываю в ячейку,а мне надо чтобы оно меняло только в одной выбранной ячейке.
Есть какие мысли по этому поводу?
Записан
-=QT=-
Гость
« Ответ #29 : Август 13, 2007, 09:41 »

model->setQuery("select cities.city_name, articles.article_name, sales.kol_vo, sales.dat_real FROM `sales`, `cities`, `articles` WHERE sales.sit_key = cities.id_key_city AND sales.art_key = id_key_art ORDER BY sales.dat_real DESC , cities.city_name");

Значит : sales.sit_key = cities.id_key_city Для то го чтобы изменить данные в таблице нужно знать этот id_key_city или sales.sit_key и использовать его в :
Код:
query.prepare("update cities set city_name = 'Абакан' where id_key_city = 1");
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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