1. Акция на весь декабрь! Получай оплату х2 за уникальные статьи, объемом от 200 слов, если в заголовке темы и теле статьи присутствует слово Python
    Скрыть объявление

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

Тема в разделе "Delphi - Базы данных", создана пользователем evgen, 9 дек 2008.

  1. evgen

    evgen Гость

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

    Вложения:

    • form.jpg
      form.jpg
      Размер файла:
      13,1 КБ
      Просмотров:
      77
    • table1.jpg
      table1.jpg
      Размер файла:
      12 КБ
      Просмотров:
      84
    • table2.jpg
      table2.jpg
      Размер файла:
      13,1 КБ
      Просмотров:
      81
    • table3.jpg
      table3.jpg
      Размер файла:
      13,3 КБ
      Просмотров:
      72
  2. etc

    etc Гость

    Тут без кодирования не обойтись.
     
  3. evgen

    evgen Гость

    А может подскажите, без какого кодирования не обойтись???
     
  4. etc

    etc Гость

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

    evgen Гость

    А может быть покажете примерчик, как это все накодить?? Буду очень благодарен!!!
     
  6. etc

    etc Гость

    Неумею, я только могу показать где накодино неправильно, и все.
     
  7. evgen

    evgen Гость

    Может ссылку кинете, где это показано.
    Заранее благодарен!!!
     
  8. etc

    etc Гость

    В поставке Delphi есть отличная папачка - DEMOS - там много чего уже показано, если поискать как следует, то и это отыщите.
     
  9. BurcevD

    BurcevD Гость

    Лучше всего иметь два ADOQuery, Query1 и Query2, а дальше делается так:
    Код (Text):
    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;
    Хотя, если честно все делается намного проще, в одной таблице, если хотите могу показать...
     
  10. etc

    etc Гость

    Лучше их ваще не иметь.
     
  11. evgen

    evgen Гость

    Если вас не затруднит, покажите пожалуйста, ато совсем с ума схожу уже. :rolleyes:
     
  12. etc

    etc Гость

    этож всем известно - ADOConnection, ADOCommand, ADODataSet
     
  13. BurcevD

    BurcevD Гость

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

    Код (Text):
    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;
    Принцип этой процедурки довольно прост, ищем ветвь, создаем ее и ищем для нее подветви и так далее, например для заполнения как вы хотели выше таблица будет иметь следующий вид:
     

    Вложения:

    • _______1.png
      _______1.png
      Размер файла:
      13,7 КБ
      Просмотров:
      74
  14. evgen

    evgen Гость

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

    etc Гость

    А вот как написали, так и организовать.

    Когда уже сами начнете делать? любители халявы ...
     
  16. BurcevD

    BurcevD Гость

    Все делается довольно просто, у каждого элемента в дереве есть свой код, вставляемый из таблицы, храниться он в свойстве StateIndex. Вам необходимо в событии OnChange для компонента TreeView1 Сделать обработчик, например если добавить в таблицу текстовое поле, где будет краткое описание или можно МЕМО поле, в котором хранить все данные, то обработчик событий может быть такой
    Код (Text):
    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;
     
Загрузка...

Поделиться этой страницей