![]() |
|
|
![]()
|
|
| Ddddddelphi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 1.12.2004 Репутация: нет Всего: нет |
Создал таблицу и псевдоним с именем Lavocka.
Таблица такая - таблица описывает предприятие, у каждого рабочего имеется свой универсальны код в таблице, и дополнительный код, который означает - у кого в подчинение данный рабочий, вот таблица: code name dopcode proffession 0033 bos 0000 director 0084 ivanov 0033 menejer 0085 vasichkin 0033 menejer 0097 ohlamonov 0084 menejer's p0moshnik 0097 ohlamonov 0085 menejer's p0moshnik Мне нужно через дерево TreeView1, используя SQL -запросы отобразить базу данных, следующим образом : -bos _ _ _-ivanov _ _ _ _ _ _ohlamonov _ _ _-vasichkin _ _ _ _ _ _ohlamonov подскажите пожалуйста, как нужно чего делать????????????? |
|||
|
||||
| SPrograMMer |
|
|||
![]() Спамер :) ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 5.11.2004 Где: Краснодар Репутация: 1 Всего: 6 |
УУУ, чего захотел!
компонент TDBTree поищи в каком-нить яндексе. -------------------- животное = зверь законченный гентушник |
|||
|
||||
| Dimich |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 25.8.2004 Где: Брянск Репутация: 3 Всего: 7 |
--------------------
Не работает - исправь, работает - не трогай!!! |
|||
|
||||
| BSV_Sergey |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 19.11.2004 Где: г. Москва Репутация: нет Всего: 3 |
Для построения данного дерева нужно использовать рекурсию. Вариантов может быть несколько. Если БД на SQL сервере то могу предложить следующее:
Создать на сервере 2 хранимые процедуры, которые используя рекурсию сформируют промежуточную таблицу, на основании которой delphi построит дерево. Процедура 1
Процедура 2
В Delphi пишем процудеру формирования дерева:
При этом всю основную нагрузку по формированию данных выполняет SQL сервер а Delphi лишь остается нарисовать дерево пройдясь по всем строчкам в возвращенном наборе данных. Либо можно организовать рекурсивное построение дерева средствами самого Delphi. каму как больше нравится. Это сообщение отредактировал(а) BSV_Sergey - 10.12.2004, 14:43 |
||||||
|
|||||||
| Ddddddelphi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 1.12.2004 Репутация: нет Всего: нет |
BSV_Sergey, спасибо, но я сделал бд используя BDE,
извиняюсь, что неполностью всё не описал, как с помощью компонентов DataSourse и Query добиться решения задачи? Это сообщение отредактировал(а) Ddddddelphi - 10.12.2004, 23:16 |
|||
|
||||
| SPrograMMer |
|
|||
![]() Спамер :) ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 5.11.2004 Где: Краснодар Репутация: 1 Всего: 6 |
Ну, берешь, Query, которые выбирает сотрудников первого уровня - саамых главных, - из этого списка, создаешь, узлы первого уровня, затем берешь первый узел, смотришь сотрудников, которые ему подчиняются, - это узелы второго уровня для первого узла, затем, берешь первый узел второго уровня, для первого начальника, смотришь какие люди ему подчиняются,... и т.д.
Вот и построишь дерево. -------------------- животное = зверь законченный гентушник |
|||
|
||||
| BSV_Sergey |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 19.11.2004 Где: г. Москва Репутация: нет Всего: 3 |
Алгоритм формирования дерева можно организовать используя код приведенный ниже. Возможно его удастся улучшить, это первое решение, которое пришло мне в голову;
Структура таблицы используемой в примере: REPORTTREE treeid description treeupid 1 tree1 0 2 tree2 1 3 tree3 1 и тд Текст модуля:
Ddddddelphi Надеюсь, я не слишком опоздал с ответом и мое решение Это сообщение отредактировал(а) BSV_Sergey - 16.12.2004, 15:01 |
|||
|
||||
| Ddddddelphi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 1.12.2004 Репутация: нет Всего: нет |
BSV_Sergey,
актуально, я учусь для себя поками-сь.... cпасибо!!!!! поработаю... глупые вопросы, а: Структура таблицы используемой в примере: REPORTTREE это из стандартных? не нашёл...c этим ладно treeid description treeupid 1 tree1 0 2 tree2 1 3 tree3 1 и тд чё воще означает? Это сообщение отредактировал(а) Ddddddelphi - 16.12.2004, 15:55 |
|||
|
||||
| BSV_Sergey |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 19.11.2004 Где: г. Москва Репутация: нет Всего: 3 |
Таблица REPORTTREE - содержит 3 столбца:
treeid - id ветви дерева description - название ветви дерева treeupid - какой ветви дерева подчиняется. В случае если treeupid = 0 - ветвь является контевой ветвью дерева и не кому не подчиняется. Я назвал таблицу REPORTTREE, в твоей программе она может называться по другому. В твоем примере, если я правильно понял code - это treeid в моей таблице name - description, dopcode - treeupid. К примеру дерево на основе следующих данных: treeid description treeupid 1 Иванов 0 2 Петров 1 3 Сидоров 1 4 Смирнов 3 5 Наумов 2 будет выглядеть так - Иванов ----Петров -------Наутов ----Сидоров -------Смирнов Это сообщение отредактировал(а) BSV_Sergey - 16.12.2004, 17:13 |
|||
|
||||
| BSV_Sergey |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 19.11.2004 Где: г. Москва Репутация: нет Всего: 3 |
Я посмотрел твой пример. У тебя есть возможность, что у одного сотрудника могут быть несколько руководителей. В данной ситуации я еще посоветовал бы слегка изменить структуру таблиц, чтобы избежать избыточности данных. Можно создать таблицу с информацией о сотрудниках, к примеру Employee (employeeid(ID сотрудника), lastname, firstname, post и тд) и таблицу Hierarchy (employeeid, chiefid) в которой будет прописана орг структура предприяпия. В поле employeeid будет храниться ID сотрудника из таблицы employee, а в поле chiefid – ID сотрудника из таблица employee, который является руководителем первого.
Example: Employee 1 ivanov ivan Manager 2 petrov ivan Chief of Branch of Department 3 sidorov petr Director Hierarchy 3 0 1 3 2 3 1 2 Дерево будет выглядеть так --sidorov ----ivanov ----petrov --------ivanov Хотя мож это и лищнее, смотри сам.. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Еще проще
Ставищ EhLib 3.5, если еще не стоит В оэтой библиотеке много полезного, в том числе есть и такая фича, которая тебе нужна, по трем полям построить дерево. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
попытался отсканировать пару страниц из книги "Мир Interbase"
получилось кривовато есть таблица [ID_GOODS] [ID_PARENT_GOODS] [GOOD_NAME] 1 0 GOODS 2 1 Бытовая техника 3 1 Компьютеры и комплектующие 4 2 Холодиль ники 5 2 Стиральные машины 6 4 Трехкамерные 7 4 Двухкамерные 8 4 Однокамерные 9 5 Вертикальные 10 5 Фронтальные 11 10 Узкие 12 10 Классические DECLARE VARIABLE CURR_CHILD_NAME VARCHAR(80); BEGIN /*Организуем внешний цикл FOR SELECT no непосредственным потомкам товара с ID_GOOD=ID_GOOD2SHOW */ FOR SELECT gt1.id_good, gt1.good_name FROM GoodsTree gt1 WHERE gt1.id_parent_good=:ID_good2show INTO:ID_CHILD_G00D, :full_goods_name DO BEGIN /*Проверка с помощью функции EXISTS, которая возвращает TRUE, если запрос в скобках вернет хотя бы одну строку. Если у найденного узла с ID_PARENT_GOOD = ID_CHILD_GOOD нет потомков, то он является "листом" дерева и попадает в результаты */ IF (NOT EXISTS( SELECT * FROM GoodsTree WHERE GoodsTree.id_parent_good=:id_child_good)) THEN BEGIN /* Передаем "лист" дерева в результаты */ SUSPEND; END ELSE /* Для узлов, у которых есть потомки*/ BEGIN /*сохраняем имя узла-родителя во временной переменной */ CURR_CHILD_NAME=full_goods_name; / * рекурсивно запускаем эту процедуру */ FOR SELECT ID_CHILD_GOOD, full_goods_name FROM GETFULLNAME (:ID_CHILD_GOOD) INTO:ID_CHILD_GOOD, :full_goods_name DO BEGIN /*добавляем имя узла-родителя к найденному имени потомка с помощью операции конкатенации строк || */ full_goods_name=CURR_CHILD_NAME||' '||full_goods_name; SUSPEND; /* возвращаем полное имя товара*/ END END END END Если мы выполним данную процедуру с входным параметром ID_GOOD2SHOW=1, то получим следующее: FULL_GOODS_NAME FULL_GOODS_NAME Бытовая техника Холодильники Трехкамерные 6 Бытовая техника Холодильники Двухкамерные 7 Бытовая техника Холодильники Однокамерные 8 и т.д. Это сообщение отредактировал(а) dsergey - 21.12.2004, 12:57 |
|||
|
||||
| Ddddddelphi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 1.12.2004 Репутация: нет Всего: нет |
@dsergey
"Мир Interbase"-что за книга? специально для Дельфи или? До изучения Interbase по книге ещё не дошёл, надо будет твой код рассмотреть, когда дойду. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
"Мир Interbase (вторая редакция)" это, насколько я знаю единственная книга на русском языке по Interbase, для Delphi там не очень много, еще продается с ней компакт-диск, там прилочно информации, компонентов, а также кроме IB7, есть "огненная утка"
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |