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

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

Хитрая структура БД [D7, WinXP]


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

de. ©   (2008-01-28 14:30:00) 

Здравствуйте уважаемые мастера!
Возник такой вопрос:

Структура БД абонентов была такова:

tPoint – Населенный пункт
  IdPoint -Ключь
 Point

tStreet- Улицы
  IdStreet -Ключь
 IdPoint
 Street

tAbonent- Абоненты
  Ls
 Fam
 Nam
 Otch
 Nd
 NdDr
 Nk
 NkDr
 DatS
 DatP


Необходимо переделать структуру БД под такову:

tPoint – Населенный пункт
  IdPoint -Ключь
 Point

tStreet- Улицы
  IdStreet -Ключь
 IdPoint
 Street

tHome- Дома
  IdHome -Ключь
 Nd
 NdDr
 NdLit

tEntrance- Подъезды
  IdEntrance -Ключь
 Np
 NpDr
 NpLit

tApartment- Квартиры
  IdApartment -Ключь
 Nk
 NkDr
 NkLit

tRoom- Комнаты
  IdRoom -Ключь
 Ls

tAbonent- Абоненты
  Ls
 Fam
 Nam
 Otch
 DatS
 DatP


Всебы нечего, но структура сложна при добавлении нового абонента.

Если в первой структуре при добавлении нового абонента мы обходились редактированием только одной таблицы tAbonent, то в новой необходимо:
-добавить абонента в tAbonent
-добавить новый дом в tHome (или выбрать существующий)
-далее подъезд
-квартиру
-комнату

В приложении клиенте этой БД
-В первом случае у меня были компоненты грубо говоря завязаны на одной таблице tAbonent, и я мог спокойно добавлять редактировать и т.д.
-Но во втором случае просматривать абонента могу т.е. вводим ЛС (Лицевой счет) открывается НД tAbonent, далее по ЛС связуюсь с tRoom возвращая тем самым IdApartment, потом по IdApartment возвращаю IdEntrance и т.д. раскручиваю до tPoint.

Но вот редактировать такую структуру как? Как завязать НД и компоненты чтобы добавлять нового абонента не могу представить….

Может кто сталкивался с такой структурой?


DiamondShark   (2008-01-28 19:13:00) [21]


> В общих чертах объесню почему пришли к такой структуре.
>
> Есть абонент у абонента есть счетчик.
> Абонент может (его ЛС) может отвечать за
> -личный счетчик
> -общедомовой
> -общеподъездный
> -общеквартирный

Начнём с того, что у абонента нет счётчика.
Счётчик Установленв Месте, а Абонент Прописанпо Месту жительства.
У счётчика есть Тип, а абонент за счётчик Отвечает.

Итого, вместо шизофренической структуры с рахитическими таблицами достаточно справочника Абонентов, справочника Счётчиков и таблицы-связки Абонент-Счётчик.


ANB   (2008-01-28 18:53:00) [22]

1. Добавить еще одну таблицу - Адреса, в полях которой собирать ссылки на справочники (все таблицы, кроме абонента). В принципе, можно прямо в абонента добавить все эти поля.
2. Реализовать возможность в эдите вызывать справочник, а справочник разрешить редактировать.
Кистате, все таблицы мона загнать в одну древовидную, вот только мс скл не умеет с ними работать, посему уж проще так оставить - количество уровней то фиксировано.
3. На форму редактирования / добавления абонента положить эдиты с кнопками. Можно положить один эдит с рассчитанной комплексной инфой об адресе и для редактирования адресов юзать отдельную форму (может пригодится в других местах).
4. Структуру адреса (кроме кв. и комнат) лучше подогнать под КЛАДР, тогда его мона будет импортить, а не вбивать руками.


> ЗЫ
>  Настоятельно рекомендую вместо записей использовать иерерхию
> классов.

ЗЫ. Настоятельно рекомендую так не делать. Проблем меньше.


Kolan   (2008-01-28 18:25:00) [23]

> TDialogs = record
>  Ls, Fam, Nam, Otch: String;
>  DatS, DatP: TDateTime;
>  IdStreet: Integer;
>  Nd, NdDr, NdLit: String;
>  Np, NpDr, NpLit: String;
>  Nk, NkDr, NkLit: String;
> end;

Оторвал бы за названия… все бы оторвал…

Пример простой:

используете BDE как я понял…

function GetAbonent(AbonentID: Integer): TAbonent;
Query := TQuery.Create(nil);
try
 Query.SQL.Text := 'SELECT * FROM tAbonent WHERE Ls = :AbonentID';
 Query.ParamByName('AbonentID').AsInteger := AbonentID
 Query.Open;
 if not Query.Eof then
 bein
   Result.Fam := Query.FieldByName('Fam');
   
 end;  
finally
 Query.Close;
 Query.Free;
end;


ЗЫ
 Настоятельно рекомендую вместо записей использовать иерерхиюклассов.


Ega23   (2008-01-28 17:00:00) [24]

А не надо получать. Объявляй ID как Identity, он сам чё надо вставит.


Sergey13   (2008-01-28 16:47:00) [25]

> [17] de.   (28.01.08 16:09)
> чтобы на грабли не наступить

Граблей бояться - в лес не ходить. 8-)


de.   (2008-01-28 16:09:00) [26]


> Palladin ©   (28.01.08 16:04) [16]

Гы. Да реализовать как я уже премерно представил, вопрос насчет примеров в том, чтобы на грабли не наступить...


Palladin   (2008-01-28 16:04:00) [27]


> [15] de.   (28.01.08 15:58)

примеры? :) народ годы тратит на разработку систем
DB -> DBLayer -> DBObjects -> DBControls
а тут приходит чувак и просит примеры :)


de.   (2008-01-28 15:58:00) [28]

А есть ли примеры считывания значений из БД скажем

в

TDialogs = record
  Ls, Fam, Nam, Otch: String;
  DatS, DatP: TDateTime;
  IdStreet: Integer;
  Nd, NdDr, NdLit: String;
  Np, NpDr, NpLit: String;
  Nk, NkDr, NkLit: String;
end;

далее счетывания из этого типа

в

контролы

редактирование значений

и обратная запись

в

TDialogs = record
  Ls, Fam, Nam, Otch: String;
  DatS, DatP: TDateTime;
  IdStreet: Integer;
  Nd, NdDr, NdLit: String;
  Np, NpDr, NpLit: String;
  Nk, NkDr, NkLit: String;
end;

а далее уже из типа

в

БД  

?


de.   (2008-01-28 15:55:00) [29]

И вправду все через Ж получается, структура идеально подходит под многоквартирные дома.!
Ну чтобы иметь связку ДОМ-АБОНЕНТ (если дом скажем частный) необходимо тянуть за собой пустые значения таблиц tEntrance, tApartment ... Вот ббб. связался...


Sergey13   (2008-01-28 15:45:00) [30]

> [12] de.   (28.01.08 15:25)

Не знаю, можно ли в МССКЛ-е зарезервировать новое значение идентификатора заранее, но вроде можно вставляя новые значения в справочники в порядке иерархии, получать новые идентификаторы налету и применять эти результаты при вставке в подчиненные таблицы.


de.   (2008-01-28 15:25:00) [31]


> Что за СУБД?

MS SQL 2000


Sergey13   (2008-01-28 15:21:00) [32]

> [9] de.   (28.01.08 15:15)

Так а собственно в чем трудность то? Основное отличие (для заведения нового абонента) во втором варианте от первого в том, что ДО ВВОДА надо знать идентификатор справочника верхнего уровня. В остальном - обычная мастер-детальная связь, просто многоуровневая.
Что за СУБД?


de.   (2008-01-28 15:20:00) [33]


> Kolan ©   (28.01.08 15:08) [8]


Вово вы меня поняли...!

Вот я об этом тоже думал... Тока вот реализовать не могу...

Думал создать чтото типа...

 TDialogs = record
   Ls, Fam, Nam, Otch: String;
   DatS, DatP: TDateTime;
   IdStreet: Integer;
   Nd, NdDr, NdLit: String;
   Np, NpDr, NpLit: String;
   Nk, NkDr, NkLit: String;
 end;


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


de.   (2008-01-28 15:15:00) [34]

Необходимо разработать форму абонента (Карточка абонента), которая бы редактировала такую структуру как я описал.

Вопрос наверное больше относится не к БД а к Delphi.

Надо в этой самой карточке создавать, редактировать абонента, т.е.

Вбили ФИО, вбили Улицу, дом, подъезд, квартиру, комнату, в комнате обозначили где расположен прибор учета (прихожая, кухня, и т.д.)


Kolan   (2008-01-28 15:08:00) [35]

> Но вот редактировать такую структуру как? Как завязать НД
> и компоненты чтобы добавлять нового абонента не могу представить…
> .

Или развлекаться с UpdateObject — тут я кроме справки ниче не посоветую.

Или :
Для работы с 1 абонентом сделать форму с обычными контролами. Перед показом загружать в неё данные, после того, как нажали «ОК» получать введенные/измененные данные и делать сотв Insert/Update. Это, имхо, нормальный вариант в данном случае.


de.   (2008-01-28 15:06:00) [36]


> Ega23 ©   (28.01.08 15:04) [6]

Ща.


Ega23   (2008-01-28 15:04:00) [37]

Начни с простого: опиши чё надо вообще.


de.   (2008-01-28 15:00:00) [38]


> детализация до подъезда и комнаты напрасна.


В общих чертах объесню почему пришли к такой структуре.

Есть абонент у абонента есть счетчик.
Абонент может (его ЛС) может отвечать за
-личный счетчик
-общедомовой
-общеподъездный
-общеквартирный

понимаю что гиморой, но всеже..... вот так... и застрял...


de.   (2008-01-28 14:56:00) [39]


> Ega23 ©   (28.01.08 14:48) [3]

Полностью согласен.!
Но руководство рвет и мечет, не улаживаюсь в заданный срок, по началу структура казалась простой, но развернутой, а сейчас кажется развернутой и сложной...

Вопрос стал "рогом" именно в добавлении абонента и редактировании .

Кто чем сможет помочь ?


Ega23   (2008-01-28 14:48:00) [40]

детализация до подъезда и комнаты напрасна.
Достаточно номера дома и квартиры.


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

Наверх

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