Esempio LUA: 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

Iniziamo con la visualizzazione del form per la selezione dei parametri

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.