![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
IBDataSet, Master-Detail и Insert [D7, FireBird 1.5]
grav © (2008-05-20 09:45:00)Есть три связанных IBDataSet.
MasterDS-DetailDS1-DetailDS2. Соответственно Предприятие-Здания-данные по зданию. Предприятий много, у каждого прежприятия зданий много, у каждого здания одна запись с данными (площадь, стоимость и т.д.).
Список предприятий не меняется. Здания могут добавляться, редактироваться и удаляться. Данные по зданию могут редактироваться, удаляться вместе со зданием и добавляться вместе со зданием.
Встака записей в таблицу здания проходит без проблем. Вставка в тблицу с данными по зданию проходит без ошибок, но в таблицу не попадают. Почему? Как отследить что не так, если никаких ошибок не выводится?
Sergey13 (2008-05-20 11:14:00) [81]> [21] grav (20.05.08 10:58)
Тогда однозначно
> [18] ЮЮ © (20.05.08 10:48)
> Настаиваю на ORGANS, BUILDINGS и OBJECTS.
ЮЮ (2008-05-20 11:08:00) [82]> Если в таблице DATA: ID_ORG0, а ID_BUILD=ID_OBJ=0 это
> означает, что данная запись принадлежит предприятию
Ты туда ещё и характеристики предприятия примешал :)
> Да, красноречив это не про меня :)
Я не о том.
Пусть имеем
ORGAN BUILDING
ID ID ID_ORG
1 1 1
2 2 2
Если не делать особых телодвищений по обеспецению правильности данных, то в
DATA запросто может оказаться
ID_ORG ID_BUILD ID_OBJ
1 2 222
grav (2008-05-20 11:02:00) [83]Вообщем то данные в базу уже заносятся.
Я пытаюсь дописать изменение данных. Мне без проблем это сделать с помощью обычных IBQuery или IBSQL. Но вот захотелось чрез DBGrid'ы и мастер детайл.
grav (2008-05-20 10:58:00) [84]
> Sergey13 © (20.05.08 10:53) [19]
Нет. Что то в нем есть, иначе зачем здание?
grav (2008-05-20 10:57:00) [85]
> ЮЮ © (20.05.08 10:43) [16]
Да, красноречив это не про меня :)
Три поля ID_ORG, ID_BUILD и ID_OBJ образуют уникальный ключ. Т.е. знацения 5,0,0 уникально и данные этой записи будут принадлежать организации. Т.е. когда я сделаю select * from DATA where ID_ORG=5 and ID_BUILD=0 and ID_OBJ=0 отберется одна запись.
Sergey13 (2008-05-20 10:53:00) [86]> [14] grav (20.05.08 10:34)
А может быть здание без объектов?
ЮЮ (2008-05-20 10:48:00) [87]> (правда не все поля пересекаются, т.е. некоторые поля уникальны
> для объекта или здания).
Даже не экономишь на месте :) Тогда в чем причина?
Настаиваю на ORGANS, BUILDINGS и OBJECTS.
P.S. Имя таблицы организаций диссонируют с именами других таблиц, не замечаешь?
Sergey13 (2008-05-20 10:46:00) [88]> [12] Anatoly Podgoretsky © (20.05.08 10:25)
> Может быть, площадь может измениться
У него похоже все что угодно может быть. Второй топик клещами приходится по крупицам информацию выдирать. Партизан какой-то.
ЮЮ (2008-05-20 10:43:00) [89]> Если ID_ORG0 и ID_BUILD0, а ID_OBJ=0 запись принадлежит
Не смущает, что BUILDING с таким ID может запросто принадлежать другой ORGAN, не той что в ID_ORG?
ID_ORG в таблице здесь соверщенно лишний!!!
grav (2008-05-20 10:40:00) [90]
> Anatoly Podgoretsky © (20.05.08 10:25) [12]
История не нужна, это разовое обследование инфраструктуры.
> ЮЮ © (20.05.08 10:26) [13]
Я не писал миллионы, я писал под миллион записей. В каждом предприятии может сотня зданий, в каждом здании сотня объектов. Итого у предприятия м.б. тысяча объектов. 6000 предприятий на 1000 объектов = 6 миллионов. Но я думаю будет около миллиона.
grav (2008-05-20 10:34:00) [91]
> Sergey13 © (20.05.08 10:21) [10]
Имеется три таблицы ORGAN, BUILDING и DATA.
В таблице ORGAN есть ключ с именем ID и поля с кодами организации из справочников.
В таблице BUILDING есть ключ ID и поле ID_ORG (для связи с таблицей ORGAN).
В таблице DATA есть тройной ключ: ID_ORG, ID_BUILD, ID_OBJ, уникальный, данные поля не могут быть null.
Если в таблице DATA: ID_ORG<>0, а ID_BUILD=ID_OBJ=0 - это означает, что данная запись принадлежит предприятию
Если ID_ORG<>0 и ID_BUILD<>0, а ID_OBJ=0 - запись принадлежит зданию
Если ID_ORG<>0 и ID_BUILD<>0 и ID_OBJ<>0 - запись принадлежит объекту (ID_OBJ из генератора).
ЮЮ (2008-05-20 10:26:00) [92]> Выделил эти данные в отдельную таблицу только из-за того,
> что поля в таблицах одинаковы
Главная ошибка первых лет проектирования баз жанных :)
Похожесть атрибутов разных сущностей не повод порождать синтетическую сущность, ИМХО.
Атрибуты зданий в таблицу зданий, атрибуты объектов в таблицу объектов
> зданий от нескольких единиц до нескольких сот, объектов
> тысячи, таблица с данными будет содержать под миллион записей.
Странная арифметика.
данные = здания + объекты = тысячи. Откуда миллионы?
Anatoly Podgoretsky (2008-05-20 10:25:00) [93]> Sergey13 (20.05.2008 10:08:04) [4]
Может быть, площадь может измениться, а стоимость и тем более, но это называется история и там как правило еще и связи многие ко многим.
Anatoly Podgoretsky (2008-05-20 10:24:00) [94]> grav (20.05.2008 10:02:03) [3]
Может ты не договариваешь, говоришь о один к одному, а на самом деле один ко многим.
Реализовывать связь один к одному имеет смысл только по архитектурным ограничениями СУБД
Sergey13 (2008-05-20 10:21:00) [95]> [6] grav (20.05.08 10:14)
Ты все таки удивительно хреново описываешь свою задачу.
Давай просто структуру таблиц - без своих коментариев (пока не попросят 8-)
Здания и объекты - это в одной таблице?
> что поля в таблицах одинаковы
В каких таблицах?
Sergey13 (2008-05-20 10:17:00) [96]> [5] grav (20.05.08 10:09)
> Эти три поля образуют ключ
Какой ключ? Первичный? А почему не просто ID, как в других (насколько я понял) таблицах.?
Что есть такое ID_OBJ?
grav (2008-05-20 10:17:00) [97]Еще вот что.
Все вышеописанное, т.е. Inset и Edit для DetailDS1 работает без проблем.
Есть еще одна свзяка DetailDS1-DetailDS3 (здания-0бъекты), также не работает вставка и редактирование.
grav (2008-05-20 10:17:00) [98]Еще вот что.
Все вышеописанное, т.е. Inset и Edit для DetailDS1 работает без проблем.
Есть еще одна свзяка DetailDS1-DetailDS3 (здания-0бъекты), также не работает вставка и редактирование.
grav (2008-05-20 10:14:00) [99]
> Sergey13 © (20.05.08 10:08) [4]
Нет, запись по каждому зданию и объекту в таблице с данными одна. Выделил эти данные в отдельную таблицу только из-за того, что поля в таблицах одинаковы (правда не все поля пересекаются, т.е. некоторые поля уникальны для объекта или здания).
grav (2008-05-20 10:09:00) [100]
> Sergey13 © (20.05.08 09:57) [2]
Делаю
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;
Эти три поля образуют ключ и являются единственными полями, которые не могут быть NULL.
Проверяю DetailDS2.UpdatesPending , изменения есть. Делаю
DetailDS2.ApplyUpdates;
MainForm.StartTr.Commit;
Все проходит без ошибок. Данные в таблице не появляются.
Тоже самое, если делать DetailDS2.Edit;