Как сделать дерево в access?

Конференция VBStreets

Весь вкус программирования!

  • Список форумовПлатформы и технологииБазы данных
  • Изменить размер шрифта
  • FAQ
  • Вход

Дерево в Access 2003

Дерево в Access 2003

smitatyana » 02.02.2009 (Пн) 11:33

Re: Дерево в Access 2003

Денис » 02.02.2009 (Пн) 13:51

Re: Дерево в Access 2003

iGrok » 02.02.2009 (Пн) 16:23

А если имелась в виду структура данных — тут вообще вариантов масса.

Один из самых простых:
Element_ID, Parent_ID, Element_Name

Parent_ID — ID элемента-родителя. Если Parent_ID = 0 — элемент находится «в корне» дерева.

Re: Дерево в Access 2003

smitatyana » 05.02.2009 (Чт) 12:28

ОООчень нужен дельный обстоятельно разъясненный совет!

мне нужно дерево организаций и должнослей в виде конечных листов дерева! У меня 4 справочника Департаменты, Отделы, Секторы и Должности. Структура справочниов:
id: int
name: str
И еще одна таблица — Штатное расписание:
id: int
depart: int — подстановка из справочника департаментов
otd: int — подстановка из справочника отделов
sek: int — подстановка из справочника секторов
dolj: int — подстановка из справочника должностей
и еще поля описательного характера данной штатной единицы (минимум, максимум, вредные условия, категория, количество ставок, ШПЗ ну и мелочи . )
В таблице Личная карточка помимо полей, описывающих все характеристики человека(табельный, ФИО, датарож, и др.) есть поле СТАВКАШТ — ставка из штатного расписания. Как раз ID из таблицы штатное расписание. Так я узнаю какой человек на какой должности и в каком департаменте работает. Служебные данные.
Вот незадача-то: всю структуру организации мне нужно изобразить в виде дерева treeview!
Так, чтобы при выделении листа — должности на форме справа, например, были харакеристики данной штатной единицы (минимум, максимум, вредные условия, категория, количество ставок, ШПЗ ну и мелочи . ). Ну и конечно подтягивался человек на этой ставкеШТ.
Могу я с моей структурой БД организовать такое дерево с возможностью редактирования всех узлов дерева? Удалить/добавить/изменить ветку дерева. Сделать удобным формирование и изменение штатного расписания.

Подскажите, как организовать подчиненость отделов департментам и т. д.?
и как заполнять в таком случае узлы дерева?
Просьба обьяснить. Начинающему — доходчиво. Заранее благодарна.

Re: Дерево в Access 2003

smitatyana » 05.02.2009 (Чт) 12:48

iGrok писал(а): А если имелась в виду структура данных — тут вообще вариантов масса.

Читать еще:  Как сделать форму поиска в access?

Один из самых простых:
Element_ID, Parent_ID, Element_Name

Parent_ID — ID элемента-родителя. Если Parent_ID = 0 — элемент находится «в корне» дерева.

Так у меня только одна таблица получается. А что делать с 4мя справочниками?

Re: Дерево в Access 2003

iGrok » 05.02.2009 (Чт) 13:36

Я правильно понял структуру?

Департаменты -> Отделы -> Секторы -> Должности -> Человеки. ?

С текущей структурой, если данные внутренне непротиворечивы, дерево построить можно, но достаточно трудно будет поддерживать ту саму непротиворечивость при изменениях.

Или у тебя теоретически возможен вариант, когда один отдел окажется в двух департаментах?

Если важно сохранить стуктуру данных неизменной — можно попробовать строить дерево по «Штатному расписанию».
Сделать выборку: SELECT DISTINCT depart, otd, sek, dolj FROM [Штатное расписание] ORDER BY depart, otd, sek, dolj
Потом идти по записям, и добавлять в дерево департаменты, отделы, секции и должности.
Т.е. для каждой записи проверять, есть ли уже в корне дерева такой департамент, если нету — добавлять. Потом так же с отделом, но смотреть его уже не в корне, а в текущем департаменте, и т.п. вполть до должности.

Такой способ построения дерева может оказаться достаточно медленым, но как реализовать что-то более эффективное, не меняя структуру БД я не знаю. Могу только подсказать подходящий вариант изменения структуры.

Насчёт самого компонента-дерева — нужно поизучать компонент, о котором Денис писал в первом посте. На форуме о нём много написано, но если что-то из прочитанного будет не понятно — спрашивай.

Re: Дерево в Access 2003

Денис » 05.02.2009 (Чт) 14:00

Насчет структуры данных, думаю ты хотел предложить дописать к таблицам

если отделов немного, то расставить ID будет недолго, если же много, как (подозреваю) у автора, можно ей порекомендовать сделать форму типа дизайнера и в ней распределить отделы и департаменты по своим местам.

О, я уже представил себе, как это может выглядеть: сначала есть список (запрос на выборку, обединяющий union’ами все справочники в один список) , но выводится он уже в TreeView (то-есть, каждый элемент — это корень дерева), потом, рядом со списком комбобокс, в котором отдельно выбраны наименования. при выборе элемента из списка мы видим в комбо 0 или надпись «нет» — это значит, что элемент является корневым. теперь мы выбираем в комбо из выпадающего списка нужный нам элемент и его ID записывается в Parent_ID текущего элемента, после чего обновляем дерево (процедуру обновления надо оптимизировать максимально, чтобы не тормозило, либо обновлять не автоматически, а по нажатию на кнопку), итак, в дереве появляется первая ветка.

Читать еще:  Как сделать запрос в microsoft access?

Всю процедуру повторяем до победного конца!

Саму форму можно так и обозвать: Справочник Отделов.
_________________

И да! Очень удобно для представления дерева сделать таблицу связей. вот так она должна выглядеть:
Код: Выделить всё ID
Департамент_ID,
Отдел_ID,
Сектор_ID,
Должность_ID,
Сотрудник_ID
В каждой записи этой таблицы будет прописана каждая одна связь какого-либо элемента одного справочника с каким-либо элементом другого или нескольких. На основе этой таблицы и строить дерево.

По сути, такая таблица у smitatyana уже наполовину реализована в таблице штатного расписания, но это неправильно. Нужно в штатном оставить только поле с номером (ID) записи в таблице связей.

При таком раскладе Parent_ID вообще не нужны! Структура-то жесткая. У сектора непосредственным парентом может быть только отдел. У сотрудника только должность (чтобы узнать из какого от отдела, сектора, департамента это тоже указано в записи)
если у одного сотрудника две должности (внутренний совместитель) то в таблице связей на него будет заведено соответственно две записи.

Office 365, AD, Active Directory, Sharepoint, C#, Powershell. Технические статьи и заметки.

Access: построение дерева разделов — TreeView и VBA

Дано: База данных Access 2016 с таблицей, где перечислены разделы (подразделения или другие данные, которые можно представить в виде иерархии).
Задача: на Access-форме построить иерархическое дерево на базе указанной выше таблице.

Допустим имеется таблица подразделений вуза (tblDepartment) в формате:
intID — strDepartmentName — intParentID
Где,
intID — идентификатор подразделения,
strDepartmentName — наименование подразделения,
intParentID — идентификатор родительского подразделения.

Корневой элемент будет ссылаться в качестве «родителя» на самого себя.
Также для удобства в конструкторе таблицы в поле родителя можно задать подстановку, ссылаясь на эту же таблицу:

Текст запроса для подстановки:

После этого в колонке родителя мы сможем выбирать не идентификатору, а по имени подразделения (но в колонке будет по-прежнему храниться идентификатор).

В итоге мы сможем заполнять таблицу следующим образом:

Теперь построим дерево. Для этого создаем пустую форму в режиме конструктора и выберем пункт «Элементы ActiveX»:

В списке выбираем элемент «Microsoft TreeView Control (6.0)»

Читать еще:  Как сделать ссылку в access?

Выбранный элемент добавляем на форму в нужном месте нужного размера:

Далее переходим в режим кода Visual Basic и добавляем следующий код:

Сохраняем код и форму. Теперь можно запускать форму в режиме просмотра. Должно отобразиться дерево:

Если возникает ошибка: User-defined type not defined (на строке кода ADODB.Recordset), то в VBA в меню Tools — References нужно добавить компонент Microsoft ActiveX Data Objects:

И после этого сделать компиляцию — Debug — Compile.

Как вариант можно использовать таблицу, расположенную в базе на MS SQL Server. Для этого достаточно создать связь с таблицами. Все остальные действия по построению дерева будет аналогичны. В этом случае также возможен обход дерева на стороне MS SQL Server.

9 комментариев :

Этот комментарий был удален автором.

Чтобы работало с node, где родители null

Option Compare Database

Private Sub Form_Load()
Dim strRoot
strRoot = «»

Private Sub AddNode(ByVal ParentID As String)
Set rsCommon = New ADODB.Recordset

If ParentID = «» Then
rsCommon.Open «SELECT Êîä, Ðîäèòåëü, Èìÿ FROM Req DP WHERE IsNull(Ðîäèòåëü)» & » ORDER BY Èìÿ», CurrentProject.Connection, adOpenKeyset, adLockOptimistic

Do While Not rsCommon.EOF
TreeViewDep.Nodes.Add , , Str(rsCommon(«Êîä»)) & «$KEY», rsCommon(«Èìÿ»)
TreeViewDep.Nodes.Item(Str(rsCommon(«Êîä»)) & «$KEY»).Expanded = True
AddNode (Str(rsCommon(«Êîä»)))
rsCommon.MoveNext
Loop
rsCommon.Close
Set rsCommon = Nothing

Else
rsCommon.Open «SELECT Êîä, Ðîäèòåëü, Èìÿ FROM Req DP WHERE Êîä <> Ðîäèòåëü AND Ðîäèòåëü = » & ParentID & » ORDER BY Èìÿ», CurrentProject.Connection, adOpenKeyset, adLockOptimistic

Do While Not rsCommon.EOF
TreeViewDep.Nodes.Add ParentID & «$KEY», tvwChild, Str(rsCommon(«Êîä»)) & «$KEY», rsCommon(«Èìÿ»)
TreeViewDep.Nodes.Item(Str(rsCommon(«Êîä»)) & «$KEY»).Expanded = True
AddNode (Str(rsCommon(«Êîä»)))
rsCommon.MoveNext
Loop
rsCommon.Close
Set rsCommon = Nothing
End If

Здравствуйте. Дорос уже до наполнения дерева по частям. Т.к. элементов несколько тысяч, то построение дерева занимает ощутимое время. Теперь я подгружаю ветку по клику на элемент. Вопрос: как вывести возле элемента значок «+» ? А то неудобно — пока не кликнул, не знаешь есть у этого элемента дочерние позиции или нет

Давно не работала с этим контролом. Может как вариант выводить у каждого элемента в скобках количество дочерних элементов? Или подгружать до клика на элементе хотя бы один его дочерний элемент?

Спасибо за совет. Сейчас эту проблему так и решаю, подгружая дочерние элементы. Но это не совсем удобно, учитывая рекурсивный характер нумерации элементов, который у меня используется. Хотел немного облегчить себе жизнь.

Ссылка на основную публикацию
Adblock
detector