Skip to content

3. El caso práctico

Queremos escribir 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 elaborar la nómina se almacenan en una base de datos SQL Server Express denominada dbpam (pam = Paie Assistante Maternelle). Esta base de datos tiene un administrador llamado sa con la contraseña msde.

 

La base de datos tiene 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 la Seguridad 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 tratamiento - clave externa en el campo [INDICE] de la tabla [INDEMNITES]

Su contenido podría ser el siguiente:


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 cotisations son independientes del empleado. La tabla anterior solo tiene una línea.


Table INDEMNITES : rassemble les différentes indemnités dépendant de l'indice de l'employé
INDICE
Índice de salario - clave primaria
BASEHEURE
precio net 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 guardia
INDEMNITESCP
Indemnización por vacaciones pagadas. Se trata de un porcentaje que se aplica al salario base.

Su contenido podría ser el siguiente:

Cabe señalar que las indemnizaciones pueden variar de una cuidadora a otra. De hecho, están asociadas a una cuidadora concreta 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] de pueden trasladarse a otro equipo y volver a vincularse al SGBD SQL Server Express de ese equipo. A continuación se explica cómo hacerlo:

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

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

3.2. Método de cálculo del salario de una asistente maternal ( )

A continuación, presentamos el método de cálculo del salario mensual de una cuidadora infantil. Tomamos como ejemplo el salario de la Sra. Marie Jouveinal, que trabajó 150 horas durante 20 días en el mes a pagar.

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

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

3.3. Recordatorios ADO.NET

La aplicación de cálculo de nóminas 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óminas la procesa.
  • Entonces puede necesitar los datos de la base de datos. A continuación, realiza una consulta al proveedor (provider) ADO.NET del SGBD utilizado [4].
  • Este utiliza la base de datos [5] y devuelve los resultados al proveedor ADO.NET, quien a su vez los transmite a la aplicación
  • esta utiliza dichos resultados y elabora una respuesta [5] para el usuario

Recordemos ahora las principales interfaces que presenta un proveedor ADO.NET a sus clients [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 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 del comando SQL ejecutado.
  • 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 concreta.
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 abrir 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 lo que hay que ejecutar - toma sus valores de una enumeración:
- CommandType.Text: ejecuta la orden SQL definida en la propiedad CommandText. 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 articles set price=price*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 la consulta Select.
ExecuteNonQuery
M
para ejecutar una orden SQL Update, Insert, Delete. Se obtiene el número de líneas 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 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:

// apertura de sesión 
IDbConnection connexion=...
connexion.Open();
// preparación del comando
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 propiedades P de esta interfaz se encuentran los siguientes:

Nombre
Tipo
Función
FieldCount
P
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 línea actual de la tabla IDataReader.
Read
M
pasa a la siguiente línea de la tabla IDataReader. Devuelve el valor booleano True si se ha podido realizar la lectura, False en caso contrario.
Close
M
cierra la tabla IDataReader.
GetBoolean
M
GetBoolean(i): devuelve el valor booleano de la columna n.º i de la línea 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 línea actual de la tabla IDataReader como tipo objeto.
IsDBNull
M
IsDBNull(i) devuelve True si la columna n.º i de la línea actual de la tabla IDataReader no tiene valor, lo que se simboliza con el valor SQL NULL.

La evaluación 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 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 conexión
connexion.Close();