Skip to content

3. 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.

3.1. 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 :

SS
numéro de sécurité sociale de l'employé - clé primaire
NOM
nom de l'employé
prenom
son prénom
ADRESSE
son adresse
VILLE
sa ville
CODEPOSTAL
son code postal
INDICE
son indice de traitement - clé étrangère sur le champ [INDICE] de la table [INDEMNITES]

Son contenu pourrait être le suivant :

Image


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é
INDICE
indice de traitement - clé primaire
BASEHEURE
prix net en euro d’une heure de garde
ENTRETIENJOUR
indemnité d’entretien en euro par jour de garde
REPASJOUR
indemnité de repas en euro par jour de garde
INDEMNITESCP
indemnité de congés payés. C'est un pourcentage à appliquer au salaire de base.

Son contenu pourrait être le suivant :

Image

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 :
  1. clic droit sur [Databases] / Attach
  2. choix du fichier [dbpam.mdf] via un bouton [Add] non représenté
  3. 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.
  4. 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.

3.2. 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]=[SALAIR
EBASE]*(CSGRDS+CSGD+SECU+RETR
[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]*(EN
TRETIENJOUR+REPASJOUR)
[INDEMNITES]=104
Au final, le salaire net à payer à l'assistante maternelle est le suivant :
[SALAIREBASE]-
[COTISATIONSSOCIALES]+
[INDEMNITÉS]
[salaire NET]=368,77

3.3. 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 :

  1. ouvre une connexion avec la source de données
  2. travaille avec la source de données en lecture/écriture
  3. 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 :

1
2
3
IDbConnection connexion=new Connection();
connexion.ConnectionString=...;
connexion.Open();

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 :

// ouverture connexion 
IDbConnection connexion=...
connexion.Open();
// préparation commande
IDbCommand commande=new Command();
commande.Connection=connexion;
// exécution ordre select
commande.CommandText="select ...";
IDbDataReader reader=commande.ExecuteReader();
...
// exécution ordre update, insert, delete
commande.CommandText="insert ...";
int nbLignesInsérées=commande.ExecuteNonQuery();
...
// fermeture connexion
connexion.Close();

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 1ère 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 :

// ouverture connexion 
IDbConnection connexion=...
connexion.Open();
// préparation commande
IDbCommand commande=new Command();
commande.Connection=connexion;
// exécution ordre select
commande.CommandText="select ...";
IDataReader reader=commande.ExecuteReader();
// exploitation résultats
while(reader.Read()){
    // exploiter ligne courante
        ...
}
// fermeture reader
reader.Close();
// fermeture connexion
connexion.Close();