Мы продаем витую пару, в бабинах по 30 метров и по 70 метров, бабины не разрезаются, продаются целиком. Имеем на складе какое-то произвольное количество тех и других бабин.
Приходит клиент и просит какую-либо длину, произвольную, допустим 150 метров, необходимо написать процедуру которая одним-двумя запросами подберет необходимое количество бабин как можно ближе к этой длине с учетом товаров на складе.
Какие есть решения на запросе?
Приходит клиент и просит какую-либо длину, произвольную, допустим 150 метров, необходимо написать процедуру которая одним-двумя запросами подберет необходимое количество бабин как можно ближе к этой длине с учетом товаров на складе.
Какие есть решения на запросе?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) skt-roman, если дополнительных условий нет, тогда ставь блокировку на регистр остатков товаров, выбирай остаток бОбин по 70 м из регистра остатков товара на складе, вычитай из заказанного количества количество метров в бОбине, потом проверяй, если остаток > 70 метров, тогда следующую из 70 м, если остаток заказанного количества < 70, тогда запрашивай бОбины по 30 м, пока количество метров будет => Заказанного Количества. Или сам код нужен?
(15) Cooler, Я еще другое помню, на ту же тему. Типа кандидаты в депутаты на совещании. Один из них: Бабу, бабу... бабу.... Да подождите товарищ, вот выиаграем выборы, будут вам и бабы, и бабки, все будет. - Бабу.. бабурина в президенты!
(1) skt-roman, вот вроде бы рабочий вариант решения, но желательно еще протестировать
ВЫБРАТЬ
0 КАК Х
ПОМЕСТИТЬ Число0_1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Инь.Х + 2 * Янь.Х КАК Х
ПОМЕСТИТЬ Число0_3
ИЗ
Число0_1 КАК Инь,
Число0_1 КАК Янь
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Инь.Х + 4 * Янь.Х КАК Х
ПОМЕСТИТЬ Число0_15
ИЗ
Число0_3 КАК Инь,
Число0_3 КАК Янь
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Инь.Х + 16 * Янь.Х КАК Х
ПОМЕСТИТЬ Число0_255
ИЗ
Число0_15 КАК Инь,
Число0_15 КАК Янь
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Инь.Х + 256 * Янь.Х КАК Х
ПОМЕСТИТЬ Число0_65535
ИЗ
Число0_255 КАК Инь,
Число0_255 КАК Янь
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Число.Х КАК По70,
ВЫБОР
КОГДА &НужноМетров <= Число.Х * 70
ТОГДА 0
ИНАЧЕ ВЫРАЗИТЬ((&НужноМетров - Число.Х * 70) / 30 + 0.499999 КАК ЧИСЛО(10, 0))
КОНЕЦ КАК По30,
Число.Х * 70 + ВЫБОР
КОГДА &НужноМетров <= Число.Х * 70
ТОГДА 0
ИНАЧЕ ВЫРАЗИТЬ((&НужноМетров - Число.Х * 70) / 30 + 0.499999 КАК ЧИСЛО(10, 0))
КОНЕЦ * 30 - &НужноМетров КАК Остаток
ПОМЕСТИТЬ Варианты
ИЗ
Число0_65535 КАК Число
ГДЕ
Число.Х <= &Остаток70
И ВЫРАЗИТЬ((&НужноМетров - Число.Х * 70) / 30 + 0.499999 КАК ЧИСЛО(10, 0))<= &Остаток30
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Варианты.По70,
Варианты.По30,
Варианты.Остаток
ИЗ
Варианты КАК Варианты
ГДЕ
Варианты.Остаток В
(ВЫБРАТЬ
МИНИМУМ(Варианты.Остаток)
ИЗ
Варианты)
Показать
Предлагаю такой алгоритм:
1. Пытаемся набрать нужную длину бобинами по 70 метров, это даст превышение над требуемой длиной от 0 до 69 метров.
2. Если превышение меньше 9 метров, то оптимизация не нужна.
3. Если превышение больше 9 метров, то обрабатываем его по следующим правилам: если оно больше 49 метров - один раз заменяем одну бобину 70 метров на одну бобину 30 метров, из превышения вычитаем 40 метров.
4. Оставшееся превышение 0-29 метров уменьшаем в цикле: заменяем одну бобину 70 метров на две бобины 30 метров, из превышения вычитаем 10 метров, так что проделывается это максимум 2 раза.
5. Если на складе не хватает бобин 70 метров для п.1 то добираем до превышения бобинами по 30 метров и переходим к п.4.
6. Если на любом этапе кончаются бобины 30 метров, то оптимизация прерывается.
Вот только сомневаюсь, что это можно реализовать запросом.
1. Пытаемся набрать нужную длину бобинами по 70 метров, это даст превышение над требуемой длиной от 0 до 69 метров.
2. Если превышение меньше 9 метров, то оптимизация не нужна.
3. Если превышение больше 9 метров, то обрабатываем его по следующим правилам: если оно больше 49 метров - один раз заменяем одну бобину 70 метров на одну бобину 30 метров, из превышения вычитаем 40 метров.
4. Оставшееся превышение 0-29 метров уменьшаем в цикле: заменяем одну бобину 70 метров на две бобины 30 метров, из превышения вычитаем 10 метров, так что проделывается это максимум 2 раза.
5. Если на складе не хватает бобин 70 метров для п.1 то добираем до превышения бобинами по 30 метров и переходим к п.4.
6. Если на любом этапе кончаются бобины 30 метров, то оптимизация прерывается.
Вот только сомневаюсь, что это можно реализовать запросом.
(10) Cooler, я бы выгрузил все остатки в ТЗ и циклом по 70 м дошёл до значения, когда остаток меньше 70 и больше 30, а потом внутренним циклом добил до больше или равно Заказа клиента, если по 30 м больше не осталось, тогда возврат в первый цикл. Хотя и твой способ тоже хорош.
Смутно мне напоминает задачу о рюкзаке. Должна же быть куча готовых решений где-то. Стандартная же задача.
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот