Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление уза в TreeView и данных в базе, Срочно!!!!!! Помгите!!!!!& 
V
    Опции темы
Dementor
Дата 10.7.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В общем имеется база MySQL, состоящая из 2-х таблиц: folder и files. Таблица folder состоит из полей folderid, foldername, idpar, где idpar показывает принадлежность к родителю. Таблица files имеет следущую структуру fileid, filename, groupid, где groupid показываетпринадлежность файла к папке (тобишь groupid = folderid).
В TreeView построено дерево по этим данным. Но я никак не могу понять как организовать удаление узла и информации о нем в базе данных. Я понимаю что можно просто узнать имя родителя, найти его в таблице, узнать его id, потом найти в таблице files соответствующую запись и удалить ее. То же и с удалением папки. Но тут есть проблема - ведь имена папок могут повторяться!!!
В общем помоги плиз. Срочно надо!!!! для работы использую dbExpress!!!! Ничего другого прикручивать нельзя!!!! Никаких левых библиотек. Только ее возможности!!!!!! Буду очень благодарен!!!!!  smile  
PM MAIL   Вверх
Dementor
  Дата 10.7.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Появилась идея такая. Я не сразу считываю всю базу, а только по мере ее необходимости. И теперь хочу чтоб в базу при считывании записывался обсолютный индекс каждого элемента (типа .AbsoluteIndex). 
Вот как я это делаю:
Код



procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
  var AllowExpansion: Boolean);
var folder:ttreenode; i:integer;
begin
// files
treeview1.Items.BeginUpdate;
node.DeleteChildren;
SQLQuery2.Close;
SQLQuery2.SQL.Clear;
SQLQuery2.SQL.Add('SELECT files.filename from folder, files where folder.foldername = :index and folder.folderid = files.groupid;');
SQLQuery2.ParamByName('index').AsString:=folder.Text;
SQLQuery2.Open;
node.ImageIndex:=1;
while not sqlquery2.Eof do
begin
node:=form1.TreeView1.Items.AddChild(folder,SQLQuery2.Fields[0].asstring);
node.ImageIndex:=6;
node.SelectedIndex:=node.ImageIndex;
sqlquery2.Next;
end;


// folder
SQLQuery2.Close;
SQLQuery2.SQL.Clear;
SQLQuery2.SQL.Add('select * from folder where foldername = :index2');
SQLQuery2.ParamByName('index2').AsString:=folder.Text;
SQLQuery2.Open;
SQLQuery3.Close;
SQLQuery3.SQL.Clear;
SQLQuery3.SQL.Add ('select * from folder where idpar = :index3');
SQLQuery3.ParamByName('index3').AsString := sqlquery2.Fields[0].AsString;
SQLQuery3.Open;
while not sqlquery3.Eof do
begin
node:=form1.TreeView1.Items.AddChildFirst(folder,SQLQuery3.Fields[1].asstring);
node.ImageIndex:=0;
node.SelectedIndex:=node.ImageIndex;
node.HasChildren:=true;
sqlquery1.sql.Add('update folder set index = :index where folderid = :id');
sqlquery1.ParamByName('index').AsInteger:= node.AbsoluteIndex;
sqlquery1.ParamByName('id').AsInteger:= SQLQuery3.Fields[0].AsInteger;
sqlquery1.open;
sqlquery3.Next;
end;
treeview1.Items.EndUpdate;

end;


Тут приведен листинг, где абсолютный индекс должен записываться только при чтении таблицы с данными папок. Должен но не записывается. Выдает ошибку синтаксиса update folder set index = :index where folderid = :id . Вроде все правильно.... причем в ошибке идет не с названиями переменных а с их значениями, типа update folder set index = 11 where folderid = 4.
А я хотел по этому индексы проводить удаление записи...
Объясните что не так.  


Это сообщение отредактировал(а) Dementor - 11.7.2007, 10:05
PM MAIL   Вверх
Dementor
Дата 10.7.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В общем, проблему с изменением данных я решил - оказалось нельзя в имени столбца использовать index, так как это зарезервированное слово.

Добавлено @ 23:06
Код



Теперь другая проблема.
вот текст получившейся проги (ее части).
procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
  var AllowExpansion: Boolean);
var folder:ttreenode;
begin

treeview1.Items.BeginUpdate;
node.DeleteChildren;
SQLQuery2.Close;
SQLQuery2.SQL.Clear;
SQLQuery2.SQL.Add('select * from folder where foldername = :index2');
SQLQuery2.ParamByName('index2').AsString:=folder.Text;
SQLQuery2.Open;
SQLQuery3.Close;
SQLQuery3.SQL.Clear;
SQLQuery3.SQL.Add ('select * from folder where idpar = :index3');
SQLQuery3.ParamByName('index3').AsString := sqlquery2.Fields[0].AsString;
SQLQuery3.Open;
while not sqlquery3.Eof do
begin
node:=form1.TreeView1.Items.AddChildFirst(folder,SQLQuery3.Fields[1].asstring);
node.ImageIndex:=0;
node.SelectedIndex:=node.ImageIndex;
node.HasChildren:=true;
sqlquery1.sql.Text:='update folder set indexid = :index1 where folderid = :id';
sqlquery1.ParamByName('index1').AsInteger:= node.AbsoluteIndex;
sqlquery1.ParamByName('id').AsInteger:= SQLQuery3.Fields[0].AsInteger;
sqlquery1.ExecSQL;
sqlquery3.Next;
end;

SQLQuery2.Close;
SQLQuery2.SQL.Clear;
SQLQuery2.SQL.Add('SELECT files.filename, files.fileid from folder, files where folder.foldername = :index and folder.folderid = files.groupid;');
SQLQuery2.ParamByName('index').AsString:=folder.Text;
SQLQuery2.Open;
node.ImageIndex:=1;
while not sqlquery2.Eof do
begin
node:=form1.TreeView1.Items.AddChild(folder,SQLQuery2.Fields[0].asstring);
node.ImageIndex:=6;
node.SelectedIndex:=node.ImageIndex;
sqlquery1.sql.Text:='update files set indexid = :index1 where fileid = :id';
sqlquery1.ParamByName('index1').AsInteger:= node.AbsoluteIndex;
sqlquery1.ParamByName('id').AsInteger:= SQLQuery2.Fields[1].AsInteger;
sqlquery1.ExecSQL;
sqlquery2.Next;
end;
treeview1.Items.EndUpdate;
end;

Индексация идет, только вот индексация папок идет не верно. Например есть корень Windows, от него идут ветви Programm files, Films и тд. Так вот все ветви помечаются индексом 1. Почему так?????? Это же не верно!!!!! Я понимаю что скорее всего это из-за того что индексация папок и файлов идет отдельно. Но как этого избежать??? Подскажите!!!

Это сообщение отредактировал(а) Dementor - 11.7.2007, 10:06
PM MAIL   Вверх
Dementor
Дата 11.7.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Оказалось все гораздо проще!!!!! Добавлять запись в дерево надо AddObject, и в Pointer указывать id этой записи в таблице. А потом приудалении вызывать через Treeview1.selected.Data. Вот и все. Скажем спасибо Rodman-у!!!! Помог по аське.
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.1197 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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