Вывод данных из таблица Access в Treeview

  • Автор темы evgen
  • Дата начала
E

evgen

#1
Здравствуйте уважаемые эксперты!!!
Есть на форме ADOConnection, ADOQuery, TreeView, Button. И есть 3 таблицы БД Access (см. рисунок - table1..3).
Нужно чтобы в объект TreeView выводились данные из этих таблиц в таком виде: (см. рисунок - form). И в какой нибудь тэг этих итемов помещались числа, для дальнейшего вывода в ListView.
Заранее благодарю!!!
 

Вложения

E
#4
Без настоящего, сами по себе данные в TreeView не попадут, их надо сначало загрузитть из базы а потом затолкать в TreeView.
Вот это все надо накодить.
 
E

evgen

#5
Без настоящего, сами по себе данные в TreeView не попадут, их надо сначало загрузитть из базы а потом затолкать в TreeView.
Вот это все надо накодить.
А может быть покажете примерчик, как это все накодить?? Буду очень благодарен!!!
 
E
#6
Неумею, я только могу показать где накодино неправильно, и все.
 
E
#8
В поставке Delphi есть отличная папачка - DEMOS - там много чего уже показано, если поискать как следует, то и это отыщите.
 
B

BurcevD

#9
Лучше всего иметь два ADOQuery, Query1 и Query2, а дальше делается так:
Код:
Var n:TTreeNode;
...
//Запрос для выборки Директора и учителя
Query1.Active:=false;
Query1.SQL.Text:='Select name_type from Itemy order by tag';
Query1.Active:=true;
//Заполнение дерева
TreeView1.BeginUpdate;
TreeView1.Items.Clear;
//Добавляем директора
n:=TreeView1.Items.Add(nil, Query1.Fields[0].AsString);
//Формируем запрос для добавления договоров
Query2.Active:=false;
Query2.SQL.Text:='Select doc from DIRECTOR order by tag';
Query2.Active:=true;
//Заполняем элементы из таблицы директора
While not Query2.Eof do 
begin
TreeView1.Items.AddChild(n, Query2.Fields[0].AsString);
Query2.Next;
end;
//Добаляем учителя
Query1.Next;
n:=TreeView1.Items.Add(nil, Query1.Fields[0].AsString);
//Формируем запрос для добавления журналов
Query2.Active:=false;
Query2.SQL.Text:='Select doc from TEACH order by tag';
Query2.Active:=true;
//Заполняем элементы из таблицы учителей
While not Query2.Eof do 
begin
TreeView1.Items.AddChild(n, Query2.Fields[0].AsString);
Query2.Next;
end;
TreeView1.EndUpdate;
Query1.Active:=false;
Query2.Active:=false;
Хотя, если честно все делается намного проще, в одной таблице, если хотите могу показать...
 
E

evgen

#11
Лучше всего иметь два ADOQuery, Query1 и Query2, а дальше делается так:
Код:
Var n:TTreeNode;
...
//Запрос для выборки Директора и учителя
Query1.Active:=false;
Query1.SQL.Text:='Select name_type from Itemy order by tag';
Query1.Active:=true;
//Заполнение дерева
TreeView1.BeginUpdate;
TreeView1.Items.Clear;
//Добавляем директора
n:=TreeView1.Items.Add(nil, Query1.Fields[0].AsString);
//Формируем запрос для добавления договоров
Query2.Active:=false;
Query2.SQL.Text:='Select doc from DIRECTOR order by tag';
Query2.Active:=true;
//Заполняем элементы из таблицы директора
While not Query2.Eof do 
begin
TreeView1.Items.AddChild(n, Query2.Fields[0].AsString);
Query2.Next;
end;
//Добаляем учителя
Query1.Next;
n:=TreeView1.Items.Add(nil, Query1.Fields[0].AsString);
//Формируем запрос для добавления журналов
Query2.Active:=false;
Query2.SQL.Text:='Select doc from TEACH order by tag';
Query2.Active:=true;
//Заполняем элементы из таблицы учителей
While not Query2.Eof do 
begin
TreeView1.Items.AddChild(n, Query2.Fields[0].AsString);
Query2.Next;
end;
TreeView1.EndUpdate;
Query1.Active:=false;
Query2.Active:=false;
Хотя, если честно все делается намного проще, в одной таблице, если хотите могу показать...
Если вас не затруднит, покажите пожалуйста, ато совсем с ума схожу уже. :rolleyes:
 
B

BurcevD

#13
Если вас не затруднит, покажите пожалуйста, ато совсем с ума схожу уже. :)
Делается одна таблица с полями
Код, Родитель, Наименование, ПорядокСортировки
выбирается в том же самом ADOQuery примерно так:

Код:
procedure TForm1.ButtonClick(...);

Procedure RT(NN:TTreeNode;PARENTID:Integer);
Var N:TTreeNode;
BM:TBookMark;
Begin
//Ищем первую запись с родителем равным в параметре
ADOQuery1.Locate('Родитель',PARENTID,[]);
//Пока текущий родитель нужный нам и не конец таблицы выполняем следующее...
While (ADOQuery1.FieldByName('Родитель').AsInteger=PARENTID)and(not ADOQuery1.Eof) do
begin
//Создаем ветвь с накименованием из таблицы
N:=TreeView1.Items.AddChild(nn,ADOQuery1.FieldByName('Наименование').AsString);
//Присваиваем этой ветви номер, равный коду из таблицы
N.StateIndex:=ADOQuery1.FieldByName('Код').AsInteger;
//Запоминаем место в таблице
BM:=ADOQUery1.GetBookMark();
//Рекурсивно вызываем проедуру, т.е. ищем все ветви, для которых текущая ветвь будет родителем
RT(N,N.StateIndex);
//Переходим на закладку
ADOQuery1.GotoBookMark(BM);
ADOQuery1.FreeBookMark(BM);
//Следующая запись
ADOQuery1.Next;
end;
End;

Begin
//Формируем запрос
ADOQuery1.Active:=false;
ADOQuery1.SQL.Text:='Select Код, Родитель, Наименование, ПорядокСортировки FROM Таблица1 ORDER BY Родитель, ПорядокСортировки';
ADOQuery1.Open;
//Заполняем дерево
RT(nil,0);
ENd;
Принцип этой процедурки довольно прост, ищем ветвь, создаем ее и ищем для нее подветви и так далее, например для заполнения как вы хотели выше таблица будет иметь следующий вид:
 

Вложения

E

evgen

#14
Делается одна таблица с полями
Код, Родитель, Наименование, ПорядокСортировки
выбирается в том же самом ADOQuery примерно так:

Принцип этой процедурки довольно прост, ищем ветвь, создаем ее и ищем для нее подветви и так далее, например для заполнения как вы хотели выше таблица будет иметь следующий вид:
Огоромное спасибо Вам, за такой полный ответ. Я убедился в Ваших огромных знаниях. Но у меня возник следующий вопрос. Также все эти договора и журналы хранятся в таблице. Я их хочу выводить в ListView, вернее содержимое журналов, например фамилии участников. Нужно ведь присваивать в TreeView какие то ключи, типа поле Data, чтоб она была типа ссылкой. Для того, чтобы ListView знал, какие фамилии участников к какому журналу относятся. Как это организовать?
Спасибо!!!
 
B

BurcevD

#16
Огоромное спасибо Вам, за такой полный ответ. Я убедился в Ваших огромных знаниях. Но у меня возник следующий вопрос. Также все эти договора и журналы хранятся в таблице. Я их хочу выводить в ListView, вернее содержимое журналов, например фамилии участников. Нужно ведь присваивать в TreeView какие то ключи, типа поле Data, чтоб она была типа ссылкой. Для того, чтобы ListView знал, какие фамилии участников к какому журналу относятся. Как это организовать?
Спасибо!!!
Все делается довольно просто, у каждого элемента в дереве есть свой код, вставляемый из таблицы, храниться он в свойстве StateIndex. Вам необходимо в событии OnChange для компонента TreeView1 Сделать обработчик, например если добавить в таблицу текстовое поле, где будет краткое описание или можно МЕМО поле, в котором хранить все данные, то обработчик событий может быть такой
Код:
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var q:TADOQuery;
begin
if (Node<>nil) then
begin
q:=TADOQuery.Create(nil);
q.Connection:=ADOConnection1; //Указываете имя компоненты для соединения
q.SQL.Text:='Select [MyField] from Таблица1 Where Код='+IntToStr(Node.StateIndex); //MyField - наименование поля, где храняться данные
q.Open;
Memo1.Lines.text:=q.Fields[0].AsString; //Memo1 - Текстовое поле куда нужно вывести данные
q.Close;
q.Free;
end;
end;