Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TreeView и БД, Удаление вложенности 
:(
    Опции темы
Foron
Дата 23.6.2005, 13:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подскажите пожалуйста.

Есть TreeView, есть ADO, есть СУБД.
Нужно реализовать удаление любого выбранного в TreeView узла, причем, если есть вложенность, то удалить все вложенные узлы тоже. Как из БД, так и из TreeView.
Подскажите пожалуйста, как это сделать smile
  Вверх
Alex
Дата 23.6.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162





--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
FRAGNATIC
Дата 30.10.2005, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 2
Всего: 11



а без компонента?
PM MAIL   Вверх
Alex
Дата 30.10.2005, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



Цитата(FRAGNATIC @ 30.10.2005, 23:55)
а без компонента?

все зависит от того как вы храните дерево


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
FRAGNATIC
Дата 30.10.2005, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 2
Всего: 11



Name
ID - ключевое поле
ParentID - ид родителя
PM MAIL   Вверх
<Spawn>
Дата 31.10.2005, 05:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 2
Всего: 64



В узлы дерева, при его заполнении, читаешь ID, в поле Data (не забудь потом освободить память на OnDeletion), а затем пишешь такой код:

Код

if Assigned(TreeView.Selected) and Assigned(TreeView.Selected.Data) then
  with ADOQuery do
  begin
    SQL.Text := 
      Format(
        'DELETE FROM TableName ' +
        'WHERE ParentID = %d', [PInteger(TreeView.Selected.Data)]);

    ExecSQL;
  end;


И не забудь транзакцию завершить, если СУРБД поддерживает ее.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
FRAGNATIC
Дата 31.10.2005, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 2
Всего: 11



<Spawn>
спасибо
тока еслибы всё было так просто!
уровень вложености может быть любым. Он не ограничен )
у раздела может быть куча подразделов а у подразделов тоже могут быть подразделы и так далее
хранится это всё в таблице Tree структура её такая
Name-имя раздела
ID - ключивое поле
ParentID - ID родителя тоесть головнова раздела)
и вот возник вопрос как удалять раздел так чтобы и все его подразделы и подразделы подразделов удалились
ведь их может быть бесчётное кол-во
или одним даже SQL запросм типа
DELETE FROM Tree WHERE ID in (SELECT ID FROM Tree WHERE ParentID in (здесь ещё чё-то))
БД access
техн доступа ADO
нашлё код хранимой процедуры для интербэйс
но у меня даже не выходит программно её в аксэс создать
Цитата
create procedure GetChild (Prnt Integer, bLev SmallInt)
                  returns (Chld Integer, rLev SmallInt) as
begin
01  for select PersonID from People where  Parent=:Prnt into :Chld
02      do begin
03        rLev = bLev + 1;
04        suspend;
05        for select Chld,rLev from GetChild(:Chld,:bLev) into :Chld,:rLev
06            do begin
07                suspend;
08            end
09      end
end

      Первый запрос выбирает все идентификаторы строк, у которых родитель (Parent) равен значению переданному в процедуру (Prnt). Результат записывается в переменную Chld и одновременно увеличивается счетчик уровней (rLev).
      На языке Interbase SUSPEND означает, что возвращаемая по Returns информация должна заноситься в результирующий набор в виде очередной записи. Первый оператор SUSPEND (строка 04) возвращает значения первой записи запроса, определяющего непосредственных потомков Prnt. Следующий SUSPEND (строка 07) возвращает результат рекурсивного вызова процедуры выбора GetChild. До тес пор пока этот второй вызов находит записи (то есть до тех пор, пока у объекта находяться потомки), второй SUSPEND возвращает их исходной вызывающей процедуре. Когда объекты кончаются, вызывающий код продолжает свою работу и с помощью первого SUSPEND возвращает вторую запись исходного запроса.
      Подобные итерации идеально подходят для просмотра иерархических данных в обоих направлениях, потому что сохраненные процедуры рекурсивны. Такую процедуру можно вызывать из нее самой, чтобы определить детей текущего объекта, затем получить их детей и т.д. Вместо того чтобы сразу получить все записи одного поколения и переходить к следующему, при этой стратегии мы сначала определяем первого потомка объекта, затем — его первого потомка (т.е. первого внука исходного объекта) и т.д. до последнего потомка.
      Для вызова процедуры выборки Interbase следует пользоваться компонентом TQuery, а не TStoredProc. Синтаксис выглядит просто:

Query.Close;  Query.SQL.Clear;
Query.SQL.Add('Select * from GetChild('+IntToStr(CurrentItemID)+',0)');
Query.Open;

Полученный набор будет содержать всех потомков текущего объекта с указанием их уровня.

Точно таким же образом можно пройти по дереву в обратном направлении с помощью процедуры GetParent. Для этого нужно только поменять местами родителя и потомка.



Это сообщение отредактировал(а) FRAGNATIC - 31.10.2005, 12:53
PM MAIL   Вверх
Medved
Дата 31.10.2005, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 1
Всего: 154



Рекомендую воспользоваться компонентом TdxDBTreeList из библиотеки DevExpress.
Там кстати есть примеры того, что ты хочешь сделать.

Можно конечно реализовать и без компонента такое, но я не понимаю, зачем изобретать велосипед, и делать то, что, что уже неплохо сделано другими.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
<Spawn>
Дата 31.10.2005, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 2
Всего: 64



FRAGNATIC Все имеено так просто. Я постоянно использую на любой уровень вложенности. Ты, видимо, не до конца понял, что я написал))

На счет удаления - это просто делается триггером на стороне сервера. При большой вложенности получится своего рода рекурсия, которая убьет все дочерние узлы, но у тебя Access, так что, видимо, прийдется самому все удалять...


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
offline
Дата 31.10.2005, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 474
Регистрация: 7.2.2005

Репутация: 7
Всего: 7



посмотри еще EhLib
PM MAIL   Вверх
FRAGNATIC
Дата 1.11.2005, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 2
Всего: 11



Цитата
а без компонента?

smile
PM MAIL   Вверх
offline
Дата 1.11.2005, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 474
Регистрация: 7.2.2005

Репутация: 7
Всего: 7



Также как без Delphi. smile Зачем изобретать велосипед?
PM MAIL   Вверх
FRAGNATIC
Дата 1.11.2005, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 2
Всего: 11



kirilllius
затем что в даной ситуации мне нужно именно так)
задание такое=)
PM MAIL   Вверх
FRAGNATIC
Дата 1.11.2005, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 2
Всего: 11



Код

var
  Work: array of integer;
  SQL: string;
const
   SqlSel = 'SELECT ID FROM Tree WHERE ParentID IN (%s)'

procedure TransFinal;
begin
  ShowMessage(SQL) //вот тут уже просто удалить !!!!
типа 'DELETE FROM Tree WHERE ID IN (SQL)' ))))
end;

procedure TransWork;
var
  tmp: string;
  i: integer;
begin
  tmp:=IntToStr(Work[Low(work)]);
  for i:=Low(work)+1 to High(work) do
  begin
    tmp:=tmp+','+IntToStr(Work[i]);
  end;
  if SQL='' then
  SQL:=SQL+tmp
  else SQL:=SQL+','+tmp;
  PriceEditFrm.ClearTrees(tmp)
end;

function TPriceEditFrm.ClearTrees(Id : string): boolean;
var
  i, len: integer;
begin
  SetLength(work,0);
  ADOQuery.Close;
  ADOQuery.SQL.Clear;
  ADOQuery.SQL.Add(Format(SqlSel,[id]));
  ADOQuery.Open;
  if ADOQuery.RecordCount=0 then exit;
  SetLength(work,ADOQuery.RecordCount);
  ADOQuery.First;
  for i:=Low(work) to High(work) do
  begin
    work[i]:=ADOQuery.FieldByName('ID').AsInteger;
    ADOQuery.Next;
  end;
  TransWork;
end;

короче я сделал так)

Это сообщение отредактировал(а) FRAGNATIC - 1.11.2005, 16:17
PM MAIL   Вверх
bas
Дата 1.11.2005, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: 1
Всего: 2



id
parent- родитель
inde-место в ветке
count- количество узлов в ветке
name
Если parent 0 то главный узел

Это сообщение отредактировал(а) bas - 1.11.2005, 16:55
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0662 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.