Créer les mensuels à partir des marqueurs heures des opérateurs

Dans cet exemple nous allons construire un document directement dans la base de données. Nous en créerons un pour chaque opérateur et nous insérerons les heures travaillées pour un certain mois. Vue l’opération a effectuer, ce script est une action associée directement au logiciel.

Groupe ScriptÉvénement
ProgrammeAction Programme
output.clear()
dataform = program.newdataform()
dataform.settitle("Select month")
months = {"January","February","March","April","May","June","July","August","September","October","November","December"}

actualmonth = utility.datemonth(utility.getnow())
actualyear = utility.dateyear(utility.getnow())
actualmonths = null

if actualmonth == 1 then actualmonth = "January" end
if actualmonth == 2 then actualmonth = "February" end
if actualmonth == 3 then actualmonth = "March" end
if actualmonth == 4 then actualmonth = "April" end
if actualmonth == 5 then actualmonth = "May" end
if actualmonth == 6 then actualmonth = "June" end
if actualmonth == 7 then actualmonth = "July" end
if actualmonth == 8 then actualmonth = "August" end
if actualmonth == 9 then actualmonth = "September" end
if actualmonth == 10 then actualmonth = "October" end
if actualmonth == 11 then actualmonth = "November" end
if actualmonth == 12 then actualmonth = "December" end

dataform.addfieldlist("Month","MONTH",months,actualmonths)
dataform.addfieldinteger("Year","YEAR",actualyear)
dataform.show()

if dataform.closewithx == true then
        do return end
end

D’abord nous créons un dataform pour demander à l’utilisateur quel mois et année on devrait analyser. Pour plus de commodité, nous définirons les valeurs par défaut avec le mois et l’année en cours.

Au cas où l’utilisateur ferme le dataform avec la x, bonne règle sera de bloquer l’exécution du script.

table_rows = database.getsql("SELECT * FROM work_hour WHERE eli=0")
rows = table_rows.getrows()
for i = 1,table_rows.countrows() do
        m = utility.datemonth(rows[i].getvalue("date"))
        y = utility.dateyear(rows[i].getvalue("date"))
        wrk = rows[i].getvalue("gguid_worker")
        if m == actualmonth and y == actualyear then
               vote = false
               for i,worker in pairs(workers) do
                       if worker == wrk then
                               vote = true
                       end
               end
               if vote == false then
                       table.insert(worker,wrk)
               end
        end
end

Une fois récupéré le mois et l’année à analyser, nous commençons à tourner le tableau work_hour pour intercepter quels sont les opérateurs qui ont travaillé dans ce laps de temps. Dans cette phase nous enregistrons seulement le gguid de l’opérateur, puisqu’il servira pour effectuer les recherches sur les tableaux. D’ici, nous saurons combien de documents nous allons créer.

for i,worker in pairs(workers) do
        workername = ""
        hourlyrate = 0
        tworker    = database.getsql("SELECT * FROM workers WHERE gguid='" .. worker .."' AND eli=0")
        if tworker.countrows() > 0 then
               rowso = tworker.getrows()
               workername = rowso[1].getvalue("name")
               hourlyrate = rowso[1].getvalue("hourly_rate")
        end

Nous commençons à tourner tous les opérateurs et, en premier lieu, nous récupérons pour chacun le nom et son tarif horaire.

Attention : le cycle for n’est pas fermé parce que les parties ultérieures du script doivent également être ajoutées.

if workername ~= "" then
        -- start to see if I find a monthly with the required characteristics
        gguidmonth = ""
        account   = 0
        tme = database.getsql("SELECT * FROM monthly
        WHERE eli=0 and gguid_worker='" ..worker .. "' and month='" .. actualmonths .. "' and year=" .. tostring(actualyear) .."")
        if tme.countrows() == 0 then
               --I have to create a new card
               gguidmonth = utility.gguid()
               sql   = "INSERT INTO monthly(gguid,tid,eli,arc,ut, uta,exp,gguidp,ind,tap,dsp,dsc,dsq1,dsq2,utc,tidc,gguid_worker,workername,[month],[year], hourly_rate,date) VALUES ("sql   = sql .. "'" ..  gguidmonth .. "'," .. tostring(utility.tid()) .. ",0,0,'','','',''," ..tostring(database.getind("monthly")) .. ",'','','',0,0,'',0,'" ..worker .. "','" .. utility.convap(workername) .. "','" .. actualmonths .."'," ..tostring(actualyear) .. "," ..tostring(hourlyrate) .. ",#" .. utility.formatdate(utility.getnow(),"yyyy-MM-dd") .. "#)"
               database.setsql(sql)
        else
               rows = tme.getrows()
               gguidmonth = rows[1].getvalue("gguid")
              total_account = rows[1].getvalue("total_account")
               --I eliminate the detail lines
               database.setsql("DELETE * FROM monthly_rows WHERE gguidp='"  .. gguidmonth .. "'")
        end

Nous ne prenons en considération seulement les opérateurs qui ont un nom valide et après nous voyons s’il existe un mensuel pour cet opérateur avec le mois et l’année requis. S’il n’existe pas nous le créons, sinon nous le récupérons le précédent en supprimant les lignes à l’intérieur, car nous allons ensuite les recréer.

Veuillez noter la chaîne de création où sont indiqués tous les champs de gestion de Nios4 et les champs propres au tableau. En plus n’oubliez pas que pour éviter des dysfonctionnements il est nécessaire de donner toujours une valeur à tous les champs, car la condition null n’est pas gérée.

Attention: dans ce cas également le if initial c’est pas fermé.

--I begin to read the reports
table_rows = database.getsql("SELECT * FROM work_hour WHERE eli=0 and gguid_worker='" .. worker .. "'")
totalhour = 0
rows = table_rows.getrows()
for i = 1,table_rows.countrows() do
        m = utility.datemonth(rows[i].getvalue("date"))
        y = utility.dateyear(rows[i].getvalue("date"))
        wrk = rows[i].getvalue("gguid_worker")
        if m == actualmonth and y == actualyear then
               - I create the row and save it
               gguidr  = utility.gguid()
               sql = "INSERT INTO monthly_rows(gguid,tid,eli,arc,ut,uta,exp,gguidp,ind,tap,dsp,dsc,dsq1,dsq2,utc,tidc)  VALUES ("sql = sql .. "'" .. gguidr .. "'," ..  tostring(utility.tid()) .. ",0,0,'','','','" .. gguidmonth .. "'," .. tostring(database.getind("monthly_rows")) .. ",'monthly','','',0,0,'',0)"
               database.setsql(sql)
               - add the missing values
               sql = "UPDATE monthly_rows SET date=#" .. utility.formatdate(rows[i].getvalue("date"),"yyyy-MM-dd") .. "#,"
               sql = sql .. "gguid_customer='" .. rows[i].getvalue("gguid_customer") .. "', customer='" .. utility.convap(rows[i].getvalue("customer")) .. "',"
               sql = sql .. "total_hour=" .. utility.convi(rows[i].getvalue("total_hour")) .. ","
               sql = sql .. "work_done=" .. utility.convap(rows[i].getvalue("work_done")) .. "',"
               sql = sql .. "site='" .. utility.convap(rows[i].getvalue("site")) .. "'"
               sql = sql .. " WHERE gguid='" .. gguidr .. "'"
               database.setsql(sql)
               totalhour = totalhour +                rows[i].getvalue("total_hour")
        end
end

Maintenant que nous avons créée ou récupérée la tête du document de notre mensuel, nous commençons à extrapoler les lignes du compteur horaire en fonction de l’opérateur. Dans ce cas deux requêtes d’écriture sont exécutées pour plus de commodité: la première définit la nouvelle ligne en saisissant les valeurs pour le programme, tandis que la deuxième saisit nos données.

               -- update the head of the monthly
               total_month = totalhour * hourlyrate
              balance = total_month– total_account
               sql = "UPDATE monthly SET total_month=" ..  utility.convi(total_month) ..  ",total_hour=" .. utility.convi(totalhour) .. ",balance=".. utility.convi(balance)  .. " WHERE gguid='" .. gguidmonth .."'" database.setsql(sql)
        end
end
program.refreshsection("monthly")

Après avoir tourné toutes les lignes, nous mettons à jour la tête du mensuel en saisissant le prix total et ce que nous avons déjà payé à l’opérateur.

Nous terminons la condition if concernant le nom de l’opérateur et le cycle for.

Enfin nous forçons le programme pour mettre à jour les sections qu’utilisent le tableau de mensuels pour montrer les documents créés.