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 ScriptEvento
SchedaPost 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.