powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Иерархия
25 сообщений из 25, страница 1 из 1
Иерархия
    #39726196
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый час!

есть таблица Иерархическая

ID Наименование Родитель
1 Управление 1 0
2 Отдел 1 1
3 Отделение 1 2
4 Отделение 2 2
5 Управление 2 0
6 Отдел 1 5
7 Отделение 1 6
8 Отделение 2 6

Подскажите как создать позволяющий понять входит ли Отделение 2 в Управление 2 ?
...
Рейтинг: 0 / 0
Иерархия
    #39726197
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
...
Рейтинг: 0 / 0
Иерархия
    #39726198
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите как создать ЗАПРОС позволяющий понять входит ли Отделение 2 в Управление 2 ?
...
Рейтинг: 0 / 0
Иерархия
    #39726272
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может это поможет Иерархическая структура
Ну за одно гляньте Иерархия. Интервальное дерево.
...
Рейтинг: 0 / 0
Иерархия
    #39726294
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Public Function getChildren(ByVal folderId As String) As String
    Dim db As dao.Database
    Dim rst As dao.Recordset
    Dim result As String
    Dim children As String
    
    result = ""
    
    Set db = CurrentDb
    Set rst = db.OpenRecordset("SELECT m1.id, m1.pid FROM tblRef1 m0 INNER JOIN tblRef1 m1 ON m0.id = m1.pid WHERE m0.id=" & folderId & " ORDER BY m1.pid")
    With rst
        If .RecordCount > 0 Then
            .MoveFirst
            Do Until .EOF
                result = result & "," & .Fields("id")
                children = getChildren(.Fields("id"))
                If Len(children) > 0 Then
                    result = result & "," & children
                End If
                .MoveNext
            Loop
        End If
    End With
    rst.Close
    Set rst = Nothing
    Set db = Nothing
    
    If InStr(1, result, ",") > 0 Then
        result = Right(result, Len(result) - 1)
    End If
    
    getChildren = result
End Function



от шедрот душевных накидал ф-ию, которая рекурсивно возвращает коды всех детей по папке.
...
Рейтинг: 0 / 0
Иерархия
    #39726410
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычный запрос на самообъединение. отделений 2 - несколько про какое речь ?
Код: sql
1.
2.
3.
4.
SELECT Иерархическая_2.Наименование, Иерархическая_1.ID, Иерархическая_1.Наименование, Иерархическая_1.Родитель, Иерархическая.Родитель
FROM (Иерархическая INNER JOIN Иерархическая AS Иерархическая_1 ON Иерархическая.ID = Иерархическая_1.Родитель) 
    INNER JOIN Иерархическая AS Иерархическая_2 ON Иерархическая_1.ID = Иерархическая_2.Родитель
WHERE (((Иерархическая.Родитель)=0));


т.е. если ищем на втором уровне (Отделение 2 - на 2-м уровне), относительно 0-го уровня, то степень глубины 3. (3 таблицы) - как отобрать то что нужно надеюсь разберетесь .
...
Рейтинг: 0 / 0
Иерархия
    #39726695
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю! Всех кто откликнулся! Буду изучать ... решение напишу сюда ...
...
Рейтинг: 0 / 0
Иерархия
    #39726708
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDV , имеется ли ограничение на количество уровней иерархии? т.е. некое значение, выше которого высота дерева не поднимется никогда?
...
Рейтинг: 0 / 0
Иерархия
    #39726890
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
5 уровней
...
Рейтинг: 0 / 0
Иерархия
    #39726928
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для 5 уровней можно, не заморачиваясь на рекурсию, построить один запрос на базе 5 копий таблицы, формирующий UNC отделов, и проверить наличие в UNC имён либо ИДов (смотря из чего будешь строить пути) обоих заданных подразделений.

Что-то вроде

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT "\" & t1.id & "\" & 
       IFNULL(t2.id,"") & "\" & 
       IFNULL(t3.id,"") & "\" & 
       IFNULL(t4.id,"") & "\" & 
       IFNULL(t5.id,"") & "\" AS fullpath -- UNC на базе ID с обрамляющими слэшами
FROM      таблица AS t1
LEFT JOIN таблица AS t2 ON t1.id = t2.Родитель
LEFT JOIN таблица AS t3 ON t1.id = t3.Родитель
LEFT JOIN таблица AS t4 ON t1.id = t4.Родитель
LEFT JOIN таблица AS t5 ON t1.id = t5.Родитель
WHERE t1.Родитель = 0
HAVING INSTR(fullpath, "\5\") > 0 -- Управление2
   AND INSTR(fullpath, "\8\") > 0 -- Отделение2


Access, возможно, не понравится HAVING - ну тады заменить там fullpath на его выражение и переместить проверку во WHERE.
...
Рейтинг: 0 / 0
Иерархия
    #39726929
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Впрочем, если нужна только проверка, достаточно посмотреть количество возвращаемых записей - ноль или больше...
...
Рейтинг: 0 / 0
Иерархия
    #39727220
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina, Благодарю! Буду пробовать )
...
Рейтинг: 0 / 0
Иерархия
    #39735365
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko,
про любое поиск по родителю можно сделать?
...
Рейтинг: 0 / 0
Иерархия
    #39735881
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDV,

как его сделать? напишите запрос если возможно ?
...
Рейтинг: 0 / 0
Иерархия
    #39735897
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDVДобрый час!

есть таблица Иерархическая

ID Наименование Родитель
1 Управление 1 0
2 Отдел 1 1
3 Отделение 1 2
4 Отделение 2 2
5 Управление 2 0
6 Отдел 1 5
7 Отделение 1 6
8 Отделение 2 6

Подскажите как создать позволяющий понять входит ли Отделение 2 в Управление 2 ?
добавить поле "путь"
...
Рейтинг: 0 / 0
Иерархия
    #39736028
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDV,замените условие (или добавьте)
Код: sql
1.
2.
3.
SELECT Иерархическая_2.Наименование, Иерархическая_1.ID, Иерархическая_1.Наименование, Иерархическая_1.Родитель, Иерархическая.ID
FROM (Иерархическая INNER JOIN Иерархическая AS Иерархическая_1 ON Иерархическая.ID = Иерархическая_1.Родитель) INNER JOIN Иерархическая AS Иерархическая_2 ON Иерархическая_1.ID = Иерархическая_2.Родитель
WHERE (((Иерархическая.ID)=5) AND ((Иерархическая.Родитель)=0));


запросы на самообъединение обычно применяются при поиске по спискам, т.е. три списка, List1, List2, List3, в них создаем запросы
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
' для 1-го списка
str = "SELECT ID, Наименование From Иерархическая WHERE Родитель=0 ORDER BY Наименование;"
List1.RowSource=str
' для второго списка
str = "SELECT Иерархическая_1.ID, Иерархическая_1.Наименование  " & _
"FROM Иерархическая INNER JOIN Иерархическая AS Иерархическая_1 ON Иерархическая.ID = Иерархическая_1.Родитель " & _
"WHERE (((Иерархическая.ID)=" & List1.value & "));"
List2.RowSource=str
' для третьего списка по аналогии
str = "SELECT Иерархическая_2.ID, Иерархическая_2.Наименование " & _
"FROM (Иерархическая INNER JOIN Иерархическая AS Иерархическая_1 ON Иерархическая.ID = Иерархическая_1.Родитель) INNER " & _
 "JOIN Иерархическая AS Иерархическая_2 ON Иерархическая_1.ID = Иерархическая_2.Родитель " & _
"WHERE (((Иерархическая_1.ID)=" & List2.value & "));"
List3.RowSource=str
После выбора нужно только обновить списки
т.е. если выбираем в первом списке, то
Private sub List1_afterUpdate()
list2.requery
list3.requery
end sub
' при выборе во вором списке
Private sub List2_afterUpdate()
list3.requery
end sub

...
Рейтинг: 0 / 0
Иерархия
    #39746374
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko, а если пропущен один уровень ... к примеру отделение сразу подчиняется отделу?
...
Рейтинг: 0 / 0
Иерархия
    #39746412
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDVДобрый час!


Подскажите как создать позволяющий понять входит ли Отделение 2 в Управление 2 ?
а каким образом вы в этом запросе собираетесь указывать - что проверяем? Если например вы каким-то образом выбираете отдел 2, потом Управление 2, и хотите получить ответ - подчинен ли отдел 2 управлению 2 с логическим значением Да/нет, и в принципе можете сначала выбрать Управление 2 а потом отдел 2 и получить ответ - подчинено ли управление 2 отделу 2, то я бы это сделал на VBA - строчек 5 от силы будет....
...
Рейтинг: 0 / 0
Иерархия
    #39746413
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDValecko, а если пропущен один уровень ... к примеру отделение сразу подчиняется отделу?
И пропуск уровня не помешал бы....
...
Рейтинг: 0 / 0
Иерархия
    #39746497
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDValecko, а если пропущен один уровень ... к примеру отделение сразу подчиняется отделу?
т.е. например отдел удалили? - тогда нужно править запросом parent-столбец отделений - т.е. поднимать их на уровень выше - пустых уровней быть не может.
...
Рейтинг: 0 / 0
Иерархия
    #39746499
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg197311,
сверху понятно а как снизу дойти до верхнего уровня?
...
Рейтинг: 0 / 0
Иерархия
    #39746515
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDVSerg197311,
сверху понятно а как снизу дойти до верхнего уровня?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Public Function Getqb(nm1 As Integer) As Integer
Dim rst As DAO.Recordset
Dim qq As Integer
Dim cn As Integer
cn = nm1
qq = 1
20 Set rst = CurrentDb.OpenRecordset("SELECT * from MAIN1 where MAIn1!code=" & cn & ";")
   If rst.EOF = False Then
      qq = qq * rst!qt
      cn = rst!Own
      GoTo 20
   Else
       Getqb = qq
       Exit Function
   End If

End Function


Вот функция которая получает на входе код строки(у вас id) и пробегает до самого верха, перемножая количества.
Вам надо передать в функцию еще один код, сделать ее Boolean, и вместо перемножения выполнять сравнение кода(id) текущей строки со вторым переданным в функцию кодом. Коды совпали - функция = true, выход. Совпадения не нашлось - функция False
Мое поле !own - это у вас Родитель
Гуру, не бейте ногами за такую корявость.... Работает ведь...
...
Рейтинг: 0 / 0
Иерархия
    #39746532
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О! только проверку на родитель=0 надо еще сделать
...
Рейтинг: 0 / 0
Иерархия
    #39746569
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
SELECT Код, наименование, родитель, DLookUp("наименование","tbl","код=" & [родитель]) AS входитВ
FROM tbl
...
Рейтинг: 0 / 0
Иерархия
    #39747032
JDV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю Братья! Буду пробовать!
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Иерархия
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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