Skip to content

3. Il caso di studio

Vogliamo scrivere un'applicazione .NET che consenta a un utente di simulare i calcoli delle buste paga per gli operatori dell'assistenza all'infanzia presso l'associazione "Maison de la petite enfance" in un comune. Ci concentreremo tanto sull'organizzazione del codice .NET dell'applicazione quanto sul codice stesso.

3.1. Il database

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

 

Il database contiene tre tabelle, EMPLOYEES, CONTRIBUTIONS e ALLOWANCES, con la seguente struttura:


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

Struttura:

SS
numero di previdenza sociale del dipendente - chiave primaria
NOME
cognome del dipendente
nome
nome
INDIRIZZO
il loro indirizzo
CITTÀ
la sua città
CAP
il suo codice postale
INDICE
il suo indice di elaborazione - 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 contenuto potrebbe essere il seguente:

Le aliquote dei contributi previdenziali sono indipendenti dal dipendente. La tabella precedente ha una sola riga.


Table INDEMNITES : rassemble les différentes indemnités dépendant de l'indice de l'employé
INDICE
indice salariale - chiave primaria
ORA DI BASE
tariffa oraria netta in euro
MANUTENZIONE GIORNALIERA
indennità giornaliera in euro per ogni giorno di reperibilità
PASTO AL GIORNO
Indennità pasti in euro per giorno di assistenza
INDENNITÀ DI FERIE
Indennità per ferie pagate. Si tratta di una percentuale applicata allo stipendio base.

Il contenuto potrebbe essere il seguente:

Image

Si noti che le indennità possono variare da un operatore all’altro. Esse sono collegate a un operatore specifico tramite la sua categoria retributiva. Pertanto, la sig.ra Marie Jouveinal, che ha una categoria retributiva 2 (tabella EMPLOYEES), 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 EMPLOYEES(INDEX) e la colonna ALLOWANCES(INDEX).

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 sistema di gestione del database SQL Server Express di quel computer. Ecco come procedere:

  • I file del database [dbpam] vengono copiati in una cartella
 
  • Avviare SQL Server Express
  • Utilizzando il client SQL Server Management Studio Express, collegare il file [dbpam.mdf] al database:
  1. Fai clic con il pulsante destro del mouse su [Database] / Collega
  2. Selezionare il file [dbpam.mdf] utilizzando il pulsante [Aggiungi] (non mostrato)
  3. Il file collegato creerà un database che non deve già esistere. Qui, nel campo [Collega come], abbiamo denominato il nuovo database [dbpam2].
  4. È possibile visualizzare il nuovo database e le sue tabelle

Questa tecnica per collegare un database è utile per trasferire un database da un computer all'altro e la useremo occasionalmente in questa guida.

3.2. Metodo di calcolo dello stipendio di un operatore dell'assistenza all'infanzia

Vi presenteremo ora il metodo di calcolo dello stipendio mensile di un'assistente all'infanzia. Come esempio, useremo lo stipendio della signora Marie Jouveinal, che ha lavorato 150 ore in 20 giorni durante il periodo di paga.

Si tiene conto dei seguenti fattori:

[TOTALHOURS]: totale
 ore lavorate nel
 mese

[TOTALDAYS]: totale dei giorni
 lavorati nel mese
[TOTALHOURS]=150
[TOTALDAYS] = 20
Lo stipendio base dell'assistente all'infanzia viene calcolato utilizzando la seguente formula:
[STIPENDIOBASE]=([TOTALORE]*
[TARIFFA ORARIA])*(1+
[INDENNITÀ CP]/100)
[STIPENDIOBASE]=(150*[2,1])*(1+0,15)= 362,25
Da questo stipendio base devono essere detratti alcuni contributi previdenziali:

Contributo sociale generale
 e
 per il rimborso del debito
 : [STIPENDIOBASE]*[CSGRDS/100]

Franchigia
 :
 [STIPENDIO BASE]*[CSGD/100]

Previdenza sociale, vedovanza,
 vecchiaia:
 [STIPENDIO BASE]*[SECU/100]
Pensione integrativa +
AGPF + Assicurazione contro la disoccupazione:
[STIPENDIO BASE]*[PENSIONE/100]
CSGRDS: 12,64
CSGD: 22,28
Previdenza sociale: 34,02
Pensione: 28,55
Totale contributi previdenziali:
[CONTRIBUTI SOCIALI] = [STIPENDIO
EBASE]*(CSGRDS+CSGD+SECU+RETR
[CONTRIBUTI SOCIALI]=97,48
Inoltre, l’assistente all’infanzia ha diritto a un’indennità di soggiorno e a un’indennità di vitto per ogni giorno lavorato. Pertanto, riceve le seguenti indennità:
[Compenso] = [TOTALE_GIORNI] * (
INDENNITÀ GIORNALIERA + INDENNITÀ GIORNALIERA PER I PASTI)
[INDENNITÀ]=104
Alla fine, lo stipendio netto da corrispondere alla tata è il seguente:
[STIPENDIO BASE]-
[CONTRIBUTI PREVIDENZIALI]+
[INDENNITÀ]
[STIPENDIO NETTO]=368,77

3.3. Promemoria su ADO.NET

L'applicazione per il calcolo delle buste paga richiede informazioni dal database [dbpam]. La sua architettura sarà la seguente:

  • In [1], l'utente effettua una richiesta
  • In [2], l'applicazione per il calcolo delle buste paga la elabora.
  • Potrebbero quindi essere necessari dati dal database. A quel punto invia una query al provider ADO.NET del DBMS in uso [4].
  • Il provider accede al database [5] e restituisce i risultati al provider ADO.NET, che a sua volta li trasmette all'applicazione
  • L'applicazione elabora questi risultati e genera una risposta [5] per l'utente

Esamineremo ora le principali interfacce fornite da un provider ADO.NET ai propri clienti [3].

In modalità connessa, l'applicazione:

  1. apre una connessione all'origine dati
  2. opera con l'origine dati in modalità lettura/scrittura
  3. chiude la connessione

Tre interfacce ADO.NET sono principalmente coinvolte in 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'istruzione SQL SELECT.

L'interfaccia IDbConnection

viene utilizzata per gestire la connessione al database. Tra i metodi (M) e le proprietà (P) di questa interfaccia vi sono i seguenti:

Nome
Tipo
Ruolo
Stringa di connessione
P
Stringa di connessione al database. Specifica tutti i parametri necessari per stabilire una connessione con un database specifico.
Apri
M
Apre la connessione al database definito da ConnectionString
Chiudi
M
Chiude la connessione
BeginTransaction
M
avvia una transazione.
Stato
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, la connessione può essere aperta come segue:

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

L'interfaccia IDbCommand

viene utilizzata per eseguire un'istruzione SQL o una procedura memorizzata. Tra i metodi M e le proprietà P di questa interfaccia vi sono i seguenti:

Nome
Tipo
Ruolo
CommandType
P
specifica cosa eseguire - prende i propri valori da un'enumerazione:
- CommandType.Text: esegue l'istruzione SQL definita nella proprietà CommandText. Questo è il valore predefinito.
- CommandType.StoredProcedure: esegue una procedura memorizzata nel database
CommandText
P
- il testo dell'istruzione SQL da eseguire se CommandType= CommandType.Text
- il nome della procedura memorizzata da eseguire se CommandType= CommandType.StoredProcedure
Connessione
P
la connessione IDbConnection da utilizzare per eseguire l'istruzione SQL
Transazione
P
la transazione IDbTransaction in cui eseguire l'istruzione SQL
Parametri
P
L'elenco dei parametri per un'istruzione SQL parametrizzata. L'istruzione `update articles set price=price*1.1 where id=@id` ha il parametro `@id`.
ExecuteReader
M
Per eseguire un'istruzione SQL SELECT. Restituisce un oggetto IDataReader che rappresenta il risultato dell'istruzione SELECT.
ExecuteNonQuery
M
per eseguire un'istruzione SQL Update, Insert o Delete. Viene restituito il numero di righe interessate dall'operazione (aggiornate, inserite o eliminate).
ExecuteScalar
M
per eseguire un'istruzione SQL Select che restituisce un singolo risultato, ad esempio: select count(*) from articles.
CreateParameter
M
per creare i parametri IDbParameter di un'istruzione SQL parametrizzata.
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'istruzione SQL senza transazione assumerà la seguente 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();

L'interfaccia IDataReader

Utilizzata per incapsulare i risultati di un'istruzione SQL Select. Un oggetto IDataReader rappresenta una tabella con righe e colonne, che vengono elaborate in sequenza: prima la prima riga, poi la seconda e così via. Tra i metodi (M) e le proprietà (P) di questa interfaccia vi sono i seguenti:

Nome
Tipo
Ruolo
FieldCount
P
Il numero di colonne nella tabella IDataReader
GetName
M
GetName(i) restituisce il nome della colonna i nella tabella IDataReader.
Elemento
P
Item[i] rappresenta la colonna numero i della riga corrente nella tabella IDataReader.
Lettura
M
Passa alla riga successiva nella tabella IDataReader. Restituisce True se la riga è stata letta correttamente, False in caso contrario.
Chiudi
M
Chiude la tabella IDataReader.
GetBoolean
M
GetBoolean(i): restituisce il valore booleano della colonna i nella riga corrente della tabella IDataReader. Altri metodi simili includono: GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString.
Getvalue
M
Getvalue(i): restituisce il valore della colonna i nella riga corrente della tabella IDataReader come tipo di oggetto.
IsDBNull
M
IsDBNull(i) restituisce True se la colonna i della riga corrente nella tabella IDataReader non ha alcun valore, il che è rappresentato dal valore SQL NULL.

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

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