Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Двойное условие в запросе (=>; <=)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
Constantus
Приветствую, форумчане!
"Управление торговлей 10.3", (Моби-С 5.5). "ABBYY Ukraine", 2003-2014 (2.3.20.1)

Имеется некий отчет, который должен выводить результат числовых значений по двум значениям в диапазоне (=>; <=)
Причем, можно выбрать выборку по одному значению, по двум или вообще игнорировать отбор

|{ГДЕ
|    ВложенныйЗапрос.Остаток >= &ОстатокОт И ВложенныйЗапрос.Стоимость >= &СтоимостьОт
|    И ВложенныйЗапрос.Остаток <= &ОстатокДо И ВложенныйЗапрос.Стоимость <= &СтоимостьДо}



    Если ДиапазонОстатка Тогда 
        Запрос.УстановитьПараметр("ОстатокОт", СуммаОстаткаОт);
        Запрос.УстановитьПараметр("ОстатокДо", СуммаОстаткаДо);
    КонецЕсли;        
    
    Если ДиапазонСумм Тогда
        Запрос.УстановитьПараметр("СтоимостьОт", СуммаПродажОт);
        Запрос.УстановитьПараметр("СтоимостьДо", СуммаПродажДо);
    КонецЕсли;


Код не срабатывает, как можно сформировать такой гибкий отчет с выбором диапазона сумм от/до по Остаткам и/или СуммамПродаж?
sava1
Такой диапазон определяется МЕЖДУ

Условия лучше формировать динамически, типа%

Если ДиапазонОстатка ИЛИ ДиапазонСумм Тогда 
   Если ДиапазонОстатка Тогда
        УсловиеЗапроса = "ГДЕ ДиапазонОстатка МЕЖДУ &ОстатокОт И &ОстатокДо";
        Запрос.УстановитьПараметр("ОстатокОт", СуммаОстаткаОт);
        Запрос.УстановитьПараметр("ОстатокДо", СуммаОстаткаДо);
    КонецЕсли;        

    Если ДиапазонСумм Тогда
        УсловиеЗапроса = УсловиеЗапроса + ?(ДиапазонОстатка, " И ", "ГДЕ ") +" ДиапазонСумм МЕЖДУ &СтоимостьОт И &СтоимостьДо";
        Запрос.УстановитьПараметр("СтоимостьОт", СуммаПродажОт);
        Запрос.УстановитьПараметр("СтоимостьДо", СуммаПродажДо);
    КонецЕсли;    
КонецЕсли;


текстзапроса = "
|....
|"+ УсловиеЗапроса+"    
......
|";
Constantus
sava1 @ Сегодня, 14:56 необходимо зарегистрироваться для просмотра ссылки ,


Благодарю... Но возникла другая ситуация. Дело в том, что у меня поле "Остаток" является расчетной, т.е. разницей между "Стоимость" и "Подарок"

Вот текст запроса:

    Запрос.Текст = 
"ВЫБРАТЬ
|    ВложенныйЗапрос.Контрагент КАК Контрагент,
|    СУММА(ВложенныйЗапрос.Стоимость) КАК Стоимость,
|    СУММА(ВложенныйЗапрос.Подарок) КАК Подарок,
|    СУММА(ВложенныйЗапрос.Остаток) КАК Остаток
|ИЗ
|    (ВЫБРАТЬ
|        Продажи.Контрагент КАК Контрагент,
|        СУММА(Продажи.Стоимость) КАК Стоимость,
|        0 КАК Подарок,
|        СУММА(Продажи.Стоимость) КАК Остаток
|    ИЗ
|        РегистрНакопления.Продажи КАК Продажи
|    ГДЕ
|        Продажи.Период МЕЖДУ НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ)
|        И Продажи.Номенклатура В(&НоменклатураПродаж)
|    
|    СГРУППИРОВАТЬ ПО
|        Продажи.Контрагент
|    
|    ОБЪЕДИНИТЬ ВСЕ
|    
|    ВЫБРАТЬ
|        Продажи.Контрагент,
|        0,
|        СУММА(Продажи.СтоимостьБезСкидок),
|        СУММА(-Продажи.СтоимостьБезСкидок)
|    ИЗ
|        РегистрНакопления.Продажи КАК Продажи
|    ГДЕ
|        Продажи.Номенклатура В(&НоменклатураПодарков)
|        И Продажи.Период МЕЖДУ НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ)
|    
|    СГРУППИРОВАТЬ ПО
|        Продажи.Контрагент) КАК ВложенныйЗапрос
|
|"+ УсловиеЗапроса+"
|
|
|
|СГРУППИРОВАТЬ ПО
|    ВложенныйЗапрос.Контрагент
|
|УПОРЯДОЧИТЬ ПО
|    Контрагент
|АВТОУПОРЯДОЧИВАНИЕ";


Т.е., если
1. Стоимость=1000, Подарок=200, Остаток=800
2. Стоимость=1000, Подарок=000, Остаток=1000
2. Стоимость=2000, Подарок=000, Остаток=2000

Если я выбираю по "Остатку" чистые поля, т.е. без подарков, то отбор по "ДиапазонОстатка" осуществляется. Если же пытаюсь отфильтровать поля с "Подарками", то этот результат не увидит.

Например, см приведенные строки, делаю фильтр от "700" до "2500", то первую строку "1. Стоимость=1000, Подарок=200, Остаток=800" не увидит...
Т.е. поля Остатков, которые подверглись воздействию "Подарков" не расчитывает...

Что может быть?
sava1
Обернуть запрос еще раз без агрегатов и на него условие
Constantus
sava1 @ Сегодня, 16:32 необходимо зарегистрироваться для просмотра ссылки ,


А можно по-подробнее... Как это в данном тексте запроса избавиться от агрегатных функций, т.е. обернуть?
sava1
ВЫБРАТЬ
|    Контрагент КАК Контрагент,
|    Стоимость,
|    Подарок,
|    Остаток
|ИЗ

// тут Ваш запрос

|"+ УсловиеЗапроса+"


Покажите запрос с установкой условий - там с условиями что-то не так.

Constantus
sava1 @ Сегодня, 16:45 необходимо зарегистрироваться для просмотра ссылки ,

Попробовал, но безрезультатно...

    ТекстЗапросаХ = 
"ВЫБРАТЬ
|    ВложенныйЗапрос.Контрагент КАК Контрагент,
|    СУММА(ВложенныйЗапрос.Стоимость) КАК Стоимость,
|    СУММА(ВложенныйЗапрос.Подарок) КАК Подарок,
|    СУММА(ВложенныйЗапрос.Остаток) КАК Остаток
|ИЗ
|    (ВЫБРАТЬ
|        Продажи.Контрагент КАК Контрагент,
|***********************************************************
|
|СГРУППИРОВАТЬ ПО
|    ВложенныйЗапрос.Контрагент
|
|УПОРЯДОЧИТЬ ПО
|    Контрагент
|АВТОУПОРЯДОЧИВАНИЕ";




Запрос.Текст = 
"ВЫБРАТЬ
|    Контрагент КАК Контрагент,
|    Стоимость,
|    Подарок,
|    Остаток
|ИЗ
| " + ТекстЗапросаХ +"
|"+ УсловиеЗапроса;



{(7, 2)}: Неверное присоединение
<<?>>ВЫБРАТЬ



Вот полный текст запроса. Работает, но "Остатки" не берет

Запрос = Новый Запрос;
УсловиеЗапроса = "";
Если ДиапазонОстатка ИЛИ ДиапазонСумм Тогда
   Если ДиапазонОстатка Тогда
        УсловиеЗапроса = "ГДЕ Остаток МЕЖДУ &ОстатокОт И &ОстатокДо";
        Запрос.УстановитьПараметр("ОстатокОт", СуммаОстаткаОт);
        Запрос.УстановитьПараметр("ОстатокДо", СуммаОстаткаДо);
    КонецЕсли;        

    Если ДиапазонСумм Тогда
        УсловиеЗапроса = УсловиеЗапроса + ?(ДиапазонОстатка, " И ", "ГДЕ ") +" Стоимость МЕЖДУ &СтоимостьОт И &СтоимостьДо";
        Запрос.УстановитьПараметр("СтоимостьОт", СуммаПродажОт);
        Запрос.УстановитьПараметр("СтоимостьДо", СуммаПродажДо);
    КонецЕсли;    
КонецЕсли;    
    
//*****************    
    Запрос.Текст =
"ВЫБРАТЬ
|    ВложенныйЗапрос.Контрагент КАК Контрагент,
|    СУММА(ВложенныйЗапрос.Стоимость) КАК Стоимость,
|    СУММА(ВложенныйЗапрос.Подарок) КАК Подарок,
|    СУММА(ВложенныйЗапрос.Остаток) КАК Остаток
|ИЗ
|    (ВЫБРАТЬ
|        Продажи.Контрагент КАК Контрагент,
|        СУММА(Продажи.Стоимость) КАК Стоимость,
|        0 КАК Подарок,
|        СУММА(Продажи.Стоимость) КАК Остаток
|    ИЗ
|        РегистрНакопления.Продажи КАК Продажи
|    ГДЕ
|        Продажи.Период МЕЖДУ НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ)
|        И Продажи.Номенклатура В(&НоменклатураПродаж)
|    
|    СГРУППИРОВАТЬ ПО
|        Продажи.Контрагент
|    
|    ОБЪЕДИНИТЬ ВСЕ
|    
|    ВЫБРАТЬ
|        Продажи.Контрагент,
|        0,
|        СУММА(Продажи.СтоимостьБезСкидок),
|        СУММА(-Продажи.СтоимостьБезСкидок)
|    ИЗ
|        РегистрНакопления.Продажи КАК Продажи
|    ГДЕ
|        Продажи.Номенклатура В(&НоменклатураПодарков)
|        И Продажи.Период МЕЖДУ НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ)
|    
|    СГРУППИРОВАТЬ ПО
|        Продажи.Контрагент) КАК ВложенныйЗапрос
|
|"+ УсловиеЗапроса+"
|
|
|
|СГРУППИРОВАТЬ ПО
|    ВложенныйЗапрос.Контрагент
|
|УПОРЯДОЧИТЬ ПО
|    Контрагент
|АВТОУПОРЯДОЧИВАНИЕ";


    Запрос.УстановитьПараметр("Дата1", ДатаНачала);
    Запрос.УстановитьПараметр("Дата2", ДатаОкончания);
    Запрос.УстановитьПараметр("НоменклатураПродаж", Товары);
    Запрос.УстановитьПараметр("НоменклатураПодарков", Бонусы);

sava1
покажите запрос с установкой условий

добавьте в агрегаты IsNull

СУММА(IsNULL(ВложенныйЗапрос.Стоимость,0)) КАК Стоимость,
Constantus
sava1 @ Сегодня, 17:03 необходимо зарегистрироваться для просмотра ссылки ,
Цитата(sava1 @ 08.07.17, 17:03) необходимо зарегистрироваться для просмотра ссылки
покажите запрос с установкой условий

добавьте в агрегаты IsNull

СУММА(IsNULL(ВложенныйЗапрос.Стоимость,0)) КАК Стоимость,



Нет, не сработало. Результат прежний
sava1
тимВивер в ЛС - посмотрю
Constantus
sava1 @ Сегодня, 17:31 необходимо зарегистрироваться для просмотра ссылки ,

Вроде отправил

Еще раз благодарю, Сава1!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.