![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хитрая структура БД [D7, WinXP]
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]детализация до подъезда и комнаты напрасна.
Достаточно номера дома и квартиры.