Skip to content

3. El caso práctico

Queremos desarrollar una aplicación .NET que permita al usuario simular los cálculos de nóminas para los cuidadores infantiles de la asociación «Maison de la petite enfance» en un municipio. Nos centraremos tanto en la organización del código .NET 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 denominada dbpam (pam = Paie Assistante Maternelle). Esta base de datos tiene un administrador llamado sa con la contraseña msde.

 

La base de datos contiene tres tablas, EMPLOYEES, CONTRIBUTIONS y ALLOWANCES, con la siguiente estructura:


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

Estructura:

SS
número de la Seguridad Social del empleado - clave principal
NOMBRE
apellido del empleado
nombre
nombre
DIRECCIÓN
su dirección
CIUDAD
su ciudad
CÓDIGO POSTAL
su código postal
ÍNDICE
su índice de procesamiento: 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 cotización a la Seguridad Social 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é
ÍNDICE
índice salarial - clave principal
HORA BASE
tarifa horaria neta en euros
MANTENIMIENTO DIARIO
dietas diarias en euros por día de guardia
DIETAS POR COMIDAS
Subsidio de comida en euros por día de asistencia
SUELDO DE VACACIONES
Subsidio por vacaciones pagadas. Se trata de un porcentaje que se aplica al salario base.

Su contenido podría ser el siguiente:

Image

Tenga en cuenta que las prestaciones pueden variar de un proveedor de servicios de guardería a otro. Están vinculadas a un proveedor de servicios de guardería específico a través de la categoría salarial de dicho proveedor. Así, la Sra. Marie Jouveinal, que tiene una categoría salarial de 2 (tabla EMPLOYEES), 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 EMPLOYEES(INDEX) y la columna ALLOWANCES(INDEX).

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

Los archivos [dbpam.mdf, dbpam_log.ldf] se pueden transferir a otro equipo y volver a conectar al sistema de gestión de bases de datos SQL Server Express de ese equipo. A continuación se explica cómo hacerlo:

  • Los archivos de la base de datos [dbpam] se copian a una carpeta
 
  • Inicie SQL Server Express
  • Utilizando el cliente SQL Server Management Studio Express, adjunte el archivo [dbpam.mdf] a la base de datos:
  1. Haga clic con el botón derecho en [Bases de datos] / Conectar
  2. Seleccione el archivo [dbpam.mdf] mediante el botón [Añadir] (no se muestra)
  3. El archivo adjunto creará una base de datos que no debe existir ya. Aquí, en el campo [Adjuntar como], hemos nombrado la nueva base de datos [dbpam2].
  4. Puede ver la nueva base de datos y sus tablas

Esta técnica para conectar una base de datos resulta útil para transferir una base de datos de un ordenador a otro, y la utilizaremos ocasionalmente aquí.

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

A continuación, presentaremos el método para calcular el salario mensual de una cuidadora infantil. Como ejemplo, utilizaremos el salario de la Sra. Marie Jouveinal, que trabajó 150 horas repartidas en 20 días durante el periodo de pago.

Se tienen en cuenta los siguientes factores:

[TOTALHOURS]: total
 horas trabajadas en el
 mes

[TOTALDAYS]: total de días
 trabajados en el mes
[TOTALHOURS]=150
[TOTALDAYS] = 20
El salario base del cuidador de niños se calcula utilizando la siguiente fórmula:
[SALARIOBASE]=([TOTALHORAS]*
[TARIFA POR HORA])*(1+
[CPALLOWANCE]/100)
[SALARIOBASE]=(150*[2,1])*(1+0,15)= 362,25
De este salario base deben deducirse una serie de cotizaciones a la seguridad social:

Cotización social general
 y
 para el pago de la deuda
 : [SALARIOBASE]*[CSGRDS/100]

Deducible
 deducible:
 [SALARIO BASE]*[CSGD/100]

Seguridad Social, viudedad,
 vejez:
 [SALARIO BASE]*[SECU/100]
Pensión complementaria +
AGPF + Seguro de desempleo:
[SALARIO BASE]*[PENSIÓN/100]
CSGRDS: 12,64
CSGD: 22,28
Seguridad Social: 34,02
Pensión: 28,55
Total de cotizaciones a la Seguridad Social:

[CONTRIBUCIONES SOCIALES] = [SALARIO
EBASE]*(CSGRDS+CSGD+SECU+RETR
[CONTRIBUCIONES SOCIALES] = 97,48
Además, la cuidadora tiene derecho a una asignación para gastos de manutención y a una asignación para comidas por cada día trabajado. Por lo tanto, recibe las siguientes asignaciones:
[Compensación] = [TOTAL_DIAS] * (EN
DIENAS + DIENAS DE COMIDA)
[DIENESTOS]=104
Al final, el salario neto que se pagará a la cuidadora es el siguiente:
[SALARIO BASE]-
[CONTRIBUCIONES A LA SEGURIDAD SOCIAL]+
[COMPLEMENTOS]
[SALARIO NETO]=368,77

3.3. Recordatorios de ADO.NET

La aplicación de cálculo de nóminas requiere 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.
  • Es posible que entonces necesite datos de la base de datos. A continuación, envía una consulta al proveedor ADO.NET del SGBD que se está utilizando [4].
  • El proveedor accede a la base de datos [5] y devuelve los resultados al proveedor ADO.NET, que a su vez los transmite a la aplicación
  • La aplicación procesa estos resultados y genera una respuesta [5] para el usuario

A continuación, repasaremos 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 el origen de datos
  2. trabaja con el origen de datos en modo lectura/escritura
  3. cierra la conexión

En estas operaciones intervienen principalmente tres interfaces de ADO.NET:

  • 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 instrucción SQL SELECT.

La interfaz IDbConnection

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

Nombre
Tipo
Rol
ConnectionString
P
Cadena de conexión a la base de datos. Especifica todos los parámetros necesarios para establecer una conexión con una base de datos concreta.
Abrir
M
Abre la conexión a la base de datos definida por ConnectionString
Cerrar
M
Cierra la conexión
BeginTransaction
M
Inicia una transacción.
Estado
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

se utiliza para ejecutar una instrucción 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
especifica qué se va a ejecutar - toma sus valores de una enumeración:
- CommandType.Text: ejecuta la instrucción SQL definida en la propiedad CommandText. Este es el valor predeterminado.
- CommandType.StoredProcedure: ejecuta un procedimiento almacenado en la base de datos
CommandText
P
- el texto de la instrucción SQL que se ejecutará si CommandType = CommandType.Text
- el nombre del procedimiento almacenado que se ejecutará si CommandType = CommandType.StoredProcedure
Conexión
P
la conexión IDbConnection que se utilizará para ejecutar la instrucción SQL
Transacción
P
la transacción IDbTransaction en la que se ejecutará la instrucción SQL
Parámetros
P
La lista de parámetros para una instrucción SQL parametrizada. La instrucción `update articles set price=price*1.1 where id=@id` tiene el parámetro `@id`.
ExecuteReader
M
Para ejecutar una instrucción SQL SELECT. Devuelve un objeto IDataReader que representa el resultado de la instrucción SELECT.
ExecuteNonQuery
M
Para ejecutar una instrucción SQL Update, Insert o Delete. Se devuelve el número de filas afectadas por la operación (actualizadas, insertadas o eliminadas).
ExecuteScalar
M
para ejecutar una instrucción SQL Select que devuelva un único resultado, como por ejemplo: select count(*) from articles.
CreateParameter
M
para crear los parámetros IDbParameter de una instrucción SQL parametrizada.
Prepare
M
permite optimizar la ejecución de una consulta parametrizada cuando se ejecuta varias veces con diferentes parámetros.

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

// 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();

La interfaz IDataReader

Se utiliza para encapsular los resultados de una instrucción SQL Select. Un objeto IDataReader representa una tabla con filas y columnas, que se procesan secuencialmente: primero la primera fila, luego la segunda, y así sucesivamente. Entre los métodos (M) y 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 i de la tabla IDataReader.
Elemento
P
Item[i] representa la columna número i de la fila actual en la tabla IDataReader.
Read
M
Pasa a la siguiente fila de la tabla IDataReader. Devuelve True si la fila se ha leído correctamente; False en caso contrario.
Cerrar
M
Cierra la tabla IDataReader.
GetBoolean
M
GetBoolean(i): devuelve el valor booleano de la columna i en la fila actual de la tabla IDataReader. Otros métodos similares son: GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString.
Getvalue
M
Getvalue(i): devuelve el valor de la columna i en la fila actual de la tabla IDataReader como un tipo de objeto.
IsDBNull
M
IsDBNull(i) devuelve True si la columna i de la fila actual de la tabla IDataReader no tiene ningún valor, lo que se representa mediante el valor SQL NULL.

El uso de un objeto IDataReader suele ser similar al siguiente:

// 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();