Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: TreeView
 
 автор: час   (05.08.2009 в 21:10)   личное сообщение
 
 

Заполняем дерево...


Public Function TO_FILL_TREE_VIEW(var_TreeView As Control)
' Çàãðóçêà ãðóïï òîâàðîâ

Dim rst As ADODB.Recordset
Dim strParentID As String
Dim strID As String
Dim strName1 As String

Set rst = New ADODB.Recordset

rst.Open "SELECT COMODITY_GROUP_TBL.* FROM COMODITY_GROUP_TBL ", GLB_con, adOpenKeyset, adLockOptimistic

Do Until rst.EOF
strParentID = NZVB(rst("GROUP_Parent"))

If strParentID = "0" Or strParentID = "" Then
strID = "root" & rst("ID_GROUP")
strName1 = rst("GROUP_NAME")
var_TreeView.Nodes.Add , , strID, strName1
var_TreeView.Nodes.Item(strID).Expanded = True
Else
strID = "root" & rst("ID_GROUP")
strName1 = rst("GROUP_NAME")
' вот тута приотсутствии strParentID (родителя)
' Возникает ошибочка


var_TreeView.Nodes.Add "root" & strParentID, tvwChild, strID, strName1

End If
rst.MoveNext
Loop
rst.Close

End Function



Как бы наладить проверку что родителя такого нет в таблице.
Может использовать как то RST - набор записей.
как то Find first блин....

  Ответить  
 
 автор: osmor   (05.08.2009 в 21:19)   личное сообщение
 
 

Обычно дерево строят либо уровнями
1-й затем второй и т.д.
либо ветками
т.е. родителя к нему детей, к детям их детей и т.д. (рекурсия)
Набери на сайте в поиске treeview найдешь кучу примеров.
ps. проверить налицие родителя можно запросом или dlookup

  Ответить  
 
 автор: час   (05.08.2009 в 21:24)   личное сообщение
 
 

да, согласен дерево я строю необычено - просто так мне понятнее и проще.
Это всё в VB6 происходит - потому и затрудняюсь dlookup_нуть
А вот в имеющемся наборе записей....

  Ответить  
 
 автор: osmor   (05.08.2009 в 21:28)   личное сообщение
 
 

ну тогда варианты
1. рекордсет с where - если есть записи - есть родитель
2. свойство рекордсет Filter - читаем help
3. метод find (для ado) или findfirst - dao

  Ответить  
 
 автор: час   (05.08.2009 в 21:33)   личное сообщение
 
 

Извини - ..... подумал
Был не прав....
Может случиться , что дети раньше родителя в таблице лежат - тода беды не миновать....

  Ответить  
 
 автор: час   (05.08.2009 в 21:35)   личное сообщение
6 Кб.
 
 

Надо как то иначе подойти к решению......
Олег !- намекни как ...

  Ответить  
 
 автор: час   (05.08.2009 в 21:57)   личное сообщение
 
 

Даааа - примеров куча.........
блиииииииииииин тёмный лес
скоро не ждите....

  Ответить  
 
 автор: Гамлет   (05.08.2009 в 22:44)   личное сообщение
 
 

Может случиться , что дети раньше родителя в таблице лежат - тода беды не миновать....


как вариант строить дерево на основе запроса, в котром детей отсортировать после родителей

  Ответить  
 
 автор: час   (06.08.2009 в 14:54)   личное сообщение
 
 

Значит алгаритма выходит такой:
создать RST из нужной таблицы
Начинаем шагать по таблице
Берём первого попашегося "Вася"

Если у него родителей нет - тогда
создаём ещё один RST с условием что в поле родитель стоит ID_"Вася"
смотрим нет ли детей
если RST пуст - детей нет
если не пуст - смотрим и добавляем детей к "Вася"
иначе если у Васи есть предки
чё делать?

  Ответить  
 
 автор: osmor   (06.08.2009 в 15:34)   личное сообщение
 
 

создаем рекордсет из Запроса отсортированного таким образом что бы родители были ВЫШЕ детей.
Следить что бы у "дитя" был родитель нужно на этапе изменения/добавления данных, а не построения дерева

  Ответить  
 
 автор: час   (06.08.2009 в 15:50)   личное сообщение
 
 

У мну выгрузка групп товаров будет из 1С - я там не очень то но ссовет учту.
блин.
значит запрос с сортировкой по .....
или........

SELECT COMODITY_GROUP_TBL.ID_GROUP, COMODITY_GROUP_TBL.GROUP_PARENT
FROM COMODITY_GROUP_TBL
GROUP BY COMODITY_GROUP_TBL.ID_GROUP, COMODITY_GROUP_TBL.GROUP_PARENT
ORDER BY COMODITY_GROUP_TBL.ID_GROUP, COMODITY_GROUP_TBL.GROUP_PARENT
WITH OWNERACCESS OPTION;

  Ответить  
 
 автор: Denis V.   (06.08.2009 в 16:23)   личное сообщение
 
 

Ну, ладно, уследили, что у дитя есть родитель. Где гарантия, что в отсортированном наборе записей нет такого случая, что сначала идёт дитё, а потом родитель этого дитя, который сам является чиьм-то дитём ;-) Или рассматриваем только два поколения? ;-)

  Ответить  
 
 автор: час   (06.08.2009 в 16:25)   личное сообщение
 
 

Ды нет.........
Пока не складывается алгоритма........
У тя Есть сообажения-предложения

  Ответить  
 
 автор: час   (06.08.2009 в 16:31)   личное сообщение
 
 


Значит алгаритма выходит такой:
создать RST из нужной таблицы
Начинаем шагать по таблице
Берём первого попашегося "Вася"

Если у него родителей нет - тогда
создаём ещё один RST с условием что в поле родитель стоит ID_"Вася"
смотрим нет ли детей
если RST пуст - детей нет
если не пуст - смотрим и добавляем детей к "Вася"
иначе если у Васи есть предки



создаём rst с васиными предками
а у них там тоже самое
==================================
вот говорил мне Капитан учи рекурсию - а я думал мне она нахр.... .?


а тут без неё (рекурсии) не обойтись

  Ответить  
 
 автор: час   (06.08.2009 в 16:39)   личное сообщение
 
 

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

  Ответить  
 
 автор: osmor   (06.08.2009 в 16:48)   личное сообщение
 
 

если отсортировать невозможно - то стройте "по-веточно" начиная от верхнего уровня.
т.е.
1. получили список узлов верхнего уровня (это я надеюсь возможно? у них нет родителя...)
2. перебирая поочередно отобранные узлы для каждого делаем
3. добавили его в дерево
4. отобрали всех детей добавленого узла
далее к п 3.

все...

  Ответить  
 
 автор: час   (06.08.2009 в 19:44)   личное сообщение
 
 

ОООООООООО ды эт , раз так всё просто эт мы... эт я ...эт надо попробовать веточки растить...

  Ответить  
 
 автор: час   (06.08.2009 в 21:25)   личное сообщение
 
 

Вот начало


Public Function FUN_CREATE_TABLE_GROUP_TREEVIEW()
'COMODITY_GROUP_TBL
Dim rst As ADODB.Recordset

Set rst = New ADODB.Recordset


If FUN_IS_TABLE("GROUP_TREEVIEW_TBL") = False Then
GLB_con.Execute "SELECT COMODITY_GROUP_TBL.* INTO [GROUP_TREEVIEW_TBL]" _
& " From COMODITY_GROUP_TBL " _
& "WITH OWNERACCESS OPTION;"
End If
' ОЧИСТКА ПО ЛЮБОМУ -ПЕРЕД ЗАПОЛНЕНИЕМ
FUN_CLEAR_TABLE ("GROUP_TREEVIEW_TBL")

'ПОМЕЩАЕМ ВСЕХ БЕЗ РОДИТЕЛЕЙ
GLB_con.Execute "INSERT INTO GROUP_TREEVIEW_TBL" _
& " SELECT COMODITY_GROUP_TBL.*" _
& " From COMODITY_GROUP_TBL" _
& " Where (((COMODITY_GROUP_TBL.GROUP_PARENT) = ""0"")) Or (((COMODITY_GROUP_TBL.GROUP_PARENT) = """")) Or (((COMODITY_GROUP_TBL.GROUP_PARENT) Is Null))" _
& " WITH OWNERACCESS OPTION;"

'открываем ВСЕХ БЕЗ РОДИТЕЛЕЙ GROUP_TREEVIEW_TBL
'и перебераем с поиском их детей в COMODITY_GROUP_TBL.*
rst.Open "SELECT GROUP_TREEVIEW_TBL.*" _
& " From GROUP_TREEVIEW_TBL" _
& " WITH OWNERACCESS OPTION;", GLB_con, adOpenKeyset, adLockOptimistic

Do Until rst.EOF ' переброс детей "ID_GROUP" в GROUP_TREEVIEW_TBL

GLB_con.Execute "INSERT INTO GROUP_TREEVIEW_TBL" _
& " SELECT COMODITY_GROUP_TBL.*" _
& " From COMODITY_GROUP_TBL" _
& " Where (((COMODITY_GROUP_TBL.GROUP_PARENT) = '" & rst("ID_GROUP") & "'))" _
& " WITH OWNERACCESS OPTION;"
rst.MoveNext
Loop
rst.Close
Set rst = Nothing

End Function


  Ответить  
 
 автор: час   (06.08.2009 в 21:31)   личное сообщение
 
 

а как далее и как это всё остановить?

  Ответить  
 
 автор: час   (07.08.2009 в 11:18)   личное сообщение
 
 

Вот создал, но какая то несуразица помоему, хотя работает.


Public Function FUN_CREATE_TABLE_GROUP_TREEVIEW(var_TreeView As Control)
'COMODITY_GROUP_TBL
Dim rst As ADODB.Recordset
Dim rst1 As ADODB.Recordset

' если таблицы ещё нет - создаём из COMODITY_GROUP_TBL
If FUN_IS_TABLE("GROUP_TREEVIEW_TBL") = False Then
GLB_con.Execute "SELECT COMODITY_GROUP_TBL.* INTO [GROUP_TREEVIEW_TBL]" _
& " From COMODITY_GROUP_TBL " _
& "WITH OWNERACCESS OPTION;"
End If
' ОЧИСТКА таблицы ПЕРЕД ЗАПОЛНЕНИЕМ
FUN_CLEAR_TABLE ("GROUP_TREEVIEW_TBL")

' переброс всех без родителей
GLB_con.Execute "INSERT INTO GROUP_TREEVIEW_TBL" _
& " SELECT COMODITY_GROUP_TBL.*" _
& " From COMODITY_GROUP_TBL" _
& " Where (((COMODITY_GROUP_TBL.GROUP_PARENT) = ""0"")) Or (((COMODITY_GROUP_TBL.GROUP_PARENT) = """")) Or (((COMODITY_GROUP_TBL.GROUP_PARENT) Is Null))" _
& " WITH OWNERACCESS OPTION;"

Recoursi: ' заново
Set rst = New ADODB.Recordset
Set rst1 = New ADODB.Recordset

' проверка на совпадене записей в обоих таблицах
rst1.Open "SELECT COMODITY_GROUP_TBL.GROUP_NAME" _
& " FROM COMODITY_GROUP_TBL LEFT JOIN GROUP_TREEVIEW_TBL ON COMODITY_GROUP_TBL.ID_GROUP = GROUP_TREEVIEW_TBL.ID_GROUP" _
& " WHERE (((GROUP_TREEVIEW_TBL.ID_GROUP) Is Null));", GLB_con, adOpenKeyset, adLockOptimistic
If rst1.EOF = True Then ' если таблицы одинаковы по кол. записей
'rst.Close
rst1.Close
Set rst = Nothing
Set rst1 = Nothing
' Заполнение дерева
Call FUN_TO_FILL_TREE_VIEW(var_TreeView)
Exit Function
End If

'открываем ВСЕХ в GROUP_TREEVIEW_TBL
rst.Open "SELECT GROUP_TREEVIEW_TBL.*" _
& " From GROUP_TREEVIEW_TBL" _
& " WITH OWNERACCESS OPTION;", GLB_con, adOpenKeyset, adLockOptimistic

' бегаем по таблице GROUP_TREEVIEW_TBL
Do Until rst.EOF
' и добавляем детей из COMODITY_GROUP_TBL.* для GROUP_TREEVIEW_TBL.ID_GROUP
On Error Resume Next
GLB_con.Execute "INSERT INTO GROUP_TREEVIEW_TBL" _
& " SELECT COMODITY_GROUP_TBL.*" _
& " From COMODITY_GROUP_TBL" _
& " Where (((COMODITY_GROUP_TBL.GROUP_PARENT) = '" & rst("ID_GROUP") & "'))" _
& " WITH OWNERACCESS OPTION;"

rst.MoveNext
Loop
GoTo Recoursi

End Function




Или я ошибаюся

  Ответить  
 
 автор: alecks_lp   (09.08.2009 в 20:19)   личное сообщение
 
 

значительно упрощаете задачу применением иерархического рекордсета и свойства NextRecordset


http://support.microsoft.com/default.aspx?scid=http%3A%2F%2Fsupport.microsoft.com%2Fsupport%2Fkb%2Farticles%2FQ189%2F6%2F57.ASP&NoWebContent=1

на русском ищите или переводите, у меня нету

  Ответить  
 
 автор: час   (09.08.2009 в 21:29)   личное сообщение
 
 

Спасибо!!!

  Ответить  
 
 автор: Гамлет   (10.08.2009 в 00:18)   личное сообщение
 
 

http://www.hot.ee/jurisfox/vfpplus/ax_treeview_02_ru.htm
ещё ссылочка

  Ответить  
 
 автор: час   (10.08.2009 в 10:57)   личное сообщение
 
 

Спасибо!!!

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList