In un magazzino gestito con ubicazioni dinamiche il codice viene ubicato dove c’è lo spazio disponibile pertanto uno stesso codice potrebbe essere allocato in più punti del magazzino, se sono parecchi i codici con più ubicazioni questo può rallentare le operazioni di prelievo del materiale, un po’ come avviene con un disco di un computer che pertanto periodicamente va deframmentato. Come misurare il grado di frammentazione del magazzino? Lo possiamo misurare attraverso l’indice di Gini che misura il grado di concentrazione in una distribuzione di frequenza. La tabella da cui partire è la seguente:
CODICE, N UBI
A questo punto attraverso tre query in cascata andiamo ad accodare in una tabella dove registriamo lo storico del grado di frammentazione del magazzino:
SELECT [UBICAZIONI].CODICE, [UBICAZIONI].[N UBI], [Totale ubicazioni].TOTUBI, [N UBI]/[TOTUBI] AS FRE, [FRE]^2 AS FREQ FROM [UBI LOGIS], [Totale ubicazioni] ORDER BY [UBI LOGIS].[N UBI] DESC; |
SELECT [UBICAZIONI].CODICE, [UBICAZIONI].[N UBI], [Totale ubicazioni].TOTUBI, [N UBI]/[TOTUBI] AS FRE, [FRE]^2 AS FREQ FROM [UBI LOGIS], [Totale ubicazioni] ORDER BY [UBI LOGIS].[N UBI] DESC;
SELECT SUM(Frequenze.FREQ) AS SOMMA, COUNT(Frequenze.CODICE) AS N FROM Frequenze; |
SELECT Sum(Frequenze.FREQ) AS SOMMA, Count(Frequenze.CODICE) AS N FROM Frequenze;
INSERT INTO [Frammentazione magazzino] ( DATA, FRAMMENTAZIONE ) SELECT DATE() AS DATA, 1-((1-[SOMMA])/(([N]-1)/[N])) AS FRAMMENTAZIONE FROM [Somma frequenze]; |
INSERT INTO [Frammentazione magazzino] ( DATA, FRAMMENTAZIONE ) SELECT Date() AS DATA, 1-((1-[SOMMA])/(([N]-1)/[N])) AS FRAMMENTAZIONE FROM [Somma frequenze];
Graficamente possiamo rappresentare la frammentazione del magazzino contando per ogni frequenza di ubicazione quanti codici ci sono.
Una volta individuato che il magazzino è eccessivamente frammentato procediamo all’operazione di refilling, ovvero andiamo a posizionare in una ubicazione i codici che sono in più di tre ubicazioni, per fare questo è necessario elaborare una tabella che indichi per ogni codici le ubicazioni in cui si trova. Per fare questo partiamo da una tabella GIACENZA così formata:
CODICE, UBI, QT ed eseguiamo il seguente codice
Function uge() Dim db As DAO.Database Dim tabella As DAO.Recordset Dim c1 As DAO.Field Dim c2 As DAO.Field Dim c3 As DAO.Field Dim c4 As DAO.Field Dim CODE(50000) Dim AREA(50000) Dim QT(50000) Dim TE(50000) Dim CA(50000) Set db = CurrentDb C = 1 Set tabella = db.OpenRecordset("GIACENZE", dbOpenDynaset) Do Until tabella.EOF CODE(C) = tabella.Fields("CODICE") AREA(C) = Replace(tabella.Fields("UBI"), " ", "") QT(C) = tabella.Fields("QT") C = C + 1 tabella.MoveNext Loop tabella.Close DoCmd.SetWarnings False DoCmd.RunSQL "DELETE [UBICAZIONI.* FROM [UBICAZIONI];" Set tabella = db.OpenRecordset("UBICAZIONI", dbOpenDynaset) Set c1 = tabella.Fields("CODICE") Set c2 = tabella.Fields("UBICAZIONE") Set c3 = tabella.Fields("QT") Set c4 = tabella.Fields("N UBI") For X = 1 To C If CODE(X) <> CODE(X - 1) Then TE(X) = AREA(X) CA(X) = QT(X) N = 1 Else TE(X) = TE(X - 1) + "; " + AREA(X) CA(X) = CA(X - 1) + QT(X) N = N + 1 End If If CODE(X) <> CODE(X + 1) Then tabella.AddNew c1 = CODE(X) c2 = TE(X) c3 = CA(X) c4 = N tabella.Update End If Next X tabella.Close db.Close End Function |
Function uge() Dim db As DAO.Database Dim tabella As DAO.Recordset Dim c1 As DAO.Field Dim c2 As DAO.Field Dim c3 As DAO.Field Dim c4 As DAO.Field Dim CODE(50000) Dim AREA(50000) Dim QT(50000) Dim TE(50000) Dim CA(50000) Set db = CurrentDb C = 1 Set tabella = db.OpenRecordset("GIACENZE", dbOpenDynaset) Do Until tabella.EOF CODE(C) = tabella.Fields("CODICE") AREA(C) = Replace(tabella.Fields("UBI"), " ", "") QT(C) = tabella.Fields("QT") C = C + 1 tabella.MoveNext Loop tabella.Close DoCmd.SetWarnings False DoCmd.RunSQL "DELETE [UBICAZIONI.* FROM [UBICAZIONI];" Set tabella = db.OpenRecordset("UBICAZIONI", dbOpenDynaset) Set c1 = tabella.Fields("CODICE") Set c2 = tabella.Fields("UBICAZIONE") Set c3 = tabella.Fields("QT") Set c4 = tabella.Fields("N UBI") For X = 1 To C If CODE(X) <> CODE(X - 1) Then TE(X) = AREA(X) CA(X) = QT(X) N = 1 Else TE(X) = TE(X - 1) + "; " + AREA(X) CA(X) = CA(X - 1) + QT(X) N = N + 1 End If If CODE(X) <> CODE(X + 1) Then tabella.AddNew c1 = CODE(X) c2 = TE(X) c3 = CA(X) c4 = N tabella.Update End If Next X tabella.Close db.Close End Function