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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlTableModel и view  (Прочитано 7397 раз)
crossly
Гость
« : Март 28, 2008, 15:47 »

имеется вьюшка.... 3 тригера (вставка, редактирование, удаление).... использую QSqlRelationalTableModel... новая запись вставляется без проблем, а вот апдэйт и удаление не работают... мот кто сталкивался....??
Записан
stealth
Гость
« Ответ #1 : Апрель 04, 2008, 19:25 »

не совсем понятен вопрос, вьюшка в БД? если да, то редактирование и удаление работать отказываются скорее всего из-за каких-либо неопределённостей, которые получает БД
Записан
crocus
Гость
« Ответ #2 : Апрель 05, 2008, 02:11 »

похоже,что в таблице нет ключа
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Апрель 06, 2008, 08:24 »

а вот апдэйт и удаление не работают... мот кто сталкивался....??
а как это проявляется, БД ошибку дает? Если да, то какую?
Записан

Юра.
Shamil
Гость
« Ответ #4 : Март 18, 2009, 18:00 »

Подниму тему, аналогичная проблема.
Дано: SQLite, таблицы "recipes" и "units", вьюшка "recipes_units", триггеры "insert_recipe", "update_recipe", "delete_recipe"

Код:
CREATE TABLE recipes (id INTEGER PRIMARY KEY AUTOINCREMENT, food INTEGER, ingredient INTEGER, quantity REAL)

CREATE TABLE units (id INTEGER PRIMARY KEY, name TEXT)

CREATE VIEW recipes_units
  AS SELECT recipes.id AS id, recipes.food AS food, recipes.ingredient AS ingredient, recipes.quantity AS quantity, ingredients.unit as units
  FROM recipes, ingredients WHERE recipes.ingredient = ingredients.id

CREATE TRIGGER insert_recipe INSTEAD OF INSERT ON recipes_units
BEGIN
  INSERT INTO recipes (food, ingredient, quantity) VALUES (new.food, new.ingredient, new.quantity);
END

CREATE TRIGGER update_recipe INSTEAD OF UPDATE ON recipes_units
BEGIN
  UPDATE recipes SET food=new.food, ingredient=new.ingredient, quantity=new.quantity WHERE id=old.id;
END

CREATE TRIGGER delete_recipe INSTEAD OF DELETE ON recipes_units
BEGIN
  DELETE FROM recipes WHERE id=old.id;
END

m_pRecipesModel->setTable("recipes_units");

Проблема та же: pRecipesModel->insertRow работает, а pRecipesModel->removeRow не приводит ни к каким результатам, обновление тоже не работает. Ошибок эти функции не возвращают.

При этом если делать через запросы типа
Код:
UPDATE recipes_units SET quantity=13 WHERE id=1
DELETE FROM recipes_units WHERE id=1
то все нормально.

Нет мыслей?
Записан
miha-ha
Гость
« Ответ #5 : Март 19, 2009, 09:55 »

Обрати внимание:
CREATE VIEW recipes_units
  AS SELECT recipes.id AS id, recipes.food AS food, recipes.ingredient AS ingredient, recipes.quantity AS quantity, ingredients.unit as units
  FROM recipes, ingredients WHERE recipes.ingredient = ingredients.id

а где описание таблицы: ingredients Непонимающий?
Может в этом проблема?
Записан
Shamil
Гость
« Ответ #6 : Март 19, 2009, 11:36 »

Я описание ingredients не привел просто, вот оно:
Код:
CREATE TABLE ingredients (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, quantity REAL, unit INTEGER)

У меня такое чувство, что Qt обновление и удаление делает как-то не через запросы UPDATE и DELETE, а иначе. Хотя глупость наверное Улыбающийся

В удалении можно removeRow заменить на запрос DELETE. А вот как с обновлением быть, надо глубже в дебри лезть  Шокированный
Записан
miha-ha
Гость
« Ответ #7 : Март 20, 2009, 09:29 »

Возможно дело в Sqlite... вот что нарыл:
"В SQLite "VIEW"-хи доступны только для чтения. На вьюхах вы не можете выполнять операции "DELETE", "INSERT" или "UPDATE". Но, если вы в этом нуждаетесь, то можете создать триггер, который запросами в своем теле выполнит "DELETE", "INSERT" или "UPDATE" вьюхи. "
но триггеры ведь создаются....

« Последнее редактирование: Март 20, 2009, 09:32 от miha-ha » Записан
miha-ha
Гость
« Ответ #8 : Март 20, 2009, 10:57 »

Вот что пишут на http://www.sqlite.org/lang_createtrigger.html:
Note that currently, triggers may behave oddly when created on tables with INTEGER PRIMARY KEY fields. If a BEFORE trigger program modifies the INTEGER PRIMARY KEY field of a row that will be subsequently updated by the statement that causes the trigger to fire, then the update may not occur. The workaround is to declare the table with a PRIMARY KEY column instead of an INTEGER PRIMARY KEY column.

Последнее предложение говорит, что возможно придется изменить INTEGER PRIMARY KEY на PRIMARY KEY...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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