Skip to content

3. El caso de estudio

Queremos desarrollar una aplicación .NET que permita a un usuario realizar simulaciones del cálculo de la nómina de las cuidadoras infantiles de la asociación «Maison de la petite enfance» de un municipio. Nos centraremos tanto en la organización del código DotNet de la aplicación como en el código en sí.

3.1. La base de datos « »

Los datos estáticos necesarios para generar la nómina se almacenan en una base de datos SQL Server Express llamada dbpam (pam = Nómina de Cuidadoras Infantiles). Esta base de datos tiene un administrador llamado «sa» con la contraseña «msde».

 

La base de datos cuenta con tres tablas: EMPLOYES, COTISATIONS y INDEMNITES, cuya estructura es la siguiente:


Table EMPLOYES : rassemble des informations sur les différentes assistantes maternelles

Estructura:

SS
número de seguro social del empleado - clave primaria
NOM
nombre del empleado
prenom
su nombre
ADRESSE
su dirección
VILLE
su ciudad
CODEPOSTAL
su código postal
INDICE
su índice de tramitación —clave externa en el campo [INDICE] de la tabla [INDEMNITES]

Su contenido podría ser el siguiente:

Image


Table COTISATIONS : rassemble les taux des cotisations sociales prélevées sur le salaire

Estructura:

Su contenido podría ser el siguiente:

Las tasas de las cotizaciones sociales son independientes del empleado. La tabla anterior solo tiene una fila.


Table INDEMNITES : rassemble les différentes indemnités dépendant de l'indice de l'employé
INDICE
índice de salario - clave primaria
BASEHEURE
precio neto en euros por una hora de guardia
ENTRETIENJOUR
indemnización de manutención en euros por día de custodia
REPASJOUR
indemnización por comida en euros por día de cuidado
INDEMNITESCP
Indemnización por vacaciones pagadas. Es un porcentaje que se aplica al salario base.

Su contenido podría ser el siguiente:

Image

Cabe señalar que las indemnizaciones pueden variar de una cuidadora a otra. De hecho, están vinculadas a una cuidadora específica a través de su índice salarial. Así, la Sra. Marie Jouveinal, que tiene un índice salarial de 2 (tabla EMPLOYES), tiene un salario por hora de 2,1 euros (tabla INDEMNITES).

Las relaciones entre las tres tablas son las siguientes:

Existe una relación de clave externa entre la columna EMPLOYES (INDICE) y la columna INDEMNITES (INDICE).

La base de datos [dbpam] así creada genera dos archivos en la carpeta de SQL Server Express:

Los archivos [dbpam.mdf, dbpam_log.ldf] pueden trasladarse a otra máquina y volver a vincularse al servidor SGBD SQL Server Express de esa máquina. A continuación se explica cómo hacerlo:

  • Los archivos de BD y [dbpam] se duplican en una carpeta
 
  • se inicia SQL Server Express
  • con el cliente SQL Server Management Studio Express, y se vincula el archivo [dbpam.mdf] al SGBD:
  1. clic derecho en [Databases] / Adjuntar
  2. seleccionar el archivo [dbpam.mdf] mediante un botón [Add] no representado
  3. el archivo adjunto generará un BD que no debe existir ya. Aquí, en el campo [Attach As], se le ha asignado el nombre [dbpam2] al nuevo BD.
  4. Se ve el nuevo archivo BD y sus tablas

Esta técnica de vincular un archivo BD es útil para trasladar un archivo BD de un puesto a otro y la utilizaremos en algunas ocasiones aquí.

3.2. Método de cálculo del salario de una cuidadora infantil

A continuación, presentamos la forma de calcular el salario mensual de una cuidadora infantil. Tomamos como ejemplo el salario de la Sra. Marie Jouveinal, quien trabajó 150 horas durante 20 días en el mes a pagar.

Se toman en cuenta los siguientes elementos:

[TOTALHEURES]: total des
 heures travaillées dans le
 mois

[TOTALJOURS]: total des jours
 travaillés dans le mois
[TOTALHEURES]=150
[TOTALJOURS]= 20
El salario base de la cuidadora infantil se calcula mediante la siguiente fórmula:
[SALAIREBASE]=([TOTALHEURES]*
[BASEHEURE])*(1+
[INDEMNITESCP]/100)
[SALAIREBASE]=(150*[2.1])*(1+0.15)= 362,25
De este salario base se deben deducir una serie de cotizaciones sociales:

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 de contribuciones sociales:
[COTISATIONSSOCIALES]=[SALAIR
EBASE]*(CSGRDS+CSGD+SECU+RETR
[COTISATIONSSOCIALES]=97,48
Además, la cuidadora infantil tiene derecho, por cada día trabajado, a una indemnización por gastos de manutención y a una indemnización por comida. Por este concepto, recibe las siguientes indemnizaciones:

[Indemnités]=[TOTALJOURS]*(EN
TRETIENJOUR+REPASJOUR)
[INDEMNITES]=104
En definitiva, el salario neto que se le debe pagar a la cuidadora infantil es el siguiente:
[SALAIREBASE]-
[COTISATIONSSOCIALES]+
[INDEMNITÉS]
[salaire NET]=368,77

3.3. Recordatorios ADO.NET

La aplicación de cálculo de nómina necesita la información de la base de datos [dbpam]. Su arquitectura será la siguiente:

  • en [1], el usuario realiza una solicitud
  • en [2], la aplicación de nómina la procesa.
  • Es posible que entonces necesite los datos de la base de datos. Por lo tanto, envía una consulta al proveedor (provider) ADO.NET del SGBD utilizado por [4].
  • Este último consulta la base de datos [5] y devuelve los resultados al proveedor ADO.NET, quien a su vez los transmite a la aplicación
  • esta procesa dichos resultados y elabora una respuesta [5] para el usuario

A continuación, repasamos las principales interfaces que un proveedor ADO.NET ofrece a sus clientes [3].

En modo conectado, la aplicación:

  1. abre una conexión con la fuente de datos
  2. trabaja con la fuente de datos en modo de lectura/escritura
  3. cierra la conexión

Hay tres interfaces ADO.NET que se ven principalmente afectadas por estas operaciones:

  • IDbConnection, que encapsula las propiedades y métodos de la conexión.
  • IDbCommand, que encapsula las propiedades y métodos de la orden SQL ejecutada.
  • IDataReader, que encapsula las propiedades y métodos del resultado de una orden SQL Select.

La interfaz IDbConnection

Sirve para gestionar la conexión con la base de datos. Entre los métodos M y las propiedades P de esta interfaz se encuentran los siguientes:

Nombre
Tipo
Función
ConnectionString
P
cadena de conexión a la base de datos. Especifica todos los parámetros necesarios para establecer la conexión con una base de datos específica.
Open
M
abre la conexión con la base de datos definida por ConnectionString
Close
M
cierra la conexión
BeginTransaction
M
inicia una transacción.
State
P
estado de la conexión: ConnectionState.Closed, ConnectionState.Open, ConnectionState.Connecting, ConnectionState.Executing, ConnectionState.Fetching, ConnectionState.Broken

Si Connection es una clase que implementa la interfaz IDbConnection, la conexión se puede establecer de la siguiente manera:

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

La interfaz IDbCommand

Sirve para ejecutar una orden SQL o un procedimiento almacenado. Entre los métodos M y las propiedades P de esta interfaz se encuentran los siguientes:

Nombre
Tipo
Función
CommandType
P
indica qué se debe ejecutar - toma sus valores de una enumeración:
- CommandType.Text: ejecuta la orden SQL definida en la propiedad CommandText. Este es el valor por defecto.
- CommandType.StoredProcedure: ejecuta un procedimiento almacenado en la base
CommandText
P
- el texto de la orden SQL que se ejecutará si CommandType = CommandType.Text
- el nombre del procedimiento almacenado que se ejecutará si CommandType = CommandType.StoredProcedure
Connection
P
la conexión IDbConnection que se utilizará para ejecutar la orden SQL
Transaction
P
la transacción IDbTransaction en la que se ejecutará la orden SQL
Parameters
P
la lista de parámetros de una orden SQL configurada. La orden «update artículos set precio=precio*1.1 where id=@id» tiene el parámetro @id.
ExecuteReader
M
para ejecutar una orden SQL Select. Se obtiene un objeto IDataReader que representa el resultado de Select.
ExecuteNonQuery
M
para ejecutar una orden SQL: Actualizar, Insertar, Eliminar. Se obtiene el número de filas afectadas por la operación (actualizadas, insertadas, eliminadas).
ExecuteScalar
M
para ejecutar una orden SQL Select que devuelva un único resultado, como en: select count(*) from articles.
CreateParameter
M
para crear los parámetros IDbParameter de una orden SQL ya configurada.
Prepare
M
permite optimizar la ejecución de una consulta parametrizada cuando se ejecuta varias veces con parámetros diferentes.

Si Command es una clase que implementa la interfaz IDbCommand, la ejecución de una orden SQL sin transacción tendrá la siguiente forma:

// se inicia la sesión 
IDbConnection connexion=...
connexion.Open();
// preparación de la orden
IDbCommand commande=new Command();
commande.Connection=connexion;
// ejecución de la orden select
commande.CommandText="select ...";
IDbDataReader reader=commande.ExecuteReader();
...
// ejecución de la orden update, insert, delete
commande.CommandText="insert ...";
int nbLignesInsérées=commande.ExecuteNonQuery();
...
// cierre de conexión
connexion.Close();

La interfaz IDataReader

Sirve para encapsular los resultados de una orden SQL Select. Un objeto IDataReader representa una tabla con filas y columnas, que se procesan secuencialmente: primero la primera fila, luego la segunda, ... Entre los métodos M y las propiedades P de esta interfaz se encuentran los siguientes:

Nombre
Tipo
Función
FieldCount
P
el número de columnas de la tabla IDataReader
GetName
M
GetName(i) devuelve el nombre de la columna n.º i de la tabla IDataReader.
Item
P
Item[i] representa la columna n.º i de la fila actual de la tabla IDataReader.
Read
M
pasa a la siguiente línea de la tabla IDataReader. Devuelve el valor booleano True si se pudo realizar la lectura; de lo contrario, devuelve False.
Close
M
cierra la tabla IDataReader.
GetBoolean
M
GetBoolean(i): devuelve el valor booleano de la columna n.º i de la fila actual de la tabla IDataReader. Los demás métodos análogos son los siguientes: GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString.
Getvalue
M
Getvalue(i): devuelve el valor de la columna n.º i de la fila actual de la tabla IDataReader como tipo object.
IsDBNull
M
IsDBNull(i) devuelve True si la columna n.º i de la fila actual de la tabla IDataReader no tiene valor, lo cual se simboliza con el valor SQL NULL.

La consulta de un objeto IDataReader suele ser similar a lo siguiente:

// apertura de conexión 
IDbConnection connexion=...
connexion.Open();
// preparación de comando
IDbCommand commande=new Command();
commande.Connection=connexion;
// ejecución de la orden select
commande.CommandText="select ...";
IDataReader reader=commande.ExecuteReader();
// análisis de resultados
while(reader.Read()){
     // procesar línea actual
        ...
}
// cierre del lector
reader.Close();
// cierre de la conexión
connexion.Close();