|
|
|
| Заполняем дерево...
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 блин.... | |
|
| |
|
|
|
| Обычно дерево строят либо уровнями
1-й затем второй и т.д.
либо ветками
т.е. родителя к нему детей, к детям их детей и т.д. (рекурсия)
Набери на сайте в поиске treeview найдешь кучу примеров.
ps. проверить налицие родителя можно запросом или dlookup | |
|
| |
|
|
|
| да, согласен дерево я строю необычено - просто так мне понятнее и проще.
Это всё в VB6 происходит - потому и затрудняюсь dlookup_нуть
А вот в имеющемся наборе записей.... | |
|
| |
|
|
|
| ну тогда варианты
1. рекордсет с where - если есть записи - есть родитель
2. свойство рекордсет Filter - читаем help
3. метод find (для ado) или findfirst - dao | |
|
| |
|
|
|
| Извини - ..... подумал
Был не прав....
Может случиться , что дети раньше родителя в таблице лежат - тода беды не миновать.... | |
|
| |
|
6 Кб. |
|
| Надо как то иначе подойти к решению......
Олег !- намекни как ... | |
|
| |
|
|
|
| Даааа - примеров куча.........
блиииииииииииин тёмный лес
скоро не ждите.... | |
|
| |
|
|
|
| Может случиться , что дети раньше родителя в таблице лежат - тода беды не миновать.... |
как вариант строить дерево на основе запроса, в котром детей отсортировать после родителей | |
|
| |
|
|
|
| Значит алгаритма выходит такой:
создать RST из нужной таблицы
Начинаем шагать по таблице
Берём первого попашегося "Вася"
Если у него родителей нет - тогда
создаём ещё один RST с условием что в поле родитель стоит ID_"Вася"
смотрим нет ли детей
если RST пуст - детей нет
если не пуст - смотрим и добавляем детей к "Вася"
иначе если у Васи есть предки
чё делать? | |
|
| |
|
|
|
| создаем рекордсет из Запроса отсортированного таким образом что бы родители были ВЫШЕ детей.
Следить что бы у "дитя" был родитель нужно на этапе изменения/добавления данных, а не построения дерева | |
|
| |
|
|
|
| У мну выгрузка групп товаров будет из 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;
|
| |
|
| |
|
|
|
| Ну, ладно, уследили, что у дитя есть родитель. Где гарантия, что в отсортированном наборе записей нет такого случая, что сначала идёт дитё, а потом родитель этого дитя, который сам является чиьм-то дитём ;-) Или рассматриваем только два поколения? ;-) | |
|
| |
|
|
|
| Ды нет.........
Пока не складывается алгоритма........
У тя Есть сообажения-предложения | |
|
| |
|
|
|
|
Значит алгаритма выходит такой:
создать RST из нужной таблицы
Начинаем шагать по таблице
Берём первого попашегося "Вася"
Если у него родителей нет - тогда
создаём ещё один RST с условием что в поле родитель стоит ID_"Вася"
смотрим нет ли детей
если RST пуст - детей нет
если не пуст - смотрим и добавляем детей к "Вася"
иначе если у Васи есть предки
|
создаём rst с васиными предками
а у них там тоже самое
==================================
вот говорил мне Капитан учи рекурсию - а я думал мне она нахр.... .?
а тут без неё (рекурсии) не обойтись | |
|
| |
|
|
|
| надо сформировать таблицу, что ба сначала шли родители без детей.......
потом родители у которых имеются дети
потм дети уже имеющихся родителей
потм дети уже имеющихся родителей-детей
потм дети уже имеющихся родителей-детей
....................................
потм дети уже имеющихся родителей-детей
как RST будут пустые - остановиться
и на основании этой таблицы
сформировать генекологическое дерево | |
|
| |
|
|
|
| если отсортировать невозможно - то стройте "по-веточно" начиная от верхнего уровня.
т.е.
1. получили список узлов верхнего уровня (это я надеюсь возможно? у них нет родителя...)
2. перебирая поочередно отобранные узлы для каждого делаем
3. добавили его в дерево
4. отобрали всех детей добавленого узла
далее к п 3.
все... | |
|
| |
|
|
|
| ОООООООООО ды эт , раз так всё просто эт мы... эт я ...эт надо попробовать веточки растить... | |
|
| |
|
|
|
| Вот начало
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
|
| |
|
| |
|
|
|
| а как далее и как это всё остановить? | |
|
| |
|
|
|
| Вот создал, но какая то несуразица помоему, хотя работает.
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
|
Или я ошибаюся | |
|
| |
|
|
|
| значительно упрощаете задачу применением иерархического рекордсета и свойства NextRecordset
http://support.microsoft.com/default.aspx?scid=http%3A%2F%2Fsupport.microsoft.com%2Fsupport%2Fkb%2Farticles%2FQ189%2F6%2F57.ASP&NoWebContent=1
|
на русском ищите или переводите, у меня нету | |
|
| |
|
|
|
| Спасибо!!! | |
|
| |
|
|
|
| http://www.hot.ee/jurisfox/vfpplus/ax_treeview_02_ru.htm
ещё ссылочка | |
|
| |
|
|
|
| Спасибо!!! | |
|
| |