2009-08-05 3 views
0

У меня есть SQL 05 Сохраненная процедура, которая возвращает около 180 строк со структурой:Excel VBA - Создать Treeview из записей

ID | Имя | ParentId.

Что я хотел бы сделать, это создать Treeview на основе возвращенных записей. Ниже приведен образец, который я адаптировал из других мест на форуме (here)

Я почти делаю то, что хочу, но не совсем.

Это проблема, которая у меня есть, Корень добавлен нормально. Следующий слой вниз добавлен нормально. Однако он не знает, каким должен быть следующий ParentId. Должен ли я просто увеличивать переменную и пытаться найти совпадения? Думаю, я должен включить это в верхний метод.

Надеюсь, я не за горами, и нужно толчок в правильном направлении,

Большое спасибо заранее Майкл

В качестве последней вещи, проверяет BOF и EOF есть в цикле, как я похоже, у меня появилось много ошибок, если у меня их нет.

Private Sub MakeTree(ByVal rs As ADODB.Recordset) 
    rs.MoveFirst 
    Do Until rs.EOF 
     If (IsNull(rs.Fields("ParentID"))) Then 
      Call TVFunds.Nodes.Add(, , "Key" + CStr(rs.Fields("Id")), rs.Fields("Name")) 
      Call MsgBox("Key" + CStr(rs.Fields("Id")) + " " + rs.Fields("Name"), vbInformation, "Added Root") 
     Else 
      DrawNode rs, rs.Fields("ParentID"), rs.Fields("ID") 
     End If 
     If rs.BOF <> True And rs.EOF <> True Then 
      rs.MoveNext 
     End If 
    Loop 
End Sub 

    Private Sub DrawNode(ByRef r As ADODB.Recordset, ByRef pId As Integer, ByRef Id As Integer) 
    r.MoveFirst 
    Do Until r.EOF 
     If (r.Fields("ParentId") = pId And r.Fields("Id") = Id) Then 
      Call TVFunds.Nodes.Add("Key" + CStr(r.Fields("ParentId")), tvwChild, "Key" + CStr(r.Fields("Id")), r.Fields("Name")) 
      Call MsgBox("Key" + CStr(r.Fields("ParentId")) + " Key" + CStr(r.Fields("Id")) + " " + r.Fields("Name"), vbInformation, "Added") 
      Id = Id + 1 
      DrawNode r, pId, Id 
     End If 
     If r.BOF <> True And r.EOF <> True Then 
      r.MoveNext 
     End If 
    Loop 
End Sub 

ответ

1

Первое, что необходимо сделать: до ... циклы всегда выполняются хотя бы один раз. Итак, если в наборе записей нет строк, он все равно войдет в цикл. Вот почему вы получали эти ошибки без проверок EOF/BOF.

Изменить те не делать до ... петли делать ... Хотя петли, как это:

Do While Not rs.EOF 
     If (IsNull(rs.Fields("ParentID"))) Then 
      Call TVFunds.Nodes.Add(, , "Key" + CStr(rs.Fields("Id")), rs.Fields("Name")) 
      Call MsgBox("Key" + CStr(rs.Fields("Id")) + " " + rs.Fields("Name"), vbInformation, "Added Root") 
     Else 
      DrawNode rs, rs.Fields("ParentID"), rs.Fields("ID") 
     End If 

     rs.MoveNext 
Loop 
+0

Привет, Спасибо за быстрый ответ, если есть какая-либо деталь вы не уверены в том, пожалуйста, спросите , Кроме того, я немного уточнил второй метод, чтобы предотвратить дублирование записей, вызвавших ошибку. Даже реализация Do While While, похоже, не возвращает истинную ошибку EOF true BOF на rs.MoveNext, хотя им кажется, что это временная проблема до тех пор, пока второй метод не будет работать правильно. еще раз спасибо – 2009-08-05 14:44:17

Смежные вопросы