Страницы: 1
RSS
Распределение товара по складам с учётом уже хранящегося товара
 
Всем привет.

Есть задача: нужно сделать распределение товара по нескольким складам с учётом уже хранящегося товара. Таким образом, чтобы уехал весь товар.
Из исходных данных есть:
  • кол-во товара, которое нужно поставить;
  • эталонное распределение по складам в %;
  • фактическое распределение по складам в %.
Файл-задача во вложении.
 
Deko1One, и как вы пытались решить вашу задачу? И что не получилось?
И, кстати, сумма вашего "эталонного распределения" равна 100.10%. Отличный эталон!
А у артикула 4 сумма текущего распределения равна 97%. Отличное распределение!
Да и без перемещения товаров между складами, похоже, не обойтись.
Изменено: AlienSx - 26.05.2024 10:36:33
Пришелец-прораб.
 
AlienSx, как бы я не пробовал решить, изящно сделать это не получается. Самое главное не получается автоматизировать, приходится вручную корректировать. Сумма не важна. Важно приблизится максимально к процентовке.
Пожалуйста, не придирайтесь к суммам процентов. Если вам есть что предложить — предложите.  
 
Deko1One, Попробуйте вариант:
Вредить легко, помогать трудно.
 
Behruz A.N., к сожалению не подходит.
Отрицательных значений быть не должно. Мы не можем забрать товар со склада, где по нему фактический остаток больше, чем "эталонный %".
Например, артикул 1 совершенно понятно, что не нужно поставлять на склады: Юг, Урал и Сибирь, т.к. фактически там товара больше, чем требуется. Соответственно, на эти склады мы не поставляем, а распределяем между остальными так, чтобы в конце концов получилось то самое "эталонное распределение".
Надеюсь понятно объяснил  :)  
 
Код
M11:S14    =ЦЕЛОЕ(МАКС(0;$A11*E$7*($C11+$D11)-E11*$D11))
T11:T14    =C11-СУММ(M11:S11)
A11    0,88
A12    0,95
A13    1,05
A14    1,02
 
МатросНаЗебре, уже очень хорошо, но есть нюанс 😁. Что такое за коэффициенты в столбце А? Как я понимаю это сделано через подбор параметров? Можно ли автоматизировать, т.к. артикулов то может быть и 100, это лишь в примере я указал 4 штуки, чтобы не нагромождать.
Прикрепляю ваш вариант.
 
Если бы остатки были бы дробными, если бы процент по всем складам был бы одинаковый, если бы не было излишков, то достаточно просто можно было бы сделать формулой. При таких вводных, я бы делал макросом.
 
Вариант через пользовательскую функцию.
Это в ячейку M11
Код
=ПОСТАВКА($C11;$D11;$E11:$L11;$E$7:$L$7;E11)

Это в стандартный модуль.
Код
Function ПОСТАВКА(Доступно_к_поставке As Long, Остаток_на_складах_ВСЕГО As Long, Процент_от_общего_остатка As Range, Эталонное_распределение As Range, Процент_от_общего_остатка_одного_склада As Range) As Long
    Dim arr As Variant: arr = Эталонное_распределение.Value
    Dim prr As Variant: prr = Процент_от_общего_остатка.Value
    Dim nrr As Variant: ReDim nrr(1 To UBound(prr, 2)) As Long
    Dim drr As Variant: ReDim drr(1 To UBound(prr, 2)) As Long
    Dim mrr As Variant: ReDim mrr(1 To UBound(prr, 2)) As Double
    Dim krr As Variant: ReDim krr(1 To UBound(prr, 2)) As Double
    Dim iSum As Long
    iSum = Доступно_к_поставке + Остаток_на_складах_ВСЕГО
    
    Dim xMin As Long
    Dim xx As Long
    For xx = 1 To UBound(nrr)
        nrr(xx) = Остаток_на_складах_ВСЕГО * prr(1, xx)
        mrr(xx) = iSum * arr(1, xx)
    Next
    
    Do
        If Доступно_к_поставке <= 0 Then Exit Do
        
        xMin = 1
        For xx = 1 To UBound(nrr)
            If mrr(xx) > 0 Then
                xMin = xx
                Exit For
            End If
        Next
        For xx = 1 To UBound(nrr)
            If mrr(xx) > 0 Then
                krr(xx) = nrr(xx) / mrr(xx)
                If krr(xMin) > krr(xx) Then
                    xMin = xx
                    If krr(xMin) = 0 Then Exit For
                End If
            End If
        Next
        nrr(xMin) = nrr(xMin) + 1
        drr(xMin) = drr(xMin) + 1
        Доступно_к_поставке = Доступно_к_поставке - 1
        DoEvents
    Loop
    
    xx = Процент_от_общего_остатка_одного_склада.Column - Процент_от_общего_остатка.Column + 1
    ПОСТАВКА = drr(xx)
End Function
 
Что то слепил близкое - подразумевается, что с каждой поставкой остатки будут приближаться к "эталону", если следовать предложенной схеме
 
МатросНаЗебре, Спасибо Вам большое!
Ваш вариант прям ТОП. Всё классно работает, то что нужно! Жму руку🤝
 
Павел \Ʌ/, и Вам спасибо за предложенное решение!
Есть, конечно, небольшие огрехи в виде того что, если ставить небольшие значения (5-10) в столбец "В поставку", а товара на складах суммарно 142, то распределение начинает уходить в минус.
В целом ничего страшного, я думаю можно допилить. Замечательное и нативное решение, чтобы не влезать в Visual Basic. Спасибо🤝
Страницы: 1
Наверх