Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Oracle таблицу EMP на Treeview в delphi  [new]
Nathgul
Member

Откуда:
Сообщений: 26
Сломал голову уже... задача вывести всех сотрудников начиная с президента из таблицы emp в treeview используя delphi. логически понимаю что хотят.
есть президент (mgr=0)
у него 3 менеджера в разных городах(mgr=7839, deptno=10 20 30)
у тех еще есть свои подчиненные в тех же городах(mgr<>0, mgr<>7839, deptno=10 20 30).
то есть иерархию отследить по одной таблице emp могу.
к базе подключился, в dbgrid данные выводятся.

Вопросы:
Как в принципе внести данные в treeview?
вносить данные в treeview нужно тремя запросами? или можно ограничится одним?
есть ли какие нибудь примеры для изучения (например на основе базы типа: один город, какое-то кол-во улиц, какое-то кол-во домов на каждой улице). Заранее спасибо!!!
12 сен 19, 10:37    [21969201]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
DesWind
Member

Откуда:
Сообщений: 109
Nathgul,

Таблицу сам формируешь? Тогда можно сделать через ID, PatrentID тогда достаточно перебора.
12 сен 19, 10:54    [21969226]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Nathgul
Member

Откуда:
Сообщений: 26
DesWind
Nathgul,

Таблицу сам формируешь? Тогда можно сделать через ID, PatrentID тогда достаточно перебора.

гридовскую табличку сам формирую (делал ее для проверки что данные приходят по запросу)? но суть еще в том что нужно просто создать приложение которое при запуске отобразит treeview в кором будет иерархичный список сотрудников начиная с президента.
12 сен 19, 10:59    [21969230]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Nathgul
Member

Откуда:
Сообщений: 26
DesWind
Nathgul,

Таблицу сам формируешь? Тогда можно сделать через ID, PatrentID тогда достаточно перебора.

с другой стороны буду я использовать или нет нигде не оговорено. табличку то можно и скрыть с глаз долой))
12 сен 19, 11:00    [21969231]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Nathgul
Member

Откуда:
Сообщений: 26
в целом то и нужен пример заполнения treeview из базы вида шеф-его манагеры в флиалах- сотрудники филиалов.... чтобы понять и как правильно заполняется treeview, и какая логика используется при этом.
12 сен 19, 11:03    [21969234]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Nathgul
Member

Откуда:
Сообщений: 26
крутится алгоритм: сначала найти из базы начальника (mgr=0) и поставить его первым, запрос обнулить. потом новым запросом найти первого из трех манагеров (mgr=7839)и поставить его в подраздел начальника, после этого запустить второй запрос на поиск его сотрудников (mgr<>0, mgr<7839>, deptno манагера = deptno сотрудника)и ставить их уже в подраздел манагера... ну тд. вопрос как его реализовать и правильный ли он вообще.
12 сен 19, 11:14    [21969242]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
DesWind
Member

Откуда:
Сообщений: 109
Nathgul,

Если данные формируешь сам, то и формировать их нужно иерархически, сначала глава департамента(Id=1; ParentId=0); потом подчиненные (Id=x; ParentId=1) и т.д. Далее простым перебором добавляешь в TreeView, в соответсвующие ветки, согласно иерархии.
12 сен 19, 11:28    [21969256]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Nathgul
Member

Откуда:
Сообщений: 26
DesWind
Nathgul,

Если данные формируешь сам, то и формировать их нужно иерархически, сначала глава департамента(Id=1; ParentId=0); потом подчиненные (Id=x; ParentId=1) и т.д. Далее простым перебором добавляешь в TreeView, в соответсвующие ветки, согласно иерархии.


EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17.12.80 800 20
7499 ALLEN SALESMAN 7698 20.02.81 1600 300 30
7521 WARD SALESMAN 7698 22.02.81 1250 500 30
7566 JONES MANAGER 7839 02.04.81 2975 20
7654 MARTIN SALESMAN 7698 28.09.81 1250 1400 30
7698 BLAKE MANAGER 7839 01.05.81 2850 30
7782 CLARK MANAGER 7839 09.06.81 2450 10
7839 KING PRESIDENT 0 17.11.81 5000 10
7844 TURNER SALESMAN 7698 08.09.81 1500 0 30
7900 JAMES CLERK 7698 03.12.81 950 30
7902 FORD ANALYST 7566 03.12.81 3000 20
7934 MILLER CLERK 7782 23.01.82 1300 10

это исходная таблица в Oracle... ее я получаю запросом select * from emp;... не совсем тебя понимаю как я могу сформировать иерархические данные и потом использовать их? извини если туплю... но реально перечитав массу воды про тривью уже голова закипает.
12 сен 19, 11:48    [21969272]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48141

Nathgul
вопрос как его реализовать и правильный ли он вообще.

Именно так его и реализовать: добавляешь в TTreeView начальника из одного запроса, а потом
всех его прямых подчинённых из второго запроса. В OnExpanding повторяешь процесс
добавления подчинённых для каждого Child из разворачиваемой ноды.

Posted via ActualForum NNTP Server 1.5

12 сен 19, 12:33    [21969325]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Gator
Member

Откуда: Москва
Сообщений: 14910
Dimitry Sibiryakov
Nathgul
вопрос как его реализовать и правильный ли он вообще.

Именно так его и реализовать: добавляешь в TTreeView начальника из одного запроса, а потом
всех его прямых подчинённых из второго запроса. В OnExpanding повторяешь процесс
добавления подчинённых для каждого Child из разворачиваемой ноды.
Будет работать, пока кто-то из города bobo не купит жильё в городе coco и не совместит работу манагера в разных подразделениях этих городов. А если он гражданство расширит? Тем самым будет лес (два президента - два дерева).
Так не строят отношения (реляции).
Генеалогия нагляднее подчинённости сотрудников, а реальные топологии сложнее генеалогических лесов.
Простыми отношениями ID-ParentID в одной таблице тут не обойтись. Надо таблицы и связи плодить.
Хотя задание Автора ваша рекомендация решает, но...
Больно смотреть на широкие нермализованные таблицы. Картинка с другого сайта.
12 сен 19, 13:21    [21969402]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
goldmi45
Member

Откуда:
Сообщений: 1177
Nathgul
крутится алгоритм: сначала найти из базы начальника (mgr=0) и поставить его первым, запрос обнулить. потом новым запросом найти первого из трех манагеров (mgr=7839)и поставить его в подраздел начальника, после этого запустить второй запрос на поиск его сотрудников (mgr<>0, mgr<7839>, deptno манагера = deptno сотрудника)и ставить их уже в подраздел манагера... ну тд. вопрос как его реализовать и правильный ли он вообще.

А кто знает, что mgr=0 - это президент, а mgr=7839 - подчинённые президента, а mgr=7698 уже ниже по иерархии?
Если никто, кроме вас, то построить дерево можно, но это вы гвоздями прибьёте такую иерархию.
Обычно для дерева должна быть таблица, в которой у каждой записи есть поле родителя. О чём вам DesWind говорил. Типа такого:
IdParentId
1null
21
31
42
54

И тогда первым запросом вы получаете записи, у которых ParentId = null. И это будут корни дерева. А следующими запросами получаете детей для конкретных корней.
12 сен 19, 13:32    [21969425]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Nathgul
Member

Откуда:
Сообщений: 26
сформировал таблицу иерархическую, проставил поля id и parent_id. подскажите как на ее основании теперь построить дерево в treeview. заранее спасибо) прошу прощения за воду выше)

     LEVEL         ID ENAME       PARENT_ID
---------- ---------- ---------- ----------
         1       7839 KING                 
         2       7566 JONES            7839
         3       7788 SCOTT            7566
         4       7876 ADAMS            7788
         3       7902 FORD             7566
         4       7369 SMITH            7902
         2       7698 BLAKE            7839
         3       7499 ALLEN            7698
         3       7521 WARD             7698
         3       7654 MARTIN           7698
         3       7844 TURNER           7698
         3       7900 JAMES            7698
         2       7782 CLARK            7839
         3       7934 MILLER           7782

слева id людей, потом имена и id руководителей на ними. level это столбец показывающий уровень родства.
12 сен 19, 13:39    [21969438]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Gator
Member

Откуда: Москва
Сообщений: 14910
goldmi45
И тогда первым запросом вы получаете записи, у которых ParentId = null. И это будут корни дерева. А следующими запросами получаете детей для конкретных корней.
Несусветная глупость!!!
NULL суть неизвестно, что означает.
Почему mgr=0 не может утонуть, а mgr=7839 стать президентом? Ключ менять/удалять?
Не проще ли ключ президента хранить отдельно? Иди флажок поднять - мол этот 123 - Президент теперь?
12 сен 19, 13:46    [21969446]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
goldmi45
Member

Откуда:
Сообщений: 1177
Gator
goldmi45
И тогда первым запросом вы получаете записи, у которых ParentId = null. И это будут корни дерева. А следующими запросами получаете детей для конкретных корней.
Несусветная глупость!!!
NULL суть неизвестно, что означает.
Почему mgr=0 не может утонуть, а mgr=7839 стать президентом? Ключ менять/удалять?
Не проще ли ключ президента хранить отдельно? Иди флажок поднять - мол этот 123 - Президент теперь?

Не скажите. )) NULL означает, что нет родителя.
Это один из самых распространённых способов построения дерева.
А для того, чтобы менеджер с ид=7839 стал президентом, нужно должности хранить отдельно от людей(менеджеров), потому как это разные сущности. И должна быть процедура назначения на должность, которая хранится в отдельной таблице.
12 сен 19, 14:03    [21969474]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Gator
Member

Откуда: Москва
Сообщений: 14910
Nathgul
сформировал таблицу иерархическую, проставил поля id и parent_id. подскажите как на ее основании теперь построить дерево в treeview. заранее спасибо) прошу прощения за воду выше)

слева id людей, потом имена и id руководителей на ними. level это столбец показывающий уровень родства.


Не надо LEVEL
Бери как Дмитрий написал в 21969325
select id, name, parentid ... where parentid is null
а дальше разворачивай дерево по текущему id родителя (как будто ты - начальник)
select id, name, parentid ... where parentid = preid
12 сен 19, 14:04    [21969476]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Gator
Member

Откуда: Москва
Сообщений: 14910
goldmi45
Не скажите. )) NULL означает, что нет родителя.
Это один из самых распространённых способов построения дерева.
А для того, чтобы менеджер с ид=7839 стал президентом, нужно должности хранить отдельно от людей(менеджеров), потому как это разные сущности. И должна быть процедура назначения на должность, которая хранится в отдельной таблице.
Каша в голове.
Нет родителя, т.е. он в воздухе болтается?
Должности связаны бизнес иерархией.
Люди никак не связаны, они сами по себе: Петя, Вася, Юля, Стеша, Яша, Фаня...
Когда их ставят на должность, у них появляется иерархия.
А когда Юля уйдёт в декрет, и её работу разделят Стеша с Яшей, твоя иерархия ломается.
Ибо "отдельная таблица" это не предусматривает.
А в реале, начальник просто звякнет Васе: мол, Юлькины дела сделайте, Стеша тебе поможет.
А Вася работает под Яшей, а Стеша у Фани
12 сен 19, 14:21    [21969497]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Nathgul
Member

Откуда:
Сообщений: 26
Gator
Nathgul
сформировал таблицу иерархическую, проставил поля id и parent_id. подскажите как на ее основании теперь построить дерево в treeview. заранее спасибо) прошу прощения за воду выше)

слева id людей, потом имена и id руководителей на ними. level это столбец показывающий уровень родства.


Не надо LEVEL
Бери как Дмитрий написал в 21969325
select id, name, parentid ... where parentid is null
а дальше разворачивай дерево по текущему id родителя (как будто ты - начальник)
select id, name, parentid ... where parentid = preid


ну это я и из новой таблички сделать смогу)) Пасип))
12 сен 19, 14:27    [21969505]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
goldmi45
Member

Откуда:
Сообщений: 1177
Gator
goldmi45
Не скажите. )) NULL означает, что нет родителя.
Это один из самых распространённых способов построения дерева.
А для того, чтобы менеджер с ид=7839 стал президентом, нужно должности хранить отдельно от людей(менеджеров), потому как это разные сущности. И должна быть процедура назначения на должность, которая хранится в отдельной таблице.
Каша в голове.
Нет родителя, т.е. он в воздухе болтается?

Зачем же вы в 21969476 советуете по null искать корень, если "он в воздухе болтается". ))
Gator
Должности связаны бизнес иерархией.
Люди никак не связаны, они сами по себе: Петя, Вася, Юля, Стеша, Яша, Фаня...
Когда их ставят на должность, у них появляется иерархия.

Ну дак и я про это же. Должности и штатное расписание - отдельные от людей сущности.
Gator
А когда Юля уйдёт в декрет, и её работу разделят Стеша с Яшей, твоя иерархия ломается.
Ибо "отдельная таблица" это не предусматривает.

По штатному расписанию она останется на той же должности.
Gator
А в реале, начальник просто звякнет Васе: мол, Юлькины дела сделайте, Стеша тебе поможет.
А Вася работает под Яшей, а Стеша у Фани

Лирика, к построению дерева не относится.
12 сен 19, 14:40    [21969522]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
MaratIsk
Member

Откуда: Astana, Kazakhstan
Сообщений: 2475
Nathgul,

...

type
  pstr   = ^tstr;
    tstr = record
    str1  : string; //ID1
    str2  : string; //Template
    str3  : string; //Script
    str4  : string; //Description
  end;

var
  FolderID  : pstr;

procedure TfrmReport.FillTree;
var
  TreeNode: TTreeNode;
  procedure FillTreeNode(TreeNode: TTreeNode);
  var
    I: Integer;
    Node: TTreeNode;
  begin
    FolderID := TreeNode.Data;
    DS_CHILD.DataSet.Filtered := FALSE;
    DS_CHILD.DataSet.Filter   := 'rep_ID2=' + #39 + FolderID.str1 + #39;
    DS_CHILD.DataSet.Filtered := True;

    DS_CHILD.DataSet.First;
    for I := 0 to DS_CHILD.DataSet.RecordCount - 1 do begin
      Node := TreeView.Items.AddChild(TreeNode, DS_CHILD.DataSet.FindField('rep_title').AsString);
      New(FolderID);
      FolderID.str1 := DS_CHILD.DataSet.FindField('rep_ID1').AsString;
      Node.Data := FolderID;
      Node.ImageIndex := 0;
      Node.SelectedIndex := 1;
      DS_CHILD.DataSet.Next;
    end; // for I := 0 to DS_CHILD.DataSet.RecordCount
    for I := 0 to TreeNode.Count - 1 do begin
      FillTreeNode(TreeNode.Item[I]);
    end; // for I := 0 to TreeNode.Count
  end;
begin
  try
    LockWindowUpdate(self.Handle);
    TreeView.Items.BeginUpdate;
    TreeView.Items.Clear;

    while not DS_ROOT.DataSet.Eof do begin
      with TreeView.Items.Add(nil, DS_ROOT.DataSet.FieldByName('rep_title').AsString) do begin
        New(FolderID);
        FolderID.str1 := DS_ROOT.DataSet.FieldByName('rep_ID1').AsString;
        Data          := FolderID;
        ImageIndex    := 0;
        SelectedIndex := 1;
      end; // with TreeView.Items.Add
      TreeView.Canvas.Font.Style := [fsBold];
      FillTreeNode(TreeView.Items[0]);
      DS_ROOT.DataSet.Next;
    end; // while not DS_ROOT.DataSet.Eof

    TreeView.FullExpand;
    TreeView.Items.EndUpdate;
    if DS_ROOT.DataSet.RecordCount > 0 then TreeView.Items[0].Selected := True;
  finally
    LockWindowUpdate(0);
  end;
end;


К сообщению приложен файл. Размер - 20Kb
12 сен 19, 15:00    [21969550]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Gator
Member

Откуда: Москва
Сообщений: 14910
goldmi45
Лирика, к построению дерева не относится.
Дерево к работе тоже не относится.
Надо представить бизнес процесс и попытаться облегчить его эта(чик) своей софтинкой.
> Ну дак и я про это же. Должности и штатное расписание - отдельные от людей сущности.
Наконец! Поздравляю с началом понимания откуда берётся иерархия заранее несвязанных людей.
> По штатному расписанию она останется на той же должности.
Ясен пень. Это кто бухам и налоговой объяснит, почему у сотрудницы детсад оплатить нет хватило, когда она исполняла пожелания руководства, пока оно отпускное пузо грело?
> Зачем же вы в 21969476 советуете по null искать корень, если "он в воздухе болтается". ))
Ты же сам Президента в воздух подвесил, не указав ID его родителя (начальника). Вот я и написал where ParentID is null

Кроме этого, всё меняется в жизни, на месте ничего не стоит.
12 сен 19, 19:05    [21969774]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
Nathgul
Member

Откуда:
Сообщений: 26
Gator
goldmi45
Лирика, к построению дерева не относится.
Дерево к работе тоже не относится.
Надо представить бизнес процесс и попытаться облегчить его эта(чик) своей софтинкой.
> Ну дак и я про это же. Должности и штатное расписание - отдельные от людей сущности.
Наконец! Поздравляю с началом понимания откуда берётся иерархия заранее несвязанных людей.
> ...


все круто... единственное что не понятно... как отделять вносимые tree-поля друг от друга используя CurrentNode := TreeView1.Items.AddChild
CurrentNode := TreeView1.Items.AddChild(CurrentNode, '1');
          first := TreeView1.Items.AddChild(CurrentNode, '2');
          second := TreeView1.Items.AddChild(first, '3');
          third := TreeView1.Items.AddChild(first, '4');
          CurrentNode := TreeView1.Items.AddChild(CurrentNode, '5');
          first := TreeView1.Items.AddChild(first, '6');
          second := TreeView1.Items.AddChild(first, '7');
          third := TreeView1.Items.AddChild(first, '8');

пока пишу ручками каждую строчку просто для того, чтобы понять как родителя отделить он потомка или наеборот))
в чем смысл оператора Parent?
какая разница если мы пишем TreeView1.Items.Add или TreeView1.Items.AddChild
что будет происходить если например между двумя строками поставить CurrentNode :=CurrentNode.Parent;? код ниже.
CurrentNode := TreeView1.Items.AddChild(CurrentNode, '1');
CurrentNode := TreeView1.Items.AddChild(CurrentNode, '2');
CurrentNode :=CurrentNode.Parent;
CurrentNode := TreeView1.Items.AddChild(CurrentNode, '3');
CurrentNode := TreeView1.Items.AddChild(CurrentNode, '4');
CurrentNode := TreeView1.Items.AddChild(CurrentNode, '5');

смотрю на все это визуально пробуя разные компановки, но пока что-то не вижу закономерностей. Заранее спасибо.
12 сен 19, 20:20    [21969859]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
goldmi45
Member

Откуда:
Сообщений: 1177
Nathgul
в чем смысл оператора Parent?
какая разница если мы пишем TreeView1.Items.Add или TreeView1.Items.AddChild
что будет происходить если например между двумя строками поставить CurrentNode :=CurrentNode.Parent;? код ниже.
CurrentNode := TreeView1.Items.AddChild(CurrentNode, '1');
CurrentNode := TreeView1.Items.AddChild(CurrentNode, '2');
CurrentNode :=CurrentNode.Parent;
CurrentNode := TreeView1.Items.AddChild(CurrentNode, '3');
CurrentNode := TreeView1.Items.AddChild(CurrentNode, '4');
CurrentNode := TreeView1.Items.AddChild(CurrentNode, '5');

смотрю на все это визуально пробуя разные компановки, но пока что-то не вижу закономерностей. Заранее спасибо.

Parent нужен, чтобы указать, кто будет родителем узла.
Кроме этого, у типа TTreeNode, к которому относится ваш CurrentNode, есть свойство Data: Pointer. В нём можно хранить указатель на данные, характеризующие ноду. Там можно хранить к примеру идентификатор ноды. И не только.

К сообщению приложен файл. Размер - 33Kb
13 сен 19, 08:30    [21970025]     Ответить | Цитировать Сообщить модератору
 Re: Oracle таблицу EMP на Treeview в delphi  [new]
goldmi45
Member

Откуда:
Сообщений: 1177
Nathgul
в чем смысл оператора Parent?
какая разница если мы пишем TreeView1.Items.Add или TreeView1.Items.AddChild
что будет происходить если например между двумя строками поставить CurrentNode :=CurrentNode.Parent;?

После CurrentNode :=CurrentNode.Parent у вас в переменной CurrentNode ссылка на родителя того узла, что был в этой переменной до этого кода.
TreeView1.Items.Add вы можете добавить соседей (на тот же уровень дерева) к указанной в параметре ноде.
TreeView1.Items.AddChild вы добавляете потомка к указанной в параметре ноде.
13 сен 19, 08:36    [21970028]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить