powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Oracle таблицу EMP на Treeview в delphi
23 сообщений из 23, страница 1 из 1
Oracle таблицу EMP на Treeview в delphi
    #39860758
Nathgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сломал голову уже... задача вывести всех сотрудников начиная с президента из таблицы emp в treeview используя delphi. логически понимаю что хотят.
есть президент (mgr=0)
у него 3 менеджера в разных городах(mgr=7839, deptno=10 20 30)
у тех еще есть свои подчиненные в тех же городах(mgr<>0, mgr<>7839, deptno=10 20 30).
то есть иерархию отследить по одной таблице emp могу.
к базе подключился, в dbgrid данные выводятся.

Вопросы:
Как в принципе внести данные в treeview?
вносить данные в treeview нужно тремя запросами? или можно ограничится одним?
есть ли какие нибудь примеры для изучения (например на основе базы типа: один город, какое-то кол-во улиц, какое-то кол-во домов на каждой улице). Заранее спасибо!!!
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860772
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nathgul,

Таблицу сам формируешь? Тогда можно сделать через ID, PatrentID тогда достаточно перебора.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860775
Nathgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWindNathgul,

Таблицу сам формируешь? Тогда можно сделать через ID, PatrentID тогда достаточно перебора.
гридовскую табличку сам формирую (делал ее для проверки что данные приходят по запросу)? но суть еще в том что нужно просто создать приложение которое при запуске отобразит treeview в кором будет иерархичный список сотрудников начиная с президента.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860776
Nathgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWindNathgul,

Таблицу сам формируешь? Тогда можно сделать через ID, PatrentID тогда достаточно перебора.
с другой стороны буду я использовать или нет нигде не оговорено. табличку то можно и скрыть с глаз долой))
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860777
Nathgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в целом то и нужен пример заполнения treeview из базы вида шеф-его манагеры в флиалах- сотрудники филиалов.... чтобы понять и как правильно заполняется treeview, и какая логика используется при этом.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860782
Nathgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
крутится алгоритм: сначала найти из базы начальника (mgr=0) и поставить его первым, запрос обнулить. потом новым запросом найти первого из трех манагеров (mgr=7839)и поставить его в подраздел начальника, после этого запустить второй запрос на поиск его сотрудников (mgr<>0, mgr<7839>, deptno манагера = deptno сотрудника)и ставить их уже в подраздел манагера... ну тд. вопрос как его реализовать и правильный ли он вообще.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860788
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nathgul,

Если данные формируешь сам, то и формировать их нужно иерархически, сначала глава департамента(Id=1; ParentId=0); потом подчиненные (Id=x; ParentId=1) и т.д. Далее простым перебором добавляешь в TreeView, в соответсвующие ветки, согласно иерархии.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860796
Nathgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWindNathgul,

Если данные формируешь сам, то и формировать их нужно иерархически, сначала глава департамента(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;... не совсем тебя понимаю как я могу сформировать иерархические данные и потом использовать их? извини если туплю... но реально перечитав массу воды про тривью уже голова закипает.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860832
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nathgulвопрос как его реализовать и правильный ли он вообще.

Именно так его и реализовать: добавляешь в TTreeView начальника из одного запроса, а потом
всех его прямых подчинённых из второго запроса. В OnExpanding повторяешь процесс
добавления подчинённых для каждого Child из разворачиваемой ноды.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860885
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNathgulвопрос как его реализовать и правильный ли он вообще.

Именно так его и реализовать: добавляешь в TTreeView начальника из одного запроса, а потом
всех его прямых подчинённых из второго запроса. В OnExpanding повторяешь процесс
добавления подчинённых для каждого Child из разворачиваемой ноды.Будет работать, пока кто-то из города bobo не купит жильё в городе coco и не совместит работу манагера в разных подразделениях этих городов. А если он гражданство расширит? Тем самым будет лес (два президента - два дерева).
Так не строят отношения (реляции).
Генеалогия нагляднее подчинённости сотрудников, а реальные топологии сложнее генеалогических лесов.
Простыми отношениями ID-ParentID в одной таблице тут не обойтись. Надо таблицы и связи плодить.
Хотя задание Автора ваша рекомендация решает, но...
Больно смотреть на широкие нермализованные таблицы.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860903
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nathgulкрутится алгоритм: сначала найти из базы начальника (mgr=0) и поставить его первым, запрос обнулить. потом новым запросом найти первого из трех манагеров (mgr=7839)и поставить его в подраздел начальника, после этого запустить второй запрос на поиск его сотрудников (mgr<>0, mgr<7839>, deptno манагера = deptno сотрудника)и ставить их уже в подраздел манагера... ну тд. вопрос как его реализовать и правильный ли он вообще.
А кто знает, что mgr=0 - это президент, а mgr=7839 - подчинённые президента, а mgr=7698 уже ниже по иерархии?
Если никто, кроме вас, то построить дерево можно, но это вы гвоздями прибьёте такую иерархию.
Обычно для дерева должна быть таблица, в которой у каждой записи есть поле родителя. О чём вам DesWind говорил. Типа такого:
IdParentId1null21314254
И тогда первым запросом вы получаете записи, у которых ParentId = null. И это будут корни дерева. А следующими запросами получаете детей для конкретных корней.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860914
Nathgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сформировал таблицу иерархическую, проставил поля id и parent_id. подскажите как на ее основании теперь построить дерево в treeview. заранее спасибо) прошу прощения за воду выше)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
     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 это столбец показывающий уровень родства.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860920
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45И тогда первым запросом вы получаете записи, у которых ParentId = null. И это будут корни дерева. А следующими запросами получаете детей для конкретных корней.Несусветная глупость!!!
NULL суть неизвестно, что означает.
Почему mgr=0 не может утонуть, а mgr=7839 стать президентом? Ключ менять/удалять?
Не проще ли ключ президента хранить отдельно? Иди флажок поднять - мол этот 123 - Президент теперь?
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860943
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatorgoldmi45И тогда первым запросом вы получаете записи, у которых ParentId = null. И это будут корни дерева. А следующими запросами получаете детей для конкретных корней.Несусветная глупость!!!
NULL суть неизвестно, что означает.
Почему mgr=0 не может утонуть, а mgr=7839 стать президентом? Ключ менять/удалять?
Не проще ли ключ президента хранить отдельно? Иди флажок поднять - мол этот 123 - Президент теперь?
Не скажите. )) NULL означает, что нет родителя.
Это один из самых распространённых способов построения дерева.
А для того, чтобы менеджер с ид=7839 стал президентом, нужно должности хранить отдельно от людей(менеджеров), потому как это разные сущности. И должна быть процедура назначения на должность, которая хранится в отдельной таблице.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860945
Фотография 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
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860962
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45Не скажите. )) NULL означает, что нет родителя.
Это один из самых распространённых способов построения дерева.
А для того, чтобы менеджер с ид=7839 стал президентом, нужно должности хранить отдельно от людей(менеджеров), потому как это разные сущности. И должна быть процедура назначения на должность, которая хранится в отдельной таблице.Каша в голове.
Нет родителя, т.е. он в воздухе болтается?
Должности связаны бизнес иерархией.
Люди никак не связаны, они сами по себе: Петя, Вася, Юля, Стеша, Яша, Фаня...
Когда их ставят на должность, у них появляется иерархия.
А когда Юля уйдёт в декрет, и её работу разделят Стеша с Яшей, твоя иерархия ломается.
Ибо "отдельная таблица" это не предусматривает.
А в реале, начальник просто звякнет Васе: мол, Юлькины дела сделайте, Стеша тебе поможет.
А Вася работает под Яшей, а Стеша у Фани
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860968
Nathgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GatorNathgulсформировал таблицу иерархическую, проставил поля 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

ну это я и из новой таблички сделать смогу)) Пасип))
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39860981
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatorgoldmi45Не скажите. )) NULL означает, что нет родителя.
Это один из самых распространённых способов построения дерева.
А для того, чтобы менеджер с ид=7839 стал президентом, нужно должности хранить отдельно от людей(менеджеров), потому как это разные сущности. И должна быть процедура назначения на должность, которая хранится в отдельной таблице.Каша в голове.
Нет родителя, т.е. он в воздухе болтается?
Зачем же вы в 21969476 советуете по null искать корень, если "он в воздухе болтается". ))
GatorДолжности связаны бизнес иерархией.
Люди никак не связаны, они сами по себе: Петя, Вася, Юля, Стеша, Яша, Фаня...
Когда их ставят на должность, у них появляется иерархия.
Ну дак и я про это же. Должности и штатное расписание - отдельные от людей сущности.
GatorА когда Юля уйдёт в декрет, и её работу разделят Стеша с Яшей, твоя иерархия ломается.
Ибо "отдельная таблица" это не предусматривает.
По штатному расписанию она останется на той же должности.
GatorА в реале, начальник просто звякнет Васе: мол, Юлькины дела сделайте, Стеша тебе поможет.
А Вася работает под Яшей, а Стеша у Фани
Лирика, к построению дерева не относится.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39861005
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nathgul,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
...

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;
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39861149
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45Лирика, к построению дерева не относится.Дерево к работе тоже не относится.
Надо представить бизнес процесс и попытаться облегчить его эта(чик) своей софтинкой.
> Ну дак и я про это же. Должности и штатное расписание - отдельные от людей сущности.
Наконец! Поздравляю с началом понимания откуда берётся иерархия заранее несвязанных людей.
> По штатному расписанию она останется на той же должности.
Ясен пень. Это кто бухам и налоговой объяснит, почему у сотрудницы детсад оплатить нет хватило, когда она исполняла пожелания руководства, пока оно отпускное пузо грело?
> Зачем же вы в 21969476 советуете по null искать корень, если "он в воздухе болтается". ))
Ты же сам Президента в воздух подвесил, не указав ID его родителя (начальника). Вот я и написал where ParentID is null

Кроме этого, всё меняется в жизни, на месте ничего не стоит.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39861163
Nathgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gatorgoldmi45Лирика, к построению дерева не относится.Дерево к работе тоже не относится.
Надо представить бизнес процесс и попытаться облегчить его эта(чик) своей софтинкой.
> Ну дак и я про это же. Должности и штатное расписание - отдельные от людей сущности.
Наконец! Поздравляю с началом понимания откуда берётся иерархия заранее несвязанных людей.
> ...

все круто... единственное что не понятно... как отделять вносимые tree-поля друг от друга используя CurrentNode := TreeView1.Items.AddChild
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
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;? код ниже.
Код: pascal
1.
2.
3.
4.
5.
6.
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');


смотрю на все это визуально пробуя разные компановки, но пока что-то не вижу закономерностей. Заранее спасибо.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39861265
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nathgulв чем смысл оператора Parent?
какая разница если мы пишем TreeView1.Items.Add или TreeView1.Items.AddChild
что будет происходить если например между двумя строками поставить CurrentNode :=CurrentNode.Parent;? код ниже.
Код: pascal
1.
2.
3.
4.
5.
6.
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. В нём можно хранить указатель на данные, характеризующие ноду. Там можно хранить к примеру идентификатор ноды. И не только.
...
Рейтинг: 0 / 0
Oracle таблицу EMP на Treeview в delphi
    #39861266
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nathgulв чем смысл оператора Parent?
какая разница если мы пишем TreeView1.Items.Add или TreeView1.Items.AddChild
что будет происходить если например между двумя строками поставить CurrentNode :=CurrentNode.Parent;?
После CurrentNode :=CurrentNode.Parent у вас в переменной CurrentNode ссылка на родителя того узла, что был в этой переменной до этого кода.
TreeView1.Items.Add вы можете добавить соседей (на тот же уровень дерева) к указанной в параметре ноде.
TreeView1.Items.AddChild вы добавляете потомка к указанной в параметре ноде.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Oracle таблицу EMP на Treeview в delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]