Имя: Пароль:
1C
1С v8
Ут11 Помогите с запросом
,
0 breezee
 
28.05.15
19:44
Сразу извиняюсь что создаю еще одну тему.
Нужно выбирать из регистра цен номенклатуры цену текущую и предыдущую цену для всех позиций номенклатуры документов "Установка цен номенклатуры", с и по определенную дату, которую указывает пользователь, мне подсказали что есть нахождение цен на каждую дату - я попробовал сделать под свою задачу - не вышло ничерта. Подскажите, где я затупил? Вот запрос

ВЫБРАТЬ
    ВыборкаНаДаты.Номенклатура,
    ВыборкаНаДаты.Характеристика,
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена1,
    ВыборкаНаДаты.ВидЦены,
    ЦеныНоменклатурыСрезПоследних.Регистратор,
    ВыборкаНаДаты.Цена
ИЗ
    (ВЫБРАТЬ
        ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
        ЦеныНоменклатуры.Характеристика КАК Характеристика,
        ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена,
        ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
        МАКСИМУМ(ЦеныНоменклатурыСрезПоследних.Период) КАК Период
    ИЗ
        РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКонец, ) КАК ЦеныНоменклатурыСрезПоследних
            ПО ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
                И ЦеныНоменклатуры.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
                И ЦеныНоменклатуры.Период < ЦеныНоменклатурыСрезПоследних.Период
    ГДЕ
        ЦеныНоменклатуры.ВидЦены = &ВидЦены
        И ЦеныНоменклатурыСрезПоследних.Период >= &ДатаНач
    
    СГРУППИРОВАТЬ ПО
        ЦеныНоменклатуры.Номенклатура,
        ЦеныНоменклатуры.Характеристика,
        ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0),
        ЦеныНоменклатуры.ВидЦены) КАК ВыборкаНаДаты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ) КАК ЦеныНоменклатурыСрезПоследних
        ПО ВыборкаНаДаты.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
            И ВыборкаНаДаты.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
            И ВыборкаНаДаты.Период = ЦеныНоменклатурыСрезПоследних.Период
1 DirecTwiX
 
28.05.15
19:49
Смотри во что выливается СрезПоследних. Заменив <= на < для соединия периодов можно сделать СрезПредпоследних.
2 breezee
 
28.05.15
19:51
(1) Так я это и пытаюсь сделать) Мне надо теущую цену и предпоследнюю цену перед тем как ей изменили
3 breezee
 
28.05.15
19:55
(1) То есть я хотел написать что в месте с максимальным периодам второй таблицы будет срез её предпоследнего значения я это понял и даже поставл условие на NULL чтобы если предпоследнего не было - выдалося 0, но дальше у меня какая-то фигня, по идее должны быть 2 документа в каждом по 1 строчке с 1 позицией номенклатуры - у меня выбирается 10 раз один документ с одной позицией номенкалтуры, но разными ценами
4 breezee
 
28.05.15
19:58
Апну еще 1 раз
5 breezee
 
28.05.15
21:05
Еще ап
6 RomanYS
 
28.05.15
22:12
7 breezee
 
28.05.15
23:12
Ничерта не понимаю. Вот у меня есть во вложенном запросе таблица из значений дат - по идеи на каждую предыдущую дату к каждому элементы таблицы я и получаю значение - которое будет предыдущим для текщей таблицы которая соединяется со вложенной, еще поставлю левое соединение по вложенной таблице чтобы все данные оотуда взялись и к тем которые есть просто дописались полученные старые значения и на ЕСТЬNULL проверку добавлю. Так почему это ни черта не работает??? Опять только 1 позиция выбирается. Понимаю что дело далеко не в лыжах. Помогите, я идиот.


ВЫБРАТЬ
    ЦеныНом.Номенклатура,
    ЦеныНом.Регистратор,
    ЦеныНом.Цена,
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Регистратор, 0) КАК Регистратор1,
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена1
ИЗ
    (ВЫБРАТЬ
        ЦеныНоменклатуры.Период КАК Период,
        ЦеныНоменклатуры.Регистратор КАК Регистратор,
        ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
        ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
        ЦеныНоменклатуры.Характеристика КАК Характеристика,
        ЦеныНоменклатуры.Цена КАК Цена
    ИЗ
        РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ГДЕ
        ЦеныНоменклатуры.ВидЦены = &ВидЦены
        И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
        И ЦеныНоменклатуры.Период >= &ДатаНач) КАК ЦеныНом
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(КОНЕЦПЕРИОДА(&ДатаАктуальнойЦены, ДЕНЬ), ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
        ПО ЦеныНом.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
            И ЦеныНом.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
            И ЦеныНом.Период < ЦеныНоменклатурыСрезПоследних.Период
ГДЕ
    ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены
8 RomanYS
 
28.05.15
23:35
1.условие где на правую таблицу девает левое соединение внутренним, тем более это условие уже есть в параметрах вт
2. ты выбираешь все значения за период, а не последнее

итого если у тебя по номенклатуре меньше 2 цен за период, она не попадет в выборку,
иначе попадут все предыдущие
9 breezee
 
28.05.15
23:45
(8) Условие теперь накладываю во внутреннем запросе
Мне так и нужно выбрать все за период и потом к ним дописать предопследнии значения цен. Опять фигня выбирается, какое бы соединение не ставил. Т.е. в таблице вложенного запроса выбиратся то что нужно - 2 документа и потом для позиций номенклатуры к этим документом нужно просто добавить предыдущие значения цен - через МАКСИМУМ(период) и все должно работать - за место этого много раз выбираются эти документы, не понимаю что я не так делаю

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

СГРУППИРОВАТЬ ПО
    ЦеныНом.Номенклатура,
    ЦеныНом.Регистратор,
    ЦеныНом.Цена,
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0)
10 breezee
 
29.05.15
00:08
Так, кое что подправил - теперь сатло лучше, только старая цена кривая выходит

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК ЦенаСтарая,
    ВТВыборкиПредпоследнихЦен.Период,
    ВТВыборкиПредпоследнихЦен.Регистратор,
    ВТВыборкиПредпоследнихЦен.Номенклатура,
    ВТВыборкиПредпоследнихЦен.Характеристика,
    ВТВыборкиПредпоследнихЦен.Цена
ИЗ
    ВТВыборкиПредпоследнихЦен КАК ВТВыборкиПредпоследнихЦен
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ВТВыборкиПредпоследнихЦен.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И ВТВыборкиПредпоследнихЦен.Характеристика = ЦеныНоменклатуры.Характеристика
            И ВТВыборкиПредпоследнихЦен.Период = ЦеныНоменклатуры.Период
11 breezee
 
29.05.15
06:33
Ап
12 breezee
 
29.05.15
07:17
Да что за фигня - выбирается все что нужно, а старая цена берется каким-то странным значением, абсолютно левым 115 и 150, которых вообще нет в установках цен на эти товары
ВЫБРАТЬ
    МАКСИМУМ(ЦеныНоменклатурыСрезПоследних.Период) КАК Период,
    ЦеныНом.Регистратор,
    ЦеныНом.Номенклатура,
    ЦеныНом.Характеристика,
    ЦеныНом.Цена КАК Цена,
    ЦеныНом.Период КАК Период1
ПОМЕСТИТЬ ВТВыборкиПредпоследнихЦен
ИЗ
    (ВЫБРАТЬ
        ЦеныНоменклатуры.Период КАК Период,
        ЦеныНоменклатуры.Регистратор КАК Регистратор,
        ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
        ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
        ЦеныНоменклатуры.Характеристика КАК Характеристика,
        ЦеныНоменклатуры.Цена КАК Цена
    ИЗ
        РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ГДЕ
        ЦеныНоменклатуры.ВидЦены = &ВидЦены
        И ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
        И ЦеныНоменклатуры.Период >= &ДатаНач) КАК ЦеныНом
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
        ПО ЦеныНом.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
            И ЦеныНом.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
            И ЦеныНом.Период > ЦеныНоменклатурыСрезПоследних.Период

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТВыборкиПредпоследнихЦен.Регистратор,
    ВТВыборкиПредпоследнихЦен.Номенклатура,
    ВТВыборкиПредпоследнихЦен.Цена КАК ЦенаНовая,
    ЦеныНоменклатуры.Цена КАК ЦенаСтарая
ИЗ
    ВТВыборкиПредпоследнихЦен КАК ВТВыборкиПредпоследнихЦен
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ВТВыборкиПредпоследнихЦен.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И ВТВыборкиПредпоследнихЦен.Характеристика = ЦеныНоменклатуры.Характеристика
            И ВТВыборкиПредпоследнихЦен.Период = ЦеныНоменклатуры.Период
13 RomanYS
 
29.05.15
08:14
(12) ...эээ, а ты таблицы не путаешь:
срез должен быть основной таблицей, а из вложенного надо брать макс(период)
14 breezee
 
29.05.15
11:59
(13) Если ставлю основной - срез последних - поадает только 1 документ из двух в первой виртуальной таблице, во второй попадает уже много раз одни и те же документы со старыми ценами(со всеми старыми ценами) Во запрос где я поставил срез основновой

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТВыборкиПредпоследнихЦен.Цена КАК НоваяЦена,
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Цена КАК СтраяЦена,
    ЦеныНоменклатуры.Регистратор
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ЛЕВОЕ СОЕДИНЕНИЕ ВТВыборкиПредпоследнихЦен КАК ВТВыборкиПредпоследнихЦен
        ПО ЦеныНоменклатуры.Номенклатура = ВТВыборкиПредпоследнихЦен.Номенклатура
            И ЦеныНоменклатуры.Характеристика = ВТВыборкиПредпоследнихЦен.Характеристика
            И ЦеныНоменклатуры.Период = ВТВыборкиПредпоследнихЦен.Период
ГДЕ
    ЦеныНоменклатуры.Период <= &ДатаАктуальнойЦены
    И ЦеныНоменклатуры.Период >= &ДатаНач
15 breezee
 
29.05.15
12:13
(14) Забыл поменять знак неравенства. Может у меня проблема в понимании? Скажите, пожалуйста, я правильно понимаю?
Для того чтобы выбрать все номенклатуру и по всем документам в периоде нужно
1)Выбрать все номенклатуру в этом периоде - волженный запрос в котором просто выбирается вся номенклатура за период
2)Взять из Среза Последних - текущую цену на эту номенклатуру(будет текущей)
3)Взять максимальное значение из вложенного запроса, но меньшее чем в срезе последних для каждой номенклатуры - для этого используется функция МАКСИМУМ(период волженного запроса) - это и будет прдыдущим периодом на который надо получать цены. Все это помещается во временную таблицу
4)Получение цен на предыдущей период - путем добавления таблицы регистра, и связь по периоду и номенклатуре между временной таблицей и таблицей регистра, выбираются все данные из таблицы регистра - если нет записи выбирается 0(проверка на ЕСТЬNULL для цены)

Так почему у меня выбираются ВСЕ старые цены, а не максимальные? Где я мог накосяить?
16 breezee
 
29.05.15
12:27
Ок, наверное название темы ничего не отражает + нужно было сразу писать нормальный запрос. Пересоздам тему