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.