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

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

Рекурсивный запрос [D7, Access2000]


Страницы:   1 2

YurikGl ©   (2004-03-13 12:18:00) 

Уважаемые мастера.
Существует следующая задача - описать структуру объектов неограниченной вложненности друг в друга. Т.е. в моем случае объектом является сборка. Каждая сборка может в своем составе содержать другие сборки.
В структуре БД я описал это так

табл Сборки                       табл Связи
    IdСборки                          IdСвязи
    Название                          IdСборкиРодитель
    ....(параметры сборки)            IdСборкиДочерний
                                      Количество
                                      ...(параметры связи)

Далее необходимо выбрать все сборки содержащиеся в заданной на любом уровне.

В настоящее время решаю эту проблему так:

//описание классов
type
 TSborkaRec = class
    IdSborka:longint;
    count:Longint;
    constructor Create(S1:longint;S2:longint);
 end;
 TMyList = class (TList)
   procedure MyAdd (S1:longint;S2:longint);
   destructor Destroy; override;
 end;

Constructor TSborkaRec.Create(S1:longint;S2:longint);
Begin
IdSborka:=S1;
count:=S2;
inherited Create;
End;

Procedure TMyList.MyAdd(S1:longint;S2:longint);
Var
Sb:TSborkaRec;
Begin
Sb:=TSborkaRec.Create(S1,S2);
Add(Sb);
End;

//сама процедура

Procedure TFormSborkaOtchet.Recur(IdSborka:longint);
var
List:TMyList;
s:string;
i:longint;
Rec:TSborkaRec;
Begin
List:=TMyList.Create;
ADODataSetvr.Active:=false;
s:='select [Связи].IdСборкиДочерний,[Связи].Количество From [Связи] where [Связи].IdСборкиРодитель='+IntToStr(IdSborka);
ADODataSetvr.CommandText:=s;
ADODataSetvr.Active:=true;
ADODataSetvr.First;
if ADODataSetvr.RecordCount>0 then
 repeat
   List.MyAdd(ADODataSetvr.Fields[0].Value,ADODataSetvr.Fields[1].Value);
   ADOCommand1.CommandText:='insert into '+TableVrName+' ([IdСборки], [Количество]) values ('+IntToStr(ADODataSetvr.Fields[0].Value)+', '+IntToStr(ADODataSetvr.Fields[1].Value)+')';
   ADOCommand1.Execute;
   ADODataSetvr.Next;
 Until ADOdatasetvr.EOF;
if List.Count>0 then
 for i:=0 to List.Count-1 do begin
   Rec:=TSborkaRec(List.items[i]);
   recur(Rec.IdSborka);
                             end;
List.Free;
End;

// TableVrName - динамически создаваемая таблица, с полями IdСборки и Количество

По окончанию работы в ТableVrName получаем искомый набор.

Какие еще существуют способы решения поставленной задачи? Как можно оптимизировать представленный код?


Romkin   (2004-03-13 18:28:00) [21]

Ты думаешь, в воскресенье здесь просто куча народа сидит? Щаз!
Оххх... Ну написал - а как иначе-то? На Access нет процедур, а запросы рекурсию не допускают.
Структура таблиц, правда, у тебя не для дерева, а вообще сетевая, дерево в первом приближении делается так:
Сборка (ID, Название, Owner_ID references ID)
То есть третье поле - ID родителя, а у корня ID делается либо NULL, либо 0, как хочешь.
Остальное - http://www.ibase.ru/develop.htm
"Древовидные и иерархические структуры, хранение объектов"
Все касательно IB, но, думаю, разобраться можно :)


YurikGl   (2004-03-13 18:21:00) [22]

Мнда... Надо было девушкой представиться. :)


YurikGl   (2004-03-13 16:17:00) [23]

Неужели все в FAQ описано?


Страницы:   1 2

Наверх

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