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
Programme
Événement
Action 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.