|
v7: Обращение внутри запроса к данным уже им собранным | ☑ | ||
---|---|---|---|---|
0
SSDDRR
27.04.17
✎
13:47
|
Приветствую!
У меня возник, по-видимому, наивно-риторический вопрос: можно ли в запросе обращаться к уже собранным к тому времени данным? Допустим, я хочу пройтись одновременно по справочникам "ГТД" и "Партии" и получить на выходе выборку элементов справочника "Партии" так, чтобы в неё попали только элементы с непустными ГТД, ещё в такую выборку не попадавшие. Для этого к запросу-основе ____________________________________________________________ ТекстЗапроса = " |Обрабатывать НеПомеченныеНаУдаление; |ГТД = Справочник.ГТД.ТекущийЭлемент; |Партия = Справочник.Партии.ТекущийЭлемент; |ГТДПартии = Справочник.Партии.ГТД; |СтранаПроисхожденияПартии = Справочник.Партии.СтранаПроисхождения; |Группировка ГТД без групп; |Группировка Партия без групп; |Условие (ПустоеЗначение(ГТДПартии) + ПустоеЗначение(СтранаПроисхожденияПартии) = 0); |Условие (ГТД в ГТДПартии);"; ____________________________________________________________ Надо было бы добавить что-то вроде "|Условие (НЕ (ГТДПартии в [Группировка ГТД]));" Скорее всего, так нельзя, но можно ли такое, например, в языке запросов "8.3"? |
|||
1
SSDDRR
27.04.17
✎
13:56
|
Поправка: "... чтобы в неё попали только элементы с непустными ГТД, ещё в такую выборку не попадавшими". То есть речь идёт о выборке партий с ГТД, которые ни в одной ранее выбранной партии ещё не встречались, чтобы в итоге во всех выбранных партиях были только уникальные ГТД.
|
|||
2
Ёпрст
27.04.17
✎
14:03
|
(0) дык, у тебя запрос в (0) такие и возвращает
|
|||
3
Ёпрст
27.04.17
✎
14:05
|
точнее, нужно переписать вот так и привет:
|Обрабатывать НеПомеченныеНаУдаление; |Партия = Справочник.Партии.ТекущийЭлемент; |ГТД = Справочник.Партии.ГТД; |СтранаПроисхожденияПартии = Справочник.Партии.СтранаПроисхождения; |Группировка ГТД без групп; |Группировка Партия без групп; |Условие (ПустоеЗначение(ГТД) + ПустоеЗначение(СтранаПроисхожденияПартии) = 0); |
|||
4
vladko
27.04.17
✎
14:05
|
(0)
Вариант решения задачи: 1. надо получить список значений ГТД у существующих партий, для этого делаем запрос по существующим партиям и заполняем ими список значений 2 Делаем запрос по гтд, с условием, что ГТД не в нашем списке значений. |
|||
5
SSDDRR
27.04.17
✎
14:16
|
(3) Запрос в (0) сваливает все партии, а в них ГТД повторяются. Много партий товара может быть с одним и тем же ГТД.
(4) Да, но список значений становится крайне медленным, если в нём уже тысячи значений. Хочется через запрос всё сделать. |
|||
6
Ёпрст
27.04.17
✎
14:22
|
(5) запрос в (3) <> запросу в (0) , смотри внимательнее
|
|||
7
Ёпрст
27.04.17
✎
14:25
|
+ если тебе нужна первая попавшаяся партия с уникальным ГТД, то при обходе второй группировки просто бери первую партию из группировки и всё:
Пока Группировка(1)=1 Цикл ГТД = Запрос.ГТД; Партия=""; Если Группировка(2)=1 Тогда Партия = Запрос.партия; КонецЕсли; КонецЦикла; |
|||
8
SSDDRR
27.04.17
✎
14:41
|
(7) Спасибо. А в чём отличие (3) от (0)? Почему он работает лучше?
|
|||
9
SSDDRR
27.04.17
✎
14:57
|
Кроме того, всё-таки, хотелось бы узнать, есть ли доступ внутри запроса к данным, уже им собранным, хотя в на платформе "8.3"? Или и там такого нет?
|
|||
10
Ёпрст
27.04.17
✎
15:02
|
(9) можешь обращаться к результату запроса, что в снеговике, что в клюшках и осуществлять прямое позиционирование в выборке.
В 7.7 через Получить, в 8.3 через НайтиСледующий,СледующийПоЗначениюПоля и т.д |
|||
11
SSDDRR
27.04.17
✎
15:21
|
(10) Имею ввиду доступ ещё внутри самого запроса, пока он до конца не выполнен.
Допустим, условие, что новая партия не должна попадать в выборку, если одной из предыдущих добавленных по выборке партий уже попадался такой же ГТД. Без такой возможности придётся пользоваться способом (7), а хотелось бы её иметь. Вот я и спрашиваю, что, может, в "8.3" добавили в движок обработки запросов доступ к группировкам прямо ещё во время исполнения самого запроса. |
|||
12
SSDDRR
27.04.17
✎
15:56
|
(3) Мне надо получить и те ГТД, которые в партиях не участвуют. То есть убирать "ГТД = Справочник.ГТД.ТекущийЭлемент;" всё таки нельзя?
|
|||
13
Ёпрст
27.04.17
✎
16:02
|
(11) в 7.7 можно сделать прямым запросом, там есть и подзапросы в селекте, и коррелированные подзапросы в селекте и группировки и оконные функции, для реализации обращения к промежуточным результатам, в 8.3 - проблематично.
|
|||
14
SSDDRR
27.04.17
✎
16:30
|
(13) Спасибо. А что это за команды в запросах, которыми можно такое сделать в "7.7"?
|
|||
15
slowpoke1C
29.04.17
✎
23:30
|
(14) Это внешняя компонента 1С++ (1cpp.dll)с сайта 1cpp.ru.
Очень сильная штука, и там используется SQL, приправленный обычными для 1С именами объектов. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |