Skip to content

3. Die Fallstudie

Wir möchten eine .NET-Anwendung entwickeln, mit der ein Benutzer die Lohnabrechnung für Kinderbetreuer beim Verein „Maison de la petite enfance“ in einer Gemeinde simulieren kann. Wir werden uns ebenso sehr auf die Organisation des .NET-Codes der Anwendung konzentrieren wie auf den Code selbst.

3.1. Die Datenbank

Die zur Erstellung der Gehaltsabrechnung benötigten statischen Daten sind in einer SQL Server Express-Datenbank namens dbpam (pam = Paie Assistante Maternelle) gespeichert. Diese Datenbank hat einen Administrator namens sa mit dem Passwort msde.

 

Die Datenbank enthält drei Tabellen: EMPLOYEES, CONTRIBUTIONS und ALLOWANCES mit folgender Struktur:


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

Struktur:

SS
Sozialversicherungsnummer des Mitarbeiters – Primärschlüssel
NAME
Nachname des Mitarbeiters
Vorname
Vorname
ADRESSE
ihre Adresse
STADT
seine/ihre Stadt
POSTLEITZAHL
seine/ihre Postleitzahl
INDEX
sein Verarbeitungsindex – Fremdschlüssel auf dem Feld [INDICE] der Tabelle [INDEMNITES]

Der Inhalt könnte wie folgt lauten:

Image


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

Aufbau:

Der Inhalt könnte wie folgt lauten:

Die Sozialversicherungsbeiträge sind unabhängig vom Arbeitnehmer. Die vorstehende Tabelle enthält nur eine Zeile.


Table INDEMNITES : rassemble les différentes indemnités dépendant de l'indice de l'employé
INDEX
Gehaltsindex – Primärschlüssel
BASEHOUR
Nettostundensatz in Euro
TÄGLICHE WARTUNG
Tagespauschale in Euro pro Tag Bereitschaftsdienst
VERPFLEGUNG PRO TAG
Verpflegungszulage in Euro pro Pflegetag
URLAUBSGELD
Bezahlter Urlaubsgeldzuschlag. Dies ist ein Prozentsatz, der auf das Grundgehalt angewendet wird.

Der Inhalt könnte wie folgt lauten:

Image

Beachten Sie, dass die Zulagen von Kinderbetreuungsanbieter zu Kinderbetreuungsanbieter variieren können. Sie sind über die Gehaltsstufe des jeweiligen Anbieters an diesen gebunden. So erhält Frau Marie Jouveinal, die der Gehaltsstufe 2 (Tabelle „EMPLOYEES“) angehört, einen Stundenlohn von 2,1 Euro (Tabelle „INDEMNITES“).

Die Beziehungen zwischen den drei Tabellen sind wie folgt:

Es besteht eine Fremdschlüsselbeziehung zwischen der Spalte EMPLOYEES(INDEX) und der Spalte ALLOWANCES(INDEX).

Die auf diese Weise erstellte Datenbank [dbpam] generiert zwei Dateien im Ordner „SQL Server Express“:

Die Dateien [dbpam.mdf, dbpam_log.ldf] können auf einen anderen Rechner übertragen und dort wieder in das SQL Server Express-Datenbankmanagementsystem eingebunden werden. So geht’s:

  • Die [dbpam]-Datenbankdateien werden in einen Ordner kopiert
 
  • Starten Sie SQL Server Express
  • Fügen Sie mithilfe des SQL Server Management Studio Express-Clients die Datei [dbpam.mdf] zur Datenbank hinzu:
  1. Klicken Sie mit der rechten Maustaste auf [Datenbanken] / Anfügen
  2. Wählen Sie die Datei [dbpam.mdf] über die Schaltfläche [Hinzufügen] (nicht abgebildet) aus
  3. Die angehängte Datei erstellt eine Datenbank, die noch nicht vorhanden sein darf. Hier haben wir im Feld [Anhängen als] die neue Datenbank [dbpam2] benannt.
  4. Sie können die neue Datenbank und ihre Tabellen sehen

Diese Methode zum Anfügen einer Datenbank ist nützlich, um eine Datenbank von einem Computer auf einen anderen zu übertragen, und wir werden sie hier gelegentlich verwenden.

3.2. Berechnungsmethode für das Gehalt einer Tagesmutter

Wir stellen nun die Methode zur Berechnung des Monatsgehalts einer Tagesmutter vor. Als Beispiel nehmen wir das Gehalt von Frau Marie Jouveinal, die während des Abrechnungszeitraums 150 Stunden an 20 Tagen gearbeitet hat.

Folgende Faktoren werden berücksichtigt:

[TOTALHOURS]: Gesamtzahl
 im
 Monat

[TOTALDAYS]: Gesamtzahl der
 im Monat
[TOTALHOURS]=150
[TOTALDAYS] = 20
Das Grundgehalt der Kinderbetreuungskraft wird anhand der folgenden Formel berechnet:
[BASISGEHALT]=([GESAMTSTUNDEN]*
[STUNDENSATZ])*(1+
[CPALLOWANCE]/100)
[BASESALARY]=(150*[2,1])*(1+0,15)= 362,25
Von diesem Grundgehalt müssen verschiedene Sozialversicherungsbeiträge abgezogen werden:

Allgemeiner Sozialbeitrag
 sowie Schulden
 zur Schuldentilgung
 : [BASESALARY]*[CSGRDS/100]

Selbstbehalt
 Selbstbehalt:
 [BASESALARY]*[CSGD/100]

Sozialversicherung, Witwenrente,
 Altersversicherung:
 [BASESALARY]*[SECU/100]
Zusatzrente +
AGPF + Arbeitslosenversicherung:
[GRUNDGEHALT]*[RENTE/100]
CSGRDS: 12,64
CSGD: 22,28
Sozialversicherung: 34,02
Rente: 28,55
Gesamtsumme der Sozialversicherungsbeiträge:
[SOCIALCONTRIBUTIONS] = [SALARY
EBASE]*(CSGRDS+CSGD+SECU+RETR
[SOCIALCONTRIBUTIONS]=97,48
Darüber hinaus hat die Kinderbetreuerin Anspruch auf eine Tagegeldzulage und eine Verpflegungszulage für jeden Arbeitstag. Somit erhält sie folgende Zulagen:
[Vergütung] = [TOTAL_DAYS] * (EN
TAGESZULAGE + TÄGLICHE VERPFLEGUNGSZULAGE)
[ZULAGEN]=104
Letztendlich ergibt sich folgender Nettolohn, der an die Tagesmutter zu zahlen ist:
[GRUNDGEHALT]-
[SOZIALVERSICHERUNGSBEITRÄGE]+
[ZULAGEN]
[NETTOGEHALT]=368,77

3.3. ADO.NET-Hinweise

Die Anwendung zur Lohn- und Gehaltsabrechnung benötigt Informationen aus der Datenbank [dbpam]. Ihre Architektur sieht wie folgt aus:

  • In [1] stellt der Benutzer eine Anfrage
  • In [2] verarbeitet die Lohnabrechnungsanwendung diese Anfrage.
  • Möglicherweise benötigt sie dann Daten aus der Datenbank. Daraufhin sendet sie eine Abfrage an den ADO.NET-Anbieter des verwendeten DBMS [4].
  • Der Anbieter greift auf die Datenbank [5] zu und gibt die Ergebnisse an den ADO.NET-Anbieter zurück, der sie wiederum an die Anwendung weiterleitet
  • Die Anwendung verarbeitet diese Ergebnisse und generiert eine Antwort [5] für den Benutzer

Wir werden nun die wichtigsten Schnittstellen betrachten, die ein ADO.NET-Anbieter seinen Clients zur Verfügung stellt [3].

Im verbundenen Modus führt die Anwendung folgende Schritte aus:

  1. eine Verbindung zur Datenquelle
  2. arbeitet mit der Datenquelle im Lese-/Schreibmodus
  3. schließt die Verbindung

An diesen Vorgängen sind in erster Linie drei ADO.NET-Schnittstellen beteiligt:

  • IDbConnection, das die Eigenschaften und Methoden der Verbindung kapselt.
  • IDbCommand, das die Eigenschaften und Methoden des ausgeführten SQL-Befehls kapselt.
  • IDataReader, das die Eigenschaften und Methoden des Ergebnisses einer SQL-SELECT-Anweisung kapselt.

Die IDbConnection-Schnittstelle

dient zur Verwaltung der Verbindung zur Datenbank. Zu den Methoden (M) und Eigenschaften (P) dieser Schnittstelle gehören die folgenden:

Name
Typ
Rolle
ConnectionString
P
Datenbankverbindungszeichenfolge. Sie gibt alle Parameter an, die zum Herstellen einer Verbindung mit einer bestimmten Datenbank erforderlich sind.
Öffnen
M
Öffnet die Verbindung zu der durch ConnectionString definierten Datenbank
Schließen
M
Schließt die Verbindung
BeginTransaction
M
Startet eine Transaktion.
Status
P
Verbindungsstatus: ConnectionState.Closed, ConnectionState.Open, ConnectionState.Connecting, ConnectionState.Executing, ConnectionState.Fetching, ConnectionState.Broken

Wenn „Connection“ eine Klasse ist, die die Schnittstelle „IDbConnection“ implementiert, kann die Verbindung wie folgt geöffnet werden:

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

Die IDbCommand-Schnittstelle

dient zur Ausführung einer SQL-Anweisung oder einer gespeicherten Prozedur. Zu den Methoden M und Eigenschaften P dieser Schnittstelle gehören die folgenden:

Name
Typ
Rolle
Befehlstyp
P
gibt an, was ausgeführt werden soll – bezieht seine Werte aus einer Aufzählung:
- CommandType.Text: Führt die in der CommandText-Eigenschaft definierte SQL-Anweisung aus. Dies ist der Standardwert.
- CommandType.StoredProcedure: Führt eine gespeicherte Prozedur in der Datenbank aus
CommandText
P
- der Text der auszuführenden SQL-Anweisung, wenn CommandType= CommandType.Text
- der Name der auszuführenden gespeicherten Prozedur, wenn CommandType= CommandType.StoredProcedure
Verbindung
P
die IDbConnection-Verbindung, die zur Ausführung der SQL-Anweisung verwendet werden soll
Transaktion
P
die IDbTransaction-Transaktion, in der die SQL-Anweisung ausgeführt werden soll
Parameter
P
Die Liste der Parameter für eine parametrisierte SQL-Anweisung. Die Anweisung `update articles set price=price*1.1 where id=@id` enthält den Parameter `@id`.
ExecuteReader
M
Zum Ausführen einer SELECT-SQL-Anweisung. Dies gibt ein IDataReader-Objekt zurück, das das Ergebnis der SELECT-Anweisung darstellt.
ExecuteNonQuery
M
zum Ausführen einer SQL-Anweisung vom Typ „Update“, „Insert“ oder „Delete“. Die Anzahl der von der Operation betroffenen Zeilen (aktualisiert, eingefügt oder gelöscht) wird zurückgegeben.
ExecuteScalar
M
zum Ausführen einer SQL-Select-Anweisung, die ein einzelnes Ergebnis zurückgibt, z. B.: select count(*) from articles.
CreateParameter
M
zum Erstellen der IDbParameter-Parameter einer parametrisierten SQL-Anweisung.
Prepare
M
ermöglicht es Ihnen, die Ausführung einer parametrisierten Abfrage zu optimieren, wenn diese mehrfach mit unterschiedlichen Parametern ausgeführt wird.

Wenn „Command“ eine Klasse ist, die die Schnittstelle „IDbCommand“ implementiert, sieht die Ausführung einer SQL-Anweisung ohne Transaktion wie folgt aus:

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

Die IDataReader-Schnittstelle

Wird verwendet, um die Ergebnisse einer SQL-Select-Anweisung zu kapseln. Ein IDataReader-Objekt stellt eine Tabelle mit Zeilen und Spalten dar, die nacheinander verarbeitet werden: zuerst die erste Zeile, dann die zweite und so weiter. Zu den Methoden (M) und Eigenschaften (P) dieser Schnittstelle gehören die folgenden:

Name
Typ
Rolle
FieldCount
P
Die Anzahl der Spalten in der IDataReader-Tabelle
GetName
M
GetName(i) gibt den Namen der Spalte i in der IDataReader-Tabelle zurück.
Element
P
Item[i] steht für die Spaltennummer i der aktuellen Zeile in der IDataReader-Tabelle.
Read
M
Wechselt zur nächsten Zeile in der IDataReader-Tabelle. Gibt True zurück, wenn die Zeile erfolgreich gelesen wurde, andernfalls False.
Schließen
M
Schließt die IDataReader-Tabelle.
GetBoolean
M
GetBoolean(i): Gibt den booleschen Wert der Spalte i in der aktuellen Zeile der IDataReader-Tabelle zurück. Weitere ähnliche Methoden sind: GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString.
Getvalue
M
Getvalue(i): Gibt den Wert der Spalte i in der aktuellen Zeile der IDataReader-Tabelle als Objekttyp zurück.
IsDBNull
M
IsDBNull(i) gibt „True“ zurück, wenn Spalte i der aktuellen Zeile in der IDataReader-Tabelle keinen Wert enthält, was durch den SQL-NULL-Wert dargestellt wird.

Die Verwendung eines IDataReader-Objekts sieht häufig wie folgt aus:

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