Древовидная таблица: удаление узла с подузлами
Добавлено: 16 май 2005, 05:01
Добрый день. Такой вопрос: Древовидная таблица в FB (D6, IBO4.5). Принцип прост: PARENTID чилда равен ID родителя. Вложенность не бесконечна, а ограничена 4-мя уровнями: Улицы - Дома - Квартиры - Комнаты.
Вопрос: Как удалить, к примеру, улицу, чтобы удалились ее дома, квартиры этих домов и комнаты в этих квартирах.
Контрол этой таблицы - IBOGrid, датасет этой таблицы - IB_Query (не путать с IBQuery из IBX). Почти такая же штука, как IBDataSet. При попытке удаления запросом
он кричит "попытка удаления множественных записей!" Хотя какое ему дело? Да и если бы удалил, то удалилась бы улица и дома на этой улицы. А квартиры этих домов остались бы без родителя.
Я обдумывал вариант - дополнительное поле с какой-нибудь единой характеристикой для всех "родственников узла". Ну, скажем, RELATIONID (Integer) - при вводе нового чилда всегда равен ID самого верхнего родителя. И удалять весь пучок WHERE RELATIONID = : OLD_ID. Но а если надо будет удалять не улицу, а дом? Ведь прихватит с собой и улицу. Усложнять запрос не хочется.
Может быть, это можно сделать процедурой на самом сервере? Мой опыт пока не позволяет это оформить
Помогите, а?
Да, забыл сказать: в таблице есть еще поле, обозначающее уровень элемента: 0 - улица, 1 - дом, 2 - квартира, 3 - комната.
Вопрос: Как удалить, к примеру, улицу, чтобы удалились ее дома, квартиры этих домов и комнаты в этих квартирах.
Контрол этой таблицы - IBOGrid, датасет этой таблицы - IB_Query (не путать с IBQuery из IBX). Почти такая же штука, как IBDataSet. При попытке удаления запросом
Код: Выделить всё
DELETE FROM Tablica WHERE ID =: OLD_ID OR PARENTI D=: OLD_ID
Я обдумывал вариант - дополнительное поле с какой-нибудь единой характеристикой для всех "родственников узла". Ну, скажем, RELATIONID (Integer) - при вводе нового чилда всегда равен ID самого верхнего родителя. И удалять весь пучок WHERE RELATIONID = : OLD_ID. Но а если надо будет удалять не улицу, а дом? Ведь прихватит с собой и улицу. Усложнять запрос не хочется.
Может быть, это можно сделать процедурой на самом сервере? Мой опыт пока не позволяет это оформить

Да, забыл сказать: в таблице есть еще поле, обозначающее уровень элемента: 0 - улица, 1 - дом, 2 - квартира, 3 - комната.