Actualizarea preturilor listei de materiale

In acest exemplu vom vedea cum sa recalculam preturile articolelor pornind de la lista de materiale. In practica, schimband pretul unui articol, vom putea vedea in ce liste de materiale se afla si de acolo vom recalcula preturile articolelor parinte.

Grup ScriptEveniment
FisaSalvare ulterioara

Deci, sa vedem cum sa utilizam o functie recursiva adica, o functie care se recheama pe ea insasi, pentu a putea calcula toate nivelurile listei de materiale din fiecare articol trecut.

Script-ul va fi legat de salvarea ulterioara a articolului.

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("costo_totale")
        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 someone else child, if yes then I start calculating 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

Mai intai scriem functiunea recursiva care considera gguid-ul articolului de actualizat ca si parametru de intrare. Astfel, este recuperat tabelul listei de materiale, pretul acesteia este recalculat si actualizat. In timpul actualizarii, preluam gguidurile articolelor care-l contin in cadrul listelor de materiale si, dupa cum se observa, apelam aceeasi functie creand astfel recursivitatea.

De fapt, sistemul actualizeaza articolul de la nivelul inferior (dat intotdeauna de articolul pe care l-am modificat noi la inceput) si apoi recalculeaza toti parintii sai.

price = dataview.getvalue("price")
cost = dataview.getvalue("cost")
gguid = dataview.getvalue("gguid")
sprice = utility.formatnum(price,2)
scost = utility.formatnum(cost,2)
- extrapolate 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")

In aceasta parte a script-ului, aceea lansata efectiv de program, recuperam informatiile articolului si actualizam preturile si costurile acolo unde acesta este regasit in cadrul listelor de materiale. In acest fel va fi posibila preluarea gguid-urilor parintilor care vor fi apoi trecute la functiunea Calculeaza. De acolo, pentru fiecare parinte, functiunea va urca lantul de articole garantand ca modificarea facuta de articolul initial este preluata de toate listele de materiale si, prin urmare, de preturile si costurile articolelor care direct sau indirect o recheama.