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

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

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

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

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

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

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

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

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

единственное "но", таблицы с иерархией должны быть довольно редко изменяемыми, орг структура как раз такой и является.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Иерархия в запросе
    #40038256
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
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Иерархия в запросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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