Форумы HiProg.com - MS ACCESS, VBA, VB

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

ник: Lukas
Давай я лучше свой пример покажу:
Здесь функция обновляет значения поля WithChildren (Text(255)), в котором собираются
IDItem (Long, Counter) записей через запятую (Свой +детки) , для каждой записи таблицы.
То есть, если детей нет, то только свой IDItem, если есть, то свой IDItem и IDItem-ы деток, внуков, правнуков и т.д. через запятую.
В поле IDParent (Long) - значение IDItem родителя.

Далее запросом с IN () можно будет считать суммы.
Вызывать без параметров, так: Call FillWithChildren() или просто: FillWithChildren

Должен признаться, я не специалист по деревьям и по ADO.
Возможно есть более простые решения.


Public Function FillWithChildren(Optional IDItem As Long = 0, Optional rst As ADODB.Recordset, Optional Children As String)
    Dim varBmk As Variant
    If rst Is Nothing Then
        Set rst = New ADODB.Recordset
        rst.Open "SELECT IDItem, IDParent, WithChildren FROM tblComBar ORDER BY IDItem DESC", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
        Do Until rst.EOF '"обNullим" поле "WithChildren"
            rst(2) = Null
            rst.Update
            rst.MoveNext
        Loop
        rst.MoveFirst
        Do Until rst.EOF
            If Not rst.EOF And Not rst.BOF Then
                varBmk = rst.Bookmark
                Children = ""
                If IsNull(rst.Collect(2)) Then ' Только если заранее "обNullили" поле "WithChildren" всех строк.
                    FillWithChildren rst.Collect(0), rst, Children
                Else
                    Children = rst.Collect(2)
                End If
                rst.Bookmark = varBmk
'Debug.Print rst.Collect(0) & Children
                rst(2) = rst.Collect(0) & Children
                rst.Update
                rst.MoveNext
            End If
        Loop
        rst.Close
        Set rst = Nothing
    Else
        rst.MoveFirst
        Do Until rst.EOF
            rst.Find "IDParent=" & IDItem
            If Not rst.EOF And Not rst.BOF Then
                If IsNull(rst.Collect(2)) Then
                    varBmk = rst.Bookmark
                    Children = Children & "," & rst.Collect(0)
                    FillWithChildren rst.Collect(0), rst, Children
                    rst.Bookmark = varBmk
                Else
                    Children = Children & "," & rst.Collect(2)
                End If
                rst.MoveNext
            End If
        Loop
    End If
End Function


Ваше имя:

Пароль:

Цитировать: [quote][/quote] Код: [code][/code]
Жирный: [b][/b] Наклонный: [i][/i]
URL: [url][/url] 

Сообщение:

 Размер файла не более 50 Кбт. Большие файлы можно размещать на www.slil.ru

Прикрепить:

 

Для вставки смайлов в текст щелкните по значку.