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. Соответственно Предприятие-Здания-данные по зданию. Предприятий много, у каждого прежприятия зданий много, у каждого здания одна запись с данными (площадь, стоимость и т.д.).
Список предприятий не меняется. Здания могут добавляться, редактироваться и удаляться. Данные по зданию могут редактироваться, удаляться вместе со зданием и добавляться вместе со зданием.
Встака записей в таблицу здания проходит без проблем. Вставка в тблицу с данными по зданию проходит без ошибок, но в таблицу не попадают. Почему? Как отследить что не так, если никаких ошибок не выводится?


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;


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

Наверх

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