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

1. GSoft 2235 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 2235 06.12.16 19:52 Сейчас в теме
(2) так не прокатит из-за синтаксиса

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


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

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


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

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

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


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



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

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


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

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


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

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