HELP: Ищу красивое решение по формированию запроса
Есть два регистра: ОстаткиНоменклатуры и ЗаказыПокупателей в каждом из которых есть реквизит Количество
Суть задачи достаточно простая - получить запросом текущий остаток с учетом резерва.
соответственно задача решается следующим куском кода
Все бы ничего, однако в тоже время в запросе введена допфункция Ошибка которая проверяет правильность формирования запроса и на выходе выдает значение для номера иконки в ТЗ.
И вот в этом то как раз загвоздка - когда имеем кол-во из остатков и кол-во из брони то итоговый остаток считается однако значение функции ошибка суммируется применительно к значению каждого регистра. Например - "правильное значение иконки" - 8, а результат по функции может быть - 24. Это для комбинации 3 шт в остатках и 2 штуки в брони.
К тому же вариант
приводит к тому что на выходе в результате работы запроса выводятся строки с "нулевым остатком", т.е. по которым текущий остаток = забронированному количеству.
Не могу найти красивого решения чтобы обойти этот косяк сразу в тексте запроса.
Единственное что приходит в голову это переписать конфу так чтобы изначально "сменить знак с + на -" в реквизите Количество регистра ЗаказыПокупателей . То есть когда мы туда заносим бронь - количество пишется с -, а не с + как сейчас. Правда это геморно. Зато позволит написать конструкцию
и использовать сразу одну функцию для остатка, что позволит в том числе уйти от строк с "нулевыми остатками".
Может кто подскажет более красивое решение, а?
повторюсь - хочу сделать все внутри запроса, перебор в ТЗ не предлагать.
Суть задачи достаточно простая - получить запросом текущий остаток с учетом резерва.
соответственно задача решается следующим куском кода
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
//|с ДатаНач по ДатаКон;
|Количество = Регистр.ОстаткиНоменклатуры.Количество;
|";
Если ТабНастрОстДоговоры.ОстБезРезерва = 0 Тогда
//считаем только остатки на складе
ТекстЗапроса = ТекстЗапроса + "
|Номенклатура = Регистр.ОстаткиНоменклатуры.Номенклатура;
|ШтрихКод = Регистр.ОстаткиНоменклатуры.ПозицияНоменклатуры.ШтрихКод;
|Артикул = Регистр.ОстаткиНоменклатуры.Номенклатура.Артикул;
|Склад = Регистр.ОстаткиНоменклатуры.МестоХранения;
|Статус = Регистр.ОстаткиНоменклатуры.Номенклатура.Статус;
|Функция Остаток = КонОст(Количество);
|Условие (Количество > 0);
|";
Иначе
//при подсчете остатков считаем сколько забронировано
ТекстЗапроса = ТекстЗапроса + "
|Номенклатура = Регистр.ОстаткиНоменклатуры.Номенклатура, Регистр.ЗаказыПокупателей.Номенклатура;
|ШтрихКод = Регистр.ОстаткиНоменклатуры.ПозицияНоменклатуры.ШтрихКод, Регистр.ЗаказыПокупателей.ПозицияНоменклатуры.ШтрихКод;
|Артикул = Регистр.ОстаткиНоменклатуры.Номенклатура.Артикул, Регистр.ЗаказыПокупателей.Номенклатура.Артикул;
|Склад = Регистр.ОстаткиНоменклатуры.МестоХранения, Регистр.ЗаказыПокупателей.МестоХранения;
|Статус = Регистр.ОстаткиНоменклатуры.Номенклатура.Статус, Регистр.ЗаказыПокупателей.Номенклатура.Статус;
|Резерв = Регистр.ЗаказыПокупателей.Количество;
|Функция фКоличество = КонОст(Количество);
|Функция фРезерв = КонОст(Резерв);
|Функция Остаток = Сумма(Запрос.фКоличество - Запрос.фРезерв);
|Условие ((Количество > 0) или (Резерв > 0));
|";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|Функция Ошибка = Сумма(ПроверкаШтрихкода(Штрихкод));
|Группировка Артикул;
|Группировка Номенклатура упорядочить по Номенклатура.Артикул без групп;
|Группировка ШтрихКод;
|Условие(Статус в сзЗапроса);
|"//}}ЗАПРОС
;
ПоказатьВсе бы ничего, однако в тоже время в запросе введена допфункция Ошибка которая проверяет правильность формирования запроса и на выходе выдает значение для номера иконки в ТЗ.
И вот в этом то как раз загвоздка - когда имеем кол-во из остатков и кол-во из брони то итоговый остаток считается однако значение функции ошибка суммируется применительно к значению каждого регистра. Например - "правильное значение иконки" - 8, а результат по функции может быть - 24. Это для комбинации 3 шт в остатках и 2 штуки в брони.
К тому же вариант
|Функция фКоличество = КонОст(Количество);
|Функция фРезерв = КонОст(Резерв);
|Функция Остаток = Сумма(Запрос.фКоличество - Запрос.фРезерв);
приводит к тому что на выходе в результате работы запроса выводятся строки с "нулевым остатком", т.е. по которым текущий остаток = забронированному количеству.
Не могу найти красивого решения чтобы обойти этот косяк сразу в тексте запроса.
Единственное что приходит в голову это переписать конфу так чтобы изначально "сменить знак с + на -" в реквизите Количество регистра ЗаказыПокупателей . То есть когда мы туда заносим бронь - количество пишется с -, а не с + как сейчас. Правда это геморно. Зато позволит написать конструкцию
|Количество = Регистр.ОстаткиНоменклатуры.Количество, Регистр.ЗаказыПокупателей.Количество;
и использовать сразу одну функцию для остатка, что позволит в том числе уйти от строк с "нулевыми остатками".
Может кто подскажет более красивое решение, а?
повторюсь - хочу сделать все внутри запроса, перебор в ТЗ не предлагать.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) так не прокатит из-за синтаксиса
(4) когда в семерке есть и работает)) но не всегда понятно))
(3)
так тоже не вариант не все будет счиать, даже ради интереса попробовал))
поучилось что по позициям где есть бронь "задваивает" остатки (на остатках - 3 шт, в брони - 1 шт, на выходе дает 5)))
даже не могу понять почему так
вариант
даже тот же "эффект"
вдогонку - до этого попробовал такой вариант
в остатке не учитывается резерв
Частично можно решить путем
при этом по "нулевым" позиция (остаток-бронь = 0) проверка правильности штрихкода считаться не будет
однако это никак не решает проблему с наличия "нулевых" строк в результирующей таблице
Условие (Количество <<?>> Резерв <> 0);
Запрос[13] : Ожидается ')' перед 'Резерв'
(4) когда в семерке есть и работает)) но не всегда понятно))
(3)
|Функция Остаток = Сумма(Запрос.фКоличество - Запрос.фРезерв) КОГДА (Запрос.фКоличество <> Запрос.фРезерв);
так тоже не вариант не все будет счиать, даже ради интереса попробовал))
поучилось что по позициям где есть бронь "задваивает" остатки (на остатках - 3 шт, в брони - 1 шт, на выходе дает 5)))
даже не могу понять почему так
вариант
|Функция Остаток = Сумма(Запрос.фКоличество - Запрос.фРезерв) КОГДА ((Запрос.фКоличество - Запрос.фРезерв) > 0);
даже тот же "эффект"
вдогонку - до этого попробовал такой вариант
|Функция Остаток = Сумма(Запрос.фКоличество - Запрос.фРезерв) КОГДА ((Количество - Резерв) > 0);
//|Условие ((Количество > 0) или (Резерв > 0));
в остатке не учитывается резерв
Частично можно решить путем
|Функция Ошибка = Сумма(ПроверкаШтрихкода(Штрихкод)) КОГДА ((Количество - Резерв) > 0);
при этом по "нулевым" позиция (остаток-бронь = 0) проверка правильности штрихкода считаться не будет
однако это никак не решает проблему с наличия "нулевых" строк в результирующей таблице
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот