Имя: Пароль:
1C
1С v8
Вопрос по запросу.Выборка скидки по приориту для товара и для товара.родитель
,
0 serg-lom89
 
12.05.16
09:53
добрый день!

Есть запросик

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ Номра
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка = &Ном
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СкидкиНаценкиНоменклатурыСрезПоследних.Номенклатура,
    СкидкиНаценкиНоменклатурыСрезПоследних.ПроцентСкидкиНаценки
ПОМЕСТИТЬ СкидкиПоНомре
ИЗ
    РегистрСведений.СкидкиНаценкиНоменклатуры.СрезПоследних(
            &D,
            ПолучательСкидки.Владелец = &Kontr
                ИЛИ ПолучательСкидки.Ссылка = &Kontr) КАК СкидкиНаценкиНоменклатурыСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Номра.Номенклатура КАК Номенклатура1,
    СкидкиПоНомре.Номенклатура,
    СкидкиПоНомре.ПроцентСкидкиНаценки
ИЗ
    Номра КАК Номра
        ЛЕВОЕ СОЕДИНЕНИЕ СкидкиПоНомре КАК СкидкиПоНомре
        ПО (ВЫБОР
                КОГДА Номра.Номенклатура = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
            КОНЕЦ)


Данным запросом выбираю из справочника Номра один элемент.
Вторая таблица эта скидка по ном-ре для покупателя.

затем к первой таблице присоединяю вторую таблицу.
и получается что скидка для этой номеры установлена ,но еще установлена и для иерархии в которой находиться эта ном-ра.
например скидка на товар Масло крест. 22 проц,а на продукты в иерархии "мол. прод."  25 и естестенно 2 записи получаю.
Но фактически я должен взять скидку на сам только товар(приоритет у самого товара больше)Подскажите как реализовать данный момент в запросе?
1 serg-lom89
 
12.05.16
09:54
предскажите как правильно тогда составить запрос
2 serg-lom89
 
12.05.16
10:15
апну тему
3 drcrasher
 
12.05.16
10:17
а просто номенклатуру иерархией выбрать не судьба? и соединить со скидками
4 aleks_default
 
12.05.16
10:18
(1) правильно  не запросом, а рекурсивной функцией
5 Nuobu
 
12.05.16
10:26
ВЫБОР
                КОГДА Номра.Номенклатура = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                КОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
                    ТОГДА Номра.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = СкидкиПоНомре.Номенклатура
            КОНЕЦ
КАК ПолеПриоритет
6 serg-lom89
 
12.05.16
10:28
(4) да.такой вариант я сразу и рассматривал ..вот только если брать большую выборку ном-ры тогда на производительности
7 serg-lom89
 
12.05.16
10:28
скажется
8 sash-ml
 
12.05.16
10:40
(0) помести в ТЗ из трех колонок(номенклатура, родитель, приоритет) (номенклатура, номенклатура и все ее родители, длину строки полного кода родителя) передай параметром в запрос.
соединяй внутренним соединением со срезом последних скидок по родителю, упорядочи по убыванию приоритета.
сгруппируй по максимальному приоритету. и т.д.
9 aleks_default
 
12.05.16
10:41
Дык ты определись тебе по одной позиции надо найти скидку или по списку позиций? А то ведь это существенная разница для определения механизма реализации.
10 serg-lom89
 
12.05.16
10:44
(9) в идеале надо для списка ном-ры
11 sash-ml
 
12.05.16
10:45
(11) а типовую функцию использовать религия не позволяет?
12 serg-lom89
 
12.05.16
10:49
(11) ?
13 serg-lom89
 
12.05.16
11:10
вопрос у меня еще по условию соединения .
Получается в том что для одного оно выводит скидку именно на самму ном-ру а вторую строку для 2 родителя.разве не должно отработать только для ном-ры?
14 sash-ml
 
12.05.16
11:19
(13) судя по твоему запросу не должно, (12) ОбработкаТабличныхЧастей.ПолучитьСкидки() или как то так.
Конфа то какая?
15 serg-lom89
 
12.05.16
11:24
торговля (14)
16 kittystark
 
12.05.16
23:48
(13) во-первых твои условия связи - слегка тавтология
ВЫБОР
  КОГДА Номра.Номенклатура = СкидкиПоНомре.Номенклатура
    ТОГДА Номра.Номенклатура = СкидкиПоНомре.Номенклатура
  КОГДА Номра.Номенклатура.Родитель = СкидкиПоНомре.Номенклатура
    ТОГДА Номра.Номенклатура.Родитель = СкидкиПоНомре.Номенклатура
....

по сути есть логическое выражение
Номра.Номенклатура = СкидкиПоНомре.Номенклатура
ИЛИ Номра.Номенклатура.Родитель = СкидкиПоНомре.Номенклатура
....

что производительнее на больших объемах - еще вопрос, ожидаемого "обрыва" на первой ветке "выбор-когда-тогда" не произойдет, т.к. условие проверяется для каждой записи отдельно

во-вторых у тебя возможна ситуация когда на сам товар скидка не назначена, но назначена на родителе-родителя-родителя (тремя уровнями иерархии выше)

если хочешь брать только ближаюйшую и не обращать внимание на более выше стоящие, то как вариант можно добавить свое поле "РазностьУровней" и по нему потом брать только записи соответствующие минимуму по этому полю
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший