• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Задачка По Списанию Партий

  • Автор темы Allexei
  • Дата начала
A

Allexei

Всем доброго времени суток. Есть задачка, из сборника задач на спеца по платформе, с очень хитрым условием.(1.5). Собственно сама задача(упрощенно).
Документом поступления товар приходуется, ведется партионный учет(только фифо). Списание производится документом реализации !!!с указанием в т.ч. приоритетного документа партии!!!. Если бы в условии было сказано что в документе нет повторяющихся строк, то решение было бы весьма не трудным, но у нас могу быть (и будут) дублирующиеся строки в документе. В чем проблема: на пример, мы работаем только с одним товаром. Имеем следующие поступления:
ПТ1-10
ПТ2-20
ПТ3-30
и одну реализацию(ее табличная часть)
Тов1 15 по ПТ1
Тов1 25 по ПТ2
Вот тут вопрос и возникает.... То есть по идеи в начале первая строка должна списать из ПТ1 10 штучек, затем вторая строка из ПТ2 20 штучек, а затем они обе из ПТ3 по 5 штучек. Все это надо реализовать в рамках 1 запроса. Ну комрады, есть мысли.
зы
Запрос писать за меня не надо, просто поделитесь мыслями как это можно организовать. Так же не надо отправлять на форум Павла Чистова. :)
 
Д

Дайнеко

Все это надо реализовать в рамках 1 запроса.

Трудность учебных задач в том, что решение надо не для практики, а как "надо".
Скажу по своим соображениям. Не представляю возможным нарисовать круто умный запрос, который на блюдечке преподаст партии, с которых надо списать и в каком количестве, по какой стоимости, привязанным к строкам документа. Да еще и шепнет на ушко, где чего не хватает.

Реальную трудность я вижу в том, что запрос даст остатки на момент "до списания". А проводки мы делаем на каждую строку документа. Поэтому уже 2-ой строке дока нельзя доверять запросу. А вдруг первая строка уже списала этот товар?

Я делаю так:
* Запрос по всем товарам из накладной, с детализацией до партии.
* Выгрузил в ТЗ
* Цикл по строкам дока.
- Каждая строка ищет свой товар в ТЗ. Сверяет наличие
- делает проводку
- Ключевой момент: корректируется ТЗ на количество, списанной с этой партии.
- если на одной партии не хватило, идем к следующей.
 
A

Allexei

Дайнеко , ну у Вас слишком просто :) Так и я могу...Ладно буду медетировать над запросом, может что и придумаю...
 
P

puh14

Основная беда, которую я вижу - это необходимость циклической проверки в запросе ( осталось что- либо списывать, или нет). Циклы в запросе не поддерживаются, значит надо делать временные таблички. Их количество задается запросом - значит количество итераций ( вычисления, все-ли списали) будет ограничено. и вполне возможно попасть на ситуацию когда запланированные итерации кончились, а остаток на списание остался.

Самый простой вариант - до запроса делаем проходку по строкам и тупо списываем минимум по партии между надо списать и остатком на складе. После чего создаем движение и ЗАПИСЫВАЕМ ЕГО!. В результате мы избавляемся от приоритетной партии , а дальше просто запрос с сортировкой по фифе.

Вот наверно то что поможет - тебе нужен нарастающий итог в запросе. Делаешь табличку номер раз - в ней пишешь товар, партия, количество списать, количество наличие.

Затем формируешь вторую табличку в которой товар , из первой и партия не равна в случае в записях первой таблицы количество списать больше количество чем количество осталось. Сортируешь ее по фифе.

А дальше идет финт ушами - нарастающий итог по таблице с остатками ( )- пихаешь его в третью таблицу.

А потом выбираешь из таблички номер три те записи, в которых количество нарастающее меньше количество осталось списать из первой.

Добавляешь записи из первой ( разумеется те, в которых происходит полное списание приоритетной партии или кол-во списания < количество наличие) и вот оно.

некоторые ньюансы опустил, условия расписал не все. Но вроде как идея рабочая.
 
U

unknown181538

Вообще, находил код реализации ФИФО в запросе, но это очень сложно, и вряд ли подойдет для этого случая. На экзамене специалиста не требуется.
Здесь я бы сделал по варианту Дайнеко.
"Самый простой вариант - до запроса делаем проходку по строкам и тупо списываем минимум по партии между надо списать и остатком на складе. После чего создаем движение и ЗАПИСЫВАЕМ ЕГО!. В результате мы избавляемся от приоритетной партии , а дальше просто запрос с сортировкой по фифе. " - мне кажется, будет дольше - два запроса и две записи движений получается.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!