Имя: Пароль:
1C
1С v8
Запрос в СКД.
0 YHVVH
 
12.07.12
15:02
Есть запрос

ВЫБРАТЬ РАЗЛИЧНЫЕ
   НоменклатураСегмента.Номенклатура
ПОМЕСТИТЬ ВтНоменклатураСегмента
ИЗ
   РегистрСведений.НоменклатураСегмента КАК НоменклатураСегмента
ГДЕ
   &ОтборПоСегменту
{ГДЕ
   НоменклатураСегмента.Номенклатура.*,
   НоменклатураСегмента.Сегмент.*}

Если позиция числится в разных сегментах то отбор НЕ РАВНО по сегменту
не выдает ожидаемого результата.

Допустим товар числится в Сегменте1 и в Сегменте2.
отбор ставим НЕ Равно Сегмент1

то товар попадет в результат из за сегмента2.
Вроде все логично, но как переписать запрос чтоб все таки исключить такой товар?

Изящного решения найти не могу, направьте на истинный путь.
1 Defender aka LINN
 
12.07.12
15:06

ГДЕ
   &ОтборПоСегменту

Это что за пердимонокль?
2 YHVVH
 
12.07.12
15:07
(1) это если включен отбор, если не включен то запрос не имеет смысл выполнять.
3 Defender aka LINN
 
12.07.12
15:11
(2) Гм... Интересная фигня.
Ну, кроме как получить таблицу, попавшую под отбор и соединить с таблицей из (0) я особо вариантов не вижу. Придется повозиться, факт
4 YHVVH
 
12.07.12
15:15
Придется повозиться, факт. - это очень грустно. подожду может напишут еще.
5 GANR
 
12.07.12
15:42
Вариант 1:

ВЫБРАТЬ
   Номенклатура
ИЗ
   РегистрСведений.НоменклатураСегмента
СГРУППИРОВАТЬ ПО
   Номенклатура
ИМЕЮЩИЕ
   МАКСИМУМ(ВЫБОР Когда Сегмент = &Сегмент1 Тогда 1 ИНАЧЕ 0 КОНЕЦ) = 0

Вариант 2:

ВЫБРАТЬ РАЗЛИЧНЫЕ
   Номенклатура
ИЗ
   РегистрСведений.НоменклатураСегмента
ГДЕ
   Номенклатура НЕ В
   (ВЫБРАТЬ РАЗЛИЧНЫЕ
        Номенклатура
    ИЗ
        РегистрСведений.НоменклатураСегмента
    ГДЕ
        Сегмент = &Сегмент1)
Вариант 3:
см. (3)
6 YHVVH
 
12.07.12
16:02
(5) спасибо
7 YHVVH
 
12.07.12
16:03
допиливать придется модуль объекта ПриКомпоновкеРезультата в зависимости от условия отбора который задал пользователь.
8 GANR
 
12.07.12
16:13
(7) Почему? Можно перепилить ТОЛЬКО запрос.

ВЫБРАТЬ
   Номенклатура
ИЗ
   РегистрСведений.НоменклатураСегмента
СГРУППИРОВАТЬ ПО
   Номенклатура
ИМЕЮЩИЕ
   МАКСИМУМ(ВЫБОР Когда Сегмент = &Сегмент1 И &Сегмент1 <> ЗНАЧЕНИЕ(Справочник.Сегменты.ПустаяСсылка) Тогда 1 ИНАЧЕ 0 КОНЕЦ) = 0

Тогда этот отбор будет работать только если "Сегмент1" не равен пустой ссылке.
9 YHVVH
 
12.07.12
16:21
(8) может я не понимаю, но отбор пользователь как будет задавать в отчете?

двумя полями? одно для включить второе исключить?
10 YHVVH
 
12.07.12
16:22
хотелось бы чтоб одним полем, для этого придется анализировать условие отбора которое он задал и подключать запрос твой.
11 GANR
 
12.07.12
16:34
(9) ОДНИМ, если пользователь НЕ заполнит параметр "Сегмент1", то отбор в запросе (8) де-факто производится не будет - будет только группировка по номенклатуре..
12 YHVVH
 
12.07.12
16:36
(11) Сегмент1 будет на форме и просто Cегмент , почему один то?
13 GANR
 
12.07.12
16:41
(12) Пусть будет "Сегмент", чтоб не путаться

ВЫБРАТЬ
   Номенклатура
ИЗ
   РегистрСведений.НоменклатураСегмента
СГРУППИРОВАТЬ ПО
   Номенклатура
ИМЕЮЩИЕ

  МАКСИМУМ(ВЫБОР Когда Сегмент = &Сегмент И &Сегмент <> ЗНАЧЕНИЕ(Справочник.Сегменты.ПустаяСсылка) Тогда 1 ИНАЧЕ 0 КОНЕЦ) = 0

Если отчет на компоновке и форма не самопальная - будет панелька с параметрами и, если в ней задать параметр "Сегмент" - отбор будет, если не задать - не будет).
14 YHVVH
 
12.07.12
16:46
(13) что делать если он задал отбор на равно?
15 YHVVH
 
12.07.12
16:49
не надо ни каких дополнительных параметров, на форме стоит отбор по сегменту, он может там поставить условие какое он хочет выбрать и сегмент.
16 YHVVH
 
12.07.12
16:49
для этого и надо (10) делать
17 GANR
 
12.07.12
16:51
(16) тогда кодирование.
18 YHVVH
 
12.07.12
16:57
(17) вот, а по сколько отчетов много где используется отбор по сегменту, придется по трудится так как не только править сам запрос но и код тоже.