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