Russian Qt Forum

Qt => Базы данных => Тема начата: crocus от Сентябрь 11, 2007, 05:57



Название: Про QSqlRealationalTableModel и неочевидную связь
Отправлено: 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"), повторяюсь по названию улицы город не найдем(не уникальна) только по коду.


Название: Re: Про QSqlRealationalTableModel и неочевидную связь
Отправлено: stealth от Сентябрь 14, 2007, 19:55
я для этого использую еще одну таблицу соответсвия итемов из combobox и их ID, некрасиво правда это всё... так что может еще кто-что придумал?


Название: Re: Про QSqlRealationalTableModel и неочевидную связь
Отправлено: Вячеслав от Сентябрь 14, 2007, 20:15
БД какая ? на нормальных можно вьюху (view) сделать и по ней прыгать ;) Ну и от умности сервера inserrt\update\delete или на тригерах\хп или руками .... ;)


Название: Re: Про QSqlRealationalTableModel и неочевидную связь
Отправлено: Вячеслав от Сентябрь 15, 2007, 13:18
БД MySQL.
Вот вариант - но для меня не подходит:
Код:
QString streetdata = modelFlats->relationModel( streetIdx )->data(modelFlats->relationModel( streetIdx )->index(cdi.comboStreet->currentIndex(),0)).toString();

Блин ну должно же быть это просто - связывание то происходит все равно по "_cod", т.е. получить значение поля надо  еще до реляции...
в мускуле же можно create view сазать ;) вроде ?


Название: Re: Про QSqlRealationalTableModel и неочевидную связь
Отправлено: Вячеслав от Сентябрь 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)
;

Написано на коленке -  но для примера сойдет .... И что не удовлетворяет ?


Название: Re: Про QSqlRealationalTableModel и неочевидную связь
Отправлено: Вячеслав от Сентябрь 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 доку в ассистенте читал и формочки рсиовал подобные пока на ОМ не убежал ;)