Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Иерархия в запросе / 12 сообщений из 12, страница 1 из 1
16.01.2020, 01:57
    #39914601
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия в запросе
Добрый час! Подскажите как создать запрос в таблице иерархической, что в запросе вывести все подчиненные подразделения любого из выбранного?
...
Рейтинг: 0 / 0
16.01.2020, 02:05
    #39914602
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия в запросе
JDV,

Дежавю ? или не помогло ?
...
Рейтинг: 0 / 0
16.01.2020, 02:10
    #39914603
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия в запросе
vmag, нет ( ... мне по сути в другом запросе нужно вывести всех сотрудников к примеру 1 отдела, те сразу двух отделений ...
...
Рейтинг: 0 / 0
16.01.2020, 02:15
    #39914604
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия в запросе
Вот так выглядит таблица
...
Рейтинг: 0 / 0
16.01.2020, 02:17
    #39914605
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия в запросе
JDV,
Как мне фильтрануть таблицу по полю ID_podrazdelenie ... исходя из того ... чтоб я выбрал старшее подразделение ... а все сотрудники его и его подчиненных вывелись ?
...
Рейтинг: 0 / 0
16.01.2020, 02:56
    #39914607
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия в запросе
JDV,

ну мне лично в ссылке выше понравилась функция от Озверина, которая выдергивает всех детей,
остается только написать вторую функцию - выводить дитё в запросе или нет, типа:
test_dnk([ID_podrazdelenie]) и поставить на неё условие отбора True, вернется True, сотрудник выведется, нет - значит не выведется...
Там у Озверина дети пишутся в строку, возможно удобнее писать будет в массив...

Поздненько уже... с утра народ подтянется, может еще чего подскажет, пока можете написать для спецов,
сколько уровней вложенности максимальное у вас, наверняка спросят...
...
Рейтинг: 0 / 0
16.01.2020, 03:28
    #39914608
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия в запросе
А еще там от Serg197311 можно взять идею - искать от ID_podrazdelenie до верха, так даже быстрее будет...
В запрос вставляешь туже же функцию так же, только с двумя параметрами ID_podrazdelenie от сотрудника и ID_podrazdelenie от подразделения, функция возвращает True если идешь от ID_podrazdelenie от сотрудника наверх и натыкаешься на ID_podrazdelenie от подразделения...

Собственно в ссылке выше практически набор инструментов для работы с ентой иерархией...
...
Рейтинг: 0 / 0
16.01.2020, 03:43
    #39914609
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия в запросе
Смешно...
Но там еще и вариант от sdku с DLookUp прокатит в той же функции...
1. ищем по ID_podrazdelenie хозяина, если совпал с искомым, фунция возвращает True и сотрудник печатается
2. если не совпал, то опять идем на п.1 с новым ID_podrazdelenie и опять ищем хозяина.
в конце концов упираемся в ноль (это если не входит в подразделение) и функция возвращает False - сотрудник не печатается...

В этом варианте будет меньше всего кода...
...
Рейтинг: 0 / 0
16.01.2020, 05:13
    #39914616
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия в запросе
Вот пример по последнему варианту, DLookUp проще всего...
По умолчанию в форме все сотрудники, нужно выбрать подразделение в верхнем списке...
...
Рейтинг: 0 / 0
16.01.2020, 10:39
    #39914695
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия в запросе
vmag,
Благодарю! Благодарю! Благодарю!
...
Рейтинг: 0 / 0
17.01.2020, 00:10
    #39915108
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия в запросе
JDV,

еще как вариант создать вспомогательную таблицу с полями
id, idparent, idchild, idtable (опционально если иерархию нужно прикрутить к нескольком таблицам)
по сути это таблица достижимости из одного узла в другой
т.Е пример для управления 1
(idparent, idchild), (1,2), (1,3), (1,4), (2,3), (2,4)

такая таблица при наличии индексов работает очень быстро, причем как в направлении от корня к листьям так и наоборот

обновлять ее можно на триггерах,

единственное "но", таблицы с иерархией должны быть довольно редко изменяемыми, орг структура как раз такой и является.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
23.01.2021, 13:41
    #40038256
JDV
JDV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархия в запросе
vmag,
Добрый час! Подскажите что не верно ....
If Me![fUchetIerarxii] = True Then
' Выражение1: test_dnk([Forms]![frm_head_meropriyatiya]![frm_sub_sql_meropriyatiya];[tbl_podrazdeleniya.ID_podrazdeleniya])
strSQLWhere = strSQLWhere & "([sql_head_planirovanie]![ID_podrazdeleniya] Like '" & test_dnk([Forms]![frm_head_meropriyatiya]![frm_sub_sql_meropriyatiya], [ID_podrazdeleniya]) & "') and "
End If
В этом месте ....
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
Private Sub cmdFiltr_Click()
'Базовая строка запроса (без точки с запятой!!!!!)
'Повторяет источник данных для подчиненной формы

If Me.fUchetIerarxii = True Then

strSQL = "SELECT * FROM sql_head_planirovanie"
'Предложение WHERE
    strSQLWhere = " WHERE ("  'Здесь и далее внимательно относитесь к пробелам, скобкам, кавычкам, дабы не нарушать синтаксис

'Проверяем выключатели, и, если надо, дополняем строку strSQLWhere
'Для текстовых полей лучше использовать LIKE (предварительно объяснив
'оператору назначение подстановочных символов - ну всех не надо, можно только * ;)

'JDV
    If Me![fUchetIerarxii] = True Then
'    Выражение1: test_dnk([Forms]![frm_head_meropriyatiya]![frm_sub_sql_meropriyatiya];[tbl_podrazdeleniya.ID_podrazdeleniya])
        strSQLWhere = strSQLWhere & "([sql_head_planirovanie]![ID_podrazdeleniya] Like '" & test_dnk([Forms]![frm_head_meropriyatiya]![frm_sub_sql_meropriyatiya], [ID_podrazdeleniya]) & "') and "
    End If
    
    If Me![cbo_Indikator_H] <> "" Then
        strSQLWhere = strSQLWhere & "([sql_head_planirovanie]![Indikator] Like '" & Me.[cbo_Indikator_H].[Column](0) & "') and "
    End If
    
    If Me![cbo_ID_tip_meropriyatiya] <> "" Then
        strSQLWhere = strSQLWhere & "([sql_head_planirovanie]![ID_tip_meropriyatiya] Like '" & Me.[cbo_ID_tip_meropriyatiya].[Column](0) & "') and "
    End If

    If Me![cbo_ID_vid_meropriyatiya] <> "" Then
        strSQLWhere = strSQLWhere & "([sql_head_planirovanie]![ID_vid_meropriyatiya] Like '" & Me.[cbo_ID_vid_meropriyatiya].[Column](0) & "') and "
    End If
    
    If Me![cbo_urovni] <> "" Then
        strSQLWhere = strSQLWhere & "([sql_head_planirovanie]![urovni] Like '" & Me.[cbo_urovni].[Column](0) & "') and "
    End If
    
    If Me![txt_Podrazdelenie] <> "" Then
        strSQLWhere = strSQLWhere & "([sql_head_planirovanie]![Sokraschennoe_naimenovanie] Like '" & Me![txt_Podrazdelenie] & "') and "
    End If
    
   
    If Me![txt_sotrudnik] <> "" Then
        strSQLWhere = strSQLWhere & "([sql_head_planirovanie]![Ответственный] Like '" & Me![txt_sotrudnik] & "') and "
    End If

    If Me![txt_s_data] <> "" Then
'    ДатаНачалаПериода <= ДатаОкончания And ДатаОкончанияПериода >= ДатаНачала
'        strSQLWhere = strSQLWhere & "[sql_head_planirovanie]![DataS] <= CDate ('" & Me!txt_po_data & "') and  CDate ('" & Me!txt_po_data & "')<= [sql_head_planirovanie]![DataPo] and "
        strSQLWhere = strSQLWhere & " CDate ('" & Me!txt_s_data & "')<= [sql_head_planirovanie]![DataPo] and CDate ('" & Me!txt_po_data & "')>= [sql_head_planirovanie]![DataS] and "

 
 End If
If Nz(txt_id_podrazdeleniya.Value) = "" Then

    MsgBox ("Внимание! Введите подразделение!")
    Exit Sub
End If



Функция эта
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
'Функция для фильтрации данных в Мероприятиях
Public Function test_dnk(long1 As Long, long2 As Long) As Boolean 'l1 - подразделение l2- код подр от сотрудника

Dim long3 As Long
long3 = 1

If long1 = long2 Then   ' это если самый нижний уровень
  test_dnk = True
  Exit Function
End If

test_dnk = False  ' по умолчанию не входит

Do While long3 <> 0
 long3 = Nz(DLookup("Roditel_podrazdeleniya", "podrazdelenie", "ID_podrazdeleniya=" & long2), 0)
   If long1 = long3 Then
    test_dnk = True
    Exit Function
   End If
 long2 = long3
Loop

End Function
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Иерархия в запросе / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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