Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

IBDataSet, Master-Detail и Insert [D7, FireBird 1.5]


Страницы:   1 2 3 4 5 6

grav ©   (2008-05-20 09:45:00) 

Есть три связанных IBDataSet.
MasterDS-DetailDS1-DetailDS2. Соответственно Предприятие-Здания-данные по зданию. Предприятий много, у каждого прежприятия зданий много, у каждого здания одна запись с данными (площадь, стоимость и т.д.).
Список предприятий не меняется. Здания могут добавляться, редактироваться и удаляться. Данные по зданию могут редактироваться, удаляться вместе со зданием и добавляться вместе со зданием.
Встака записей в таблицу здания проходит без проблем. Вставка в тблицу с данными по зданию проходит без ошибок, но в таблицу не попадают. Почему? Как отследить что не так, если никаких ошибок не выводится?


Anatoly Podgoretsky   (2008-05-20 15:14:00) [61]

> grav  (20.05.2008 10:40:15)  [15]

У тебя сколько было в школе по математике 100 * 100 <> 1000 далеко не равно.
Слушай, а где это детей допускают до таких больших проектов?
У меня на примете есть хорошая девочка, может возьмете в проект?


Anatoly Podgoretsky   (2008-05-20 15:14:00) [62]

> ЮЮ  (20.05.2008 10:43:16)  [16]

Почему может, это вообще то норма.


grav   (2008-05-20 13:52:00) [63]

Ой как все криво то.
Загнал добавление новой строки в таблицу DATA в кнопку сохранить.
Сначала подтверждаю добавление новой записи в таблицу BUILDING:
BuildDS.Post;
Потом добавляю новую строку в DATA
DetailDS2.Insert;
DetailDS2.FieldByName('ID_ORG').AsInteger:=DetailDS1.FieldByName('ID_ORG').AsInt eger;
DetailDS2.FieldByName('ID_BUILD').AsInteger:=DetailDS1.FieldByName('ID').AsInteg er;
DetailDS2.FieldByName('ID_OBJ').AsInteger:=0;
DetailDS2.Post;

Остальные поля в таблицу DATA заносятся уже редактированием.


grav   (2008-05-20 13:35:00) [64]

Догадался я почему не сохраняются данные при редактировании.
Поскольку я использую кэширование, то по нажатию кнопки Выход на форме производится проверка UpdatesPending всех IBDataSet. Если хоть одно UpdatesPending=True, то я делал ApplyUpdates всех пяти датасетов, независимо в каком поменялись данные, но по порядку начиная с MasterDS.
ApplyUpdates видимо надо делать с нижнего уровня связки мастер -детайл.
Лично для меня это не тривиально и до конца не понятно. Объясните, кто может.
Со вставкой я еще не разобрался.


grav   (2008-05-20 12:46:00) [65]

Убрал для эксперимента из DetailDS2 связывающий DataSource. Все работает.
Вообще тройная связка это нормально (MasterDS-DetailDS1-DetailDS2)?


grav   (2008-05-20 12:33:00) [66]

Да, DetailDS2.

Предполагалось, что insert так grav:   (20.05.08 11:46) [30]
Т.е. должна вставиться пустая строка. Потом из dbedit'ов уже Edit.
Но не работает не только вставка, но и редактирование.
SelectSQL
select * from DATA where ID_ORG=:ID_ORG and ID_BUILD=:ID and ID_OBJ=0

ModifySQL
update DATA
set
 GEN_S = :GEN_S,
 LONG_NET = :LONG_NET,
 PRISE_B = :PRISE_B,
 PRISE_M = :PRISE_M,
 IZNOS_B = :IZNOS_B,
 IZNOS_M = :IZNOS_M,
 STEPEN_B = :STEPEN_B,
 STEPEN_M = :STEPEN_M,
 WATER = :WATER,
 SEWER = :SEWER,
 HEAT = :HEAT
where
 ID_ORG = :OLD_ID_ORG and
 ID_BUILD = :OLD_ID_BUILD and
 ID_OBJ = :OLD_ID_OBJ


ЮЮ   (2008-05-20 12:27:00) [67]

DetailDS2 ?
А какой запрос на выборку?
Он редактируется в гриде или DBEdit-ах. Если второе, то когда делается Insert?


ЮЮ   (2008-05-20 12:17:00) [68]

> Вот запрос на вставку из InsertSQL

Какого датасета?


grav   (2008-05-20 12:05:00) [69]

Вот запрос на вставку из InsertSQL
insert into DATA
 (ID_ORG,ID_BUILD,ID_OBJ,GEN_S, LONG_NET, PRISE_B, PRISE_M, IZNOS_B,
IZNOS_M, STEPEN_B,
STEPEN_M,
  WATER, SEWER, HEAT)
values
 (:ID_ORG,:ID_BUILD,:ID_OBJ,:GEN_S, :LONG_NET, :PRISE_B, :PRISE_M,
:IZNOS_B, :IZNOS_M, :STEPEN_B,
  :STEPEN_M, :WATER, :SEWER, :HEAT)


grav   (2008-05-20 12:03:00) [70]


> Блин, тут целый зоопарк каких=то датасетов пасется, хотя
> на все про все достаточно ровно пяти

Тк и есть 4 IBDataSet и один IBTable (остался от предыдущей редакции, работает, вот и не заменяю на IBDataSet).


grav   (2008-05-20 12:01:00) [71]


> В принципе разные знвчения — для стойкости геморроя, очевидно.

Ага :) OrganDS=MasterDS
BuildingDS=DetailDS1
Не все поправил, извиняюсь.


grav   (2008-05-20 11:59:00) [72]


> Интересно, что можно вставить в гриде для таблицы BUILDING(ID,
>  ID_ORG)? Или там ещё поля есть? Почему они тогда не в DATA?
>

Есть еще поля, например коды адреса здания (из справочников).

> Хотя бы дельфийский help по мастер-детайл почитал бы.

Почитал. И в интернете много почитал. Так и не понял логику работы IBDataSet.

> > т.к. IBTable там вкачестве detail.
>
> Остется тихо удалиться :)

IBTable не мешает и работает.


ЮЮ   (2008-05-20 11:54:00) [73]

> DetailDS1.Insert;
> DetailDS1.FieldByName('ID_ORG').AsInteger:= OrganDS.FieldByName('ID')
> .AsInteger;
> DetailDS2.Insert;
> DetailDS2.FieldByName('ID_ORG').AsInteger:= BuildDS.FieldByName('ID_ORG')
> .AsInteg er;
> DataBDS.FieldByName('ID_BUILD').AsInteger:=BuildDS.FieldByName('ID')
> .AsInteger;
> DetailDS2.FieldByName('ID_OBJ').AsInteger:=0;
> SaveBtn.Enabled:=True;


В принципе разные знвчения — для стойкости геморроя, очевидно.


> Пользовательские данные в данном случае не в гриде, а в
> DBEdit'ах, ибо зачем под одну строку отводить грид (хотя
> первоначально так у меня и было). Передаются запросом из
> InsertSQL

Блин, тут целый зоопарк каких=то датасетов пасется, хотя на все про все достаточно ровно пяти [25]

B как, интересно, DBEdit, настоленный на другой датасет, успее вставить данные промеж строк вашего кода, пишущий в другой датасет. Или огрызки кода вместо полного фрагмента, приводятся для пущей ясности?


ЮЮ   (2008-05-20 11:47:00) [74]

> т.к. IBTable там вкачестве detail.

Остется тихо удалиться :)
Хотя бы дельфийский help по мастер-детайл почитал бы.


> Тогда при добавлении в таблицу данных Из DetailDS2 возьмется
> ID_ORG=1 ID_BUILD=1, других данных в датасете не будет просто.

У тебя же  датасет — IBTable. Там всё должно быть :)


> Редактирование, вставка и удаление в(из) таблицу Building
> работает.

Интересно, что можно вставить в гриде для таблицы BUILDING(ID, ID_ORG)? Или там ещё поля есть? Почему они тогда не в DATA?


grav   (2008-05-20 11:46:00) [75]

> ЮЮ ©   (20.05.08 11:39) [28]

Пользовательские данные в данном случае не в гриде, а в DBEdit'ах, ибо зачем под одну строку отводить грид (хотя первоначально так у меня и было). Передаются запросом из InsertSQL


> В этом коде втавка пустой строки, соответсиыующкй новой
> строке в BUILDING.

Да, так и есть.

DetailDS1.Insert;
DetailDS1.FieldByName('ID_ORG').AsInteger:=OrganDS.FieldByName('ID').AsInteger;
DetailDS2.Insert;
DetailDS2.FieldByName('ID_ORG').AsInteger:=BuildDS.FieldByName('ID_ORG').AsInteg er;
DataBDS.FieldByName('ID_BUILD').AsInteger:=BuildDS.FieldByName('ID').AsInteger;
DetailDS2.FieldByName('ID_OBJ').AsInteger:=0;
SaveBtn.Enabled:=True;


grav   (2008-05-20 11:40:00) [76]

Как нет гридов. Есть гриды, отображение работает, редактирование данных по организации работает, т.к. IBTable там вкачестве detail.
Редактирование, вставка и удаление в(из) таблицу Building работает.
Не работает вставка и редактирование в DetailDS3, т.е. в третий датасет в связке.


ЮЮ   (2008-05-20 11:39:00) [77]

> Делаю
> DetailDS2.Inset;
> DetailDS2.FieldByName(ID_ORG).AsInteger:=DetailDS1.FieldByName(ID_ORG)
> .AsInteger ;
> DetailDS2.FieldByName(ID_Build).AsInteger:=DetailDS1.FieldByName(ID)
> .AsInteger;
> DetailDS2.FieldByName(ID_OBJ).AsInteger:=0;
> DetailDS2.Post;


в каком методе?
А где пользовательские данные, что он колотил в гриде?

В этом коде втавка пустой строки, соответсиыующкй новой строке в BUILDING.
А как пользователь добавит запись в таблицу BUILDING, если та нечего отобрвжать в гриде?


ЮЮ   (2008-05-20 11:33:00) [78]

> Т.к. Если пользователь выбрал предприятие в гриде, то во
> втором гриде отображаются только здания принадлежащие данному
> предприятию.

Гридов у тебя еще нет, а IBExpert у кого-нибудь найдется :)


grav   (2008-05-20 11:29:00) [79]


> ЮЮ ©   (20.05.08 11:08) [23]

Если датасеты свзяаны между собой то такого быть не может вроде бы. Т.к. Если пользователь выбрал предприятие в гриде, то во втором гриде отображаются только здания принадлежащие данному предприятию. Тогда при добавлении в таблицу данных Из DetailDS2 возьмется ID_ORG=1 ID_BUILD=1, других данных в датасете не будет просто.


ЮЮ   (2008-05-20 11:27:00) [80]

Ну а если лечение геморроя ивое любимое занятие, и ты настаиваешь на своей структуре, то
запросы буды приерно такие:

организации
SELECT Id FROM Organs
 инфа об организации
 SELECT * FROM DATA WHERE (ID_ORG = :Id) and (ID_BUILD = 0) AND (ID_OBJ = 0)  

 здания организации
 SELKCT Id,  ID_ORG  FROM BUILDING WHERE (ID_ORG = :Id)
   
   инфа о зданиях
   SELECT * FROM DATA WHERE (ID_ORG = :Id_Orп) and (ID_BUILD = :Id) AND (ID_OBJ = 0)  

   объекты хдания
   SELECT * FROM DATA WHERE (ID_ORG = :Id_Orп) and (ID_BUILD = :Id_Bild) AND (ID_OBJ <> 0)
 

З.Ы. detail-запросы сдвинуты относительно master


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо