Имя: Пароль:
1C
1С v8
Помогите навести порядок в запросе
0 WhiteDragon93
 
17.10.13
00:50
Не бейте сильно, не писал больших запросов до этого, а тут понадобилось...
Книжка Хрусталева потихоньку читается, обещаю выучить, а пока требуется помощь :)
Значения Цена и Стоимость вываливаются в отчете на отдельную строку, а Розница выводит цены для всех документов установки.

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

СГРУППИРОВАТЬ ПО
    ТоварыНаСкладахОстатки.Склад,
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.Номенклатура.Артикул,
    ВЫБОР
        КОГДА ПартииТоваровНаСкладах.Количество <> 0
            ТОГДА ВЫРАЗИТЬ((ЦеныНоменклатурыСрезПоследних.Цена / (ПартииТоваровНаСкладах.Стоимость / ПартииТоваровНаСкладах.Количество) - 1) * 100 КАК ЧИСЛО(10, 2))
        ИНАЧЕ ВЫРАЗИТЬ((ЦеныНоменклатурыСрезПоследних.Цена / ПартииТоваровНаСкладах.Стоимость - 1) * 100 КАК ЧИСЛО(10, 2))
    КОНЕЦ,
    ВЫБОР
        КОГДА НЕ ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток ЕСТЬ NULL
            ТОГДА ТоварыНаСкладахОстатки.КоличествоОстаток - ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток
        ИНАЧЕ ТоварыНаСкладахОстатки.КоличествоОстаток
    КОНЕЦ,
    ЦеныНоменклатурыСрезПоследних.Цена

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ТоварыВРезервеНаСкладахОстатки.Склад,
    ТоварыВРезервеНаСкладахОстатки.Номенклатура,
    NULL,
    NULL,
    NULL,
    ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток,
    NULL,
    NULL,
    NULL,
    NULL
ИЗ
    РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК ТоварыВРезервеНаСкладахОстатки

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ПартииТоваровНаСкладахОстатки.Склад,
    ПартииТоваровНаСкладахОстатки.Номенклатура,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    ВЫБОР
        КОГДА ПартииТоваровНаСкладахОстатки.КоличествоОстаток <> 0
            ТОГДА ВЫРАЗИТЬ(ПартииТоваровНаСкладахОстатки.СтоимостьОстаток / ПартииТоваровНаСкладахОстатки.КоличествоОстаток * 1.18 КАК ЧИСЛО(10, 2))
        ИНАЧЕ 0
    КОНЕЦ,
    ПартииТоваровНаСкладахОстатки.СтоимостьОстаток * 1.18,
    NULL
ИЗ
    РегистрНакопления.ПартииТоваровНаСкладах.Остатки КАК ПартииТоваровНаСкладахОстатки

УПОРЯДОЧИТЬ ПО
    Номенклатура,
    Артикул
{УПОРЯДОЧИТЬ ПО
    Склад.*,
    Номенклатура.*,
    Артикул,
    Остаток,
    Резерв,
    СвободныйОстаток,
    Цена,
    Стоимость,
    Розничная,
    ПроцентНаценки}
ИТОГИ
    СРЕДНЕЕ(ПроцентНаценки),
    СУММА(Остаток),
    СУММА(Резерв),
    СУММА(СвободныйОстаток),
    СРЕДНЕЕ(Цена),
    СУММА(Стоимость)
ПО
    ОБЩИЕ,
    Склад,
    Номенклатура ИЕРАРХИЯ
{ИТОГИ ПО
    Склад.*,
    Номенклатура.*}
1 ИсчадиеADO
 
17.10.13
01:18
полное соединение не правильно юзаешь. Если в остатках регистра1 не будет номенклатуры, а по остаткам рег.2 будет, то у тебя создастся строчка, но т.к. значение номенклатуры ты берешь из рег1, то в строчке будет null. Нужно использовать что-то типа ЕСТЬNULL(Рег1.Номенклатура, Рег2.Номенклатура). А в твоем случае с 2умя соединениями это будет так ЕСТЬNULL(ЕСТЬNULL(Рег1.Номенклатура, Рег2.Номенклатура),Рег3.Номенклатура) КАК Номенклатура
2 ИсчадиеADO
 
17.10.13
01:19
+(1) но это не оптимально и трудно читается. лучше использовать то же объединение
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.