HELP: Ищу красивое решение по формированию запроса

1. GSoft 2237 05.12.16 15:30 Сейчас в теме
Есть два регистра: ОстаткиНоменклатуры и ЗаказыПокупателей в каждом из которых есть реквизит Количество

Суть задачи достаточно простая - получить запросом текущий остаток с учетом резерва.

соответственно задача решается следующим куском кода


                ТекстЗапроса = 
            "//{{ЗАПРОС(Сформировать)
            //|с ДатаНач по ДатаКон;
            |Количество                    = Регистр.ОстаткиНоменклатуры.Количество;  
            |";
            
            Если ТабНастрОстДоговоры.ОстБезРезерва = 0 Тогда
                //считаем только остатки на складе
                ТекстЗапроса = ТекстЗапроса + "    
                |Номенклатура            = Регистр.ОстаткиНоменклатуры.Номенклатура;
                |ШтрихКод                = Регистр.ОстаткиНоменклатуры.ПозицияНоменклатуры.ШтрихКод;
                |Артикул                = Регистр.ОстаткиНоменклатуры.Номенклатура.Артикул;  
                |Склад                    = Регистр.ОстаткиНоменклатуры.МестоХранения;
                |Статус                    = Регистр.ОстаткиНоменклатуры.Номенклатура.Статус;
                |Функция Остаток        = КонОст(Количество); 
                |Условие (Количество > 0);
                |";
            Иначе
                //при подсчете остатков считаем сколько забронировано
                ТекстЗапроса = ТекстЗапроса + "
                |Номенклатура            = Регистр.ОстаткиНоменклатуры.Номенклатура, Регистр.ЗаказыПокупателей.Номенклатура;
                |ШтрихКод                = Регистр.ОстаткиНоменклатуры.ПозицияНоменклатуры.ШтрихКод, Регистр.ЗаказыПокупателей.ПозицияНоменклатуры.ШтрихКод;
                |Артикул                = Регистр.ОстаткиНоменклатуры.Номенклатура.Артикул, Регистр.ЗаказыПокупателей.Номенклатура.Артикул;
                |Склад                    = Регистр.ОстаткиНоменклатуры.МестоХранения, Регистр.ЗаказыПокупателей.МестоХранения;
                |Статус                    = Регистр.ОстаткиНоменклатуры.Номенклатура.Статус,  Регистр.ЗаказыПокупателей.Номенклатура.Статус;
                |Резерв                    = Регистр.ЗаказыПокупателей.Количество;    
                |Функция фКоличество    = КонОст(Количество); 
                |Функция фРезерв        = КонОст(Резерв); 
                |Функция Остаток        = Сумма(Запрос.фКоличество - Запрос.фРезерв);
                   |Условие ((Количество > 0) или (Резерв > 0));
                |";
            КонецЕсли;
            
            ТекстЗапроса = ТекстЗапроса + "    
            |Функция Ошибка                = Сумма(ПроверкаШтрихкода(Штрихкод)); 
            |Группировка Артикул;
            |Группировка Номенклатура упорядочить по Номенклатура.Артикул без групп;
            |Группировка ШтрихКод;
            |Условие(Статус в сзЗапроса);
            |"//}}ЗАПРОС
            ;           
Показать


Все бы ничего, однако в тоже время в запросе введена допфункция Ошибка которая проверяет правильность формирования запроса и на выходе выдает значение для номера иконки в ТЗ.

И вот в этом то как раз загвоздка - когда имеем кол-во из остатков и кол-во из брони то итоговый остаток считается однако значение функции ошибка суммируется применительно к значению каждого регистра. Например - "правильное значение иконки" - 8, а результат по функции может быть - 24. Это для комбинации 3 шт в остатках и 2 штуки в брони.


К тому же вариант
                |Функция фКоличество    = КонОст(Количество); 
                |Функция фРезерв        = КонОст(Резерв); 
                |Функция Остаток        = Сумма(Запрос.фКоличество - Запрос.фРезерв);


приводит к тому что на выходе в результате работы запроса выводятся строки с "нулевым остатком", т.е. по которым текущий остаток = забронированному количеству.

Не могу найти красивого решения чтобы обойти этот косяк сразу в тексте запроса.


Единственное что приходит в голову это переписать конфу так чтобы изначально "сменить знак с + на -" в реквизите Количество регистра ЗаказыПокупателей . То есть когда мы туда заносим бронь - количество пишется с -, а не с + как сейчас. Правда это геморно. Зато позволит написать конструкцию
|Количество = Регистр.ОстаткиНоменклатуры.Количество, Регистр.ЗаказыПокупателей.Количество;



и использовать сразу одну функцию для остатка, что позволит в том числе уйти от строк с "нулевыми остатками".


Может кто подскажет более красивое решение, а?
повторюсь - хочу сделать все внутри запроса, перебор в ТЗ не предлагать.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Shreki2015 2 06.12.16 17:28 Сейчас в теме
(1) попробуй:
|Условие (Количество - Резерв <> 0);



прокатит ли? скорее всего выдаст ошибку, подобное не проверял.
6. GSoft 2237 06.12.16 19:52 Сейчас в теме
(2) так не прокатит из-за синтаксиса

Условие (Количество  <<?>> Резерв <> 0);
Запрос[13] : Ожидается ')' перед 'Резерв'


(4) когда в семерке есть и работает)) но не всегда понятно))

(3)
|Функция Остаток = Сумма(Запрос.фКоличество - Запрос.фРезерв) КОГДА (Запрос.фКоличество <> Запрос.фРезерв);


так тоже не вариант не все будет счиать, даже ради интереса попробовал))
поучилось что по позициям где есть бронь "задваивает" остатки (на остатках - 3 шт, в брони - 1 шт, на выходе дает 5)))

даже не могу понять почему так

вариант
|Функция Остаток = Сумма(Запрос.фКоличество - Запрос.фРезерв) КОГДА ((Запрос.фКоличество - Запрос.фРезерв) > 0);


даже тот же "эффект"



вдогонку - до этого попробовал такой вариант

|Функция Остаток        = Сумма(Запрос.фКоличество - Запрос.фРезерв) КОГДА ((Количество - Резерв) > 0);
//|Условие ((Количество > 0) или (Резерв > 0));



в остатке не учитывается резерв

Частично можно решить путем
|Функция Ошибка                = Сумма(ПроверкаШтрихкода(Штрихкод)) КОГДА ((Количество - Резерв) > 0); 


при этом по "нулевым" позиция (остаток-бронь = 0) проверка правильности штрихкода считаться не будет
однако это никак не решает проблему с наличия "нулевых" строк в результирующей таблице
3. alxarz 32 06.12.16 17:43 Сейчас в теме
а так?
|Функция Остаток        = Сумма(Запрос.фКоличество - Запрос.фРезерв) КОГДА (Запрос.фКоличество <> Запрос.фРезерв);
4. S.V.Y 17 06.12.16 18:02 Сейчас в теме
5. alxarz 32 06.12.16 18:05 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот