Le funzioni in Envision - Software di ottimizzazione delle scorte

Le funzioni












Home » Risorse » Qui

Scopo principale delle funzioni è quello di estendere le capacità di Envision quando la sintassi di base non è sufficiente. In questa pagina sono descritte tutte le funzioni supportate da Envision.


Funzioni matematiche

  • abs(number): è simile alla funzione di Excel ASS.
  • ceiling(number): è simile alla funzione di Excel ARROTONDA.ECCESSO.
  • exp(number): è simile alla funzione di Excel Funzione EXP.
  • floor(number): è simile alla funzione di Excel ARROTONDA.DIFETTO.
  • log(number, base): è simile alla funzione di Excel LOG.
  • max(num1, num2, num3, ..., numN): è simile alla funzione di Excel Funzione MAX.
  • min(num1, num2, num3, ..., numN): è simile alla funzione di Excel Funzione MIN.
  • percent(N) by [Group]: restituisce il valore N diviso per la somma di tutti i valori all'interno di Group.
  • norminv(number): è simile alla funzione di Excel Funzione INV.NORM.
  • pow(number, exponent): è simile alla funzione di Excel POTENZA. Envision supporta anche l'operatore di potenza number exponent, che esegue lo stesso tipo di calcolo.
  • round(number, digits): è simile alla funzione di Excel ARROTONDA. Il secondo argomento è facoltativo.
  • sqrt(number): è simile alla funzione di Excel Funzione RADQ.

Funzioni di testo

  • concat(text1, text2, ..., textN): valori di testo concatenati da text1 a textN.
  • contains(text, pattern): restituisce true (vero) se il testo contiene un'occorrenza del pattern.
  • endswith(text, pattern): restituisce true (vero) se il testo termina con un'occorrenza del pattern.
  • field(text, separator, index): restituisce l'Nesimo campo (indicizzato a partire da zero) in un valore di testo che contiene più sottostringhe, separate da un separatore specifico. Un esempio è: field("a-b-c-d-", "-", 2) == "c". Questa funzione mira a facilitare la lettura dei valori di parsing che sono stati concatenati all'interno di una singola colonna di una tabella.
  • field.r(text, separator, index): come la funzione field(), ma conta le occorrenze del separatore a partire da destra. Un esempio è field.r("a-b-c-d-", "-", 0) == "c".
  • indexof(text, pattern): restituisce l'indice della prima occorrenza del pattern all'interno del testo, o -1, se non vengono trovate occorrenze.
  • lowercase(text): restituisce il testo in lettere minuscole.
  • parsedate(text, format): converte il testo in data. Quando il formato è omesso, la data è analizzata sulla base della funzionalità di riconoscimento automatico del formato di data da parte di Envision. Se invece il formato è specificato, la data è analizzata sulla base del formato atteso. Vedere come personalizzare la stringa formato data per la sintassi dettagliata. Se la data non può essere analizzata, verrà invece restituita la data 2001-01-01.
  • parsenumber(text): converte il testo in un numero. L'analisi sfrutta la funzionalità di riconoscimento automatico del formato di data da parte di Envision. Se il numero non può essere analizzato, viene restituito il valore zero.
  • parsetime(text, format): converte un'ora del giorno in una frazione compresa tra 0 e 1, che rappresenta un giorno frazionario. Il formato è facoltativo: se non è specificato, verrà utilizzato il formato predefinito yyyy-MM-dd HH:mm:ss. Envision usa il formato di ora personalizzato .NET.
  • replace(text, pattern, replacement): sostituisce nel testo tutte le occorrenze del pattern con la sostituzione. La funzione è simile alla funzione di Excel SOSTITUISCI, senza l'argomento instance_num.
  • startswith(text, pattern): restituisce true (vero) se il testo inizia con un'occorrenza del pattern.
  • strlen(text): restituisce la lunghezza dell'argomento testo.
  • substr(text, start, count): la posizione iniziale è definita da start. Se negativa, controbilancia la fine della stringa; in caso contrario, controbilancia l'inizio della stringa.
    La lunghezza della sottostringa restituita è definita da count, trattata come 0 se count < 0. Se l'inizio del segmento o la lunghezza la spostano parzialmente o totalmente al di fuori della stringa (es. substr("A", 2, 1)), il segmento è regolato in modo da adattarsi. La funzione substr(text, start) è definita come substr(text, start, <infinity>).
  • uppercase(text): restituisce il testo in lettere maiuscole.

Funzioni calendario

  • "\{myDate:yyyy-MM-dd}": personalizza il formato delle date tramite interpolazione delle stringhe. Il formato della data è specificato dal token dopo i due punti. Vedere ulteriori dettagli sulle stringhe formato di data.
  • chineseYear(date): restituisce l'anno corrente nel calendario cinese.
  • chineseYearEnd(date): restituisce l'ultimo giorno dell'anno cinese corrente.
  • chineseYearStart(date): restituisce il primo giorno dell'anno cinese corrente.
  • date(y,m,d): restituisce una data costruita a partire da anno, mese e giorno passati come argomenti. Gli argomenti y, m e d devono essere numeri.
  • monday(date): restituisce il primo lunedì che precede la data D (compresa).
  • month(date): restituisce l'indice del mese associato alla data D, contando il numero dei mesi a partire dal 1° gennaio 2001.
  • monthnum(date): restituisce il mese applicabile (1-12) per la data passata come argomento.
  • today(timezone): restituisce la data corrente nel fuso orario passato come argomento ed esprime la differenza in ore rispetto al tempo coordinato universale (UTC).
  • year(date): restituisce l'anno applicabile alla data passata come argomento. Simile alla funzione di Excel ANNO.
  • yearStart(date): restituisce il primo giorno dell'anno per l'anno corrente.
  • yearEnd(date): restituisce l'ultimo giorno dell'anno per l'anno corrente.
  • weeknum(date): è simile alla funzione di Excel NUM.SETTIMANA (Sistema 2).

Funzioni di ordine

  • argfirst() by [Group] sort [Order]: restituisce true (vero) per il primo valore del gruppo secondo i valori ordinati (ordering). L'argomento gruppo (group) è facoltativo: quando è fornito, la funzione restituisce true (vero) una volta per ogni gruppo. Per maggiore comodità, è inoltre fornito un sovraccarico argfirst() by [Group] sort [Order] where condition. Quando è usata l'opzione where (dove), è possibile che nei gruppi non risulti alcun valore true (vero), poiché la condizione si rivela false (falsa) per l'intero gruppo.
  • arglast() by [Group] sort [Order]: come argfirst(), ma restituisce true (vero) per l'ultimo valore.
  • cumsum(N) by [Group] sort [Order]: restituisce la somma cumulativa dei valori N secondo i ranghi crescenti specificati. L'argomento gruppo (group), facoltativo, è usato per ottenere una somma cumulativa locale per ogni gruppo.
  • fifo(V, T.D, T.Q): aiuta l'analisi delle scorte con il metodo FIFO. Restituisce la quantità di scorte invendute come vettore di T. Il vettore V contiene le scorte totali. La tabella T contiene gli ordini di acquisto. T.D contiene le date, mentre T.Q contiene le quantità acquistate. La funzione calcola le quantità invendute ripercorrendo all'indietro nel tempo gli ordini di acquisto. Vedere anche il metodo di gestione del magazzino FIFO.
  • rank() by [Group] sort [Order]: è simile alla funzione di Excel EQ.RANGO, con la differenza che tutti i numeri hanno un rango distinto (in caso di parità, il rango è arbitrario). L'argomento gruppo (group) è facoltativo e viene usato per ottenere un rango locale per ogni gruppo.
  • rank(N, Group, S): è una funzione di ordine più avanzata, piuttosto diversa dagli altri sovraccarichi di tipo rank(). Scopo di questo sovraccarico è supportare la creazione di una lista di acquisti elencati per ordine di priorità. In particolare, rank(N, Group, S) non può essere riespressa come singola espressione di ordine e raggruppamento. Si tratta di un algoritmo imperativo in due fasi: nella prima fase, i valori sono raggruppati da Group in stack (pile), ognuna delle quali è ordinata per S ascendente; nella seconda fase, l'algoritmo seleziona il valore più elevato di N tra gli elementi più in alto tra tutte le stack, lo evidenzia, gli assegna un rango (partendo da 1) e ripete l'operazione fino a svuotare tutte le stack.
  • rankd() by [Group]: restituisce i ranghi dei numeri N; a numeri uguali corrispondono ranghi uguali. È simile alla funzione di Excel EQ.RANGO.

Funzioni per grafi

  • canonical(A, B): restituisce il rappresentante canonico per ogni valore di A. Da un punto di vista pratico, la funzione è usata per la sostituzione di codici (ad esempio, i codici delle SKU). Se per esempio abbiamo canonical(OldSku, NewSku), la funzione restituirà l'ultima SKU disponibile per ogni articolo, sostituendo ogni volta il codice vecchio con quello nuovo. Vedere anche nonCanonical().
  • nonCanonical(A, B): restituisce true (vero) quando non è possibile calcolare un rappresentante canonico per A, ossia quando sono rilevati percorsi circolari o salti condizionati.
  • connected(A, B, group): considera il grafo non orientato descritto da tutti i bordi (A,B), quindi restituisce per ogni nodo A il nome del più piccolo nodo del componente connesso ad A (per più piccolo intendiamo quello dal nome più breve confrontando le stringhe). Il gruppo è facoltativo: se specificato, il set di dati viene suddiviso per prima cosa nei gruppi specificati.

Funzioni di distribuzione

Vedere l'algebra delle distribuzioni.

Distribuzioni parametriche

Possono essere generate distribuzioni parametriche, ossia funzioni che sfruttano un numero come argomento (il parametro) e restituiscono una distribuzione.

  • dirac(n): restituisce una funzione a valore zero ovunque, eccetto che per n, dove il valore della funzione è 1.
  • identity(n): restituisce la funzione $\text{id}: k \to k$ limitatamente al segmento [0;n] e 0 altrove.
  • uniform(n): restituisce la funzione $\text{unif}: k \to 1$ limitatamente al segmento [0;n] e 0 altrove.
  • uniform(m, n): restituisce la funzione $\text{unif}: k \to 1$ limitatamente al segmento [m;n] e 0 altrove. Se $m - 1 = n$, la distribuzione uniform() restituisce una distribuzione zero.
  • uniform(D): restituisce la funzione $\text{unif}: k \to 1$ limitatamente al supporto della distribuzione D e 0 altrove.
  • poisson(lambda): restituisce la distribuzione di Poisson del parametro lambda ($\lambda$ in letteratura).
  • exponential(lambda): restituisce la distribuzione esponenziale del parametro lambda ($\lambda$ in letteratura).
  • negativebinomial(mu, sigma): restituisce la distribuzione di Pascal della media mu e della deviazione standard sigma. Se la deviazione standard è inferiore alla media, restituisce invece una distribuzione di Poisson della media mu.
  • ranvar.uniform(n): restituisce la distribuzione rappresentata dalla funzione $k \to \frac{1}{|n| + 1}$ sul segmento [0;n] (se $n \geq 0$) o [n;0] (se $n < 0$), e 0 altrove.
  • ranvar.uniform(m, n): restituisce la distribuzione rappresentata dalla funzione $k \to \frac{1}{n + 1 - m}$ sul segmento [m;n] e 0 altrove. Ipotizziamo che $m < n$; se $m > n$, viene restituito un errore.

Distribuzioni non parametriche

  • distrib(Id, G.Probability, G.Min, G.Max): funzione che restituisce la distribuzione definita da una lista di bucket, in cui ogni bucket ha limiti inclusivi a destra e a sinistra e a ogni bucket corrisponde un valore.
  • ranvar(T.X): aggregatore che restituisce la distribuzione empirica che risulta dalle osservazioni ottenute dal vettore T.X.
  • ranvar.segment(...): funzione avanzata che genera una distribuzione empirica risultante da una finestra temporale scorrevole (ulteriori dettagli più avanti).

Funzioni avanzate

cumsub(G.Item, G.Stock, G.Quantity, G.Rank)

Considera 4 vettori appartenenti a una tabella a griglia dove:
  • G.Item è l'identificatore dell'articolo (tutte le righe che condividono lo stesso valore appartengono allo stesso articolo);
  • G.Stock indica le scorte iniziali dell'articolo (tutte le righe che appartengono allo stesso articolo dovranno avere lo stesso valore di G.Stock);
  • G.Quantity è la quantità di articolo richiesta per l'acquisto della riga della griglia;
  • G.Rank è un identificatore di assemblaggio (tutte le righe che condividono lo stesso identificatore di assemblaggio appartengono allo stesso assemblaggio; non è possibile avere due righe con la stessa coppia (G.Item, G.Rank), e tutti gli assemblaggi sono ordinati per rango crescente).

La funzione cumsub() esplora tutti gli assemblaggi per rango crescente, tenendo traccia delle scorte rimanenti per ognuno di essi. Tali scorte sono definite dapprima attraverso il vettore G.Stock. Per ogni assemblaggio, la funzione determina se le scorte rimanenti sono sufficienti per acquistare tutte le righe della griglia corrispondenti all'assemblaggio, a seconda che le scorte superino o meno G.Quantity. Se le scorte superano G.Quantity, allora la funzione riduce le scorte per ogni articolo e scrive in ogni riga della griglia le scorte rimanenti corrispondenti. Se non vi sono abbastanza scorte per servire l'intero assemblaggio (di solito perché uno degli articoli è esaurito), allora la funzione non aggiorna le scorte rimanenti e assegna a ogni riga il valore -(S+1) (dove S rappresenta le scorte rimanenti per l'articolo in quel preciso momento), per indicare sia che la riga della griglia non è acquistata (verifica se G.S < 0), sia se è stata proprio quella riga a fare in modo che l'assemblaggio non venisse acquistato (verifica se G.Quantity + G.S + 1 > 0 e di quanto (G.Missing = G.Quantity + G.S + 1).

forex(value, Origin, Destination, date)

Restituisce l'importo espresso nella valuta di origine Origin nell'importo equivalente nella valuta di destinazione Destination secondo i tassi storici a una data specifica. Le valute vanno indicate con il corrispondente codice di tre lettere internazionale. Lokad supporta circa 30 valute, sulla base dei dati forniti dalla Banca Centrale Europea. I tassi di cambio vengono aggiornati quotidianamente. Vedere anche isCurrency() per verificare che il codice inserito sia corretto.

hash(value)

Restituisce un valore hash pseudo-iniettivo tra 0 e 2^24-1. Questa funzione è usata per mescolare in modo casuale un set di dati, applicando un algoritmo di hash al contenuto di una colonna e riordinando poi i dati secondo i valori hash corrispondenti.

isCurrency(currencyCode)

Restituisce true (vero) se il testo passato come argomento è un codice valuta riconosciuto dalla funzione forex().

mkuid(X, offset)

Restituisce un numero unico, mantenuto per tutte le esecuzioni di Envision. Questa funzione mira a identificare in modo univoco i risultati calcolati da Lokad. Ad esempio, può essere usata per generare un numero di ordine d'acquisto univoco, da incrementare ogni volta che lo script Envision viene eseguito di nuovo.

Il vettore X è ignorato, ma l'UID (identificatore univoco) è generato come scalare nella tabella associata a X. Il valore offset è uno scalare facoltativo, che rappresenta il suffisso di partenza per l'UID. Le stringhe generate sono numeri in formato PPPPPPPAAA, dove P è un numero di pagina (non comincia quindi per 0) ed è tassativamente incrementale, mentre A è un contatore incrementale che parte dal valore offset (o da 0, se non è specificato alcun parametro offset). P ha almeno 7 cifre, mentre A ne ha almeno 3.

L'UID ha tre proprietà:
  1. tutti gli UID possono essere analizzati come numeri, ognuno dei quali sarà diverso dagli altri. Occorre sottolineare, però, che gli UID contano almeno 10 cifre o anche più, se ogni chiamata deve generarne più di 1000;
  2. un UID generato nel momento T è rigorosamente inferiore (in ordine alfabetico) rispetto a un UID generato nel momento T' > T;
  3. se tutte le chiamate generano numeri simili di UID (meno di 999, oppure tra 1000 e 9999, ecc.), allora la proprietà precedente è vera anche per l'ordine numerico tra i vari UID.

solve.moq( ... )

Solutore numerico avanzato per il problema generale del quantitativo minimo d'ordine (o MOQ, dall'inglese Minimal Order Quantities).

pricebrk(D, P, Prices.MinQ, Prices.P, Stock, StockP)

Restituisce la distribuzione del prezzo unitario di acquisto con margine. Vedere Sconti per grandi quantitativi.

priopack(V, MaxV, JT, B) by [Group] sort [Order]

Si tratta di una semplice variante del problema bin packing, da usare nelle liste di priorità degli acquisti. A differenza dell'algoritmo bin packing tradizionale, con questa funzione cerchiamo non solo di ottimizzare le capacità del contenitore, ma anche di preservare il più possibile l'ordine delle unità.
  • V è il volume di ogni riga.
  • MaxV è il volume massimo contenibile, il cui valore è omogeneo rispetto a V e si presuppone costante in tutta la classe Group.
  • JT è la soglia di salto, il cui valore è omogeneo rispetto a V e si presuppone sia un multiplo minore del valore Group.
  • B è un argomento facoltativo interpretato come barriera; se questo valore viene specificato, l'algoritmo bin packing non è autorizzato a riordinare le righe al di sotto della classe definita da B.
  • Group è la classe di equivalenza dei fornitori, dove il bin packing è calcolato per fornitore.
  • Order contiene i ranghi delle righe da inserire all'interno di un contenitore.

ranvar.segment(...)

Questa funzione di chiamata è pensata per convertire le serie temporali in distribuzioni di probabilità raccogliendo osservazioni sulle finestre mobili.
D = ranvar.segment(
start: Items.Start // prima data (inclusa) per ogni articolo
end: Items.End // ultima data (inclusa) per ogni articolo
step: Items.Step // numero, intervallo tra le osservazioni giornaliere
horizon: Items.Horizon // numero, lunghezza del periodo per ogni articolo espressa in giorni
date: Orders.Date // data per ogni evento
quantity: Orders.Quantity) // quantità per ogni evento
Per ogni articolo, la funzione calcola la distribuzione della somma delle quantità dell'evento per periodi con un orizzonte compreso interamente tra la prima e l'ultima data indicate per l'articolo. Ad esempio, se la prima data è il 1° gennaio, l'ultima data il 7 gennaio, l'orizzonte è di 3 giorni e abbiamo un solo evento di quantità 5 il 2 gennaio, i periodi osservati sono i seguenti:

  • 1-3 gennaio: Q = 5
  • 2-4 gennaio: Q = 5
  • 3-5 gennaio: Q = 5
  • 4-6 gennaio: Q = 0
  • 5-7 gennaio: Q = 0

La distribuzione risultante è quindi 40% Q = 0, 60% Q = 5.

smudge(values, present) by [Group] sort [Order]

Prende un vettore incompleto di valori (values) e un vettore booleano che determina dove sono presenti i valori validi. Restituisce un vettore completo di valori validi, completato distribuendo i valori validi in quelli non validi. Più precisamente, il vettore risultante viene costituito passando in rassegna ogni riga, gruppo per gruppo (se è presente un argomento Group), seguendo un ordine (Order) crescente e sostituendo ogni valore non valido con l'ultimo valore osservato, oppure con un valore predefinito se nel gruppo non è stato ancora osservato un valore valido.

stockrwd.m (D, AM), stockrwd.s(D), stockrwd.c(D, AC)

Sono le funzioni di rendimento delle scorte, usate per creare una politica di riordino per priorità a partire dalle previsioni probabilistiche prodotte da Lokad.