|
v8: получить цепочку оснований в запросе | ☑ | ||
---|---|---|---|---|
0
LAAry
26.11.12
✎
18:52
|
Добрый день. Помогите советом:
Есть справочник, элементы которого могут вводиться на основании других элементов. Значение элемента-основания в новом элементе хранится в поле "Основание". Я хочу для каждого элемента справочника получить самый новый элемент. Если у элемента не заполнено основание, значит он и есть самый новый. Например, элементы вводили в такой связи: Спр0 -> Спр1 -> Спр2 -> Спр3. Соответственно, для элементов Спр0-Спр2 самым новым будет Спр3 из такой таблицы: Ссылка | Основание Спр3 | Спр2 Спр2 | Спр1 Спр1 | Спр0 Получить такую: Ссылка | Основание Спр3 | Спр2 Спр3 | Спр1 Спр3 | Спр0 Запрос типа: Выбрать ЕстьNULL(СписокЭлементов2.Ссылка,СписокЭлементов1.Ссылка), СписокЭлементов1.Основание Из Справочник.Договоры КАК СписокЭлементов1 ЛевоеСоединение Справочник.Договоры КАК СписокЭлементов2 По СписокЭлементов1.Ссылка = СписокЭлементов2.Основание Решит вопрос при "глубине" связи не более 2. Т.е. я получу такой результат: Ссылка | Основание Спр3 | Спр2 Спр3 | Спр1 Спр2 | Спр0 Можно ли в запросе без рекурсии получить нужную мне таблицу? |
|||
1
1C-band
26.11.12
✎
18:53
|
Можно.
|
|||
2
LAAry
26.11.12
✎
18:54
|
(1) И?
|
|||
3
1C-band
26.11.12
✎
19:03
|
(2) Используй группировки и порядок.
|
|||
4
LAAry
26.11.12
✎
19:05
|
ОМГ :)
|
|||
5
LAAry
26.11.12
✎
19:10
|
(3) я наверно не очень понятно описал, ситуацию. Это не иерархия тут нет группировок.
|
|||
6
H A D G E H O G s
26.11.12
✎
19:24
|
(5) Посмотреть как сделано в типовых
|
|||
7
H A D G E H O G s
26.11.12
✎
19:24
|
Получения родителей у номенклатуры для простановки счета учета при установке галочки "БУ" в шапке документа.
|
|||
8
H A D G E H O G s
26.11.12
✎
19:25
|
Никогда бы не думал, что буду помнить типовые настолько.
|
|||
9
kosts
26.11.12
✎
19:30
|
Если количество вложений ограничено, как-то так можно
|
|||
10
H A D G E H O G s
26.11.12
✎
19:35
|
||||
11
kosts
26.11.12
✎
19:51
|
||||
12
LAAry
27.11.12
✎
09:47
|
(7) Тут задача обратная. Я могу от текущего элемента дойти до самого первого. Но мне нужно для каждого элемента в цепочке установить в соответствие текущий элемент. Поясню: у меня был договор, по которому были движения. На основании 1-го договора создали 2-й, по которому тоже были движения. И т.д., например до 4-го договора. Теперь мне нужно получить все движения по всей цепочке договоров, но в отчете связать эти движения с 4-м договором.
(11) Видно придется делать рекурсию. Что не ускорит и так тяжелый отчет. |
|||
13
kosts
27.11.12
✎
11:28
|
(12) Если конфа своя, то можно так реализовать:
В справочник добавить реквизит "исходный договор", куда для всей цепочки будет записываться ссылка на самый первый элемент. И добавить реквизит "дата начала действия" (если такого еще нет). Тогда запросом с группировкой по максимуму всегда можно получить последний или действующий на определенную дату если необходимо. |
|||
14
LAAry
27.11.12
✎
11:37
|
(13) Своя, но суть в том, чтобы получать из родителя потомка. Хранение в потомке самого первого родителя ничего не упростит жизнь.
Можно сделать ссылку в родителе на прямого потомка и через точку получить актуальный, но опять таки без ограничений на уровень "вложенности" это можно сделать только рекурсией. Сделал так: ВЫБРАТЬ ЕСТЬNULL(Договоры1.Договор, Договоры.Договор) КАК Договор, Договоры.Договор.СР_Основание КАК Основание ПОМЕСТИТЬ Договоры2 ИЗ Договоры КАК Договоры ЛЕВОЕ СОЕДИНЕНИЕ Договоры КАК Договоры1 ПО Договоры.Договор = Договоры1.Договор.СР_Основание И Договоры.Договор.МС_Бренд = Договоры1.Договор.МС_Бренд ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЕСТЬNULL(Договоры21.Договор, Договоры2.Договор) КАК Договор, Договоры2.Основание ПОМЕСТИТЬ Договоры3 ИЗ Договоры2 КАК Договоры2 ЛЕВОЕ СОЕДИНЕНИЕ Договоры2 КАК Договоры21 ПО Договоры2.Договор = Договоры21.Основание И Договоры2.Договор.МС_Бренд = Договоры21.Договор.МС_Бренд ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЕСТЬNULL(Договоры31.Договор, Договоры3.Договор) КАК Договор, Договоры3.Основание ПОМЕСТИТЬ Договоры4 ИЗ Договоры3 КАК Договоры3 ЛЕВОЕ СОЕДИНЕНИЕ Договоры3 КАК Договоры31 ПО Договоры3.Договор = Договоры31.Основание И Договоры3.Договор.МС_Бренд = Договоры31.Договор.МС_Бренд ; и так еще пару раз. Получается 2 в 5-й степени уровень "вложенности". найдется максимум 32-й потомок. Шит-код, но в разы быстрее рекурсии для каждого элемента. |
|||
15
kosts
27.11.12
✎
12:49
|
(14) > Хранение в потомке самого первого родителя ничего не упростит жизнь.
Отчего же. Зная любой произвольный потомок или первый в цепочке можно найти любой другой на определенную дату или последний.
(Если реквизит Исходный не заполнено - считаем, что это первый) p.s. Не обязательно конечно именно первый хранить, главное что-бы был какой-то идентификатор конкретной цепочки... |
|||
16
LAAry
27.11.12
✎
13:07
|
Так я потеряю соответствие между промежуточными договорами и текущими. Получу только 1-й и последний.
|
|||
17
kosts
27.11.12
✎
13:21
|
(16) Нет никакой потери.
Можно вывести всю цепочку. Можно вывести предыдущий/следующий, то так же группировкой с доп условием по дате. Главное что бы цепочка договоров шла строго календарно, тогда и ссылку на предыдущий/последующий хранить не нужно. А так же появляется возможность при необходимости исключать звено из середины без лишней мороки с записью ссылок. |
|||
18
LAAry
27.11.12
✎
13:29
|
(17) Думаю я сейчас не готов перелопачивать справочник договоров,чтобы создать ссылки. Но спасибо за совет, учту.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |