Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.29;
Скачать: CL | DM;

Вниз

Удаление в дереве   Найти похожие ветки 

 
dim- ©   (2002-04-08 10:41) [0]

Народ помогите!
надо удалить ветвь в дереве, сделал следующее:
(может кто чего посоветует?)
procedure TForm1.delete_node(ii:integer);
var q1,q2:TADOQuery;
begin
q1:=TADOQuery.Create(application);
q1.Connection:=dbf.base;
q2:=TADOQuery.Create(application);
q2.Connection:=dbf.base;
q1.SQL.Clear;
q1.SQL.Add("select * from podrazd");
q1.SQL.Add("where id="+inttostr(ii));
q1.Open;
while not q1.Eof do begin
q2.Close;
q2.SQL.Clear;
q2.SQL.Add("Select * from podrazd");
q2.SQL.Add("where bos="+q1.FieldByName("id").AsString);
q2.Open;
while not q2.Eof do begin
delete_node(q2.FieldByName("id").AsInteger);
q2.Delete;
end;
q1.Delete;
end;
end;


 
MCFire   (2002-04-08 11:21) [1]

У тебя не правильно рекурсия написана...Попробуй без неё


 
dim- ©   (2002-04-08 11:24) [2]

В смысле "без неё"
в том то и дело, что не известно как глубоко будет вложение


 
dim- ©   (2002-04-08 14:45) [3]

НАРОД!!!!
Неужели ни кто с деревьями не работал?


 
Lusha ©   (2002-04-08 14:59) [4]

Ну, написал, молодец. А что надо то, похвалить? Лично я не понял... :(


 
SergSuper   (2002-04-08 15:10) [5]

Такие веши на клиенте не делаются
Это надо делать на стороне сервера процедурой или триггером, естественно без всяких рекурсий


 
dim- ©   (2002-04-08 15:26) [6]

to Lusha ©
хвалить не надо, не работает, а помочь можно, на путь истинный направить
То SergSuper
можно по подробней


 
Delirium ©   (2002-04-08 15:36) [7]

В MSSQL2000 есть такая штука - каскадное удаление, как-раз для деревьев очень удобно.


 
Polevi ©   (2002-04-08 15:43) [8]

Допустим таблица Structure имеет поля ID, Owner,Name
Тогда для MS SQL SP будет выглядеть примерно так:

CREATE PROCEDURE DeleteNode @NodeID INT AS
DECLARE @level INT
DECLARE @t TABLE(ID INT, level INT)
INSERT INTO @t SELECT ID,0 FROM Structure WHERE ID=@NodeID

SET @Level=0
while exists(SELECT * FROM @t t, Structure s WHERE t.level=@level and s.owner=t.id)
begin
INSERT @t SELECT s.id, @level+1 from @t t, Structure s WHERE t.level=@level and s.owner=t.id
SET @level=@level+1
end

DELETE FROM Structure WHERE ID IN (SELECT ID FROM @t)


 
Lusha ©   (2002-04-08 15:50) [9]

>Polevi
И пример триггера до кучи... :)


 
Polevi ©   (2002-04-08 16:44) [10]

CREATE TRIGGER Structure_D ON [dbo].[Structure]
FOR DELETE
AS
DECLARE @level INT
DECLARE @t TABLE(ID INT, level INT)

INSERT INTO @t SELECT ID,0 FROM Structure WHERE ID IN (SELECT ID FROM Deleted)

SET @Level=0
while exists(SELECT * FROM @t t, Structure s WHERE t.level=@level and s.owner=t.id)
begin
INSERT @t SELECT s.id, @level+1 from @t t, Structure s WHERE t.level=@level and s.owner=t.id
SET @level=@level+1
end

DELETE FROM Structure WHERE ID IN (SELECT ID FROM @t WHERE Level>0)




 
Polevi ©   (2002-04-08 16:54) [11]

PS
Я тут подумал и решил что так лучше не делать :-))
Но лучше так не делать


 
SergSuper   (2002-04-08 17:11) [12]

to dim-
можно еще по другому данные организовать
http://sdm.viptop.ru/articles/sqltrees.html

есть и другие варианты
вообще с деревьями работать довольно муторно

упоминавшеся здесь каскадное удаление никак не поможет



Страницы: 1 вся ветка

Текущий архив: 2002.04.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
3-94312
B_A_V
2002-04-09 08:33
2002.04.29
Мужики, помогите разобраться c create view .


1-94371
ymin
2002-04-15 15:40
2002.04.29
как сделать всплывающую подсказку


14-94538
VATERMAN
2002-03-20 19:54
2002.04.29
АРI


1-94470
f0rm
2002-04-16 11:57
2002.04.29
Отдельный Item listview a закрасить отдельным цветом?


14-94546
yakshe
2002-03-05 04:37
2002.04.29
Необычный вопрос.