Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.005 c
4-94622
Great
2002-02-17 09:09
2002.04.29
Окно не становится активно при появлении


3-94304
dr_neo_rostov
2002-04-08 21:48
2002.04.29
Найти Самый ЛУЧШИЙ SQL


7-94591
Raider
2002-01-08 16:32
2002.04.29
Debuger vs Win XP pro


1-94453
Deadlock
2002-04-16 07:25
2002.04.29
Функция Format


1-94420
Den_
2002-04-18 08:57
2002.04.29
Уважаемые Мастера!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский