Версия для печати темы (https://pro1c.org.ua/index.php?s=b7418db53948b071fd413953c486df6c&showtopic=38511)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Двойное условие в запросе (=>; <=)

Автор: Constantus 08.07.17, 10:42

Приветствую, форумчане!
"Управление торговлей 10.3", (Моби-С 5.5). "ABBYY Ukraine", 2003-2014 (2.3.20.1)

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

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



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


Код не срабатывает, как можно сформировать такой гибкий отчет с выбором диапазона сумм от/до по Остаткам и/или СуммамПродаж?

Автор: sava1 08.07.17, 11:56

Такой диапазон определяется МЕЖДУ

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

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

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


текстзапроса = "
|....
|"+ УсловиеЗапроса+"    
......
|";

Автор: Constantus 08.07.17, 12:55

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 08.07.17, 13:32

Обернуть запрос еще раз без агрегатов и на него условие

Автор: Constantus 08.07.17, 13:43

sava1 @ Сегодня, 16:32 * ,


А можно по-подробнее... Как это в данном тексте запроса избавиться от агрегатных функций, т.е. обернуть?

Автор: sava1 08.07.17, 13:50

ВЫБРАТЬ
|    Контрагент КАК Контрагент,
|    Стоимость,
|    Подарок,
|    Остаток
|ИЗ

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

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


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


Автор: Constantus 08.07.17, 13:59

sava1 @ Сегодня, 16:45 * ,

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

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




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



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



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

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

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


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


Автор: sava1 08.07.17, 14:03

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

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

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

Автор: Constantus 08.07.17, 14:08

sava1 @ Сегодня, 17:03 * ,

Цитата(sava1 @ 08.07.17, 17:03) *
покажите запрос с установкой условий

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

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



Нет, не сработало. Результат прежний

Автор: sava1 08.07.17, 14:31

тимВивер в ЛС - посмотрю

Автор: Constantus 08.07.17, 15:25

sava1 @ Сегодня, 17:31 * ,

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

Еще раз благодарю, Сава1!!!

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua