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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Двойная реляционная связь  (Прочитано 7976 раз)
iamfomik
Гость
« : Сентябрь 01, 2008, 08:57 »

Вопрос такой. Есть, допустим, таблица clients в которой есть поля ClientID, Firstname и Lastname. Есть также таблица заказов - orders, в которой есть внешняя ссылка на таблицу клиентов - ClientNr.
Как при помощи стандартных моделей вывести таблицу заказов, в которой были бы и имя клиента и его фамилия.
Вся проблема в том, что при объявлении реляционных связей типа QSqlRelaion(....) можно связать столбец ClientNr только с одним из полей таблицы Clients.
В SQL ваианте оно могло бы быть реализовано так  - SELECT clients.Firstname, clients.Lastname FROM clients, orders WHERE orders.ClientNr=clients.ClientID;
Как такое сделать моделями? Просто не хочется свою собственную модель писать, так как это было бы лишним. Разве что написать какую-нить свою прокси модель....
Записан
crossly
Гость
« Ответ #1 : Сентябрь 01, 2008, 09:00 »

а почему бы не вывести фамилию и имя в одном столбце.... выводить в разных не вижу смысла...
Записан
iamfomik
Гость
« Ответ #2 : Сентябрь 01, 2008, 10:21 »

Ну во-первых так требуется заказчиком.
А во-вторых, как это сделать при помощи моделей??? QSqlQueryModel тут не поможет, потому как:
Цитировать
The QSqlQueryModel class provides a read-only data model for SQL result sets.
То есть она только чтобы показывать данные, а мне нужно чтобы ещё и редактировалось.

Вот кстати ещё вопрос в догонку - как в модели можно соединить два столбца? То есть чтобы выводило Firstname+Lastname
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #3 : Сентябрь 01, 2008, 10:50 »

как я понимаю вы используете ORM модели?
в них отношения очень плохо реализованы
Записан
iamfomik
Гость
« Ответ #4 : Сентябрь 01, 2008, 11:08 »

как я понимаю вы используете ORM модели?
в них отношения очень плохо реализованы

Честно говоря не совсем понял что за ORM модели, и даже википедия не помогла =)
Использую стандартную модель QT - QSqlRelationalTableModel.

Судя по всему обычными средствами такое не проделать, придётся либо свою модель написать, либо прокси модель?
Как такое сделать попроще? Можно хотя бы идеи.

Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #5 : Сентябрь 01, 2008, 11:30 »

use google  Улыбающийся
http://ru.wikipedia.org/wiki/ORM

я бы сделал шикарный SQL запрос - и данные оттуда выбрал - так гибкости больше
Записан
iamfomik
Гость
« Ответ #6 : Сентябрь 01, 2008, 11:57 »


Да не, я про википедию и сам догадался, просто не понял в каком контексте ORM имеется ввиду здесь....ну да ладно, не так уж и важно....


А по поводу SQL запроса - просто запрос не позволяет редактировать данные.

Вообще я эту проблему решал созданием в БД представлений, например так:
Код:
CREATE VIEW orders_view AS SELECT clients.Firstname, clients.Lastname FROM clients, orders WHERE orders.ClientNr=clients.ClientID;
А потом полученную таблицу использовал в качестве аргумента для QSqlTableModel. Всё работает хорошо, и даже редактируются нужные поля, но как-то это неправильно.....Только из-за того чтобы дополнительную объектную связь отобразить приходится создавать новую почти таблицу....не заню, хорошо ли такое расточительство....
Записан
ритт
Гость
« Ответ #7 : Сентябрь 01, 2008, 15:02 »

вьюха - это не таблица...и даже не почти-таблица Улыбающийся
если неохота возиться с кутэ, вьюха - самое то

как вариант можно написать свой делегат и опционально подобие QSqlRelation (если потом захочется удобств)
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Сентябрь 03, 2008, 03:37 »

Вроде в представлении (в БД) данные нельзя редактировать если представление из нескольких таблиц собирается. Поправте если я не прав.

А в Qt можно сделать наследника от QSqlQueryModel и как сказал Константин реализовать редактируемое "подобие QSqlRelation"
Записан

Юра.
ритт
Гость
« Ответ #9 : Сентябрь 03, 2008, 06:08 »

а, ну да - ему ж редактировать надо - тогда вью не подходит
остаётся только делегат
Записан
Alex03
Гость
« Ответ #10 : Сентябрь 03, 2008, 06:19 »

Вроде в представлении (в БД) данные нельзя редактировать если представление из нескольких таблиц собирается.
Возможности редактирования вьюх сильно зависят от используемой СУБД и её версии...
Поправте если я не прав. Улыбающийся

Вообще я эту проблему решал созданием в БД представлений, например так:
Код:
CREATE VIEW orders_view AS SELECT clients.Firstname, clients.Lastname FROM clients, orders WHERE orders.ClientNr=clients.ClientID;
Чтото я тут не понял, а поля из orders в этой вьюхе то есть или как?
Да и вообще не понял как тут редактирование производится в Qt....

Как вариант можно сделать другую вьюху
Код:
CREATE VIEW client_view AS SELECT ClientID, Firstname || ' ' || Lastname as Name, ... FROM clients;
И уже эту вьюху подсовывать в QSqlRelaion().
Надеюсь Вам при редактировании заказов не надо редактировать (добавлять/удалять) имена клиентов, только иметь возможность изменить клиента для заказа?
« Последнее редактирование: Сентябрь 03, 2008, 06:22 от Alex03 » Записан
iamfomik
Гость
« Ответ #11 : Сентябрь 04, 2008, 22:20 »

Вроде в представлении (в БД) данные нельзя редактировать если представление из нескольких таблиц собирается.
Возможности редактирования вьюх сильно зависят от используемой СУБД и её версии...
Поправте если я не прав. Улыбающийся

Вообще я эту проблему решал созданием в БД представлений, например так:
Код:
CREATE VIEW orders_view AS SELECT clients.Firstname, clients.Lastname FROM clients, orders WHERE orders.ClientNr=clients.ClientID;
Чтото я тут не понял, а поля из orders в этой вьюхе то есть или как?
Да и вообще не понял как тут редактирование производится в Qt....


Как вариант можно сделать другую вьюху
Код:
CREATE VIEW client_view AS SELECT ClientID, Firstname || ' ' || Lastname as Name, ... FROM clients;
И уже эту вьюху подсовывать в QSqlRelaion().
Надеюсь Вам при редактировании заказов не надо редактировать (добавлять/удалять) имена клиентов, только иметь возможность изменить клиента для заказа?

Самое интересное, что при использовании вьюх с моделями, они становятся редактируемыми! Почему я их и использовал. Естественно поля типа Firstname || ' ' || Lastname as Name не будут редактироваться зато всё остальное редактируется, проверено лично. На счёт добавления не знаю, не проверял, но тоже должно работать. А вот кстати я тоже раньше думал что вьюхи только для чтения, однако недавно ещё заметил что из phpMyAdmin вьюхи тоже можно изменять, так что их редактируемость, действительно, зависит от БД.
Alex03, там про orders и тд - это просто пример.
Фактически можно использовать такую вьюху
Код:
CREATE VIEW orders_view AS SELECT 
orders.ClientNr as firstNameID, orders.ClientNr as LastNameId FROM clients, orders WHERE orders.ClientNr=clients.ClientID;
А потом в коде через QSqlRelations всё это связать.

Я думаю что наипростейшим вариантом всё-таки будет создать не новую модель, как я считал раньше, а новое отображение - тот же QTableView, только один столбец по другому отображать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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