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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Про QSqlRealationalTableModel и неочевидную связь  (Прочитано 4949 раз)
crocus
Гость
« : Сентябрь 11, 2007, 05:57 »

Казалось задача тривиальная.
Есть таблица объектов:
Код:
        modelFlats = new QSqlRelationalTableModel( this );
modelFlats->setTable( "tbl_flats" );
if ( !modelFlats->select() )
{
return ;
}
Есть связанная с ней таблица улиц:
Код:
        streetIdx = modelFlats->fieldIndex( "street_cod" );
modelFlats->setRelation( streetIdx, QSqlRelation( "tbl_street", "street_cod", "street_name" ) );
cdi.comboStreet->setEditable ( true );
cdi.comboStreet->setModel( modelFlats->relationModel( streetIdx ) );
cdi.comboStreet->setModelColumn( modelFlats->relationModel( streetIdx ) ->fieldIndex( "street_name" ) );
cdi.comboStreet->setCurrentIndex( 0 );
           cdi.comboStreet->setAutoCompletion(true);

И есть еще таблица городов (tbl_city), связанная c улицами через tbl_street.city_cod = tbl_city.city_cod, в таблице объектов (tbl_flats) столбец city_cod - отсутствует, поскольку избыточен. Тем не менее город отображать надо --улицы не уникальны.
Отображение объекта на форме делаю так:
Код:
   modelFlats->setFilter( "flats_cod = " + FlatsCod );
   QSqlRecord rec = modelFlats->record( 0 );
   cdi.comboStreet->setCurrentIndex( cdi.comboStreet->findText( rec.value( streetIdx ).toString() ) );
     

Вопрос: как получить "город" или по крайней мере "street_cod" (в приведенном коде сразу получаем "street_name"), повторяюсь по названию улицы город не найдем(не уникальна) только по коду.
Записан
stealth
Гость
« Ответ #1 : Сентябрь 14, 2007, 19:55 »

я для этого использую еще одну таблицу соответсвия итемов из combobox и их ID, некрасиво правда это всё... так что может еще кто-что придумал?
Записан
Вячеслав
Гость
« Ответ #2 : Сентябрь 14, 2007, 20:15 »

БД какая ? на нормальных можно вьюху (view) сделать и по ней прыгать Подмигивающий Ну и от умности сервера inserrt\update\delete или на тригерах\хп или руками .... Подмигивающий
Записан
Вячеслав
Гость
« Ответ #3 : Сентябрь 15, 2007, 13:18 »

БД MySQL.
Вот вариант - но для меня не подходит:
Код:
QString streetdata = modelFlats->relationModel( streetIdx )->data(modelFlats->relationModel( streetIdx )->index(cdi.comboStreet->currentIndex(),0)).toString();

Блин ну должно же быть это просто - связывание то происходит все равно по "_cod", т.е. получить значение поля надо  еще до реляции...
в мускуле же можно create view сазать Подмигивающий вроде ?
Записан
Вячеслав
Гость
« Ответ #4 : Сентябрь 15, 2007, 18:00 »

to:Вячеслав
Перечитай-ка свои посты, может вообще ничего не стоило писать?
Ляпнул-брякнул и пошел... Какая вьюха бля, какой триггер...хз...
Причем здесь вообще это??
Вообще-то как-раз причем .Чем заниматься проктологией на клиенте НАМНОГО проще объяснить серверу, что данные надо отдовать в другом виде .... И если лень подумать малость то зачем орать ?
Код:
CREATE TABLE BUILDING (
    ID          INTEGER NOT NULL,
    STREET_REF  INTEGER,
    NAME        VARCHAR(32)
);


CREATE TABLE CITY (
    ID    INTEGER NOT NULL,
    NAME  VARCHAR(32)
);


CREATE TABLE STREET (
    ID        INTEGER NOT NULL,
    CITY_REF  INTEGER,
    NAME      VARCHAR(32)
);
Код:
CREATE VIEW BUILDING_WITH_CITY(
    CITY_ID,
    NAME,
    STREET_ID,
    BUILDING_ID)
AS
select city.id as city_id, building.name, street.id as street_id, building.id as building_id
from building
   inner join street on (building.street_ref = street.id)
   inner join city on (street.city_ref = city.id)
;

Написано на коленке -  но для примера сойдет .... И что не удовлетворяет ?
Записан
Вячеслав
Гость
« Ответ #5 : Сентябрь 15, 2007, 19:25 »

Или я объяснить немогу, или ты понять неможешь??
Задайся вопросами:
1. зачем я вообще делаю связывание
2. нахрена мне код "улиц" (из примера)
3. и что получим
Код:
  cdi.comboStreet->setCurrentIndex( cdi.comboStreet->findText( rec.value( streetIdx ).toString() ) );
если улица Ленина есть в каждом городе

И ответы:
1. запись в таблице может редактироваться.
2. названия улиц не уникальны (уникален "street_cod")
3. подставит первую- какую найдет
Взаимно Подмигивающий Мы говорим о разном ж)
Ты пытаешься ситуевину на клиенте разрулить - я на сервере ....

Цитировать
И есть еще таблица городов (tbl_city), связанная c улицами через tbl_street.city_cod = tbl_city.city_cod, в таблице объектов (tbl_flats) столбец city_cod - отсутствует, поскольку избыточен.
И что мешает с помощью view добавить искомое ?

С моей колокольни проще на клиента выгрести данные такие как нужно для работы.
А вообще может в аську пойдем дабы флейм не разводить ?



PS доку в ассистенте читал и формочки рсиовал подобные пока на ОМ не убежал Подмигивающий
« Последнее редактирование: Сентябрь 15, 2007, 19:31 от Вячеслав » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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