powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос на вычисление с учетом иерархии - 1, 2, 3 иерархия.
3 сообщений из 3, страница 1 из 1
Запрос на вычисление с учетом иерархии - 1, 2, 3 иерархия.
    #32831278
skv_fin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть статьи затрат с иерархией второго и третьего уровня. Есть две таблицы:
1. Статьи затрат: поля-Код; Название.
2. Проводки: поля-Код; Сумма.
Во вторую таблицу данные вносятся исходя из последней иерархии, например: для статьи 1.1 последней иерархией являются статьи 1.1.1 - 1.1.3, а для статьи 1.2 или 1.3 последней иерархии нет - они сами являются статьями последней иерархии.
Вопрос: как рассчитать затраты по всем иерархиям, чтобы в результате получилось, что-то вроде ниже приведенного.
Возможно также необходимо добавить новые поля в таблицу 1-Статьи затрат.

Код Название Сумма
1 Расходы, итого 300
1.1 Аренда 90
1.1.1 аренда склада 20
1.1.2 аренда офиса 30
1.1.3 аренда прочая 40
1.2 Зарплата 100
1.3 Транспортные расходы 110
...
Рейтинг: 0 / 0
Запрос на вычисление с учетом иерархии - 1, 2, 3 иерархия.
    #32831303
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При ограниченом числе уровней (ну скажем до 10) все довольно просто. Сначала надо сверху вниз выстроить собственно дерево - N запросов по числу уровней. Начиная от корня (iParentObjectID Is NULL) опускаясь каждый раз вниз на один уровень (SELECT ... FROM tblObject AS Parent INNER JOIN tblObject as Child ON Parent.iObjectID=Child.iParentObjectID). Заодно посчитать nChildNumber. Построить для каждой веточки полный адрес вида "001.001.002". Соединить все N запросов в один при помощи UNION.

Затем снизу вверх для каждого уровня надо посчитать суммы конечных листочков + суммы всех детей.

Если нужно динамически раскрывать/закрывать уровни, то нужно где-то (в исходных таблицах или в отдельной специальной) организовать флажки bIsExpanded bIsVisible, которые нужны для манипулирования а-ля дерево эксплорера.

В общем задача решаемая, если поковыряться.
...
Рейтинг: 0 / 0
Запрос на вычисление с учетом иерархии - 1, 2, 3 иерархия.
    #32832964
sraider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На чем база? SQL Server или MDB?

На MDB я делал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Public Function СписокДетейПоДереву(ИсточникДанных As String, СписокРодителей As String) As String
  Dim Список As String, Дети As String, Данные As ADODB.Recordset
  
  Set Данные = New ADODB.Recordset
  Список = СписокРодителей
  Дети = СписокРодителей
  Do
    Данные.Open "SELECT [Код], [Родитель] FROM [" & ИсточникДанных & "] WHERE [Родитель] IN (" & Дети & ")", CurrentProject.Connection, adOpenStatic
    If Данные.EOF Then Exit Do
    Дети = Данные![Код]
    Do
      Данные.MoveNext
      If Данные.EOF Then Exit Do
      Дети = Дети & "," & Данные![Код]
    Loop
    Список = Список & "," & Дети
    Данные.Close
  Loop
  Set Данные = Nothing
  
  СписокДетейПоДереву = Список
End Function

А потом, например, выбрали какой-то элемент в поле Me![Поле] - формируем условие на данные:
Код: plaintext
"[Код] IN (" & СписокДетейПоДереву("Таблица", Me![Поле]) & ")"

----------

А на SQL Server делал UDF:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE FUNCTION dbo.[Иерархия]()
RETURNS @Результат TABLE (Родитель int not null, Код int not null)
BEGIN 
DECLARE @Итерация int, @ДобавленоСтрок int
SET @Итерация =  0 
insert @Результат (Родитель, Код) select Родитель, Код from Таблица where Родитель<>- 1 
-- Значение -1 = 'корень' дерева. Можно, в принципе, использовать null ;)
set @ДобавленоСтрок=@@RowCount
while (@ДобавленоСтрок >  0 ) and (@Итерация <  100 )
begin
insert @Результат (Родитель, Код) 
select distinct т1.Родитель, т2.Код
from @Результат т1 inner join @Результат т2 on т1.Код = т2.Родитель
where (select count(*) from @Результат пп where пп.Родитель=т1.Родитель and пп.Код=т2.Код)= 0 
set @ДобавленоСтрок=@@RowCount
set @Итерация=@Итерация+ 1 
end
insert @Результат (Родитель, Код) select Код, Код from Таблица
RETURN
END

Получается на выходе таблица Родитель и все его дети, включая самых-самых-дальных родственников. Далее используем ее...

Код: plaintext
1.
2.
3.
4.
select Иерархия.Родитель, Sum(Данные.Сумма) Сумма
from Данные
inner join [Иерархия]() Иерархия on Иерархия.Код=Данные.Статья
group by Иерархия.Родитель
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос на вычисление с учетом иерархии - 1, 2, 3 иерархия.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]