Gestion du d.i.f -- vba

Contenu du snippet

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.

A voir également

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.