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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlRelation и фильтр  (Прочитано 9816 раз)
hamlo
Гость
« : Октябрь 15, 2009, 08:36 »

Собсвенно
Код:
actTableView = new QTableView(this);
model = new QSqlRelationalTableModel;
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setTable("mediko_economic_certificate");
model->setFilter("act_id = "+QVariant(++*actId).toString()+" AND is_deleted=0");
model->select();
model->setRelation(14, QSqlRelation("infringement_main_point_list","infrigement_point","infrigement_point"));
actTableView->setModel(model);
actTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
actTableView->show();
actTableView->setItemDelegate(new QSqlRelationalDelegate(actTableView));

1. Вопрос - почему порядок, указанный в документации сначала setRelation() а  затем select() - НЕ работает(по крайней мере в этом случае, возможно я что то упускаю), так же как и порядок из доки setItemDelegate() а затем show().

2. Основной вопрос: в таблице  infringement_main_point_list надо выбирать не все записи в выпадающий список, а только те, у которых is_deleted=0. Напрашивается вопрос: есть ли для QSqlRelation какое либо окольное решение, которое бы давало эффект setFilter() для основной модели.
« Последнее редактирование: Октябрь 15, 2009, 09:56 от hamlo » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


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

1) вообще то для QSqlRelationTableModel так и указано - сначало setTable() - кот. откроет модель, затем setRelation - код из ассистента

Цитировать
The following code snippet shows how the QSqlRelationalTableModel was set up:

     model->setTable("employee");

     model->setRelation(2, QSqlRelation("city", "id", "name"));
     model->setRelation(3, QSqlRelation("country", "id", "name"));

вторую часть вопроса я не понял - зачем там show - таблица что не вставлена нив какое родительское окошко?

2) вохоже что в QSqlRelation действительно нет возможности задать фильтр - простейший способ выхода из ситуации написать своего делегата кот. будет и отображать данные верно и позволять редактировать давая отсеивая только нужные. Можете написать продвинутый QSqlRelationDelegate с возможностью задать фильтры на все случаи жизни для табличек. Тогда может удасться обойтись там вообще без setRelation...

Записан
Marat(Qt)
Гость
« Ответ #2 : Октябрь 16, 2009, 08:27 »

По поводу фильтра:
для этого делают представление с выборкой и задают relation для нее а не для оригинальной таблицы
Записан
hamlo
Гость
« Ответ #3 : Октябрь 16, 2009, 10:43 »

Отказался от Relation. Написал свою фукцию, которая обрабатывает значение одного поля и устанавливая его значение как ключ - выбираются значения из нужной таблицы. Сейчас времени нет - но собсвенная реализация делегата - необходима, чем и займусь попозже - сейчас важен результат.

ЗЫ За дефолтное отсутствие параметра фильтров у relation  - Qt - как библиотеке огромный минус. Ещё минус - за некорректную работе removeColumn(idx) у моделей. Не сдвигает указатели на столбец - это официальный баг. Вообщеем работать и работать TrollTech у ещё над фреймворком..
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #4 : Октябрь 17, 2009, 00:34 »

Цитировать
для этого делают представление с выборкой и задают relation для нее а не для оригинальной таблицы
Чё?
К вьюхе что-то чтоли хотите прикрутить? Если же вы имеете ввиду View - ы которые есть в некоторых БД то увы чаще всего они READONLY
Записан
Marat(Qt)
Гость
« Ответ #5 : Октябрь 17, 2009, 11:22 »

View конечно readonly, никто их содержимое менять не собирается, надо просто с помощью qsqlrelation сделать подстановку из view, при этом при изменении поля будет меняться не содержимое view, а содержимое таблицы, в которую производится подстановка. Если view содержит не все строки, например нет строки номер 5, то все строки исходной таблицы, требующие 5-тую строку для подстановки просто спрячутся, т.е. отфильтруются, как этого хотел топикстартер

Цитировать
К вьюхе что-то чтоли хотите прикрутить?
Естесственно речь идет о View из БД
« Последнее редактирование: Октябрь 17, 2009, 11:28 от Marat(Qt) » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


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

Цитировать
надо просто с помощью qsqlrelation сделать подстановку из view,
Может это окажется решением но далеко не во всех случаях(я даже считаю что это костыль - правильное решение это вставка необходимого текста  select * from .... в QSqlRelation - жаль этой ф-сти нет там) - если например есть таблица с колонками

ГРУППА \ УЧЕНИК

и от поля группа - должны зависеть возможные списки значений таблицы ученик - делать все возможные варианты VIEW - неправильно, а если выбирать уже из VIEW - то почему не выбирать из самой таблицы...
Записан
Marat(Qt)
Гость
« Ответ #7 : Октябрь 17, 2009, 23:55 »

Цитировать
делать все возможные варианты VIEW - неправильно
view - не так уж и сложно сделать, по сути это запрос на выборку, имеющий свое имя.
Ну допустим создали вы view с именем view1 - воспользовались, нужен другой view, в старом необходимость отпала, пожалуйста, создали новый view поверх старого - снова view1 - воспользовались... Не думаю что это будет нагружать БД, ибо view ничуть не сложнее запроса. А вот то что данные фильтруются на стороне сервера - это хорошо, меньше данных перекидывать.

Цитировать
если выбирать уже из VIEW - то почему не выбирать из самой таблицы...
из view никто не выбирает, он берется целиком, так как все выборки уже в нем

Цитировать
я даже считаю что это костыль
а я считаю, что то, чего вы хотите - велосипед, ибо все уже в субд имеется
« Последнее редактирование: Октябрь 18, 2009, 00:05 от Marat(Qt) » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


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

Цитировать
view - не так уж и сложно сделать, по сути это запрос на выборку
Да вы похоже не понимаете о чем говорите я работаю с БД firebird - там View деалется как таблица и деалть его в коде каждый раз когда нужно совершенное неудобно, параметризированных VIEW не бывает - да это идиотизм т.к. проще сделать отдельный запрос

Цитировать
Не думаю что это будет нагружать БД, ибо view ничуть не сложнее запроса. А вот то что данные фильтруются на стороне сервера - это хорошо, меньше данных перекидывать.
В коде - в коде - в коде представь создание вьева, использование, удаление - create VIEW /...,,,,,,,, drop VIEW и т.д. нах это нужно? кроме того где я по твоему предложил фильтровать данные на клиенте??? в улучшенный QSqlRelation  или в своем делегате надо выполнять запрос с параметром для возврата необходимого списка значений комбобокса - и в обоих случаях данные ( не подходящие записи) фильтруются на сервере!!!

Цитировать
из view никто не выбирает, он берется целиком, так как все выборки уже в нем
я не знаю с какой вы БД работаете - но в FB вьев это фактически однократная выборка - то есть запрос - может с джойном, может с использованием сложной хранимой процедуры - и это SQL код - сам по себе в БД он данных не содержит!!! а когда я работаю с VIEW я делаю так как будто выбираю из таблицы

select *
from MY_VIEW

и тут уже идет выборка из VIEW - так что сори за язык но "не парь мне мозг" ты в тематике плаваешь!!!

Цитировать
а я считаю, что то, чего вы хотите - велосипед, ибо все уже в субд имеется
а вот с этого момента поподробнее т.к. то что описал я это и есть то что имеется в СУБД а вы хотите катамаран со своими VIEW-ами
Записан
Marat(Qt)
Гость
« Ответ #9 : Октябрь 18, 2009, 00:50 »

К чему такие эмоции?
Код:
query.exec("CREATE OR REPLACE VIEW имя_представления AS запрос");
Это правда похоже на катамаран? тебе так сложно написать свой запрос после AS а не в делегате или где либо еще? назначение запросу имени - зверски снижает производительность? в честь чего?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


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

Я и слова не сказал про производительность - а вот то что это делать(создавать VIEW) в коде для создания списка возможных значений комбобокса НЕУДОБНО - это очевидно - т.к. каждый раз мы создаем VIEW - потом его надо удалять, следить чтобы он не остался в БД в качестве хлама и т.д. зачем это? какую роль играет VIEW если на этом же месте можно сделать запрос? И все же я не получил ответа на остальные вопросы...
Записан
Marat(Qt)
Гость
« Ответ #11 : Октябрь 18, 2009, 01:23 »

Цитировать
и деалть его в коде каждый раз когда нужно совершенное неудобно

Цитировать
каждый раз мы создаем VIEW - потом его надо удалять, следить чтобы он не остался в БД в качестве хлама и т.д. зачем это?

Цитировать
удаление - create VIEW /...,,,,,,,, drop VIEW и т.д. нах это нужно?

Цитировать
правильное решение это вставка необходимого текста  select * from .... в QSqlRelation

Раз уж все так безвыходно, буду ждать пока вы сделаете патч с "правильным" решением...
а пока у меня все нормально работает и никаких неудобств я не ощущаю.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


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

Не знаю что у вас там бузвыходно у меня эта ситуация работает со своим делегатом комбобокса без всяких городушек с вьюв.
Записан
Marat(Qt)
Гость
« Ответ #13 : Октябрь 18, 2009, 02:04 »

у меня эта ситуация работает со своим представлением без всяких городушек с делегатами
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


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

А если значения выпадающего списка должны зависеть от соседних полей, кот. пользователь может поменять? - будете создавать новые ВЬЕВы снова и снова? То есть плодить метаданные сомнительной необходимости в БД?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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