Имя: Пароль:
1C
1С v8
Срез последних на каждую дату для ВСЕЙ номенклатуры, УТ11
,
0 breezee
 
29.05.15
12:35
Может у меня проблема в понимании? Скажите, пожалуйста, я правильно понимаю?
Для того чтобы выбрать все номенклатуру и по всем документам в периоде нужно
1)Выбрать все номенклатуру в этом периоде - волженный запрос в котором просто выбирается вся номенклатура за период
2)Взять из Среза Последних - текущую цену на эту номенклатуру(будет текущей)
3)Взять максимальное значение из вложенного запроса, но меньшее чем в срезе последних для каждой номенклатуры - для этого используется функция МАКСИМУМ(период волженного запроса) - это и будет прдыдущим периодом на который надо получать цены. Все это помещается во временную таблицу
4)Получение цен на предыдущей период - путем добавления таблицы регистра, и связь по периоду и номенклатуре между временной таблицей и таблицей регистра, выбираются все данные из таблицы регистра - если нет записи выбирается 0(проверка на ЕСТЬNULL для цены)

Так почему у меня выбираются ВСЕ старые цены, а не максимальные? Где я мог накосяить?

Сам запрос

ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Характеристика,
    ЦеныНоменклатурыСрезПоследних.Цена,
    МАКСИМУМ(ЦеныНом.Период) КАК Период
ПОМЕСТИТЬ ВТВыборкиПредпоследнихЦен
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаАктуальнойЦены, ) КАК ЦеныНоменклатурыСрезПоследних
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ЦеныНоменклатуры.Период КАК Период,
            ЦеныНоменклатуры.Регистратор КАК Регистратор,
            ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
            ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
            ЦеныНоменклатуры.Характеристика КАК Характеристика,
            ЦеныНоменклатуры.Цена КАК Цена
        ИЗ
            РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ГДЕ
            ЦеныНоменклатуры.ВидЦены = &ВидЦены
            И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
            И ЦеныНоменклатуры.Период >= &ДатаНач) КАК ЦеныНом
        ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = ЦеныНом.Номенклатура
            И ЦеныНоменклатурыСрезПоследних.Характеристика = ЦеныНом.Характеристика
            И ЦеныНоменклатурыСрезПоследних.Период > ЦеныНом.Период
            И (ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены)
ГДЕ
    ЦеныНоменклатурыСрезПоследних.Период <= &ДатаНач

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Характеристика,
    ЦеныНоменклатурыСрезПоследних.Цена
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ЕСТЬNULL(ВТВыборкиПредпоследнихЦен.Цена, 0) КАК НоваяЦена,
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Цена КАК СтраяЦена,
    ЦеныНоменклатуры.Регистратор
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ЛЕВОЕ СОЕДИНЕНИЕ ВТВыборкиПредпоследнихЦен КАК ВТВыборкиПредпоследнихЦен
        ПО (ЦеныНоменклатуры.Номенклатура = ВТВыборкиПредпоследнихЦен.Номенклатура)
            И (ЦеныНоменклатуры.Характеристика = ВТВыборкиПредпоследнихЦен.Характеристика)
            И (ЦеныНоменклатуры.Период = ВТВыборкиПредпоследнихЦен.Период)
1 breezee
 
29.05.15
12:55
АП
2 breezee
 
29.05.15
13:31
Да что за фигня то? Почему у меня выбираются ВСЕ старые цены, я же поставил максимм, даже во волженном запросе сразу выбрал сатрые цены

ВЫБРАТЬ
    ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК Поле1,
    ЦеныНом.Номенклатура,
    ЦеныНом.Цена КАК Цена1
ИЗ
    (ВЫБРАТЬ
        ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
        ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
        ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
        МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
    ИЗ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаАктуальнойЦены, ) КАК ЦеныНоменклатурыСрезПоследних
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
            ПО ЦеныНоменклатурыСрезПоследних.Период > ЦеныНоменклатуры.Период
                И ЦеныНоменклатурыСрезПоследних.Номенклатура = ЦеныНоменклатуры.Номенклатура
                И ЦеныНоменклатурыСрезПоследних.Характеристика = ЦеныНоменклатуры.Характеристика
    ГДЕ
        ЦеныНоменклатуры.ВидЦены = &ВидЦены
        И ЦеныНоменклатурыСрезПоследних.Период >= &ДатаНач
        И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
        И ЦеныНоменклатуры.Период >= &ДатаНач
        И ЦеныНоменклатуры.ВидЦены = &ВидЦены
    
    СГРУППИРОВАТЬ ПО
        ЦеныНоменклатурыСрезПоследних.Характеристика,
        ЦеныНоменклатурыСрезПоследних.Номенклатура,
        ЦеныНоменклатурыСрезПоследних.Цена) КАК ЦеныНом
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО (ЦеныНом.Период = ЦеныНоменклатуры.Период)
            И (ЦеныНом.Характеристика = ЦеныНоменклатуры.Характеристика)
            И (ЦеныНом.Номенклатура = ЦеныНоменклатуры.Номенклатура)
ГДЕ
    ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
    И ЦеныНоменклатуры.Период >= &ДатаНач
3 hhhh
 
29.05.15
13:34
(2) а вот это фантастическое выражение что означает?

ГДЕ
    ЦеныНоменклатурыСрезПоследних.Период <= &ДатаНач
4 breezee
 
29.05.15
13:37
(3) Пользователь задает период с и по это ораничение на с
5 hhhh
 
29.05.15
13:40
(4) тогда >=
6 sapphire
 
29.05.15
13:41
даже теоретически непраивльно в (0) ИМХО.

Грубо, выбираем все уникальные пары Дата-Номенклатура
и для них определяем срез последних запросом, а не виртуальной таблицей.
7 breezee
 
29.05.15
13:51
(5) Сейчас првоерил во (2) там везде >= &ДатаНач
(6) Я бы так и сделал но мне нужно посторение номенклатуры для каждого регистратор - по -этому выбираю все во волженном запросе(каждую номенклатуру для каждого регистратора за период), а потом уже срезом последних для них получаю предпослежнее значение(связь по номенклатурере, дата мкасимально приближена к дате вложенного запроса но меньше неё)
8 breezee
 
29.05.15
13:59
(5) Извиняюсь, не туда смотрел, исправил, не помогло
9 manfeese
 
29.05.15
14:23
Поставь задачу правильно! Что ты хочешь получить в итоге? всю номенклатуру и по всем документам в периоде или последние цены по номенклатуре. Полностью опиши свою проблему от начала и до конца!
10 hhhh
 
29.05.15
14:25
(8) вот это еще обязательно

ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаАктуальнойЦены, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
11 breezee
 
29.05.15
14:27
(9) Хочу получить все номенклатуру во всех документах в периоде, назначенном пользователем. Если есть 2 номенклатуры одинкаовые в периоде выводить для эти 2 номенклатуры. Для каждой хочу получать последние цены(не важно в периоде ли последняя цена или нет)
12 manfeese
 
29.05.15
14:30
Приведи пример текста запроса, которым ты получаешь всю номенклатуру во всех документах в периоде, назначенном пользователем
13 breezee
 
29.05.15
14:32
(12) ВЫБРАТЬ
    ЦеныНоменклатуры.Период КАК Период,
    ЦеныНоменклатуры.Регистратор КАК Регистратор,
    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
    ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
    ЦеныНоменклатуры.Характеристика КАК Характеристика,
    ЦеныНоменклатуры.Цена КАК Цена
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
    ЦеныНоменклатуры.ВидЦены = &ВидЦены
    И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
    И ЦеныНоменклатуры.Период >= &ДатаНач


Работает - я проверял, после этого не раобтает.
Пытался еще с получившейся таблицей установить соотвествие по регистратору(не с этой, а с той где получаются уже предыдущие цены) - не помогло, выбирается много раз документ, хотя везде условия по датам проставил и связи по номенклатуре и характеристике
14 breezee
 
29.05.15
14:35
(13)
>Работает - я проверял, после этого не раобтает.
Имел в виду что конктретно этот запрос отрабатывает нормально, дальше выбирается уже не то что надо
15 hhhh
 
29.05.15
14:38
(14) вид цены подправил? А то полнейший бред получается. ЦеныНоменклатуры один вид цен, а ЦеныНоменклатурыСрезПоследних совсем другой.
16 manfeese
 
29.05.15
14:41
Попробуй так:
ВЫБРАТЬ
    ЦеныНоменклатуры.Период КАК Период,
    ЦеныНоменклатуры.Регистратор КАК Регистратор,
    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
    ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
    ЦеныНоменклатуры.Характеристика КАК Характеристика,
    ЦеныНоменклатуры.Цена КАК Цена
ИЗ
    (ВЫБРАТЬ
        МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период,
        ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
        ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
        ЦеныНоменклатуры.Характеристика КАК Характеристика
    ИЗ
        РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ГДЕ
        ЦеныНоменклатуры.ВидЦены = &ВидЦены
        И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
        И ЦеныНоменклатуры.Период >= &ДатаНач
    СГРУППИРОВАТЬ ПО
        ЦеныНоменклатуры.Номенклатура,
        ЦеныНоменклатуры.ВидЦены,
        ЦеныНоменклатуры.Характеристика) КАК ДатыПоследнихЦен
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ПО ЦеныНоменклатуры.Период = ДатыПоследнихЦен.Период
        И ЦеныНоменклатуры.Номенклатура = ДатыПоследнихЦен.Номенклатура
        И ЦеныНоменклатуры.Характеристика = ДатыПоследнихЦен.Характеристика
        И ЦеныНоменклатуры.ВидЦены = ДатыПоследнихЦен.ВидЦены
17 breezee
 
29.05.15
14:46
(15) Угу Выбралась почему-то одна номенклатура, запрос вот такой
(16) Спасибо за помощь! но выбрались только посление номенклатуры, сейчас попробую к этому запросу по регистратору условие прикрутить - может поможет
18 breezee
 
29.05.15
14:46
(17) Запрос забыл вставить


ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Характеристика,
    ЦеныНоменклатурыСрезПоследних.Цена,
    МАКСИМУМ(ЦеныНом.Период) КАК Период
ПОМЕСТИТЬ ВТВыборкиПредпоследнихЦен
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаАктуальнойЦены, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ЦеныНоменклатуры.Период КАК Период,
            ЦеныНоменклатуры.Регистратор КАК Регистратор,
            ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
            ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
            ЦеныНоменклатуры.Характеристика КАК Характеристика,
            ЦеныНоменклатуры.Цена КАК Цена
        ИЗ
            РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ГДЕ
            ЦеныНоменклатуры.ВидЦены = &ВидЦены
            И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
            И ЦеныНоменклатуры.Период >= &ДатаНач) КАК ЦеныНом
        ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = ЦеныНом.Номенклатура
            И ЦеныНоменклатурыСрезПоследних.Характеристика = ЦеныНом.Характеристика
            И ЦеныНоменклатурыСрезПоследних.Период > ЦеныНом.Период
            И (ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены)
ГДЕ
    ЦеныНоменклатурыСрезПоследних.Период >= &ДатаНач

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Характеристика,
    ЦеныНоменклатурыСрезПоследних.Цена
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТВыборкиПредпоследнихЦен.Номенклатура,
    ВТВыборкиПредпоследнихЦен.Характеристика,
    ВТВыборкиПредпоследнихЦен.Цена,
    ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК Цена1
ИЗ
    ВТВыборкиПредпоследнихЦен КАК ВТВыборкиПредпоследнихЦен
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ЦеныНоменклатуры.Номенклатура = ВТВыборкиПредпоследнихЦен.Номенклатура
            И ЦеныНоменклатуры.Характеристика = ВТВыборкиПредпоследнихЦен.Характеристика
            И ЦеныНоменклатуры.Период = ВТВыборкиПредпоследнихЦен.Период
ГДЕ
    ЦеныНоменклатуры.ВидЦены = &ВидЦены
19 breezee
 
29.05.15
14:49
(16) ГИГАААААААААНТСКОЕ СПАСИБО! ВСЕ РАБОТАЕТ. Расскажие секрет пожалуйста, где я накосячил?
20 manfeese
 
29.05.15
14:49
(16) Исправляюсь, так попробуй:
ВЫБРАТЬ
    ЦеныНоменклатуры.Период КАК Период,
    ЦеныНоменклатуры.Регистратор КАК Регистратор,
    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
    ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
    ЦеныНоменклатуры.Характеристика КАК Характеристика,
    ЦеныНоменклатуры.Цена КАК Цена
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период,
            ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
            ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
            ЦеныНоменклатуры.Характеристика КАК Характеристика
        ИЗ
            РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ГДЕ
            ЦеныНоменклатуры.ВидЦены = &ВидЦены
            И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
       СГРУППИРОВАТЬ ПО
            ЦеныНоменклатуры.Номенклатура,
            ЦеныНоменклатуры.ВидЦены,
            ЦеныНоменклатуры.Характеристика) КАК ДатыПоследнихЦен
    ПО ЦеныНоменклатуры.Период = ДатыПоследнихЦен.Период
        И ЦеныНоменклатуры.Номенклатура = ДатыПоследнихЦен.Номенклатура
        И ЦеныНоменклатуры.Характеристика = ДатыПоследнихЦен.Характеристика
        И ЦеныНоменклатуры.ВидЦены = ДатыПоследнихЦен.ВидЦены
ГДЕ
    ЦеныНоменклатуры.ВидЦены = &ВидЦены
       И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
    И ЦеныНоменклатуры.Период >= &ДатаНач
21 manfeese
 
29.05.15
14:50
Попробуй самостоятельно разобраться. Иногда полезно! :)
22 breezee
 
29.05.15
14:51
(21) Ок! СПАСИБИЩЕ ЕЩЕ РАЗ!
23 manfeese
 
29.05.15
14:55
Зачем тебе в (18) СрезПоследних? Я в (20) привел целый кусок кода, который удовлетворит все твои пожелания!
24 breezee
 
29.05.15
15:00
(23) Прости, а можно как то получить еще и текущую цену? Нужно этот запрос поместить во временну таблицу и с ним свзь сделать по таблице регистра? Если просто изменяю дату на менбшую в теущей связи идет задвоение - опять все старые цены подтягиваются


ВЫБРАТЬ
    ЦеныНоменклатуры.Период КАК Период,
    ЦеныНоменклатуры.Регистратор КАК Регистратор,
    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
    ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
    ЦеныНоменклатуры.Характеристика КАК Характеристика,
    ЦеныНоменклатуры.Цена КАК Цена,
    ДатыПоследнихЦен.Цена КАК Цена1
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период,
            ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
            ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
            ЦеныНоменклатуры.Характеристика КАК Характеристика,
            ЦеныНоменклатуры.Цена КАК Цена
        ИЗ
            РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ГДЕ
            ЦеныНоменклатуры.ВидЦены = &ВидЦены
            И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
        
        СГРУППИРОВАТЬ ПО
            ЦеныНоменклатуры.Номенклатура,
            ЦеныНоменклатуры.ВидЦены,
            ЦеныНоменклатуры.Характеристика,
            ЦеныНоменклатуры.Цена) КАК ДатыПоследнихЦен
        ПО ЦеныНоменклатуры.Номенклатура = ДатыПоследнихЦен.Номенклатура
            И ЦеныНоменклатуры.Характеристика = ДатыПоследнихЦен.Характеристика
            И ЦеныНоменклатуры.ВидЦены = ДатыПоследнихЦен.ВидЦены
            И ЦеныНоменклатуры.Период > ДатыПоследнихЦен.Период
ГДЕ
    ЦеныНоменклатуры.ВидЦены = &ВидЦены
    И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
    И ЦеныНоменклатуры.Период >= &ДатаНач
25 manfeese
 
29.05.15
15:12
Что понимается под текущей ценой?
26 breezee
 
29.05.15
15:14
(25) Последняя установленная документом установка цен номенклатуры
27 manfeese
 
29.05.15
15:17
ВЫБРАТЬ
    ЦеныНоменклатуры.Период КАК Период,
    ЦеныНоменклатуры.Регистратор КАК Регистратор,
    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
    ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
    ЦеныНоменклатуры.Характеристика КАК Характеристика,
    ЦеныНоменклатуры.Цена КАК Цена,
    ЦеныНоменклатурыСрезПоследних.Цена КАК ПоследняяЦена
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период,
            ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
            ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
            ЦеныНоменклатуры.Характеристика КАК Характеристика
        ИЗ
            РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ГДЕ
            ЦеныНоменклатуры.ВидЦены = &ВидЦены
            И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
        СГРУППИРОВАТЬ ПО
            ЦеныНоменклатуры.Номенклатура,
            ЦеныНоменклатуры.ВидЦены,
            ЦеныНоменклатуры.Характеристика) КАК ДатыПоследнихЦен
    ПО ЦеныНоменклатуры.Период = ДатыПоследнихЦен.Период
        И ЦеныНоменклатуры.Номенклатура = ДатыПоследнихЦен.Номенклатура
        И ЦеныНоменклатуры.Характеристика = ДатыПоследнихЦен.Характеристика
        И ЦеныНоменклатуры.ВидЦены = ДатыПоследнихЦен.ВидЦены
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
    ПО ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
        И ЦеныНоменклатуры.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
        И ЦеныНоменклатуры.ВидЦены = ЦеныНоменклатурыСрезПоследних.ВидЦены

ГДЕ
     ЦеныНоменклатуры.ВидЦены = &ВидЦены
       И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
    И ЦеныНоменклатуры.Период >= &ДатаНач
28 breezee
 
29.05.15
15:19
(27) ТЫ ВОЛШЕБНИК! БРО, ТЫ ЛУЧШИЙ!!! СПАСИБО!!!!!!!!!!!!!!
29 manfeese
 
29.05.15
15:26
еще раз пересмотрел свой запрос (27). Первое ЛЕВОЕ СОЕДИНЕНИЕ походу не нужно!
ВЫБРАТЬ
    ЦеныНоменклатуры.Период КАК Период,
    ЦеныНоменклатуры.Регистратор КАК Регистратор,
    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
    ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
    ЦеныНоменклатуры.Характеристика КАК Характеристика,
    ЦеныНоменклатуры.Цена КАК Цена,
    ЦеныНоменклатурыСрезПоследних.Цена КАК ПоследняяЦена
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
    ПО ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
        И ЦеныНоменклатуры.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
        И ЦеныНоменклатуры.ВидЦены = ЦеныНоменклатурыСрезПоследних.ВидЦены

ГДЕ
     ЦеныНоменклатуры.ВидЦены = &ВидЦены
       И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
    И ЦеныНоменклатуры.Период >= &ДатаНач
30 breezee
 
29.05.15
15:29
(29) Еще раз СПАСИБО!!!
31 breezee
 
29.05.15
22:49
Простите что снова поднимаю тему, стал проверять (27) (28) - новая цена подтягивается номально, старая цена подтягивается какая-то левая, может потому что во вложенном запросе не выбирается 1 дата( скрин http://rghost.net/8rqwLkzXY ) Я окончательно запутался. Может вы скажите что делать? Описание задачи:

Пользователь выбирают вид цены и дату начала и конца на которую выводятся все документы "Установка цен номенклатуры" со всей номенклатурой внутри - если для неё было изменение по заданному типу цен - если номенклатура присутствует за период в двух документах - надо вывести её 2 раза для каждого документа(если больше двух - тоже самое), для каждой номенклатуры нужно вывести цену на дату документа и предыдущую цену, установленную на эту номенклатуру.

Мои идеи:
Воспользоваться "Получением среза последних на каждую дату", только за место физической таблицы использовать вложенный запрос, который выбирает все номенклатуру и все документы, которые её устанавливали
32 breezee
 
29.05.15
23:12
АП
33 breezee
 
29.05.15
23:23
ААП
34 breezee
 
29.05.15
23:43
ап
35 Gangar
 
29.05.15
23:44
(31) не пробовал делать по аналогии с остатками на каждую дату из периода? сперва получать таблицу дат и потом от неё танцевать.
36 breezee
 
29.05.15
23:57
(35) Сейчас попробую. Получается я должен получить последнии и предпсоеднии даты во вложенном или как лучше - если я хочу получить цены на даты из таблицы дат. Я опять запутался, что с ними дальше делать? У меня получились 2 предпоследнии даты - 27.05 и 26.05 и одна последняя - 27.05 Вот запрос на получение всех дат

ВЫБРАТЬ
    МАКСИМУМ(ЦеныНоменклатуры.Период) КАК ПредпоследнииДАТЫ,
    ЦеныНоменклатурыСрезПоследних.Период КАК ПоследнииДАТЫ
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО (ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура)
            И (ЦеныНоменклатуры.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика)
            И (ЦеныНоменклатуры.ВидЦены = ЦеныНоменклатурыСрезПоследних.ВидЦены)
            И (ЦеныНоменклатуры.Период < ЦеныНоменклатурыСрезПоследних.Период)
ГДЕ
    ЦеныНоменклатуры.ВидЦены = &ВидЦены
    И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
    И ЦеныНоменклатуры.Период >= &ДатаНач

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыСрезПоследних.Период
37 breezee
 
30.05.15
00:11
Подумал что если я получу все последнии и предпследниии даты и для каждой вытащю номенклатуру и цену и потом все это свяжу по номенлатуре - получится нормально. Выбрались все даты. Наверное я идиот. Вот запрос, подскажите что делать

ВЫБРАТЬ
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Цена
ПОМЕСТИТЬ ТаблицаПередпоследнихДат
ИЗ
    (ВЫБРАТЬ
        МАКСИМУМ(ЦеныНоменклатуры.Период) КАК ПредпоследнииДАТЫ,
        ЦеныНоменклатурыСрезПоследних.Период КАК ПоследнииДАТЫ
    ИЗ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
            ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
            ПО (ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура)
                И (ЦеныНоменклатуры.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика)
                И (ЦеныНоменклатуры.ВидЦены = ЦеныНоменклатурыСрезПоследних.ВидЦены)
                И (ЦеныНоменклатуры.Период < ЦеныНоменклатурыСрезПоследних.Период)
    ГДЕ
        ЦеныНоменклатуры.ВидЦены = &ВидЦены
        И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
        И ЦеныНоменклатуры.Период >= &ДатаНач
    
    СГРУППИРОВАТЬ ПО
        ЦеныНоменклатурыСрезПоследних.Период) КАК ВсеДаты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ВсеДаты.ПредпоследнииДАТЫ = ЦеныНоменклатуры.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Цена
ПОМЕСТИТЬ ТаблицаПоследнихДат
ИЗ
    (ВЫБРАТЬ
        МАКСИМУМ(ЦеныНоменклатуры.Период) КАК ПредпоследнииДАТЫ,
        ЦеныНоменклатурыСрезПоследних.Период КАК ПоследнииДАТЫ
    ИЗ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
            ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
            ПО (ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура)
                И (ЦеныНоменклатуры.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика)
                И (ЦеныНоменклатуры.ВидЦены = ЦеныНоменклатурыСрезПоследних.ВидЦены)
                И (ЦеныНоменклатуры.Период < ЦеныНоменклатурыСрезПоследних.Период)
    ГДЕ
        ЦеныНоменклатуры.ВидЦены = &ВидЦены
        И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
        И ЦеныНоменклатуры.Период >= &ДатаНач
    
    СГРУППИРОВАТЬ ПО
        ЦеныНоменклатурыСрезПоследних.Период) КАК ВложенныйЗапрос
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ЦеныНоменклатуры.Период = ВложенныйЗапрос.ПоследнииДАТЫ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаПоследнихДат.Номенклатура,
    ЕСТЬNULL(ТаблицаПередпоследнихДат.Цена, 0) КАК Поле1,
    ТаблицаПередпоследнихДат.Цена
ИЗ
    ТаблицаПоследнихДат КАК ТаблицаПоследнихДат
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаПередпоследнихДат КАК ТаблицаПередпоследнихДат
        ПО (ТаблицаПередпоследнихДат.Номенклатура = ТаблицаПоследнихДат.Номенклатура)
38 breezee
 
30.05.15
00:26
АП!
39 France
 
30.05.15
00:39
что нужно то, старче?
40 breezee
 
30.05.15
00:46
(39) За период получить все номенклатуру во всех документах "Установка цен номенклатуры" полуить цену для неё на период текущего документа и цену предыдущуюю(установелнную предыдущим документом)
41 France
 
30.05.15
00:49
(40) в ут 11 обработка "Цены (прайс-лист)" показывает цену текущую, и цены старую *предыдущую) - может, это то, что нужно? и не нужно ничего писать?. А если все нужно писать - и ответ проще там поискать..
42 France
 
30.05.15
00:51
да, забыл - нужно в обработке "Параметры - Показывать старые цены" установить.
43 breezee
 
30.05.15
01:00
(41) Нашел, правда это отчет и там только "Отображать только цены используемы в НДС" в настройках, галочку снял, вывелась только последняя цена
44 breezee
 
30.05.15
01:07
up
45 France
 
30.05.15
01:19
(43) релиз какой конфы? у мну 11.1.10.131
вид по ссылкеhttps://yadi.sk/i/ZSFyO9i-gxK7s
46 France
 
30.05.15
01:21
что то не то нашел. Все функции - Обработки - Цены (прайс-лист)
47 Chieftain
 
30.05.15
02:04
Из (0) не до конца понял что в итоге нужно получить.
Однако цена на каждый день по всей номенклатуре примерно таким запросом получал:

    ///////////////////// Формируем ПЕРИОДЫ
    ВЫБРАТЬ 0 КАК Цифра ПОМЕСТИТЬ ТабЦифр ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9;
    ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&НачПериода, ДЕНЬ, ТабЦифр1.Цифра + 10 * ТабЦифр2.Цифра + 100 * ТабЦифр3.Цифра + 1000 * ТабЦифр4.Цифра) КАК День ПОМЕСТИТЬ ТабДней ИЗ ТабЦифр КАК ТабЦифр1, ТабЦифр КАК ТабЦифр2,ТабЦифр КАК ТабЦифр3,ТабЦифр КАК ТабЦифр4
        ГДЕ ДОБАВИТЬКДАТЕ(&НачПериода, ДЕНЬ, ТабЦифр1.Цифра + 10 * ТабЦифр2.Цифра + 100 * ТабЦифр3.Цифра + 1000 * ТабЦифр4.Цифра) <= &КонПериода
        ИНДЕКСИРОВАТЬ ПО День;
    ВЫБРАТЬ ТабДней.День ПОМЕСТИТЬ Даты ИЗ ТабДней КАК ТабДней;
    ///////////////////// Формируем ПЕРИОДЫ
    
    ВЫБРАТЬ
        МаксДаты.Дата            КАК Дата,
        МаксДаты.Номенклатура    КАК Номенклатура,
        Цены.Цена                КАК Цена
    ИЗ    (    ВЫБРАТЬ
                ВсеДаты.День                КАК Дата,
                ВсеЦены.Номенклатура        КАК Номенклатура,
                ВсеЦены.ТипЦен                КАК ТипЦен,
                МАКСИМУМ(ВсеЦены.Период)    КАК ДатаЦены
            ИЗ    Даты КАК ВсеДаты
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ВсеЦены ПО ВсеЦены.Период<=ВсеДаты.День и ВсеЦены.ТипЦен=&ТипЦен
            СГРУППИРОВАТЬ ПО ВсеДаты.День,ВсеЦены.Номенклатура,ВсеЦены.ТипЦен
        ) КАК МаксДаты
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК Цены
        ПО МаксДаты.ДатаЦены=Цены.Период и МаксДаты.Номенклатура=Цены.Номенклатура и МаксДаты.ТипЦен=Цены.ТипЦен
48 breezee
 
30.05.15
10:04
(47) Что-то не то выбирает - условия на дату не сработало. Может, мне сотит лучше описвть задачу.

Есть Период и Вид Цены. за весь период надо выбрать всю номенклатру из докумнтов "Установка цен номенклатуры" с ценой на момент документа и предыдущей ценой. Пердыдущая цена цена - предпоследнее значения из регистра "Цены номенклатуры" для этой номенклатуры.
49 Chieftain
 
30.05.15
12:28
(48) Параметры НачПериода,КонПериода,ТипЦен.
Но оно тебе отдаст актуальные цены на каждую дату.
50 breezee
 
30.05.15
12:32
(49) В промежутке между НачПриода и Конпериода? Все равно не точ то надо, может я плохо объяснил. У меня есть запрос который получает последнюю цену и предпослежнюю цену по номенклатуре - т.е. выводится только последнии изменение цен номенклатуры, мне надо чтобы он выводил всю номенклатуру за период и для каждой получал последнюю цену и предпослднюю, т.е. проеследить все изменение цен. Вот зпрос


ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура,

    ЦеныНоменклатурыСрезПоследних.Цена,
    МАКСИМУМ(ЦеныНоменклатуры.Период) КАК ПредыдущаяДата,
    ЦеныНоменклатурыСрезПоследних.Регистратор,
    ЦеныНоменклатурыСрезПоследних.Характеристика
ПОМЕСТИТЬ втЦеныНоменклатуры
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(КОНЕЦПЕРИОДА(&ДатаАктуальнойЦены, ДЕНЬ), ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И (ЦеныНоменклатуры.ВидЦены = &ВидЦены)
            И ЦеныНоменклатурыСрезПоследних.Период > ЦеныНоменклатуры.Период
ГДЕ
    ЦеныНоменклатурыСрезПоследних.Период >= &ДатаНач

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена,
    ЦеныНоменклатурыСрезПоследних.Регистратор,
    ЦеныНоменклатурыСрезПоследних.Характеристика
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

    втЦеныНоменклатуры.Номенклатура,
    ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК ЦенаСтарая,
    втЦеныНоменклатуры.Цена КАК ЦенаНовая,
    втЦеныНоменклатуры.Цена - ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК Разница,
    втЦеныНоменклатуры.Регистратор,
    втЦеныНоменклатуры.Характеристика
ПОМЕСТИТЬ ВыборкаБезКоличества
ИЗ
    втЦеныНоменклатуры КАК втЦеныНоменклатуры
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО втЦеныНоменклатуры.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И втЦеныНоменклатуры.ПредыдущаяДата = ЦеныНоменклатуры.Период
            И (ЦеныНоменклатуры.ВидЦены = &ВидЦены)
            И втЦеныНоменклатуры.Характеристика = ЦеныНоменклатуры.Характеристика
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВыборкаБезКоличества.Номенклатура,
    ВыборкаБезКоличества.ЦенаСтарая,
    ВыборкаБезКоличества.ЦенаНовая,
    ВыборкаБезКоличества.Разница,

    ВыборкаБезКоличества.Регистратор,

    ВыборкаБезКоличества.Характеристика,
    ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Остаток
ИЗ
    ВыборкаБезКоличества КАК ВыборкаБезКоличества
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
        ПО ВыборкаБезКоличества.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
            И ВыборкаБезКоличества.Характеристика = ТоварыНаСкладахОстатки.Характеристика
51 breezee
 
30.05.15
12:41
Т.е. вот у меня выбирается во второй части запрос то для чего нужно получить еще и старую цену, в пером у меня выбирается только для последней строчки второго

http://i.imgur.com/WdBdNoC.png
52 Chieftain
 
30.05.15
14:33
(51) как-то так:
    |ВЫБРАТЬ
    |        ДатыЦен.Номенклатура        КАК Номенклатура,
    |        ДатыЦен.ТипЦен                КАК ТипЦен,
    |        ДатыЦен.Дата                КАК Дата,
    |        Цены1.Цена                    КАК Цена,
    |        ДатыЦен.ДатаПрошлой            КАК ДатаПрошлой,
    |        Цены2.Цена                    КАК ЦенаПрошлой
    |ИЗ (
    |ВЫБРАТЬ
    |        ИсторияЦен.Номенклатура        КАК Номенклатура,
    |        ИсторияЦен.ТипЦен            КАК ТипЦен,
    |        ИсторияЦен.Период            КАК Дата,
    |        МАКСИМУМ(СтарыеЦены.Период)    КАК ДатаПрошлой
    |    ИЗ    РегистрСведений.ЦеныНоменклатуры КАК ИсторияЦен
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК СтарыеЦены
    |        ПО СтарыеЦены.Период<ИсторияЦен.Период и СтарыеЦены.Номенклатура=ИсторияЦен.Номенклатура и СтарыеЦены.ТипЦен=ИсторияЦен.ТипЦен
    |    ГДЕ ИсторияЦен.Период МЕЖДУ &НачПериода И &КонПериода и ИсторияЦен.ТипЦен=&ТипЦен
    |    СГРУППИРОВАТЬ ПО ИсторияЦен.Номенклатура,ИсторияЦен.ТипЦен,ИсторияЦен.Период
    |) КАК ДатыЦен
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК Цены1
    |        ПО Цены1.Период=ДатыЦен.Дата и Цены1.Номенклатура=ДатыЦен.Номенклатура и Цены1.ТипЦен=ДатыЦен.ТипЦен
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК Цены2
    |        ПО Цены2.Период=ДатыЦен.ДатаПрошлой и Цены2.Номенклатура=ДатыЦен.Номенклатура и Цены2.ТипЦен=ДатыЦен.ТипЦен
53 breezee
 
30.05.15
14:39
(52) ААААА! ОГРОМНОЕ СПАСИБИЩЕ! В чем был мой косяк? что я делал не так? Т.е. ты получаешь историю цен и делашь свзяку по старой и новой цене? Я же вроде тоже самое делал и ни черта не работало? Все дело в том что ты получаешь их для отдельных таблиц, а не для одной и по этому для каждой таблицы свои значения? ЕЩЕ РАЗ ГИАНТСКОЕ СПАСИБО!!!
54 Chieftain
 
30.05.15
14:40
(53) не нужен тут срез последних, а тем более слева к нему движения регистра
55 breezee
 
30.05.15
14:40
(52) Блин не туда отписался в 1 раз, от как я думал. ЕЩЕ РАЗ ГИГАНТСКОЕ СПАСБО!!!!

Я вроде понял - так получим все изменения на каждый преиод в указанном отрзке времени и потом просто добавм туда цены. Но для того чтобы получить цены нужно так же получить все прериоды из физической таблицы(просто запрос к физ. таблицы за период), потом найти максимально приближенное не последние значение - выбираю по финкции МАКСИМУМ(период таблицы физической) - полусются даты таким образом предпоследняя, последняя; предпоследняя, последняя; ...
Потом для каждой даты я выбираю цену - просто свзяь с физической таблицей и таблицей дат и из полученной таблицы я выбираю(вот тут финя полчается)предпоследний период, послдний период и только одно значение из цены, потому что нельзя же установить свзяь таблиц сразу по двум периодам чтобы мне выдавались цены на оба период
56 breezee
 
30.05.15
14:41
(54) Так дело было в срезе последних? В том что я получал только последнее значение за период, а не все, которые мне нужны были?
57 Chieftain
 
30.05.15
14:42
(55) Во вложенной получаем историю цен, к нему слева цепляем движения по дате меньше исторической, выбираем максимальную. Потом к датам слева по обеим датам берем цены
58 Chieftain
 
30.05.15
14:44
(56) Срезом ты сразу выбираешь только актуальные на конкретную дату, динамически дату в срез не подставишь, поэтому значения только на указанную дату. А оттуда историю не вытянешь.
59 breezee
 
30.05.15
14:47
(57) ЕЩЕ РАЗ ГИАНТСКОЕ СПАСБО!!