Дерево в Access 2003

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
smitatyana
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 09.01.2009 (Пт) 8:32
Откуда: Алматы

Дерево в Access 2003

Сообщение smitatyana » 02.02.2009 (Пн) 11:33

Есть ли возмжность в Access 2003 организовать древовидную структуру данных?
Если да, то каким образом? Спасибо.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Дерево в Access 2003

Сообщение Денис » 02.02.2009 (Пн) 13:51

Через вставку ActiveX элементов вставить TreeView и заполнять его. Все методы можно посмотреть по F2.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Дерево в Access 2003

Сообщение iGrok » 02.02.2009 (Пн) 16:23

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

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

Parent_ID - ID элемента-родителя. Если Parent_ID = 0 - элемент находится "в корне" дерева...
label:
cli
jmp label

smitatyana
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 09.01.2009 (Пт) 8:32
Откуда: Алматы

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!
Так, чтобы при выделении листа - должности на форме справа, например, были харакеристики данной штатной единицы (минимум, максимум, вредные условия, категория, количество ставок, ШПЗ ну и мелочи ...). Ну и конечно подтягивался человек на этой ставкеШТ.
Могу я с моей структурой БД организовать такое дерево с возможностью редактирования всех узлов дерева? Удалить/добавить/изменить ветку дерева. Сделать удобным формирование и изменение штатного расписания.

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

smitatyana
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 09.01.2009 (Пт) 8:32
Откуда: Алматы

Re: Дерево в Access 2003

Сообщение smitatyana » 05.02.2009 (Чт) 12:48

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

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

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


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

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Дерево в Access 2003

Сообщение iGrok » 05.02.2009 (Чт) 13:36

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

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

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

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

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

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

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

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Дерево в Access 2003

Сообщение Денис » 05.02.2009 (Чт) 14:00

iGrok

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

Element_ID, Parent_ID, Element_Name
Parent_ID - ID элемента-родителя. Если Parent_ID = 0 - элемент находится "в корне" дерева...


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

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

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

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

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

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

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

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

smitatyana
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 09.01.2009 (Пт) 8:32
Откуда: Алматы

Re: Дерево в Access 2003

Сообщение smitatyana » 06.02.2009 (Пт) 5:44

iGrok писал(а):Я правильно понял структуру?
Департаменты -> Отделы -> Секторы -> Должности -> Человеки. ?

Да, структура верная.

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

Нет, такого быть не может. Должность - последняя ветка дерева. А человека я хотела бы отображать наподчиненной форме вместе с характеристиками должности.

Могу только подсказать подходящий вариант изменения структуры.

Буду признательна за совет.

но если что-то из прочитанного будет не понятно - спрашивай.

Спасибо.

smitatyana
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 09.01.2009 (Пт) 8:32
Откуда: Алматы

Re: Дерево в Access 2003

Сообщение smitatyana » 06.02.2009 (Пт) 7:43

А если я сделаю запрос ForTree:
Код: Выделить всё
id  - из штатное расписание.ID
DEP_ID: IIf(IsNull([штатное расписание.ДЕПАРТ]);"";"b" &[штатное расписание.ДЕПАРТ])
OTD_ID: IIf(IsNull([штатное расписание.ОТДЕЛ]);"";"с" & [штатное расписание.ОТДЕЛ])
SEK_ID: IIf(IsNull([штатное расписание.СЕКТОР]);"";"d" & [штатное расписание.СЕКТОР])
DOLJ_ID: IIf(IsNull([штатное расписание.ДОЛЖНОСТЬ]);"";"e" & [штатное расписание.ДОЛЖНОСТЬ])
DEP_NAME: СПР_ДЕПАРТ.Name
OTD_NAME:  СПР_ОТДЕЛ.Name
SEK_NAME:  СПР_СЕКТОР.Name
DOLJ_NAME:  СПР_ДОЛЖНОСТЬ.Name

А потом пройдусь по записям и добавлю ветки?
Код: Выделить всё
если  DEP_ID <> Null, то
         Parent_ID : = ""; Key : = DEP_ID; Name : = DEP_NAME;
         TreeView.Add(Parent_ID, , Key, Name);

если  OTD_ID <> Null, то
Parent_ID : = DEP_ID; Key : = OTD_ID; Name : = OTD_NAME;
TreeView.Add(Parent_ID, child, Key, Name);

если  SEK_ID <> Null, то
Parent_ID : = OTD_ID; Key : = SEK_ID; Name : = SEK_NAME;
TreeView.Add(Parent_ID, child, Key, Name);
'поле ДОЛЖНОСТЬ обязательное. Пусто быть не может
Parent_ID : = SEK_ID; Key : = DOLJ_ID; Name : = DOLJ_NAME;
TreeView.Add(Parent_ID, child, Key, Name);
иначе ' у должности родитель - отдел
Parent_ID : = OTD_ID; Key : = DOLJ_ID; Name : = DOLJ_NAME;
TreeView.Add(Parent_ID, child, Key, Name);

Как это уложить в синтаксис VB?

smitatyana
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 09.01.2009 (Пт) 8:32
Откуда: Алматы

Re: Дерево в Access 2003

Сообщение smitatyana » 06.02.2009 (Пт) 7:46

Как пройтись по записям, учитывая этот код и синтаксис VB?

smitatyana
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 09.01.2009 (Пт) 8:32
Откуда: Алматы

Re: Дерево в Access 2003

Сообщение smitatyana » 06.02.2009 (Пт) 7:58

А потом, уже при сформированном дереве, при выделении листа дерева, т.е. должности, мне нужно отобразить ФИО работника из Личной карточки(ЛК). ЛК будет связанна с запросом ForTree по СТАВКАШТ.ЛК и ForTree.ID.
и свяжу штатное расписание.ID и ForTree.ID. Так я хочу отобразить ФИО из ЛК и характеристики должности из штатного расписания при выделенном листе дерева.

smitatyana
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 09.01.2009 (Пт) 8:32
Откуда: Алматы

Re: Дерево в Access 2003

Сообщение smitatyana » 06.02.2009 (Пт) 8:09

Такое возможно? Помогите с логикой!
А теперь то, ради чего это все затевается:
создать наиболее удобный интерфейс для добавления/удаления/изменения всех узлов дерева. Естествеено с записью в таблицу штатного расписания. 4 день бьюсь .... HELP!

smitatyana
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 09.01.2009 (Пт) 8:32
Откуда: Алматы

Re: Дерево в Access 2003

Сообщение smitatyana » 26.03.2009 (Чт) 8:56

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


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

    TopList