Creare i mensili dai segna ore degli operatori

In questo esempio costruiremo un documento direttamente nel database. Ne creeremo uno per ogni nostro operatore e inseriremo le ore lavorate per un determinato mese. Vista l’operazione da eseguire, questo script è un’azione associata direttamente al programma.

Gruppo Script

Programma

Evento

Azione Programma


output.clear()

finestra = program.newdataform()

finestra.settitle("Scegliere il mese")

mesi = {"Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"}


meseattuale = utility.datemonth(utility.getnow())

annoattuale = utility.dateyear(utility.getnow())

meseattuales = null


if meseattuale == 1 then meseattuales = "Gennaio" end

if meseattuale == 2 then meseattuales = "Febbraio" end

if meseattuale == 3 then meseattuales = "Marzo" end

if meseattuale == 4 then meseattuales = "Aprile" end

if meseattuale == 5 then meseattuales = "Maggio" end

if meseattuale == 6 then meseattuales = "Giugno" end

if meseattuale == 7 then meseattuales = "Luglio" end

if meseattuale == 8 then meseattuales = "Agosto" end

if meseattuale == 9 then meseattuales = "Settembre" end

if meseattuale == 10 then meseattuales = "Ottobre" end

if meseattuale == 11 then meseattuales = "Novembre" end

if meseattuale == 12 then meseattuales = "Dicembre" end


finestra.addfieldlist("Mese","MESE",mesi,meseattuales)

finestra.addfieldinteger("Anno","ANNO",annoattuale)

finestra.show()


if finestra.closewithx == true then

do return end

end

Come prima cosa creiamo un dataform per richiedere all’utente quale mese e anno dovremmo analizzare. Per comodità imposterò noi i valori di default con il mese e l’anno corrente.

Nel caso in cui l’utente chiuda il dataform con la x, buona norma sarà bloccare l’esecuzione dello script.

tabella = database.getsql("SELECT * FROM segna_ore WHERE eli=0")

righe = tabella.getrows()

for i = 1,tabella.countrows() do

m = utility.datemonth(righe[i].getvalue("data"))

y = utility.dateyear(righe[i].getvalue("data"))

ope = righe[i].getvalue("gguid_operatore")

if m == meseattuale and y == annoattuale then

voto = false

for i,operatore in pairs(operatori) do

if operatore == ope then

voto = true

end

end

if voto == false then

table.insert(operatori,ope)

end

end

end

Recuperato il mese e l’anno da analizzare, iniziamo a girare la tabella Segna_ore per intercettare quali sono gli operatori che hanno lavorato in quel range di tempo. In questa fase salviamo solamente il gguid dell’operatore, poiché servirà per eseguire le ricerche sulle tabelle. Da qui avremo modo di sapere anche quanti documenti andremo a creare.

for i,operatore in pairs(operatori) do

nomeoperatore = ""

tariffaoraria = 0

toperatore = database.getsql("SELECT * FROM operatori WHERE gguid='" .. operatore .."' AND eli=0")

if toperatore.countrows() > 0 then

righeo = toperatore.getrows()

nomeoperatore = righeo[1].getvalue("nome")

tariffaoraria = righeo[1].getvalue("tariffa_oraria")

end

Iniziamo a girare tutti gli operatori e, come prima cosa, recuperiamo per ognuno il nome e la sua tariffa oraria.

Attenzione: il ciclo for non è chiuso perché devono essere aggiunte anche le successive parti dello script.

if nomeoperatore ~= "" then

--inizio a vedere se trovo un mensile con le caratteristiche richieste

gguidmese = ""

acconto = 0

tme = database.getsql("SELECT * FROM mensili

WHERE eli=0 and gguid_operatore='" ..operatore .. "' and mese='" .. meseattuales .. "' and anno=" .. tostring(annoattuale) .."")

if tme.countrows() == 0 then

--devo creare una scheda nuova

gguidmese = utility.gguid()

stringa = "INSERT INTO mensili(gguid,tid,eli,arc,ut, uta,exp,gguidp,ind,tap,dsp,dsc,dsq1,dsq2,utc,tidc,gguid_operatore,operatore,mese,anno, tariffa_oraria,data) VALUES ("stringa = stringa .. "'" .. gguidmese .. "'," .. tostring(utility.tid()) .. ",0,0,'','','',''," ..tostring(database.getind("mensili")) .. ",'','','',0,0,'',0,'" ..operatore .. "','" .. utility.convap(nomeoperatore) .. "','" .. meseattuales .."'," ..tostring(annoattuale) .. "," ..tostring(tariffaoraria) .. ",#" .. utility.formatdate(utility.getnow(),"yyyy-MM-dd") .. "#)"

database.setsql(stringa)

else

righe = tme.getrows()

gguidmese = righe[1].getvalue("gguid")

totale_acconto = righe[1].getvalue("totale_acconti")

--elimino le righe di dettaglio

database.setsql("DELETE * FROM mensili_rows WHERE gguidp='" .. gguidmese .. "'")

end


Prendiamo in considerazione solamente gli operatori che hanno un nome valido e successivamente vediamo se esiste un mensile per questo operatore con il mese e l’anno richiesto. Se non esiste lo creiamo, altrimenti recuperiamo quello precedente eliminando le righe al suo interno poiché poi andremo a ricrearle.

Da notare la stringa di creazione dove sono riportati tutti i campi di gestione di Nios4 e i campi propri della tabella. Si ricorda inoltre che per evitare malfunzionamenti occorre dare sempre un valore a tutti i campi visto che la condizione null non è gestita.

Attenzione: anche in questo caso l’if iniziale non è chiuso.

--comincio a leggere i rapportini

tabella = database.getsql("SELECT * FROM segna_ore WHERE eli=0 and gguid_operatore='" .. operatore .. "'")

totaleore = 0

righe = tabella.getrows()

for i = 1,tabella.countrows() do

m = utility.datemonth(righe[i].getvalue("data"))

y = utility.dateyear(righe[i].getvalue("data"))

ope = righe[i].getvalue("gguid_operatore")

if m == meseattuale and y == annoattuale then

--creo la riga e la salvo

gguidr = utility.gguid()

stringa = "INSERT INTO mensili_rows(gguid,tid,eli,arc,ut,uta,exp,gguidp,ind,tap,dsp,dsc,dsq1,dsq2,utc,tidc) VALUES ("stringa = stringa .. "'" .. gguidr .. "'," .. tostring(utility.tid()) .. ",0,0,'','','','" .. gguidmese .. "'," .. tostring(database.getind("mensili_rows")) .. ",'mensili','','',0,0,'',0)"

database.setsql(stringa)

--aggiungo i valori mancanti

stringa = "UPDATE mensili_rows SET data=#" .. utility.formatdate(righe[i].getvalue("data"),"yyyy-MM-dd") .. "#,"

stringa = stringa .. "gguid_cliente='" .. righe[i].getvalue("gguid_cliente") .. "', cliente='" .. utility.convap(righe[i].getvalue("cliente")) .. "',"

stringa = stringa .. "totale_ore=" .. utility.convi(righe[i].getvalue("totale_ore")) .. ","

stringa = stringa .. "lavori_effettuati='" .. utility.convap(righe[i].getvalue("lavori_effettuati")) .. "',"

stringa = stringa .. "sede='" .. utility.convap(righe[i].getvalue("sede")) .. "'"

stringa = stringa .. " WHERE gguid='" .. gguidr .. "'"

database.setsql(stringa)

totaleore = totaleore + righe[i].getvalue("totale_ore")

end

end

Ora che abbiamo creato o recuperato la testa del documento del nostro mensile, iniziamo a estrapolare le righe dal segna ore in base all’operatore. In questo caso vengono eseguite due query di scrittura per comodità: la prima imposta la nuova riga inserendo i valori per il programma, mentre la seconda inserisce i nostri dati.

--aggiorno la testa del mensile

totale_mensile = totaleore * tariffaoraria

saldo = totale_mensile – totale_acconto

stringa = "UPDATE mensili SET totale_mensile=" .. utility.convi(totale_mensile) .. ",totale_ore=" .. utility.convi(totaleore) .. ",saldo=".. utility.convi(saldo) .. " WHERE gguid='" .. gguidmese .."'" database.setsql(stringa)

end

end

program.refreshsection("mensili")


Dopo aver girato tutte le righe, aggiorniamo la testa del mensile inserendo il prezzo totale e quanto abbiamo già pagato all’operatore.

Chiudiamo la condizione if riguardante il nome dell’operatore e il ciclo for.

Come ultima cosa forziamo il programma ad aggiornare le sezioni che utilizzano la tabella mensili per mostrare i documenti creati.