Travaillant au ressources humaines, j'ai mis en place ce petit programme qui gère les heures de D.I.F (Droit individuelle à la formation).
J'ai développé ce programme sous ACCESS en VBA. Il est scindé en deux fonctions (moi, je l'ai aient dans deux modules différent, mais c'est pas obligatoire), la premiere fait une boucle sur tous les salariés présent dans l'entreprise (Maj_Solde_Conges) et fait appel à la fonction (Solde_DIF) qui met à jour le champ correspondant au DIF dans la table locale.
Je vous laisse découvrir le prog. J'attend toutes critiques, elles sont toujours bonne pour progresser !
Source / Exemple :
Fonction n°1 :
Function Maj_Solde_Conges()
On Error GoTo err_conges
'******************************************************************************************
'******************************************************************************************
'**************************MISE A JOUR DES CONGES (Tbl_Registre)***************************
'******************************************************************************************
'******************************************************************************************
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Set cnn = CurrentProject.Connection
If MsgBox("Effectuer la mise à jour des congés ?", vbInformation + vbYesNo, "NetJoao") = vbYes Then
DoCmd.Hourglass True
'Personnel présent dans l'entreprise
rst.Open "SELECT MATRICULE, ANCIENNETE, ENTREE, NAISSANCE, CONTRAT FROM Tbl_Registre WHERE (([SORTIE]='') " & _
"AND (TYPEPAIE NOT IN ('Interimaires', 'Gardes')))", cnn
'Mise à jour
While Not rst.EOF
lngMatricule = rst.Fields(0)
'*****************Mise à jour Solde DIF**********************
Code_Abs = "DIF"
'Appel de la procédure de mise à jour
Call DIF.Solde_Dif
'Mise à jour table locale Registre du personnel identifié par un matricule
DoCmd.RunSQL "UPDATE Tbl_Registre " & _
"SET DIF='" & sngSolde & "' WHERE MATRICULE=" & lngMatricule
Debug.Print "Solde DIF : " & sngSolde & " h."
rst.MoveNext
Wend
Set cnn = Nothing
rst.Close
'**********************************************************************
DoCmd.Hourglass False
MsgBox "Fin de la mise à jour.", vbInformation, "NetJoao"
Else
Exit Function
End If
exit_err:
Exit Function
err_conges:
MsgBox Err.Number & " " & Err.Description, vbCritical, "NetJoao"
Resume exit_err
End Function
Fonction n° 2 :
Sub Solde_Dif()
'*********************************************
'********DROIT INDIVIDUEL A LA FORMATION******
'*********************************************
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim i As Integer
Dim sngDroits As Single
Dim sngAbsences As Single
Dim lngNbJour As Long
Set cnn = CurrentProject.Connection
'*********************
'*********Droits******
'*********************
sngDroits = 0
lngNbJour = 0
'Le calcul des droits sur l'année civile, incrément des droits (20h)
'au 31/12 de l'année
For i = Year(dteAnc) To Year(Now) - 1
'Plus d'un an de présence au 31/12/n
If DateDiff("m", dteAnc, "12/31/" & i) >= 12 Then
'Mise en place du DIF en 2005
'2004, car au 31/12/2004
Debug.Print "********Plus de 12 mois de présence dans l'entreprise********"
If i >= 2004 Then
If sngDroits = 120 Then
'Les droits sont limités à 120h.
sngDroits = 120
Else
sngDroits = (sngDroits + 20)
End If
End If
Debug.Print "Nombre d'heures acquises DIF : " & sngDroits & " h. - - Année: " & i
ElseIf DateDiff("m", dteAnc, "12/31/" & i) >= 4 Then
'Moins d'un an de présence
Debug.Print "**********Moins d'un an de présence**********"
lngNbJour = nbj_Calendaire(dteAnc, "12/31/" & i)
'Mise en place du DIF en 2005
'2004 car au 31/12/2004, incrément des jours
If i >= 2004 Then
sngDroits = (20 * lngNbJour) / _
(nbj_Calendaire("01/01/" & i, "12/31/" & i))
End If
Debug.Print "Nombre de jour de présence : " & lngNbJour & " j."
Debug.Print "Nombre d'heures acquises DIF : " & sngDroits & " h."
Else
sngDroits = 0
End If
Next
'***********************
'*********Absences******
'***********************
sngAbsences = 0
For i = 1 To 31
rst.Open "SELECT SUM(VAL" & i & ") FROM PANDORE_SALHISTT " & _
"WHERE INDIVIDU=" & lngMatricule & " AND RUB='11s0'", cnn, adOpenKeyset, adLockOptimistic
While Not rst.EOF
sngAbsences = sngAbsences + Nz(rst.Fields(0), 0)
rst.MoveNext
Wend
rst.Close
Next
Debug.Print "Total heures absence DIF : " & sngAbsences & " h. Individu : " & lngMatricule
'********************
'*********Solde******
'********************
sngSolde = 0
sngSolde = sngDroits - sngAbsences
sngSolde = format(sngSolde, "0.00")
Debug.Print "Solde heures DIF : " & sngSolde & " h."
End Sub
Conclusion :
L'actualisation du DIF est lancée une fois par mois, au moment de la paie.
De ce prog. en découle un état qui informe le salarié du solde DIF et autre car je gère aussi les congés (RTT,Ancienneté, CP).
J'attend tous vos commentaire pour améliorer le code...
Bonne prog.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.