Проблема с добавлением данных из mdb в TreeView

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Проблема с добавлением данных из mdb в TreeView

Сообщение Gmp » 22.07.2006 (Сб) 18:23

Привет!
Считываю данные из базы которая выглядит вот так:

Код: Выделить всё
AutoID   Datenbank   Benutzer   SPID   Methode   Befehl   Befehl1
1   SDE_LOKAL   SAO   SPID57   BLReceipt MakeDeliveryFromOrder   Init   (Transaction handling:=COM+, Transaction:=On, Timeout:=32767)
2   SDE_LOKAL   SAO   SPID57   BLReceipt MakeDeliveryFromOrder   Init   "(DB:=Microsoft SQLServer, Shaping:=Off, ConnectionString:=""""(Provider=MSDataShape.1;Data )Provider=SQLOLEDB.1;Data Source=(local);Initial Catalog=SDE_Lokal;Auto Translate=False;Persist Security Info=True;OLE DB Services=-2;User ID=SAO;Password=***"""")"
3   SDE_LOKAL   SAO   SPID57   BLReceipt MakeDeliveryFromOrder   GetRecordSet   (Mode:=ReadOnly, Location:=Client)
4   SDE_LOKAL   SAO   SPID57   BLReceipt MakeDeliveryFromOrder   GetRecordSet   "(Statement:=""SELECT @@SPID"")"
5   SDE_LOKAL   SAO   SPID57   BLReceipt MakeDeliveryFromOrder   GetRecordSet   "(Converted:=""SELECT @@SPID"")"
6   SDE_LOKAL   SAO   SPID57   BLReceipt MakeDeliveryFromOrder   GetRecordSet   (Time to select data:= 0,63 ms)


Реализовано это у меня вот так:
Код: Выделить всё
Sub CreateTreeDatenbank()
Dim NodX As Node
Dim strKey As String
Dim mKey As String
Dim intKey As Integer

intKey = 1

strSQL = "SELECT * FROM TraceFiles"
Set RecDB = New ADODB.Recordset
RecDB.Open strSQL, ConDB, adOpenStatic, adLockOptimistic

TreeView1.LineStyle = tvwRootLines
TreeView1.Nodes.Clear

If RecDB.EOF Then Exit Sub

Do While Not RecDB.EOF
    mKey = str(intKey) & str(RecDB.Fields("AutoID"))
    Set NodX = TreeView1.Nodes.Add(, , mKey, RecDB.Fields("Datenbank"), 1)
    Set NodX = TreeView1.Nodes.Add(mKey, tvwChild, mKey & 1, RecDB.Fields("Benutzer"), 2)
    Set NodX = TreeView1.Nodes.Add(mKey & 1, tvwChild, mKey & 2, RecDB.Fields("SPID"), 3)
    Set NodX = TreeView1.Nodes.Add(mKey & 2, tvwChild, , RecDB.Fields("Methode"), 4)
    RecDB.MoveNext
    intKey = intKey + 1
Loop

RecDB.Close
Set RecDB = Nothing

End Sub


И получается такое дерево:

Изображение

Вопрос - как можно сгруппировать элементы? Пробовал через sql SELECT DISTINCT, но ступор на группировке второй колонки таблицы. Надеюсь на помощь, спасибо. :)

BasiС
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 16.02.2006 (Чт) 23:34
Откуда: Koenigsberg

Сообщение BasiС » 23.07.2006 (Вс) 16:28

А почему нет?
root через SELECT DISTINCT
Child через запросы с нужной сортировкой

имхо самый короткий путь

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 23.07.2006 (Вс) 16:46

BasiС
А по подробней можно как это будет выглядеть?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.07.2006 (Вс) 16:48

Gmp, я правильно понял, что http://bbs.vbstreets.ru/viewtopic.php?t=27045 - это дубликат этой темы?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 23.07.2006 (Вс) 16:58

GSerg
Не совсем дубликат я там спрашиваю про SQL запрос.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.07.2006 (Вс) 17:14

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

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 23.07.2006 (Вс) 17:18

GSerg
Я думал их можно сгрупировать без помощи sql команд поэтому сначала вопрос здесь задал.

BasiС
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 16.02.2006 (Чт) 23:34
Откуда: Koenigsberg

Сообщение BasiС » 23.07.2006 (Вс) 17:22

Сейчас что именно не получается, чем помочь?

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 23.07.2006 (Вс) 17:37

BasiС
Если создать несколько Recordset которые будут с помощью DISTINCT группировать элементы, я не пойму как мне узнать что этот "ребенок" именно от этого "родителя"

MeMBus
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 450
Зарегистрирован: 23.02.2005 (Ср) 7:03
Откуда: Из леса...

Сообщение MeMBus » 24.07.2006 (Пн) 3:06

Нужно самому разобраться где у тебя рут, где парент, где чилд. После разбора тебе будет понятно, какой чилд от какого парента и соотв. как он будет добавляться.
Бороться и искать, найти и перепрятать!

BasiС
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 16.02.2006 (Чт) 23:34
Откуда: Koenigsberg

Сообщение BasiС » 24.07.2006 (Пн) 13:01

Можно mKey называть как root
mKey = mKey = "ID" & str(RecDB.Fields("AutoID")) & RecDB.Fields("Datenbank")

затем добавлять следующим запросом child ов непосредственно root у

Set NodX = TreeView1.Nodes.Add("ID" & str(RecDB.Fields("AutoID")) & RecDB.Fields("Datenbank"), tvwChild, mKey & 2, RecDB.Fields

вроде так

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 24.07.2006 (Пн) 13:27

если Methode "последний" узел в дереве, то сначало надо заготовить структуру дерева

забить структуру

Код: Выделить всё
SELECT DISTINCT Datenbank, Benutzer,  SPID From MyTable
Dim strKey As string
Dim strPKey As Strting
Do While Not RecDB.EOF
    strKey = RecDB.Fields("Datenbank")
    Set NodX = TreeView1.Nodes.Add(, , strKey, RecDB.Fields("Datenbank"), 1)
    strPKey = strKey
    strKey = RecDB.Fields("Datenbank") & "-" & RecDB.Fields("Benutzer")
    Set NodX = TreeView1.Nodes.Add(strPKey, tvwChild, strKey, RecDB.Fields("Benutzer"), 2)
    strPKey = strKey
    strKey = RecDB.Fields("Datenbank") & "-" & RecDB.Fields("Benutzer") & "-"&RecDB.Fields("SPID")
    Set NodX = TreeView1.Nodes.Add(strPKey, tvwChild, strKey, RecDB.Fields("SPID"), 3)
    RecDB.MoveNext
Loop


и последним шагом добавит "последние" узлы

Код: Выделить всё
SELECT * FROM MyTable

Dim strKey As string
Dim strPKey As Strting

Do While Not RecDB.EOF
    strPKey = RecDB.Fields("Datenbank") & "-" & RecDB.Fields("Benutzer") & "-"&RecDB.Fields("SPID")
    strKey = RecDB.Fields("Datenbank") & "-" & RecDB.Fields("Benutzer") & "-"&RecDB.Fields("SPID")&"-"&RecDB.Fields("Methode")
    Set NodX = TreeView1.Nodes.Add(strPKey, tvwChild, strKey, RecDB.Fields("Method"), 3)
    RecDB.MoveNext
Loop


можно все одним проходом сделать, но тогда придется проверять существование уже узлов "верхнего" уровня (в принципе можно и по On Error Resume Next)

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 24.07.2006 (Пн) 14:10

Спасибо всем, сам допер как работает это. :)

HandKot
Я сделал примерно так-же, твой вариант интересный и занимает меньше строк, возьму на заметку, спасибо.


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: SemrushBot и гости: 65

    TopList