+--КОИ1
+--КОИ2
+КОИ3
--КОИ4
--КОИ5
+--КОИ6
--КОИ7
1 | NULL | КОИ1
2 | 1 | КОИ2
3 | 2 | КОИ3
4 | 3 | КОИ4
5 | 3 | КОИ5
6 | NULL | КОИ6
7 | 6 | КОИ7
изделие (сборка, подсборка) должна удалиться во всех местах дерева.
Debugger писал(а):Не совсем понятен вопрос. Отслеживание редактирование листвьюшника? Или обновление базы после редактирования приложения?
Debugger писал(а):Кстати, дерево у тебя какое-то неправильное.
Debugger писал(а):Эмм... Судя по базе ты иммешь дело с деревом. У каждого элемента дерева (в твоем случае) максимум 1 предок.
Debugger писал(а): Такое дерево можно представить в листвьюшнике так, чтобы каждый элемент повторялся один раз. И при его удалении ничего дополнительного удалять не надо было.
1) Таблица object с полями id, name
...
3) Таблица items с полями id, name
Call Recurs("Null",ListView.AddNode("База"))
...
Sub Recurs(s,ParentNode)
--For c=0 to Base.CountRecords
----If Base.ID_Parent(c)=s then
-------Recurs(c, ParentNode.AddSubNode(Base.Koi(c)))
----End If
--Next
End Sub
FireFenix писал(а):Я работал с базой изделей и сборок, если тебе нужны связи, сделай 3 таблицы (как минмум для связей)
1) Таблица object с полями id, name
2) Таблица links с полями id, id_link, id_item
3) Таблица items с полями id, name
суть в том что в links храняться ссылки на items [id_item], и привязка осуществляется по id_link, при желании можно дабвить разнообразие привязки к большему количеству таблиц, прикрутив 2 столбца типа ссылок
Private Sub LoadTreeViewAll()
'Отображение всех вервей из таблицы TREE
Dim Query As String
Query = "SELECT ID_KOI, ID_PARENT, KOI"
Query = Query & " FROM KOI"
'Выполнение запроса
Using Command As System.Data.Common.DbCommand = Provider.CreateCommand()
Connection.Close()
Connection.Open()
Command.Connection = Connection
Command.CommandText = Query
Using Reader As System.Data.Common.DbDataReader = _
Command.ExecuteReader()
'Вывод результатов
TreeView1.Nodes.Clear()
Dim FindedNodes(0) As TreeNode
'Настройка TreeView
TreeView1.ShowPlusMinus = True
'Заполнение TreeView
Dim ID As String = ""
Dim ParentID As String = ""
Dim KOI As String = ""
Do
While Reader.Read()
ID = Reader.Item(0).ToString
ParentID = Reader.Item(1).ToString
KOI = Reader.Item(2).ToString
'Добавление в дерево
If ParentID Is String.Empty Then
'Parent
TreeView1.Nodes.Add(ID, KOI).Tag = ID
Else
'Children
FindedNodes = TreeView1.Nodes.Find(ParentID, True)
FindedNodes(0).Nodes.Add(ID, KOI).Tag = ID
End If
End While
Loop While Reader.NextResult()
TreeView1.EndUpdate()
TreeView1.ExpandAll()
End Using
End Using
End Sub
Debugger писал(а):1) Загружаешь все (или почти все...) из базы.
2) Запускаешь рекурсию (надеюсь, разберешься?) для добавления всех нодов с ID_Parent = NULL. На псевдокоде (чудо-код, но, думаю, разберешься):
[code]Call Recurs("Null",ListView.AddNode("База"))
...
Sub Recurs(s,ParentNode)
--For c=0 to Base.CountRecords
----If Base.ID_Parent(c)=s then
-------Recurs(c, ParentNode.AddSubNode(Base.Koi(c)))
----End If
--Next
End Sub
Debugger писал(а):1) Таблица object с полями id, name
...
3) Таблица items с полями id, name
Гхм. Не сосем понятно.
Вообще автор правильно указал структуру в начале топика.
sergey-911 писал(а):Спасибо FireFenix, но я ничего не понял.
Объясни популярно, зачем 3 таблицы в БД? Назночение каждой из них я не догнал. Как это может помочь контролировать узлы дерева? Я так понимаю, в таблице Object ты хранишь родителей самого верхнего уровня (в моем случае - это те изделия, у которых Id_Parent = NULL). Что в остальных двух (более детально, если можно). ops
запрос "SELECT * FROM table WHER id_parent=" & id_parent //получаем данные id_koi, id_parent, id_type, koi
Цикл получения данных типа Data.Read
if node is nothing then
добавление treeview.nodes.add(данные koi из запроса)
node = treeview.nodes(teeview.nodes.count - 1)
else
добавление node.nodes.add(данные koi из запроса)
node = nodes.lastnode
end if
Конец цикла
FireFenix писал(а):К примеру, Изделие2 - это электрический Двигатель1, который можно отобразить в виде различных винтиков, шпунтиков, ротора и т.п. Соответственно, это Изделие2 можно отобразить в виде ветви дерева, состоящие из других входящих деталей (винтиков, шпунтиков, ротора и т.п.). Допустим, мы заводим новое изделие - вентилятор (Изделие3), содержащий этот двигатель. В этом случае, пользователь заводит Изделие3 в него добавляет Изделие2, и у него сразу (т.к. этот электрический двигатель уже есть в БД) в Изделии3 отображается ветвь Изделие2, отрожающая все винтики, шпунтики, ротор и т.п., все, из чего состоит этот двигатель (Изделие2). Если конструктор решит внести изменения в этот двигатель, то он отображает Изделие2 в виде дерева, меняет в нем что-либо, при этом, изменения сразу должны произойти и в Изделии3 - вентиляторе. Везде, где встречается Изделие2.
Изделие3 'вентилятор
Изделие2 ' двигатель
ИзделиеN1' корпус
ИзделиеN2' винтик
...
ИзделиеNN' шпунтик
Изделие4 'суперкулер
Изделие2 ' двигатель
ИзделиеN1' корпус
ИзделиеN2' винтик
...
ИзделиеNN' шпунтик
Изделие3 'вентилятор
Изделие2 ' двигатель(модифицированный)
ИзделиеN1' корпус
ИзделиеN2.1' болтик
...
ИзделиеNN' шпунтик
Изделие4 'суперкулер
Изделие2 ' двигатель(модифицированный)
ИзделиеN1' корпус
ИзделиеN2.1' болтик
...
ИзделиеNN' шпунтик
Alec писал(а):Я правильно понял, что еще есть Изделие4? Например...(блин, а где еще можно воткнуть вентилятор-то )...пусть это будет "суперкулер".
Тогда:
- Код: Выделить всё
Изделие3 'вентилятор
Изделие2 ' двигатель
ИзделиеN1' корпус
ИзделиеN2' винтик
...
ИзделиеNN' шпунтик
Изделие4 'суперкулер
Изделие2 ' двигатель
ИзделиеN1' корпус
ИзделиеN2' винтик
...
ИзделиеNN' шпунтик
и при изменении "винтика" на "болтик" в Изделии2 должно быть:
- Код: Выделить всё
Изделие3 'вентилятор
Изделие2 ' двигатель(модифицированный)
ИзделиеN1' корпус
ИзделиеN2.1' болтик
...
ИзделиеNN' шпунтик
Изделие4 'суперкулер
Изделие2 ' двигатель(модифицированный)
ИзделиеN1' корпус
ИзделиеN2.1' болтик
...
ИзделиеNN' шпунтик
Так?
sergey-911 писал(а):...вот только, как такое реализовать?
ID Name Comment ...
1 "Корпус" "ИзделиеN1"
2 "Винтик" "ИзделиеN2"
3 "Шпунтик" "ИзделиеNN"
4 "Двигатель" "Изделие2"
5 "Вентилятор" "Изделие3"
6 "Суперкулер" "Изделие4"
7 "Болтик" "ИзделиеN2.1"
ID_Parent ID_Child ‘Комментарии
4 1 'Засунули в двигатель корпус
4 2 'Засунули в двигатель винтик
4 3 'Засунули в двигатель шпунтик
5 4 'Засунули в вентилятор двигатель
6 4 'Засунули в суперкулер двигатель
Debugger писал(а):Только вот будет страшно, если вдруг появятся циклы.
iGrok писал(а):2FireFenix:
Ты, кажется, всё-таки не в теме. Элементов может быть любое кол-во. С любым уровнем вложенности. И нужно всего две таблицы. И кода для реализации такой логики там минимум.
FireFenix писал(а):Вначале была просто связь и вывод в Тривиев, теперь вложенность элементов.....
WITH SP_CTE(ID_Nomenkl, ID_Parent, Koi) AS (SELECT dbo.Specific.ID_Nomenkl, dbo.Specific.ID_Parent, dbo.Nomenkl.Koi
FROM dbo.Nomenkl INNER JOIN
dbo.Specific ON dbo.Nomenkl.ID_Nomenkl = dbo.Specific.ID_Nomenkl
WHERE (dbo.Specific.ID_Parent IS NULL)
UNION ALL
SELECT Specific_1.ID_Nomenkl, Specific_1.ID_Parent, Nomenkl_1.Koi
FROM dbo.Nomenkl AS Nomenkl_1 INNER JOIN
dbo.Specific AS Specific_1 ON Nomenkl_1.ID_Nomenkl = Specific_1.ID_Nomenkl INNER JOIN
SP_CTE AS SP_CTE_2 ON SP_CTE_2.ID_Nomenkl = Specific_1.ID_Parent)
SELECT ID_Nomenkl, ID_Parent, Koi
FROM SP_CTE AS SP_CTE_1
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 89