Aggiornare i prezzi delle distinte basi
In questo esempio vedremo come ricalcolare i prezzi degli articoli partendo dalla loro distinta base. In pratica modificando il prezzo di un articolo potremo vedere in quali distinte basi si trova e da lì ricalcoleremo i prezzi degli articoli padre.
Gruppo Script
Scheda
Evento
Post Salvataggio
Vediamo quindi come utilizzare una funzione ricorsiva, ossia una funziona che richiama se stessa per poter calcolare tutti i livelli della distinta base di ogni singolo articolo passato.
Lo script sarà da collegare al post salvataggio dell’articolo.
function calcola(gpadre)
--estrapolo la distinta base e recupero i
prezzi e i costi
tpadre = database.getsql("SELECT * FROM
distintabase_dn WHERE gguidp='" .. gpadre .."'")
nrighep = tpadre.countrows()
righep = tpadre.getrows()
prezzofinale = 0
costofinale = 0
for i = 1,nrighep do
prezzofinale = prezzofinale + righep[i].getvalue("prezzo_totale")
costofinale = costofinale + righep[i].getvalue("costo_totale")
end
database.setsql("UPDATE articoli SET aggiornato=1,costo=" .. utility.formatnum(costofinale,2) ..",prezzo=" .. utility.formatnum(prezzofinale,2) .. " WHERE gguid='" .. gpadre .. "'")
database.setsql("UPDATE articoli SET tid=" .. tostring(utility.tid()) .. " WHERE gguid='" .. gpadre .. "'")
database.addsyncbox("articoli",gpadre)
--controllo se questo non è un figlio di qualcun'altro, se si allora inizio a calcolare gli altri padri
tpadri = database.getsql("SELECT * FROM distintabase_dn WHERE gguid_codice_dn='" .. gpadre .. "'")
nrighepadri = tpadri.countrows()
righepadri = tpadri.getrows()
--aggiorno i prezzi e i costi se l'oggetto è usato come figlio su altre distinte
sprezzo = utility.formatnum(prezzofinale,2)
scosto = utility.formatnum(costofinale,2)
gguidpadri = {}
for i = 1,nrighepadri do
database.setsql("UPDATE distintabase_dn SET costo=" .. scosto .. ",prezzo=" .. sprezzo .. " WHERE gguid='" .. righepadri[i].getvalue("gguid") .. "'")
database.setsql("UPDATE distintabase_dn SET costo_totale=costo * qta_dn,prezzo_totale=prezzo * qta_dn WHERE gguid='" .. righepadri[i].getvalue("gguid") .. "'")
database.setsql("UPDATE distintabase_dn SET tid=" ..
tostring(utility.tid()) .. " WHERE gguid='" .. righepadri[i].getvalue("gguid") .. "'")
database.addsyncbox("distintabase_dn", righepadri[i].getvalue("gguid"))
--estrapolo i gguid dei padri
table.insert(gguidpadri, righepadri[i].getvalue("gguidp"))
end
--procedo a elaborare ricorsivamente gli articoli
for i,gp in pairs(gguidpadri) do
calcola(gp)
end
end
Per prima cosa scriviamo la funzione ricorsiva che considera il gguid dell’articolo da aggiornare come parametro di entrata. Viene così recuperata la tabella della distinta base, ricalcolato il suo prezzo e aggiornato. Durante l’aggiornamento recuperiamo i gguid degli articoli che lo riprendono all’interno delle loro distinte base e, come si può vedere, richiamiamo la stessa funzione creando così la ricorsività.
In pratica il sistema aggiorna l’articolo dal livello sempre più basso (dato sempre dall’articolo che abbiamo modificato noi in partenza) e poi a ritroso ricalcola tutti i suoi padri.
prezzo = dataview.getvalue("prezzo")
costo = dataview.getvalue("costo")
gguid = dataview.getvalue("gguid")
sprezzo = utility.formatnum(prezzo,2)
scosto = utility.formatnum(costo,2)
--estrapolo dove viene utilizzato l'articolo e
aggiorno il prezzo e il costo
tdistinta = database.getsql("SELECT * FROM distintabase_dn WHERE gguid_codice_dn='" .. gguid .."'")
nrighe = tdistinta.countrows()
righe = tdistinta.getrows()
gguidpadri = {}
for i = 1,nrighe do
database.setsql("UPDATE distintabase_dn SET costo=" .. scosto .. ",prezzo=" .. sprezzo .. " WHERE gguid='" .. righe[i].getvalue("gguid") .. "'")
database.setsql("UPDATE distintabase_dn SET costo_totale=costo * qta_dn,prezzo_totale=prezzo * qta_dn WHERE gguid='" .. righe[i].getvalue("gguid") ..
"'")
database.setsql("UPDATE distintabase_dn SET tid=" .. tostring(utility.tid()) .. " WHERE gguid='" .. righe[i].getvalue("gguid") .. "'")
database.addsyncbox("distintabase_dn", righe[i].getvalue("gguid"))
--estrapolo i gguid dei padri
table.insert(gguidpadri,righe[i].getvalue("gguidp"))
end
--procedo a elaborare ricorsivamente gli articolifor i,gp in pairs(gguidpadri) do
calcola(gp)
end
program.refreshsection("articoli")
In questa parte dello script, quella effettivamente lanciata dal programma, recuperiamo le informazioni dell’articolo e aggiorniamo i prezzi e i costi dove quest’ultimo viene richiamato all’interno delle distinte base. In questo modo sarà possibile recuperare i gguid dei padri che andranno poi passati alla funzione Calcola. Da lì per ogni padre la funzione risalirà la catena degli articoli garantendo che la modifica fatta dall’articolo iniziale sia recepita da tutte le distinte basi e quindi dai prezzi e dai costi degli articoli che direttamente, o indirettamente, lo richiamano.