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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: SQLite & transaction()  (Прочитано 16812 раз)
Krow
Гость
« Ответ #15 : Октябрь 19, 2009, 15:20 »

нет, я специально для того чтобы проверить насколько оно работае. закрывал все открытые БД. переоткрывал нужную БД, и запускал чисто этот кусок кода.. одна фигня.. но ничего... буду мучать код сегодня ночью ещё.. авось найду то место где программист из программиста стал дураком...
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #16 : Октябрь 19, 2009, 16:49 »

не мучайся - скинь свой код(рабочий тестовый пример) и болванку базы - мы совместно быстрее разберемся
Записан
Krow
Гость
« Ответ #17 : Октябрь 19, 2009, 17:28 »

в mainWindow добавляется БД.
вот так:
Код:
bool mainWindow::createConnectionTovar()
{
QSqlDatabase db_tovar = QSqlDatabase::addDatabase("QSQLITE", "tovar");
QString file;
if (!flagSklad)
file=tr("bd")+QDir::separator()+dirCount+QDir::separator()+"tovar.db";
else
file=tr("bd")+QDir::separator()+dirCountSklad+QDir::separator()+"tovar.db";
db_tovar.setDatabaseName(file);
}

и чуть ниже приведены основные процедуры в чайлде.
Код:
void fTovCat::showModel()
{
model = new QSqlTableModel(this, DB_Tovar);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setTable("tovar");
...
showTovar();
             ...
}

void fTovCat::showTovar()
{
QString filter;
if (firmFilter != "")
filter = firmFilter;
if (searchFilter != "")
if (filter != "")
filter += " AND "+searchFilter;
else
filter = searchFilter;
if (ostatokFilter != "")
if (filter != "")
filter += " AND "+ostatokFilter;
else
filter = ostatokFilter;
model->setFilter(filter);
model->select();
ui.tableView->resizeColumnsToContents();
ui.tableView->resizeRowsToContents();
}
fTovCat::fTovCat()
{
ui.setupUi(this);
...
//Подключаем БД
DB_Tovar = QSqlDatabase::database("tovar");
if (!DB_Tovar.open())
{
QMessageBox::critical(0, qApp->tr("Ошибка"),
      qApp->tr("Не удалось открыть базу данных"), QMessageBox::Cancel);
}

}

void fTovCat::pbNullRecordClicked()
{
/*QStringList listDB = QSqlDatabase::connectionNames();
for (int k=0; k<listDB.count(); k++)
{
QMessageBox::information(0, "", listDB[k]);
}*/
QMessageBox::StandardButton ret;
ret = QMessageBox::warning(this, tr("Предупреждение"),
                      tr("Вы действительно хотите обнулить значения всех записей?"),
  QMessageBox::Yes | QMessageBox::No);
if (ret == QMessageBox::No)
return;
QString search;
if (itemColumn->text(columnItem).trimmed() != "")
{
if (columnItem == 0)
search = "";
else
search = tr(" WHERE firm = '%1'").arg(itemColumn->text(columnItem).trimmed());

/*DB_Tovar.close();
if (!DB_Tovar.open())
{
QMessageBox::critical(0, qApp->tr("Ошибка"),
      qApp->tr("Не удалось открыть базу данных"), QMessageBox::Cancel);
}*/
//if (DB_Tovar.transaction())
//if (!model->database().transaction())
//QMessageBox::warning(0, "", "Not work transaction");
//model->database().transaction();
//model->query().prepare(tr("UPDATE tovar SET kolvo='0'%1").arg(search));
model->query().exec(tr("UPDATE tovar SET kolvo='0'%1").arg(search));
//QMessageBox::warning(0, "", model->);
//QSqlQuery *query = new QSqlQuery(DB_Tovar);
//query->exec(tr("UPDATE tovar SET kolvo='0'%1").arg(search));
//query->finish();
//query->exec(tr("UPDATE tovar SET kolvo='0'%1").arg(search));
model->submitAll();
delete model;
/*DB_Tovar.close();
if (!DB_Tovar.open())
{
QMessageBox::critical(0, qApp->tr("Ошибка"),
      qApp->tr("Не удалось открыть базу данных"), QMessageBox::Cancel);
}*/
showModel();
rbCenaClicked();
QMessageBox::information(0, tr("Информация"), tr("Количество товаров в фирме %1 обнулены!").arg(itemColumn->text(columnItem)));
}
}
в последней процедуре я ппц уже замучался... не знал как поступить.. куча проверок и комментов, за них меня не надо сильно карать.
шаблон создания БД
query->exec("create table tovar (id, code_firm, firm, name, cena_zakup, cena_kr_opt, cena_opt, cena_rozn, percent_kr_opt, percent_opt, precent_rozn, kolvo, prim)");
« Последнее редактирование: Октябрь 19, 2009, 17:39 от Krow » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #18 : Октябрь 19, 2009, 18:59 »

Не знаю что у вас не получается - код некрасивый разбираться не хочется, но я потратил 20 мин - создал SQLite базу с 1 таблицей и маленькое приложение QT кот. изменяет существующие строки - у меня все работает - скидываю вам для теста и сравнения, в конструкторе формы поправьте имя базы - я указал для своенго компьютера полный путь, проект и БД во вложении.
Записан
Krow
Гость
« Ответ #19 : Октябрь 20, 2009, 03:25 »

спасибо. как окончательно проснусь гляну ваш пример..
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #20 : Октябрь 20, 2009, 04:09 »

я думаю понял --- так делать нельзя

Цитировать
model->query().exec(tr("UPDATE tovar SET kolvo='0'%1").arg(search));

попробуйте использовать отдельную QSqlQuery для своих целей не трогая query модели - и все заработает
кстати зачем там tr и 0 перед %1
Записан
Krow
Гость
« Ответ #21 : Октябрь 20, 2009, 08:43 »

я пытался использовать и отдельный sql запрос... запрос то проходит, а вот данные не фиксируются в БД.
что на счёт запроса переменная search может быть пустой, а может принимать значение  "WHERE firm = '%1'" где вместо %1 подставляется фирма подлежащая обнулению..
Записан
Krow
Гость
« Ответ #22 : Октябрь 20, 2009, 08:55 »

вот жешь блин.... всего ничего нужно было... перенести строчку
Код:
model = new QSqlTableModel(this, DB_Tovar);
из процедуры showModel в конструктор...
но чувстую что это не последний вопрос мой заданный в этой теме..
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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