Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Как проще заполнить контрол Tree?  [new]
cvbnm2
Guest
Есть набор данных - список ФИО упорядочный по алфавиту. Дерево должно выглядеть так: узел "Буква", в его дочерних узлах - ФИО на эту букву. Если на какую-то букву ФИО вообще нет, то родительский узел не создается. Команды непосредственно оперирующие с узлами - знаю.
Помощь прошу в алгоритме перебора данных.
14 дек 06, 15:20    [3536925]     Ответить | Цитировать Сообщить модератору
 Re: Как проще заполнить контрол Tree?  [new]
MsDatabaseru
Member

Откуда: Hobby.MsDatabase.ru
Сообщений: 10938
отсортировать записи в алфавитном по фамилии
запоминать букву последней корневой ноды и если она отличается от первой буквы фамилии
то добавить корневую ноду и запомнить новую букву
14 дек 06, 15:28    [3536988]     Ответить | Цитировать Сообщить модератору
 Re: Как проще заполнить контрол Tree?  [new]
osmor
Member

Откуда: hiprog.com
Сообщений: 1173
сделайе запрос
SELECT Left([ФИО],1) AS F
FROM tbl
GROUP BY Left([ФИО],1);

это будет ваш верхний уровень дерева
14 дек 06, 15:32    [3537023]     Ответить | Цитировать Сообщить модератору
 Re: Как проще заполнить контрол Tree?  [new]
cvbnm2
Guest
вот, навскидку:
Set rstMain = ....TableMain
rstТолькоБуквы.MoveFirst
Do Until rstТолькоБуквы.EOF
    rstMain.Filter = rstТолькоБуквы!F
    Set rstMainФильтрБуква = rstMain.OpenRecordset
    If rstMainФильтрБуква.RecordCount >0 Then
       ...создать родительский узел
        rstMainФильтрБуква.MoveFirst
        Do Until rstMainФильтрБуква.EOF
             ...создать дочерний узел
            rstMainФильтрБуква.MoveNext
        Loop
     End if
     rstТолькоБуквы.MoveNext
Loop 
как-то громоздко получилось - три рекордсета. Или нет?
14 дек 06, 16:04    [3537348]     Ответить | Цитировать Сообщить модератору
 Re: Как проще заполнить контрол Tree?  [new]
osmor
Member

Откуда: hiprog.com
Сообщений: 1173
ну как мне кажется
If rstMainФильтрБуква.RecordCount >0
будет лишней, т.к. в rstMainФильтрБуква будут только те буквы для которых есть фамилии ;-)
Ну можно использовать метод предлодженный MsDatabaseru, будет 1 рекодсет...
Как лучше судить не берусь...
14 дек 06, 16:20    [3537474]     Ответить | Цитировать Сообщить модератору
 Re: Как проще заполнить контрол Tree?  [new]
cvbnm2
Guest
...будет лишней
пожалуй так, это я автоматически написал, по привычке.
Т.к. речь идет о построении Дерева, то хочется найти способ, чтоб побыстрее было.
14 дек 06, 16:31    [3537576]     Ответить | Цитировать Сообщить модератору
 Re: Как проще заполнить контрол Tree?  [new]
osmor
Member

Откуда: hiprog.com
Сообщений: 1173
ПО быстроте...
Дело в том что в способе MsDatabaseru замедлять будет извлечение из поля каждой строки первой буквы и сравнение ее с переменной... а в моем - открытие еще одного рекордсета и фильтрация основного... что быстрее, так с ходу не скажу...
14 дек 06, 16:36    [3537626]     Ответить | Цитировать Сообщить модератору
 Re: Как проще заполнить контрол Tree?  [new]
MsDatabaseru
Member

Откуда: Hobby.MsDatabase.ru
Сообщений: 10938
vba код сравнивающий переменные работает достаточно быстро,
существенно, в десятки раз быстрее чем происходит добавление ноды в объект тривью
14 дек 06, 16:40    [3537681]     Ответить | Цитировать Сообщить модератору
 Re: Как проще заполнить контрол Tree?  [new]
cvbnm2
Guest
а как цикл организовать в способе MsDatabaseru?
rstMain = ....TableMain
rstMain.MoveFirst
strFL = Left(rstMain![FIO], 1)
...создать родительский узел
а дальше?
14 дек 06, 16:51    [3537791]     Ответить | Цитировать Сообщить модератору
 Re: Как проще заполнить контрол Tree?  [new]
osmor
Member

Откуда: hiprog.com
Сообщений: 1173
Я сравниваю только те части, которые различны в предложенных методах, поскольку от добавления ноды никак не избавиться ;-)
Но похоже, что Ваш метод будет побыстрее...
14 дек 06, 16:52    [3537803]     Ответить | Цитировать Сообщить модератору
 Re: Как проще заполнить контрол Tree?  [new]
MsDatabaseru
Member

Откуда: Hobby.MsDatabase.ru
Сообщений: 10938
у меня единственный рекордсет - фамилии по нему и цикл
перед созданием узла с фамилией проверить значение переменной буква последней добавленной корневой ноды и если она отличается от первого символа фамилии то сначала добавить ноду с этой буквой
14 дек 06, 17:03    [3537896]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить