Wątek przeniesiony 2021-08-27 22:23 z Bazy danych przez cerrato.

Rozdzielenie towaru pomiędzy paletami

0

Witam.

Mam taką zagwozdkę. Mam zapytanie które zwraca mi ilość towaru do pobrania z magazynu. Jednak na magazynie towaru rozłożony jest na kilku paletach i możliwe są również niepełne opakowania z tzw "resztówką". Chciałbym w pierwszej kolejności zabrać towar z całą resztówką później w miarę możliwości brać towar nie otwarty lub otwierać następny. Jeżeli nie ma resztówek to brać towar nie otwarty.

Mam tabelę Materiał :

MATERIAL ILOSC_DO_POBRANIA
A         20
B         30    
C         55

Oraz tabelę resztówka

MATERIAL RESZTOWKA  PALETA
A         1,5       50
A         0         50
A         5,5       100
B         3,5       30
A         20        50
B         0         30
C         0         125

Wynik jaki chciałbym otrzymać to mogą być powielone materiały (czyli rozbite np materiały na 1-2-3 pozycje) z ilościami do pobrania. Najważniejsze aby ILOSC_DO_POBRANIA się zgadzała.

1

A co gdy dodanie kolejnej resztówki przepełni ilość do pobrania ? Masz mieć równo tylko i le zamówili?

1

Proponowana struktura bazy jest mało perspektywiczna, tylko pod jedno zagadnienie.

Bardziej perspektywiczne by było N wierszy np. dwa z różnymi jednostkami.

1

Samym zapytaniem tego nie zrobisz (ewentualnie zrobisz potworka). Rozumiem, że masz tabelę z kluczem artykułu, pozostałą ilością w opakowaniu i wielkością opakowania, chcesz w pierwszej kolejności wydać już otwarte. Pytanie co w przypadku kiedy jest "resztówka", ale zapotrzebowanie pasuje akurat do jakiegoś pełnego opakowania?
Samo rozwiązanie to pobrać towary, posortować po stopniu napoczęcia, a później jechać po tak stworzonym kursorze tak długo jak suma narastająca będzie mniejsza od zapotrzebowania.
Pierwsza część to zwykłe select * from stany where material = 'A' order by (resztowka/paleta)
Drugą część można pewnie złożyć jakimiś sporymi zapytaniami operującymi na powyższym wyniku, ale znacznie lepiej użyć procedury, która weźmie sobie odpowiednią liczbę wierszy z początku wyniku.

3
piotrpo napisał(a):

Samym zapytaniem tego nie zrobisz (ewentualnie zrobisz potworka).

W ogóle temat jest wybitnie dla warstwy aplikacji, i robienie tego w SQL jest (mówiąc dyplomatycznie) "nieco dziwne".

3

Zakladajac, że jeżeli resztówka=0 to biorę ilość z palety, to nie jest to jakieś mega skomplikowane:

with RPT AS (
select  
  "MATERIAL"
  , "RESZTOWKA"
  , "PALETA"
  , SUM(CASE WHEN P.resztowka = 0 THEN paleta ELSE resztowka END) OVER (PARTITION BY MATERIAL ORDER BY RESZTOWKA DESC) as "RS" 
  , ROW_NUMBER() over (partition by MATERIAL order by resztowka desc) as id
  , CASE WHEN P.resztowka = 0 THEN paleta ELSE resztowka END il
from p
)
, result as (
SELECT
  ID
  ,M.MATERIAL
  ,ILOSC_DO_POBRANIA
  ,RESZTOWKA
  ,PALETA
  ,RS
  ,case when rs >= ilosc_do_pobrania then 1 else 0 end as e
  ,il
FROM
  m
  left JOIN RPT ON RPT.MATERIAL = M.MATERIAL 
)

select
  result.MATERIAL
  ,ILOSC_DO_POBRANIA
  ,RESZTOWKA
  ,PALETA
  ,case when e=0 then il else il - (rs - ilosc_do_Pobrania) end as Wynik
from 
  result
  inner join (select 
                material
                , min(id) i 
              from 
                result 
              where 
                 e = 1 
              group by material) l on l.material = result.material and result.id <= l.i

http://sqlfiddle.com/#!4/2793a1/12

0

@BLAZO:
Czym jest resztówka? Bo nie bardzo rozumiem. Jeśli paleta ma 50 i resztówkę 1.5 to znaczy że na palecie jest 51.5? W ogole jak ktoś chce 20 sztuk to 0.5 powinniśmy brać? Zbyt mało danych by napisać Ci zapytanie.

To co chcesz uzyskać nie jest takie trudne. Napisz o jakiej bazie mówimy bo to kluczowe dla zapytania.

1

Kopnijcie mnie w kostkę, albo dowolną inną część ciała, że to projekt studencki, a nie fundamenty siedemset dwunastego w Polsce tzw "ERP", który z klienta wydrąży tym więcej, im będzie to gorzej zrobione.

Wyobraź sobie że na palecie mieści się 50 zgrzewek mleka. W zgrzewce jest np. 16 butelek. Możesz mieć paletę gdzie masz np. równo 40 zgrzewek a i możesz mieć taką gdzie jest 40 pełnych zgrzewek i jedna niepełna np. zostało 3 butelki z 12. Z tego co rozumiem, to chodzi o to aby najpierw kierowało do takiej palety? — .andy 12 minut temu

jedno z pytań. Ja postawię następne.
Producent paletuje po 96 jednostek. Ale za pól roku zacznie po 92 (powód? dowolny, np eko, unia, SARS-23, firmę ktoś przejął)
Na składzie mamy z obu dostaw.

wg @KamilAdam pojutrze dam bardziej wredne uwagi, obecnie jestem zaspany

1 użytkowników online, w tym zalogowanych: 0, gości: 1