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.