Una confezione ben studiata riduce il prelievo frazionato evitando quindi errori dovuti al conteggio, allora come gestire le confezioni degli articoli per ottimizzare e velocizzare il prelievo dei materiali sia per la vendita che per la produzione? L’analisi da cui partire è quella relativa alle qt prelevate per ogni articolo per cercare di individuare la confezione più adatta. Consideriamo il caso più semplice, un’azienda che acquista e rivende, in questo caso i passaggi da effettuare sono i seguenti:
- calcolare il prelievo medio per ogni articolo raggruppato per cliente
- eliminare i valori poco significativi
- individuare il massimo comune divisore per ogni articolo (ad esempio per l’articolo X il cliente A acquista 10, B 15 e C 20, la confezione da proporre è 5)
Consideriamo la tabella con i movimenti di magazzino filtrando solo quelli in vendita avremo la seguente tabella CODICE,CLIENTE,QT e calcoliamo il valore medio, la deviazione standard ed il coefficiente di variabilità
SELECT MOVIMENTI.CODICE, MOVIMENTI.CLIENTE, Avg(MOVIMENTI.QT) AS MEDIA, StDevP(MOVIMENTI.QT) AS DEVST FROM MOVIMENTI GROUP BY MOVIMENTI.CODICE, MOVIMENTI.CLIENTE; |
SELECT MOVIMENTI.CODICE, MOVIMENTI.CLIENTE, Avg(MOVIMENTI.QT) AS MEDIA, StDevP(MOVIMENTI.QT) AS DEVST FROM MOVIMENTI GROUP BY MOVIMENTI.CODICE, MOVIMENTI.CLIENTE;
(attenzione utilizziamo la deviazione standard calcolata sulla popolazione e non quella campionaria)
Calcoliamo il coefficiente di variabilità come frazione tra la deviazione standard ed eliminiamo quei codici che hanno un CV superiore al 40%, avremo quindi una tabella del tipo: CODICE, CLIENTE, QT MEDIA calcoliamo quindi il massimo comune divisore in questo modo ( per meglio calcolare il MCD è preferibile arrotondare i valori)
Function confezioni() Dim db As DAO.Database Dim tabella1 As DAO.Recordset Dim tabella2 As DAO.Recordset Dim c1 As DAO.Field Dim c2 As DAO.Field Dim CODICE(10000) Dim QR(10000) Dim QT(100) Set db = CurrentDb Set tabella1 = db.OpenRecordset("MOVIMENTI", dbOpenDynaset) Set tabella2 = db.OpenRecordset("CONFEZIONI", dbOpenDynaset) Set c1 = tabella2.Fields("CODICE") Set c2 = tabella2.Fields("CONFEZIONE") Do Until tabella1.EOF c = c + 1 CODICE(c) = tabella1.Fields("CODICE") QR(c) = tabella1.Fields("QT MEDIA") tabella1.MoveNext Loop tabella1.Close For j = 1 To c If CODICE(j) <> CODICE(j - 1) Then T = 1 For x = 1 To 100 QT(x) = 0 Next x QT(T) = QR(j) Else If CODICE(j) = CODICE(j + 1) Then T = T + 1 QT(T) = QR(j) Else confezione = MCD(QT) tabella2.AddNew c1 = CODICE(j) c2 = confezione tabella2.Update End If End If Next j tabella2.Close db.Close End Function |
Function confezioni() Dim db As DAO.Database Dim tabella1 As DAO.Recordset Dim tabella2 As DAO.Recordset Dim c1 As DAO.Field Dim c2 As DAO.Field Dim CODICE(10000) Dim QR(10000) Dim QT(100) Set db = CurrentDb Set tabella1 = db.OpenRecordset("MOVIMENTI", dbOpenDynaset) Set tabella2 = db.OpenRecordset("CONFEZIONI", dbOpenDynaset) Set c1 = tabella2.Fields("CODICE") Set c2 = tabella2.Fields("CONFEZIONE") Do Until tabella1.EOF c = c + 1 CODICE(c) = tabella1.Fields("CODICE") QR(c) = tabella1.Fields("QT MEDIA") tabella1.MoveNext Loop tabella1.Close For j = 1 To c If CODICE(j) <> CODICE(j - 1) Then T = 1 For x = 1 To 100 QT(x) = 0 Next x QT(T) = QR(j) Else If CODICE(j) = CODICE(j + 1) Then T = T + 1 QT(T) = QR(j) Else confezione = MCD(QT) tabella2.AddNew c1 = CODICE(j) c2 = confezione tabella2.Update End If End If Next j tabella2.Close db.Close End Function
Calcoliamo le confezioni tramite questa funzione che va scrivere in una tabella in quanto in access non è possibile definire delle funzioni di aggregazione, la funzione MCD fa uso della funzione excel pertanto bisogna inserire questa libreria tra i riferimenti del progetto.
Function MCD(numeri) Dim xls As Excel.Application Set xls = CreateObject("Excel.Application") MCD = xls.WorksheetFunction.Gcd(numeri) End Function |
Function MCD(numeri) Dim xls As Excel.Application Set xls = CreateObject("Excel.Application") MCD = xls.WorksheetFunction.Gcd(numeri) End Function