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.