Mettre à jour les prix des nomenclatures

Dans cet exemple nous voyons comment recalculer les prix des articles à partir de leur nomenclatures. En pratique ne modifiant le prix d’un article nous pourrons voir dans quelles nomenclatures se trouve et à partir de là nous allons recalculer les prix des articles père

Groupe ScriptÉvénement
FicheAprès Enregistrement

Nous voyons donc comment utiliser une fonction récursive, c’est-à-dire une fonction qui se rappelle pour calculer tous les niveaux de la nomenclature de chaque article passé.

Le script sera à connecter à l’après-enregistrement de l’article.

function calculate(gfather)
        --extract the bill of materials and recover the
        prices and the costs
 
        tfather = database.getsql("SELECT * FROM
        billmaterials_dn WHERE gguidp='" .. gfather .."'")
        nrowsp = tfather.countrows()
        rowsp = tfather.getrows()
        finalprice = 0
        finalcost = 0
 
        for i = 1,nrowsp do
               finalprice = finalprice + rowsp[i].getvalue("total_price")
               finalcost  = finalcost + rowsp[i].getvalue("total_cost")
        end


        database.setsql("UPDATE items SET update=1,cost=" .. utility.formatnum(finalcost,2) ..",price=" .. utility.formatnum(finalprice,2) ..  " WHERE gguid='" .. gfather .. "'")
        database.setsql("UPDATE items SET tid=" .. tostring(utility.tid()) .. " WHERE gguid='" .. gfather .. "'")
 
        database.addsyncbox("items",gfather)
 
        - check if this is not a child of someone else, if you then start at calculate the other fathers
 
        tfathers = database.getsql("SELECT * FROM billmaterials_dn WHERE gguid_code_dn='" .. gfather .. "'")


        nrowsfathers = tfathers.countrows()
        rowsfathers = tfathers.getrows()
        - Update the prices and costs if the object is used as a son on other lists


        sprice = utility.formatnum(finalprice,2)
        scost = utility.formatnum(finalcost,2)


        gguidfathers = {}
 
        for i = 1,nrowsfathers do
               database.setsql("UPDATE billmaterials_dn SET cost=" .. scost  .. ",price=" .. sprice ..  " WHERE gguid='" .. rowsfathers[i].getvalue("gguid") .. "'")
 
               database.setsql("UPDATE billmaterials_dn SET total_cost=cost * qty_dn,total_price=price * qty_dn WHERE gguid='" .. rowsfathers[i].getvalue("gguid") .. "'")
 
               database.setsql("UPDATE billmaterials_dn SET tid=" ..
               tostring(utility.tid()) " WHERE gguid='" .. rowsfathers[i].getvalue("gguid") .. "'")
 
               database.addsyncbox("billmaterials_dn", rowsfathers[i].getvalue("gguid"))
 
               -- extract the fathers' gguids
               table.insert(gguidfathers, rowsfathers[i].getvalue("gguidp"))
        end
 
        -- I proceed to recursively process the items
        for i,gp in pairs(gguidfathers) do
               calculate(gp)
        end


end

D’abord nous écrivons la fonction récursive qui prend en compte le gguid de l’article à mettre à jour comme paramètre d’entrée. Le tableau de la nomenclature est ainsi récupérée, son prix est recalculé et actualisé. Pendant la mise à jour nous récupérons les gguid des articles qui le reprennent à l’intérieur de leurs nomenclatures et, comme on peut voir, reprennent la même fonction en créant ainsi la récursivité.

En pratique le système actualise l’article à partir du niveau le plus bas (donné toujours de l’article que nous avons modifié au début) et après recalcule ensuite tous ses pères.

price = dataview.getvalue("price")
cost = dataview.getvalue("cost")
gguid = dataview.getvalue("gguid")
sprice = utility.formatnum(price,2)
scost = utility.formatnum(cost,2)
-- extrapol where the article is used and
update the price and the cost
 
tlist = database.getsql("SELECT * FROM billmaterials_dn WHERE gguid_code_dn='" .. gguid .."'")
nrows = tlist.countrows()
rows = tlist.getrows()
gguidfathers = {}
for i = 1,nrows do
 
       database.setsql("UPDATE billmaterials_dn SET cost=" .. scost .. ",price=" .. sprice ..  " WHERE gguid='" .. rows[i].getvalue("gguid") .. "'")
 
       database.setsql("UPDATE billmaterials_dn SET total_cost=cost * qty_dn,total_price=price * qty_dn WHERE gguid='" ..  rows[i].getvalue("gguid") .. 
        "'")
 
       database.setsql("UPDATE billmaterials_dn SET tid=" .. tostring(utility.tid()) .. " WHERE gguid='" .. rows[i].getvalue("gguid") .. "'")


        database.addsyncbox("billmaterials_dn", rows[i].getvalue("gguid"))
 
       -- extract the fathers' gguids
       table.insert(gguidfathers,rows[i].getvalue("gguidp"))
end
 
-- I proceed to recursively process the itemsfor i,gp in pairs(gguidfathers) do
       calcolate(gp)
end
 
program.refreshsection("items")

Dans cette partie du script, celle effectivement lancée par le programme, nous récupérons les informations de l’article et nous mettons à jour les prix et les coûts où ce dernier est repris à l’intérieur des nomenclatures. De cette façon il sera possible de récupérer les gguid des pères qui seront ensuite transférés à la fonction Calcolate. De là pour chaque père la fonction remontera la chaîne des articles en garantissant que la modification apportée par l’article initial soit transposée dans toutes les nomenclatures et donc dans tous les prix et coûts des articles qui directement, ou indirectement, le rappellent.