|
v8: Как сделать проще (СКД + пользовательский отбор) | ☑ | ||
---|---|---|---|---|
0
Fragster
гуру
25.07.13
✎
19:55
|
РегистрСведений.ЦеновыеГруппы - для связи 2-х справочников много ко многим.
Ну а также если подскажете, как сделать то же самое, но не так... хм... странно, буду благодарен. ВЫБРАТЬ ЦеновыеГруппы.Ссылка КАК ЦеноваяГруппа ПОМЕСТИТЬ ЦеноваяГруппаИсключения ИЗ Справочник.ЦеновыеГруппы КАК ЦеновыеГруппы ГДЕ ЦеновыеГруппы.ДляКонтрагентов {ГДЕ ЦеновыеГруппы.Ссылка.* КАК ЦеноваяГруппаИсключения} ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ИСТИНА КАК Исключать ПОМЕСТИТЬ ПризнакИсключать ИЗ Справочник.ЦеновыеГруппы КАК ЦеновыеГруппы ГДЕ ЦеновыеГруппы.ДляКонтрагентов ИМЕЮЩИЕ НЕ КОЛИЧЕСТВО(*) В (ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ ЦеноваяГруппаИсключения) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВЫРАЗИТЬ(ЦеновыеГруппы.Объект КАК Справочник.Контрагенты) КАК Контрагент ПОМЕСТИТЬ КонтрагентыИсключения ИЗ РегистрСведений.ЦеновыеГруппы КАК ЦеновыеГруппы ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦеноваяГруппаИсключения КАК ЦеноваяГруппаИсключения ПО ЦеновыеГруппы.ЦеноваяГруппа = ЦеноваяГруппаИсключения.ЦеноваяГруппа, ПризнакИсключать КАК ПризнакИсключать ГДЕ ПризнакИсключать.Исключать = Истина ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Контрагенты.Ссылка КАК Контрагент {ВЫБРАТЬ Контрагент.* КАК КонтрагентИсключения} ИЗ Справочник.Контрагенты КАК Контрагенты ЛЕВОЕ СОЕДИНЕНИЕ КонтрагентыИсключения КАК КонтрагентыИсключения ПО Контрагенты.Ссылка = КонтрагентыИсключения.Контрагент ГДЕ КонтрагентыИсключения.Контрагент ЕСТЬ NULL |
|||
1
Beduin
25.07.13
✎
20:04
|
Если есть хоть одна ценовая группа без признака не для контрагентов, то ты находишь контрагентов которые свободны для установки ценовых групп.
|
|||
2
Fragster
гуру
25.07.13
✎
20:05
|
(1) не угадал
|
|||
3
Beduin
25.07.13
✎
20:09
|
Мне во втором запросе условие не понятно. по идее там всегда ложь должна быть.
|
|||
4
shuhard
25.07.13
✎
20:20
|
(0) а ты убери {} и смысл запроса кристаллизуется
|
|||
5
ИсчадиеADO
25.07.13
✎
20:23
|
во второй ВТ разве сгруппировать по не нужно? на выходе сколько у нее строк: 1 или более?
|
|||
6
Fragster
модератор
25.07.13
✎
20:48
|
(4) в них вся фишка
|
|||
7
Fragster
модератор
25.07.13
✎
20:48
|
(3) 1 или 0
|
|||
8
Fragster
модератор
25.07.13
✎
20:49
|
(7) к (5)
|
|||
9
shuhard
25.07.13
✎
20:50
|
(6) форум должен угадать в какой среде будет выполнен запрос - построителе или СКД ?
|
|||
10
МЮЛЛЕР
25.07.13
✎
20:53
|
А что это такое и с чем его есть?
{ВЫБРАТЬ Контрагент.* КАК КонтрагентИсключения} |
|||
11
Fragster
модератор
25.07.13
✎
20:55
|
(9) ИМХО без разницы. но в СКД, да.
|
|||
12
Fragster
модератор
25.07.13
✎
20:57
|
(10) когда автозаполнение убираешь, нужно, чтобы в поле появилось в полях на закладке "наборы данных" для СКД
|
|||
13
МЮЛЛЕР
25.07.13
✎
20:58
|
(12) спасибо
|
|||
14
shuhard
25.07.13
✎
21:11
|
(11) [ИМХО без разницы]
ИМХО есть разница |
|||
15
Fragster
модератор
26.07.13
✎
07:48
|
(14) в данном случае?
|
|||
16
Hmster
26.07.13
✎
07:59
|
а каков смысл у третьего запроса? что делать с одним реквизитом типа булево?
|
|||
17
Hmster
26.07.13
✎
08:00
|
(16) второго
|
|||
18
Fragster
модератор
26.07.13
✎
08:08
|
(17) там либо ноль либо одна строка, результат используется в третьем запросе
|
|||
19
Hmster
26.07.13
✎
08:12
|
по моему не хватает слова ПЕРВЫЕ 1
|
|||
20
Hmster
26.07.13
✎
08:14
|
т.е.
если в первом запросе получаем все ценовые группы для контрагентов то 2,3 запросы пустые, а 4й выводит всех контрагентов. |
|||
21
Fragster
модератор
26.07.13
✎
08:15
|
(19) в предпоследнем не хватает РАЗЛИЧНЫЕ - вот это - да.
(20) ага |
|||
22
Hmster
26.07.13
✎
08:17
|
так же если выбраны не все группы, то мы получаем в итоге контрагентов у которых нет хотя бы одной ценовой группы из выбранных?
|
|||
23
Hmster
26.07.13
✎
08:18
|
(21) теоретически результат будет одинаковый - вопрос скорости исполнения
|
|||
24
Fragster
модератор
26.07.13
✎
08:19
|
(22) да. теперь на повестку дня выходит вторая часть - как сделать это более очевидно и просто.
|
|||
25
Fragster
модератор
26.07.13
✎
08:20
|
учитывая, что не все контрагенты в принципе входят в ценовые группы
|
|||
26
Hmster
26.07.13
✎
08:39
|
а второй запрос - это как бы оптимизация - вдруг не поставили отбор?
|
|||
27
Hmster
26.07.13
✎
08:40
|
в принципе первые 2 запроса можно убрать
|
|||
28
Hmster
26.07.13
✎
08:41
|
возможно если 1й оставить будет работать быстрее но не факт
|
|||
29
Fragster
модератор
26.07.13
✎
08:54
|
(26)(27) так ведь если не поставили отбор - то нужно вывести всех. а если поставили - то для ситуации
(контрагент:ценовая группа) К1 ЦГ1 К1 ЦГ2 К2 -- К3 ЦГ2 при отборе "ценовая группа исключения = ЦГ1" надо вывести К2 и К3 |
|||
30
Fragster
модератор
26.07.13
✎
09:21
|
ап
|
|||
31
mistеr
26.07.13
✎
09:48
|
(0) Какой результат нужно получить? И что задает пользователь?
|
|||
32
Fragster
гуру
26.07.13
✎
10:19
|
(31) пользователь задает ценовые группы, контрагенты которых должны быть исключены из отчета. или не задает.
|
|||
33
mistеr
26.07.13
✎
10:30
|
(32) Связать К и ЦГ не в запросе, а в СКД. Обычные отборы по ценовым группам, объединенные в группу НЕ.
|
|||
34
Fragster
гуру
26.07.13
✎
10:31
|
(33) в таком случае в (29) К1 все равно попадает
|
|||
35
Fragster
модератор
26.07.13
✎
11:50
|
эх.
|
|||
36
Hmster
26.07.13
✎
12:23
|
А так не проще?
ВЫБРАТЬ ЦеновыеГруппы.Ссылка КАК ЦеноваяГруппа ПОМЕСТИТЬ ЦеноваяГруппаИсключения ИЗ Справочник.ЦеновыеГруппы КАК ЦеновыеГруппы ГДЕ ЦеновыеГруппы.ДляКонтрагентов {ГДЕ ЦеновыеГруппы.Ссылка.* КАК ЦеноваяГруппаИсключения} ; ВЫБРАТЬ РАЗЛИЧНЫЕ ВЫРАЗИТЬ(ЦеновыеГруппы.Объект КАК Справочник.Контрагенты) КАК Контрагент ПОМЕСТИТЬ КонтрагентыИсключения ИЗ РегистрСведений.ЦеновыеГруппы КАК ЦеновыеГруппы ГДЕ ЦеновыеГруппы.ЦеноваяГруппа В (ВЫБРАТЬ ЦеноваяГруппаИсключения.ЦеноваяГруппа ИЗ ЦеноваяГруппаИсключения КАК ЦеноваяГруппаИсключения) ; ВЫБРАТЬ Контрагенты.Ссылка КАК Контрагент {ВЫБРАТЬ Контрагент.* КАК КонтрагентИсключения} ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ НЕ Контрагенты.Контрагент В (ВЫБРАТЬ КонтрагентыИсключения.Контрагент ИЗ КонтрагентыИсключения КАК КонтрагентыИсключения) |
|||
37
Fragster
модератор
26.07.13
✎
12:42
|
(36) тогда если пользователь не установит отбор - то ему нифига не выведется.
|
|||
38
Fragster
модератор
26.07.13
✎
12:43
|
ну и "Не В" тормозит по сравнению с левым соединением и есть NULL
|
|||
39
Hmster
26.07.13
✎
13:03
|
даже если поля проиндексировать? этого кстати не хватает в запросе
это же запрос для отчета? тормозить вроде как не должен заметно для пользователя вот заполненность на отбор - это конечно проблема бывает еще хуже |
|||
40
Bober
26.07.13
✎
17:42
|
(0) что-то запрос слишком сложный для такой простой задачи, тем более если решение будет на СКД.
|
|||
41
Fragster
модератор
26.07.13
✎
17:43
|
(40) давай решение проще
|
|||
42
Bober
26.07.13
✎
18:04
|
(41) ты прям как маленький, кто ж тебе просто так выложит решение.
|
|||
43
Fragster
модератор
26.07.13
✎
18:06
|
(42) т.е. ты не знаешь, как сделать
|
|||
44
Bober
26.07.13
✎
18:07
|
(42) мелкий трололо.
Подкормлю тебя немного -) конфигуратор - справка - содержание справки - СКД - язык выражений СКД - операции сравнения в 8.2.17.169 восьмой пункт сверху |
|||
45
Fragster
модератор
26.07.13
✎
18:16
|
(44) и как же тут применить?
|
|||
46
Fragster
модератор
26.07.13
✎
18:18
|
данные для примера - в (29)
|
|||
47
Bober
26.07.13
✎
18:29
|
(45) ладно, вот тебе решение
ВЫБРАТЬ Спр.Ссылка КАК Контрагент ИЗ Справочник.Контрагенты КАК Спр {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеновыеГруппы КАК ЦеновыеГруппы ПО (ЦеновыеГруппы.Объект = Спр.Ссылка)} {ГДЕ (ЕСТЬNULL(ЦеновыеГруппы.ЦеноваяГруппа, ЗНАЧЕНИЕ(Справочник.ЦеновыеГруппы.ПустаяСсылка))).* КАК ЦеноваяГруппа} |
|||
48
Bober
26.07.13
✎
18:32
|
(45) просто так, чтобы ты лишний раз справку почитал
|
|||
49
Fragster
модератор
26.07.13
✎
18:37
|
(47) не работает. соединение только когда есть условие - да, работает. а вот при выборе "ЦеноваяГруппа <> ЦГ1" контрагент К1 все равно попадает в отчет
|
|||
50
Bober
26.07.13
✎
18:39
|
(49) все работает. раз есть условие на поле, то и соединение будет
|
|||
51
Bober
26.07.13
✎
18:42
|
(49) ага, вижу...
|
|||
52
Bober
26.07.13
✎
18:45
|
(49) а тебе нужно через отбор или через параметр задавать группы исключения?
|
|||
53
Fragster
модератор
26.07.13
✎
18:48
|
(52) через отбор
|
|||
54
Bober
26.07.13
✎
18:50
|
решение через параметр, который можно сделать в списке.
ВЫБРАТЬ Спр.Ссылка КАК Контрагент ИЗ Справочник.Контрагенты КАК Спр {ГДЕ (НЕ Спр.Ссылка В (ВЫБРАТЬ ЦеновыеГруппы.Объект ИЗ РегистрСведений.ЦеновыеГруппы КАК ЦеновыеГруппы ГДЕ ЦеновыеГруппы.ЦеноваяГруппа = &ЦеноваяГруппа))} |
|||
55
Fragster
модератор
26.07.13
✎
18:54
|
(54) оно очевидно, но требует параметра, который может быть универсальным - типа в списке, в иерархии, все, кроме (не в для исключаемых групп) и т.п.
|
|||
56
Fragster
модератор
26.07.13
✎
18:55
|
не может быть
|
|||
57
Bober
26.07.13
✎
19:53
|
с отбором
ВЫБРАТЬ РАЗЛИЧНЫЕ ВЫРАЗИТЬ(РС.Объект КАК Справочник.Контрганеты) КАК Контрагент ПОМЕСТИТЬ Контрагенты ИЗ РегистрСведений.ЦеновыеГруппы КАК РС ГДЕ ЛОЖЬ {ГДЕ РС.ЦеноваяГруппа.* КАК ЦеноваяГруппа} ; ВЫБРАТЬ Спр.Ссылка КАК Контрагент ИЗ Справочник.Контрагенты КАК Спр ЛЕВОЕ СОЕДИНЕНИЕ Контрагенты КАК Контрагенты ПО (Контрагенты.Объект = Спр.Ссылка) ГДЕ Контрагенты.Объект ЕСТЬ NULL но написать несколько строк кода в модуле объекта, перед компоновкой нужно убрать условие в первом запросе Ложь. |
|||
58
Bober
26.07.13
✎
20:01
|
либо для надежности в первом запросе написать
"ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 0" а в модуле объекта Если Найти(Запрос, "РС.ЦеноваяГруппа") > 0 Тогда Запрос = СтрЗаменить(Запрос, "ПЕРВЫЕ 0", ""); КонецЕсли; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |