Skip to content

3. Il caso di studio

Vogliamo scrivere un'applicazione .NET che consenta a un utente di effettuare simulazioni di calcolo delle retribuzioni delle assistenti materne dell'associazione «Maison de la petite enfance» di un comune. Ci concentreremo sia sull’organizzazione del codice DotNet dell’applicazione sia sul codice stesso.

3.1. l database

I dati statici necessari per la creazione della busta paga sono memorizzati in un database SQL Server Express denominato dbpam (pam = Paie Assistante Maternelle). Questo database ha un amministratore denominato sa con password msde.

 

Il database contiene tre tabelle, EMPLOYES, COTISATIONS e INDEMNITES, la cui struttura è la seguente:


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

Struttura:

SS
numero di previdenza sociale del dipendente - chiave primaria
NOM
nome del dipendente
prenom
il suo nome
ADRESSE
il suo indirizzo
VILLE
la sua città
CODEPOSTAL
il suo codice postale
INDICE
il suo indice di trattamento - chiave esterna sul campo [INDICE] della tabella [INDEMNITES]

Il contenuto potrebbe essere il seguente:

Image


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

Struttura:

Il suo contenuto potrebbe essere il seguente:

Le aliquote dei contributi sociali sono indipendenti dal dipendente. La tabella precedente contiene una sola riga.


Table INDEMNITES : rassemble les différentes indemnités dépendant de l'indice de l'employé
INDICE
indice di retribuzione - chiave primaria
BASEHEURE
prezzo netto in euro per un'ora di assistenza
ENTRETIENJOUR
indennità di vitto e alloggio in euro per giorno di servizio
REPASJOUR
indennità pasto in euro per giorno di assistenza
INDEMNITESCP
indennità per ferie retribuite. Si tratta di una percentuale da applicare allo stipendio base.

Il contenuto potrebbe essere il seguente:

Image

Si noti che le indennità possono variare da un'assistente all'infanzia all'altra. Esse sono infatti associate a una specifica assistente all'infanzia tramite il suo indice di retribuzione. Pertanto, la signora Marie Jouveinal, che ha un indice di retribuzione pari a 2 (tabella EMPLOYES), ha una retribuzione oraria di 2,1 euro (tabella INDEMNITES).

Le relazioni tra le tre tabelle sono le seguenti:

Esiste una relazione di chiave esterna tra la colonna EMPLOYES (INDICE) e la colonna INDEMNITES (INDICE).

Il database [dbpam] così creato genera due file nella cartella di SQL Server Express:

I file [dbpam.mdf, dbpam_log.ldf] possono essere trasferiti su un altro computer e ricollegati al SGBD SQL Server Express di quel computer. Ecco come procedere:

  • i file BD e [dbpam] vengono duplicati in una cartella
 
  • si avvia SQL Server Express
  • con il client SQL Server Management Studio Express, si associa il file [dbpam.mdf] al file SGBD:
  1. clic con il tasto destro su [Databases] / Allega
  2. selezionare il file [dbpam.mdf] tramite un pulsante [Add] non visualizzato
  3. il file allegato darà origine a un BD che non deve già esistere. Qui, nel campo [Attach As], è stato assegnato il nome [dbpam2] al nuovo BD.
  4. Si vede il nuovo file BD e le sue tabelle

Questa tecnica di associazione di un BD è utile per trasferire un BD da una postazione all’altra e la useremo occasionalmente in questa sede.

3.2. Modalità di calcolo dello lo stipendio di una tata

Presentiamo ora il metodo di calcolo dello stipendio mensile di un'assistente materna. Prendiamo come esempio lo stipendio della signora Marie Jouveinal, che ha lavorato 150 ore in 20 giorni durante il mese di riferimento.

Vengono presi in considerazione i seguenti elementi:

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

[TOTALJOURS]: total des jours
 travaillés dans le mois
[TOTALHEURES]=150
[TOTALJOURS]= 20
Lo stipendio base dell'assistente all'infanzia è calcolato secondo la seguente formula:
[SALAIREBASE]=([TOTALHEURES]*
[BASEHEURE])*(1+
[INDEMNITESCP]/100)
[SALAIREBASE]=(150*[2.1])*(1+0.15)= 362,25
Da questo stipendio base devono essere trattenuti alcuni contributi sociali:

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
Totale dei contributi sociali:
[COTISATIONSSOCIALES]=[SALAIR
EBASE]*(CSGRDS+CSGD+SECU+RETR
[COTISATIONSSOCIALES]=97,48
Inoltre, l’assistente all’infanzia ha diritto, per ogni giorno lavorato, a un’indennità di mantenimento e a un’indennità di pasto. A tal titolo riceve le seguenti indennità:

[Indemnités]=[TOTALJOURS]*(EN
TRETIENJOUR+REPASJOUR)
[INDEMNITES]=104
In definitiva, la retribuzione netta da corrispondere all’assistente materna è la seguente:
[SALAIREBASE]-
[COTISATIONSSOCIALES]+
[INDEMNITÉS]
[salaire NET]=368,77

3.3. Promemoria ADO.NET

L'applicazione per il calcolo delle retribuzioni necessita delle informazioni contenute nel database [dbpam]. La sua struttura sarà la seguente:

  • in [1], l'utente effettua una richiesta
  • in [2], l’applicazione per il calcolo delle retribuzioni la elabora.
  • A quel punto potrebbe aver bisogno dei dati del database. Effettua quindi una richiesta al provider ADO.NET del SGBD utilizzato da [4].
  • Quest’ultimo interroga il database [5] e restituisce i risultati al provider ADO.NET, il quale a sua volta li inoltra all’applicazione
  • quest’ultima elabora tali risultati e genera una risposta [5] per l’utente

Ricordiamo ora le principali interfacce offerte da un fornitore ADO.NET ai propri clienti [3].

In modalità connessa, l’applicazione:

  1. apre una connessione con la fonte dati
  2. opera con la fonte dati in modalità lettura/scrittura
  3. chiude la connessione

Tre interfacce ADO.NET sono principalmente interessate da queste operazioni:

  • IDbConnection, che incapsula le proprietà e i metodi della connessione.
  • IDbCommand, che incapsula le proprietà e i metodi del comando SQL eseguito.
  • IDataReader, che incapsula le proprietà e i metodi del risultato di un comando SQL Select.

L'interfaccia IDbConnection

Serve a gestire la connessione al database. Tra i metodi M e le proprietà P di questa interfaccia figurano i seguenti:

Nome
Tipo
Ruolo
ConnectionString
P
Stringa di connessione al database. Specifica tutti i parametri necessari per stabilire la connessione con un database specifico.
Open
M
apre la connessione con il database definito da ConnectionString
Close
M
chiude la connessione
BeginTransaction
M
avvia una transazione.
State
P
stato della connessione: ConnectionState.Closed, ConnectionState.Open, ConnectionState.Connecting, ConnectionState.Executing, ConnectionState.Fetching, ConnectionState.Broken

Se Connection è una classe che implementa l'interfaccia IDbConnection, l'apertura della connessione può avvenire come segue:

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

L'interfaccia IDbCommand

Serve per eseguire un comando SQL o una procedura memorizzata. Tra i metodi M e le proprietà P di questa interfaccia si trovano i seguenti:

Nome
Tipo
Ruolo
CommandType
P
indica cosa deve essere eseguito - prende i propri valori da un elenco:
- CommandType.Text: esegue il comando SQL definito nella proprietà CommandText. È il valore predefinito.
- CommandType.StoredProcedure: esegue una procedura memorizzata nel database
CommandText
P
- il testo del comando SQL da eseguire se CommandType = CommandType.Text
- il nome della procedura memorizzata da eseguire se CommandType = CommandType.StoredProcedure
Connection
P
la connessione IDbConnection da utilizzare per eseguire l'ordine SQL
Transaction
P
la transazione IDbTransaction in cui eseguire l'ordine SQL
Parameters
P
l'elenco dei parametri di un ordine SQL configurato. L'ordine update articles set price=price*1.1 where id=@id ha il parametro @id.
ExecuteReader
M
per eseguire un comando SQL Select. Si ottiene un oggetto IDataReader che rappresenta il risultato di Select.
ExecuteNonQuery
M
per eseguire un comando SQL (Aggiorna, Inserisci, Elimina). Si ottiene il numero di righe interessate dall'operazione (aggiornate, inserite, eliminate).
ExecuteScalar
M
per eseguire un comando SQL Select che restituisca un unico risultato, come in: select count(*) from articles.
CreateParameter
M
per creare i parametri IDbParameter di un ordine SQL già configurato.
Prepare
M
consente di ottimizzare l'esecuzione di una query parametrizzata quando viene eseguita più volte con parametri diversi.

Se Command è una classe che implementa l'interfaccia IDbCommand, l'esecuzione di un comando SQL senza transazione avrà la seguente forma:

// apertura della connessione 
IDbConnection connexion=...
connexion.Open();
// preparazione dell'ordine
IDbCommand commande=new Command();
commande.Connection=connexion;
// esecuzione del comando select
commande.CommandText="select ...";
IDbDataReader reader=commande.ExecuteReader();
...
// esecuzione dell'ordine update, insert, delete
commande.CommandText="insert ...";
int nbLignesInsérées=commande.ExecuteNonQuery();
...
// chiusura connessione
connexion.Close();

L'interfaccia IDataReader

serve a incapsulare i risultati di un comando SQL Select. Un oggetto IDataReader rappresenta una tabella con righe e colonne, che viene elaborata in modo sequenziale: prima la prima riga, poi la seconda, ... Tra i metodi M e le proprietà P di questa interfaccia si trovano i seguenti:

Nome
Tipo
Ruolo
FieldCount
P
il numero di colonne della tabella IDataReader
GetName
M
GetName(i) restituisce il nome della colonna n. i della tabella IDataReader.
Item
P
Item[i] rappresenta la colonna n. i della riga corrente della tabella IDataReader.
Read
M
passa alla riga successiva della tabella IDataReader. Restituisce il valore booleano True se la lettura è andata a buon fine, False in caso contrario.
Close
M
chiude la tabella IDataReader.
GetBoolean
M
GetBoolean(i): restituisce il valore booleano della colonna n. i della riga corrente della tabella IDataReader. Gli altri metodi analoghi sono i seguenti: GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString.
Getvalue
M
Getvalue(i): restituisce il valore della colonna n. i della riga corrente della tabella IDataReader come tipo object.
IsDBNull
M
IsDBNull(i) restituisce True se la colonna n. i della riga corrente della tabella IDataReader non ha alcun valore, il che è indicato dal valore SQL NULL.

L'elaborazione di un oggetto IDataReader spesso si presenta come segue:

// apertura connessione 
IDbConnection connexion=...
connexion.Open();
// preparazione comando
IDbCommand commande=new Command();
commande.Connection=connexion;
// esecuzione comando SELECT
commande.CommandText="select ...";
IDataReader reader=commande.ExecuteReader();
// elaborazione dei risultati
while(reader.Read()){
     // elaborare la riga corrente
        ...
}
// chiusura del lettore
reader.Close();
// chiusura connessione
connexion.Close();