Имя: Пароль:
1C
1С v8
Предедущая цена номенклатуры?
0 Ахиллес
 
30.10.12
21:34
Как запросом одновременно получить текущую и предедущую цены номенклатуры, но с условием, что предедущая отличается от текущей.
Например были установлены цены:
1 числа 100 рублей
2 числа 200 рублей
3 числа 200 рублей.
Надо получить 100 и 200 рублей

Пока, что наваял такой запросик:

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

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
   ТекущиеЦены.Цена КАК ЦенаТекущая,
   ТекущиеЦены.Период,
   ТекущиеЦены.Номенклатура,
   ТекущиеЦены.ТипЦен,
   ПредедущиеЦены.Цена КАК ЦенаПредедущая
ИЗ
   ТекущиеЦены КАК ТекущиеЦены
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЦеныНоменклатуры.ТипЦен КАК ТипЦен,
           ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
           ЦеныНоменклатуры.Цена КАК Цена
       ИЗ
           РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
               ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПрошлыйПериод КАК ПрПер
               ПО ЦеныНоменклатуры.Период = ПрПер.Период
                   И ЦеныНоменклатуры.Номенклатура = ПрПер.Номенклатура
       ГДЕ
           ЦеныНоменклатуры.ТипЦен = &ТипЦен
           И ЦеныНоменклатуры.Номенклатура В(&Номенклатура)) КАК ПредедущиеЦены
       ПО ТекущиеЦены.Номенклатура = ПредедущиеЦены.Номенклатура
           И ТекущиеЦены.ТипЦен = ПредедущиеЦены.ТипЦен
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПрошлыйПериод КАК ПрошлыйПериод
       ПО ТекущиеЦены.Номенклатура = ПрошлыйПериод.Номенклатура

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

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