|
Выбрать последние записи регистра накопления запросом | ☑ | ||
---|---|---|---|---|
0
prilforreal
27.09.18
✎
11:02
|
Доброе утро! 1с 8.3, конфа самописная. Подскажите, как получить последнюю запись в регистре накопления по каждому контрагенту?
|
|||
1
s03
27.09.18
✎
11:04
|
масимум по периоду, затем соединение по полученному максимуму
|
|||
2
RomanYS
27.09.18
✎
11:07
|
(1)
+затем макс по регистратору, затем соединение, затем макс по номеру строки, затем соединение, и вот она последняя Запись! Можно еще коррелированный запрос |
|||
3
prilforreal
27.09.18
✎
11:08
|
(1) С документом так получалось, с регистром испытываю затруднение
|
|||
4
nicxxx
27.09.18
✎
11:09
|
(2) "Можно еще коррелированный запрос", которых нет в 1С
|
|||
5
Джинн
27.09.18
✎
11:13
|
"Регистр накопления" и "последняя запись" - термины мало совместимые.
|
|||
6
prilforreal
27.09.18
✎
11:14
|
(5) Последнее движение в регистре
|
|||
7
Buster007
27.09.18
✎
11:15
|
(4) хм, лень смотреть в план, но по описанию текста запроса в 1С, то он на все 100 коррелированный
|
|||
8
Buster007
27.09.18
✎
11:16
|
(4) на основании чего ты утверждаешь так?
|
|||
9
s03
27.09.18
✎
11:16
|
(3) и то и другое обычные таблицы, никакой разницы
|
|||
10
Джинн
27.09.18
✎
11:18
|
(6) Если это регистр накопления, то он по определению агрегирует данные. В этом его смысл. А "последнее движение" - штука очень размытая. Что за задача вообще?
|
|||
11
Гипервизор
27.09.18
✎
11:21
|
(10) Последняя закупка или продажа поди)
|
|||
12
prilforreal
27.09.18
✎
11:22
|
(10) Написать обработку, которая пробегает по регистру и проверяет когда последний раз контрагент заказывал фотопечать, если прошло > 3х месяцев в карточке контрагента сбрасывает поле ОтветственныйДизайнер. (11) Так точно)
|
|||
13
prilforreal
27.09.18
✎
11:22
|
(11) На то и Гипервизор =)
|
|||
14
Джинн
27.09.18
✎
11:24
|
(12) Тю! Таблица оборотов Вам в помощь.
|
|||
15
s03
27.09.18
✎
11:29
|
(12) берешь контрагентов с установленным ответственным дизайнером, соединяешь (левым) с оборотами за 3 последних месяца с условием по наличию фотопечати, обрабатываешь результат если из соединения у тебя null
|
|||
16
Serg_1960
27.09.18
✎
11:31
|
Не совсем то, что надо - как выбрать 1 документ поступления по каждой номенклатуре , но надеюсь пнул автора в нужном направлении :)
|
|||
17
prilforreal
27.09.18
✎
11:40
|
(14) Спасибо, через обороты и хотел делать. (15) Хочется сделать через максимум, выгрести последние движения и если они старше 3х месяцев убирать ответственного.
|
|||
18
bolobol
27.09.18
✎
11:48
|
(17) Ну тут нужно определиться, через обороты хотел или через максимум. Но люди, совсем не глупые, советуют решать задачу правильным способом.
|
|||
19
prilforreal
27.09.18
✎
11:54
|
(18) А разве нельзя обороты с МАКСИМУМ Регистратор.Дата соединить, а после условие поставить на проверку даты?
|
|||
20
bolobol
27.09.18
✎
11:56
|
(19) Можно. Только если в заданном периоде будет оборот, то смысл искать последнее в нём? А если оборота не будет, то и последнего не найдётся.
|
|||
21
prilforreal
27.09.18
✎
11:56
|
(15) А можно же и все последние записи выгрести каждого с условием по фотопечати? Просто как обработать если из соединения null не совсем понимаю..
|
|||
22
bolobol
27.09.18
✎
11:57
|
Таким образом, последующую проверку даты уже будет не к чему применить.
|
|||
23
bolobol
27.09.18
✎
11:58
|
(21) Об этом вам в (1) ответили. Но это другая, какая-то более широкая задача.
|
|||
24
bolobol
27.09.18
✎
11:59
|
И тяжёлая для системы.
|
|||
25
s03
27.09.18
✎
12:07
|
(21) обороты возьми с периодичностью день, вытаскиваешь период (максимум), это соединяешь с твоими контрагентами и в конечном итоге условие где период есть null
|
|||
26
prilforreal
27.09.18
✎
12:48
|
(25) Таким образом у меня в выборке будут контрагенты, которые в этот день не заказывали фотопечать?
|
|||
27
s03
27.09.18
✎
13:03
|
(26) таким образом ты можешь получить контрагентов у которых установлен ответственный дизайнер, но у которых не было заказа печати за последние 3 месяца, что и требуется по твоему условию
|
|||
28
prilforreal
27.09.18
✎
13:13
|
(27) Высыпает всех контрагентов такой запрос...
"ВЫБРАТЬ | Контрагент.Ссылка КАК Контрагент, | ВЫБОР | КОГДА МАКСИМУМ(ПотолкиОбороты.Период) ЕСТЬ NULL | ТОГДА 0 | КОНЕЦ КАК Период |ИЗ | РегистрНакопления.Потолки.Обороты(, , Месяц, ) КАК ПотолкиОбороты | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагент КАК Контрагент | ПО ПотолкиОбороты.Заказчик = Контрагент.Ссылка |ГДЕ | ПотолкиОбороты.КолФотоПечать > 0 | |СГРУППИРОВАТЬ ПО | Контрагент.Ссылка | |УПОРЯДОЧИТЬ ПО | Период, | Контрагент"; |
|||
29
s03
27.09.18
✎
13:23
|
(28) возьми контрагентов с условием по заполненному дизайнеру, левым соединением обороты (соединение по контрагенту) за период 3 месяца с периодичностью день и максимум по периоду с группировкой по контрагентам
|
|||
30
s03
27.09.18
✎
13:24
|
т.е. всё то же самое, что ещё в (15) было написано
|
|||
31
s03
27.09.18
✎
13:26
|
Взяв обороты за весь период (без начала и конца периода) ты получишь дату последнего заказа, а если взять только за последние 3 месяца, то проверку более старших уже делать не надо, зачем знать что дата заказа была полгода назад, если это можно сразу отсечь при выборке
|
|||
32
prilforreal
27.09.18
✎
13:57
|
(31) Верно, нужно взять за 3 месяца только тех контрагентов, которые не совершали заказов и у которых заполнено поле печатник.
|
|||
33
prilforreal
27.09.18
✎
13:58
|
(31) Не получается все равно, ручки кривоваты((
НачДата=(ТекущаяДата()-7776000); КонДата=ТекущаяДата(); ПустаяСсылка=Справочники.Контрагент.ПустаяСсылка(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | МАКСИМУМ(ПотолкиОбороты.Период) КАК Период, | Контрагент.Ссылка КАК Контрагент |ИЗ | РегистрНакопления.Потолки.Обороты(, , День, ) КАК ПотолкиОбороты | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагент КАК Контрагент | ПО ПотолкиОбороты.Заказчик = Контрагент.Ссылка |ГДЕ | ПотолкиОбороты.КолФотоПечать > 0 | И ПотолкиОбороты.Период ЕСТЬ NULL | И Контрагент.Печатник <> &ПустаяСсылка | И ПотолкиОбороты.Период МЕЖДУ &НачДата И &КонДата | |СГРУППИРОВАТЬ ПО | Контрагент.Ссылка | |УПОРЯДОЧИТЬ ПО | Период"; Запрос.УстановитьПараметр("НачДата",НачДата); Запрос.УстановитьПараметр("КонДата",КонецДня(КонДата)); Запрос.УстановитьПараметр("ПустаяСсылка",ПустаяСсылка); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщить(ВыборкаДетальныеЗаписи.Контрагент); Сообщить(ВыборкаДетальныеЗаписи.Период); КонецЦикла; Пустой результат |
|||
34
s03
27.09.18
✎
14:10
|
Выбрать
Контрагент.Ссылка, МАКСИМУМ(ПотолкиОбороты.Период) КАК Период ИЗ Справочник.Контрагенты КАК Контрагенты Левое Соединение РегистрНакопления.ПотолкиОбороты(&НачДата, &КонДата, ДЕНЬ) КАК ПотолкиОбороты ПО Контрагент.Ссылка = ПотолкиОбороты.Контрагент ГДЕ Контрагент.Печатник<>&ПустаяСсылка СГРУППИРОВАТЬ ПО Контрагент.Ссылка Посмотри результат такого запроса, те строки, где период не будет указан это твои контрагенты, которым надо убрать дизайнера (я запрос писал руками здесь, на форуме, поэтому проверь его орфографию) |
|||
35
s03
27.09.18
✎
14:11
|
ну и условие по заказу печати ещё добавить надо
|
|||
36
prilforreal
27.09.18
✎
14:57
|
(34) Замечательно! Как вы и сказали, Таким запросом сначала высыпется список контрагентов, которым необходимо убрать ответственного, после контрагенты с периодом менее 3х месяцев.
|
|||
37
s03
27.09.18
✎
15:08
|
(36) можешь добавить условие ПотолкиОбороты.Период Есть NULL и тогда контрагентов с периодом менее 3-х месяцев тоже отсеешь. В общем смысл не искать дату последней операции по контрагенту, а какие отборы/условия будешь добавлять уже сам играйся
|
|||
38
prilforreal
27.09.18
✎
15:22
|
(37) Только вот при условии
ПотолкиОбороты.КолФотоПечать > 0 В результате ничего нет |
|||
39
prilforreal
27.09.18
✎
15:25
|
(37) Точнее есть только те, у кого заказы были, а с условием ПотолкиОбороты.Период Есть NULL они естественно пропадают
|
|||
40
s03
27.09.18
✎
15:30
|
(39) угу, потому что одновременно и Количество>0 и Период есть NULL не может быть. Поэтому или сначала запрос по оборотам во временную таблицу (с отбором по количеству>0) и последующее уже соединение с контрагентами или не делать отбор по период есть null, а проверять это при обходе результата запроса
|
|||
41
prilforreal
27.09.18
✎
15:32
|
(40) Так я убрал условие Период есть NULL, и все равно в результате только те кого нужно оставить
"ВЫБРАТЬ | Контрагент.Ссылка, | МАКСИМУМ(ПотолкиОбороты.Период) КАК Период |ИЗ | Справочник.Контрагент КАК Контрагент | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Потолки.Обороты(&НачДата, &КонДата, ДЕНЬ, ) КАК ПотолкиОбороты | ПО Контрагент.Ссылка = ПотолкиОбороты.Заказчик |ГДЕ | Контрагент.Печатник <> &ПустаяСсылка | И ПотолкиОбороты.КолФотоПечать <> 0 | |СГРУППИРОВАТЬ ПО | Контрагент.Ссылка | |УПОРЯДОЧИТЬ ПО | Период"; |
|||
42
s03
27.09.18
✎
15:46
|
А если так?
ВЫБРАТЬ РАЗЛИЧНЫЕ ПотолкиОбороты.Контрагент ПОМЕСТИТЬ врТЗ ИЗ РегистрНакопления.Потолки.Обороты(&НачДата, &КонДата, , ) КАК ПотолкиОбороты ГДЕ ПотолкиОбороты.КолФотоПечать <> 0 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Контрагенты.Ссылка ИЗ Справочник.Контрагенты КАК Контрагенты ЛЕВОЕ СОЕДИНЕНИЕ врТЗ КАК врТЗ ПО Контрагенты.Ссылка = врТЗ.Контрагент ГДЕ Контрагенты.Печатник <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) И врТЗ.Контрагент ЕСТЬ NULL |
|||
43
nicxxx
27.09.18
✎
15:57
|
(8) drop table t1
drop table t2 create table t1 (f1 nvarchar, f2 int) create table t2 (f1 nvarchar, f2 int) insert into t1 values (1,2),(2,3),(3,4),(3,5) insert into t2 values (1,7),(2,3),(3,4) select t1.f1 ,sum(t1.f2) from t1 group by t1.f1 having sum(t1.f2) > ( SELECT avg(t2.f2) FROM t2 where t2.f1 = t1.f1 ) А теперь на 1С выбрать 1 как f1 ,2 как f2 поместить t1 Union all выбрать 2, 3 Union all выбрать 3, 4 Union all выбрать 3, 5 ; выбрать 1 как f1 ,7 как f2 поместить t2 Union all выбрать 2, 3 Union all выбрать 3, 4 ; select t1.f1 ,sum(t1.f2) from t1 group by t1.f1 having sum(t1.f2) > ( ВЫБРАТЬ среднее(t2.f2) ИЗ t2 ГДЕ t2.f1 = t1.f1 ) |
|||
44
prilforreal
27.09.18
✎
16:01
|
(42) То же самое, в результате список контрагентов, сработавших в указанном периоде
|
|||
45
s03
27.09.18
✎
16:04
|
(44) точно? временная таблица это контрагенты у которых есть печать, а в результирующем запросе уже как раз их не должно быть
|
|||
46
s03
27.09.18
✎
16:09
|
Условие, заданное в Контрагент.Печатник<>... проверь, плиз, я то по памяти тут пишу, может я там не тот тип указал в сравнении
|
|||
47
prilforreal
27.09.18
✎
16:22
|
(42) Это вложенный запрос, или 2 разных?
|
|||
48
s03
27.09.18
✎
16:26
|
(47) это один запрос со временной таблицей (ну т.е. пакет запросов в первом собирается временная, а во втором используется) и выполняется как одно целое.
смоделировал, создал пару справочников, документ, регистр, - работает |
|||
49
prilforreal
27.09.18
✎
17:00
|
(48) Спасибо огромное, Плюсище к карме!) Сделал как вы говорили пакетом запросов, на выходе список контрагентов, сработавших последний раз больше 3х месяцев назад.
НачДата=(ТекущаяДата()-7776000); КонДата=ТекущаяДата(); ПустаяСсылка=Справочники.Контрагент.ПустаяСсылка(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ПотолкиОбороты.Заказчик |ПОМЕСТИТЬ врТЗ |ИЗ | РегистрНакопления.Потолки.Обороты(&НачДата, &КонДата, , ) КАК ПотолкиОбороты |ГДЕ | ПотолкиОбороты.КолФотоПечать <> 0 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Контрагент.Ссылка КАК Ссылка |ИЗ | Справочник.Контрагент КАК Контрагент | ЛЕВОЕ СОЕДИНЕНИЕ врТЗ КАК врТЗ | ПО Контрагент.Ссылка = врТЗ.Заказчик |ГДЕ | Контрагент.Печатник <> ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка) | И врТЗ.Заказчик ЕСТЬ NULL | |УПОРЯДОЧИТЬ ПО | Ссылка"; Запрос.УстановитьПараметр("НачДата",НачДата); Запрос.УстановитьПараметр("КонДата",КонецДня(КонДата)); Запрос.УстановитьПараметр("ПустаяСсылка",ПустаяСсылка); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщить(ВыборкаДетальныеЗаписи.Ссылка); КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |