![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
IBDataSet, Master-Detail и Insert [D7, FireBird 1.5]
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