Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Иерархия / 25 сообщений из 25, страница 1 из 1
31.10.2018, 23:36
    #39726196
JDV
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
31.10.2018, 23:41
    #39726197
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
...
...
Рейтинг: 0 / 0
31.10.2018, 23:42
    #39726198
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
Подскажите как создать ЗАПРОС позволяющий понять входит ли Отделение 2 в Управление 2 ?
...
Рейтинг: 0 / 0
01.11.2018, 08:34
    #39726272
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
Может это поможет Иерархическая структура
Ну за одно гляньте Иерархия. Интервальное дерево.
...
Рейтинг: 0 / 0
01.11.2018, 09:15
    #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
01.11.2018, 11:28
    #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
01.11.2018, 16:08
    #39726695
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
Благодарю! Всех кто откликнулся! Буду изучать ... решение напишу сюда ...
...
Рейтинг: 0 / 0
01.11.2018, 16:18
    #39726708
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
JDV , имеется ли ограничение на количество уровней иерархии? т.е. некое значение, выше которого высота дерева не поднимется никогда?
...
Рейтинг: 0 / 0
01.11.2018, 22:46
    #39726890
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
Akina,
5 уровней
...
Рейтинг: 0 / 0
02.11.2018, 08:09
    #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
02.11.2018, 08:10
    #39726929
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
Впрочем, если нужна только проверка, достаточно посмотреть количество возвращаемых записей - ноль или больше...
...
Рейтинг: 0 / 0
02.11.2018, 13:57
    #39727220
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
Akina, Благодарю! Буду пробовать )
...
Рейтинг: 0 / 0
19.11.2018, 23:24
    #39735365
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
alecko,
про любое поиск по родителю можно сделать?
...
Рейтинг: 0 / 0
21.11.2018, 00:48
    #39735881
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
JDV,

как его сделать? напишите запрос если возможно ?
...
Рейтинг: 0 / 0
21.11.2018, 05:20
    #39735897
ROI
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
21.11.2018, 12:00
    #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
12.12.2018, 02:34
    #39746374
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
alecko, а если пропущен один уровень ... к примеру отделение сразу подчиняется отделу?
...
Рейтинг: 0 / 0
12.12.2018, 07:43
    #39746412
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
JDVДобрый час!


Подскажите как создать позволяющий понять входит ли Отделение 2 в Управление 2 ?
а каким образом вы в этом запросе собираетесь указывать - что проверяем? Если например вы каким-то образом выбираете отдел 2, потом Управление 2, и хотите получить ответ - подчинен ли отдел 2 управлению 2 с логическим значением Да/нет, и в принципе можете сначала выбрать Управление 2 а потом отдел 2 и получить ответ - подчинено ли управление 2 отделу 2, то я бы это сделал на VBA - строчек 5 от силы будет....
...
Рейтинг: 0 / 0
12.12.2018, 07:44
    #39746413
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
JDValecko, а если пропущен один уровень ... к примеру отделение сразу подчиняется отделу?
И пропуск уровня не помешал бы....
...
Рейтинг: 0 / 0
12.12.2018, 10:42
    #39746497
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
JDValecko, а если пропущен один уровень ... к примеру отделение сразу подчиняется отделу?
т.е. например отдел удалили? - тогда нужно править запросом parent-столбец отделений - т.е. поднимать их на уровень выше - пустых уровней быть не может.
...
Рейтинг: 0 / 0
12.12.2018, 10:46
    #39746499
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
Serg197311,
сверху понятно а как снизу дойти до верхнего уровня?
...
Рейтинг: 0 / 0
12.12.2018, 11:08
    #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
12.12.2018, 11:31
    #39746532
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
О! только проверку на родитель=0 надо еще сделать
...
Рейтинг: 0 / 0
12.12.2018, 12:09
    #39746569
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
Код: vbnet
1.
2.
SELECT Код, наименование, родитель, DLookUp("наименование","tbl","код=" & [родитель]) AS входитВ
FROM tbl
...
Рейтинг: 0 / 0
13.12.2018, 00:34
    #39747032
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия
Благодарю Братья! Буду пробовать!
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Иерархия / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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