IV. L'étude de cas ▲
Nous souhaitons écrire une application .NET permettant à un utilisateur de faire des simulations de calcul de la paie des assistantes maternelles de l'association " Maison de la petite enfance " d'une commune. Nous nous intéresserons autant à l'organisation du code DotNet de l'application qu'au code lui-même.
IV-A. La base de données ▲
Les données statiques utiles pour construire la fiche de paie sont placées dans une base de données SQL Server Express nommée dbpam (pam=Paie Assistante Maternelle). Cette base a un administrateur appelé sa ayant le mot de passe msde.
La base a trois tables, EMPLOYES, COTISATIONS et INDEMNITES, dont la structure est la suivante :
Table EMPLOYES : rassemble des informations sur les différentes assistantes maternelles
Structure :
Son contenu pourrait être le suivant :
Table COTISATIONS : rassemble les taux des cotisations sociales prélevées sur le salaire
Structure :
Son contenu pourrait être le suivant :
Les taux des cotisations sociales sont indépendants du salarié. La table précédente n'a qu'une ligne.
Table INDEMNITES : rassemble les différentes indemnités dépendant de l'indice de l'employé
Son contenu pourrait être le suivant :
On notera que les indemnités peuvent varier d'une assistante maternelle à une autre. Elles sont en effet associées à une assistante maternelle précise via l'indice de traitement de celle-ci. Ainsi Mme Marie Jouveinal qui a un indice de traitement de 2 (table EMPLOYES) a un salaire horaire de 2,1 euros (table INDEMNITES).
Les relations entre les trois tables sont les suivantes :
Il y a une relation de clé étrangère entre la colonne EMPLOYES(INDICE) et la colonne INDEMNITES(INDICE).
La base de données [dbpam] ainsi créée donne naissance à deux fichiers dans le dossier de SQL Server Express :
Les fichiers [dbpam.mdf, dbpam_log.ldf] peuvent être transportés sur une autre machine et être réattachés au SGBD SQL Server Express de cette machine. Voici comment procéder :
- les fichiers de la BD [dbpam] sont dupliqués dans un dossier
- on lance SQL Server Express
- avec le client SQL Server Management Studio Express, on attache le fichier [dbpam.mdf] au SGBD :
- clic droit sur [Databases] / Attach
- choix du fichier [dbpam.mdf] via un bouton [Add] non représenté
- le fichier attaché va donner naissance à une BD qui ne doit pas déjà exister. Ici, dans le champ [Attach As] on a donné le nom [dbpam2] à la nouvelle BD.
- on voit la nouvelle BD et ses tables
Cette technique de l'attachement d'une BD est utile pour transporter une BD d'un poste à un autre et nous l'utiliserons parfois ici.
IV-B. Mode de calcul du salaire d'une assistante maternelle▲
Nous présentons maintenant le mode de calcul du salaire mensuel d'une assistante maternelle. Nous prenons pour exemple, le salaire de Mme Marie Jouveinal qui a travaillé 150 h sur 20 jours pendant le mois à payer.
Les éléments suivants sont pris en compte : | [TOTALHEURES]: total des heures travaillées dans le mois [TOTALJOURS]: total des jours travaillés dans le mois |
[TOTALHEURES]=150 [TOTALJOURS]= 20 |
Le salaire de base de l'assistante maternelle est donné par la formule suivante : | [SALAIREBASE]=([TOTALHEURES]*[BASEHEURE])*(1+[INDEMNITESCP]/100) | [SALAIREBASE]=(150*[2.1])*(1+0.15)= 362,25 |
Un certain nombre de cotisations sociales doivent être prélevées sur ce salaire de base : | Contribution sociale généralisée et contribution au remboursement de la dette sociale : [SALAIREBASE]*[CSGRDS/100] Contribution sociale généralisée déductible : [SALAIREBASE]*[CSGD/100] Sécurité sociale, veuvage, vieillesse : [SALAIREBASE]*[SECU/100] Retraite Complémentaire + AGPF + Assurance Chômage : [SALAIREBASE]*[RETRAITE/100] |
CSGRDS : 12,64 CSGD : 22,28 Sécurité sociale : 34,02 Retraite : 28,55 |
Total des cotisations sociales : | [COTISATIONSSOCIALES]=[SALAIREBASE]*(CSGRDS+CSGD+SECU+RETRAITE)/100 | [COTISATIONSSOCIALES]=97,48 |
Par ailleurs, l'assistante maternelle a droit, chaque jour travaillé, à une indemnité d'entretien ainsi qu'à une indemnité de repas. A ce titre elle reçoit les indemnités suivantes : | [Indemnités]=[TOTALJOURS]*(ENTRETIENJOUR+REPASJOUR) | [INDEMNITES]=104 |
Au final, le salaire net à payer à l'assistante maternelle est le suivant : | [SALAIREBASE]-[COTISATIONSSOCIALES]+[INDEMNITÉS] | [salaire NET]=368,77 |
IV-C. Rappels ADO.NET▲
L'application de calcul de paie a besoin des informations de la base de données [dbpam]. Son architecture sera la suivante :
- en [1], l'utilisateur fait une demande
- en [2], l'application de paie la traite.
- elle peut alors avoir besoin des données de la base de données. Elle fait alors une requête au fournisseur (provider) ADO.NET du SGBD utilisé [4].
- celui-ci exploite la base de données [5] et rend ses résultats au fournisseur ADO.NET qui lui-même les remonte à l'application
- celle-ci exploite ces résultats et élabore une réponse [5] pour l'utilisateur
Nous rappelons maintenant les principales interfaces présentées par un fournisseur ADO.NET à ses clients [3].
En mode connecté, l'application :
- ouvre une connexion avec la source de données
- travaille avec la source de données en lecture/écriture
- ferme la connexion
Trois interfaces ADO.NET sont principalement concernées par ces opérations :
- IDbConnection qui encapsule les propriétés et méthodes de la connexion.
- IDbCommand qui encapsule les propriétés et méthodes de la commande SQL exécutée.
- IDataReader qui encapsule les propriétés et méthodes du résultat d'un ordre SQL Select.
L'interface IDbConnection
Sert à gérer la connexion avec la base de données. Parmi les méthodes M et propriétés P de cette interface on trouve les suivantes :
Nom | Type | Rôle |
ConnectionString | P | chaîne de connexion à la base. Elle précise tous les paramètres nécessaires à l'établissement de la connexion avec une base précise. |
Open | M | ouvre la connexion avec la base définie par ConnectionString |
Close | M | ferme la connexion |
BeginTransaction | M | démarre une transaction. |
State | P | état de la connexion : ConnectionState.Closed, ConnectionState.Open, ConnectionState.Connecting, ConnectionState.Executing, ConnectionState.Fetching, ConnectionState.Broken |
Si Connection est une classe implémentant l'interface IDbConnection, l'ouverture de la connexion peut se faire comme suit :
L'interface IDbCommand
Sert à exécuter un ordre SQL ou une procédure stockée. Parmi les méthodes M et propriétés P de cette interface on trouve les suivantes :
Nom | Type | Rôle |
CommandType | P | indique ce qu'il faut exécuter - prend ses valeurs dans une énumération : - CommandType.Text : exécute l'ordre SQL défini dans la propriété CommandText. C'est la valeur par défaut. - CommandType.StoredProcedure : exécute une procédure stockée dans la base |
CommandText | P | - le texte de l'ordre SQL à exécuter si CommandType= CommandType.Text - le nom de la procédure stockée à exécuter si CommandType= CommandType.StoredProcedure |
Connection | P | la connexion IDbConnection à utiliser pour exécuter l'ordre SQL |
Transaction | P | la transaction IDbTransaction dans laquelle exécuter l'ordre SQL |
Parameters | P | la liste des paramètres d'un ordre SQL paramétré. L'ordre update articles set prix=prix*1.1 where id=@id a le paramètre @id. |
ExecuteReader | M | pour exécuter un ordre SQL Select. On obtient un objet IDataReader représentant le résultat du Select. |
ExecuteNonQuery | M | pour exécuter un ordre SQL Update, Insert, Delete. On obtient le nombre de lignes affectées par l'opération (mises à jour, insérées, détruites). |
ExecuteScalar | M | pour exécuter un ordre SQL Select ne rendant qu'un unique résultat comme dans : select count(*) from articles. |
CreateParameter | M | pour créer les paramètres IDbParameter d'un ordre SQL paramétré. |
Prepare | M | permet d'optimiser l'exécution d'une requête paramétrée lorsqu'elle est exécutée de multiples fois avec des paramètres différents. |
Si Command est une classe implémentant l'interface IDbCommand, l'exécution d'un ordre SQL sans transaction aura la forme suivante :
L'interface IDataReader
Sert à encapsuler les résultats d'un ordre SQL Select. Un objet IDataReader représente une table avec des lignes et des colonnes, qu'on exploite séquentiellement : d'abord la 1re ligne, puis la seconde…. Parmi les méthodes M et propriétés P de cette interface on trouve les suivantes :
Nom | Type | Rôle |
FieldCount | P | le nombre de colonnes de la table IDataReader |
GetName | M | GetName(i) rend le nom de la colonne n° i de la table IDataReader. |
Item | P | Item[i] représente la colonne n° i de la ligne courante de la table IDataReader. |
Read | M | passe à la ligne suivante de la table IDataReader. Rend le booléen True si la lecture a pu se faire, False sinon. |
Close | M | ferme la table IDataReader. |
GetBoolean | M | GetBoolean(i) : rend la valeur booléenne de la colonne n° i de la ligne courante de la table IDataReader. Les autres méthodes analogues sont les suivantes : GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString. |
Getvalue | M | Getvalue(i) : rend la valeur de la colonne n° i de la ligne courante de la table IDataReader en tant que type object. |
IsDBNull | M | IsDBNull(i) rend True si la colonne n° i de la ligne courante de la table IDataReader n'a pas de valeur ce qui est symbolisé par la valeur SQL NULL. |
L'exploitation d'un objet IDataReader ressemble souvent à ce qui suit :