Skip to content

3. Приклад із практики

Ми хочемо написати додаток .NET, що дозволить користувачеві проводити симуляції розрахунку заробітної плати вихователів дитячих садків асоціації «Дім раннього дитинства» в одній з громад. Ми зосередимося як на організації коду DotNet програми, так і на самому коді.

3.1. : база даних

Статичні дані, необхідні для формування розрахункового листка, розміщені в базі даних SQL Server Express під назвою dbpam (pam = Paie Assistante Maternelle). Ця база має адміністратора з іменем sa та паролем msde.

 

База містить три таблиці: EMPLOYES, COTISATIONS та INDEMNITES, структура яких є такою:


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

Структура:

SS
номер соціального страхування працівника — первинний ключ
NOM
прізвище працівника
prenom
його ім'я
ADRESSE
його адреса
VILLE
його місто
CODEPOSTAL
його поштовий індекс
INDICE
його індекс обробки — зовнішній ключ у полі [INDICE] таблиці [INDEMNITES]

Його вміст може бути таким:

Image


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

Структура:

Його вміст може бути таким:

Ставки соціальних внесків не залежать від працівника. Попередня таблиця містить лише один рядок.


Table INDEMNITES : rassemble les différentes indemnités dépendant de l'indice de l'employé
INDICE
індекс заробітної плати — первинний ключ
BASEHEURE
чиста вартість однієї години догляду в євро
ENTRETIENJOUR
добові в євро за день чергування
REPASJOUR
добові на харчування в євро за день догляду
INDEMNITESCP
допомога за оплачувану відпустку. Це відсоток, який застосовується до базової заробітної плати.

Його зміст може бути таким:

Image

Слід зазначити, що розмір надбавок може відрізнятися від однієї няні до іншої. Вони, а саме, прив’язані до конкретної няні через її індекс оплати праці. Так, пані Марі Жувенал, яка має індекс оплати праці 2 (таблиця EMPLOYES), отримує погодинну заробітну плату в розмірі 2,1 євро (таблиця INDEMNITES).

Взаємозв’язки між цими трьома таблицями такі:

Між стовпцем EMPLOYES (INDICE) та стовпцем INDEMNITES (INDICE) існує зв’язок за чужим ключем.

Створена таким чином база даних [dbpam] генерує два файли в папці SQL Server Express:

Файли [dbpam.mdf, dbpam_log.ldf] можна перенести на інший комп'ютер і знову підключити до сервера SGBD SQL Server Express на цьому комп'ютері. Для цього виконайте такі дії:

  • файли BD та [dbpam] дублюються у папці
 
  • запускаємо SQL Server Express
  • за допомогою клієнта SQL Server Management Studio Express, приєднайте файл [dbpam.mdf] до SGBD:
  1. клацнути правою кнопкою миші на [Databases] / Приєднати
  2. виберіть файл [dbpam.mdf] за допомогою кнопки [Add] (не показано)
  3. прикріплений файл створить файл BD, який ще не повинен існувати. Тут, у полі [Attach As], новому файлу BD було надано ім’я [dbpam2].
  4. Ми бачимо новий файл BD та його таблиці

Цей метод приєднання файлу BD є корисним для переміщення файлу BD з одного робочого місця на інше, і ми іноді будемо ним користуватися тут.

3.2. Спосіб розрахунку заробітної плати няні

Тепер розглянемо порядок розрахунку місячної заробітної плати виховательки. Як приклад візьмемо заробітну плату пані Марі Жувенал, яка пропрацювала 150 годин протягом 20 днів у місяці, за який виплачується заробітна плата.

Враховуються такі складові:

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

[TOTALJOURS]: total des jours
 travaillés dans le mois
[TOTALHEURES]=150
[TOTALJOURS]= 20
Базова заробітна плата виховательки розраховується за такою формулою:
[SALAIREBASE]=([TOTALHEURES]*
[BASEHEURE])*(1+
[INDEMNITESCP]/100)
[SALAIREBASE]=(150*[2.1])*(1+0.15)= 362,25
З цієї базової заробітної плати слід утримувати певні соціальні внески:

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
Загальна сума соціальних внесків:
[COTISATIONSSOCIALES]=[SALAIR
EBASE]*(CSGRDS+CSGD+SECU+RETR
[COTISATIONSSOCIALES]=97,48
Крім того, вихователька має право на щоденну компенсацію витрат на утримання та компенсацію витрат на харчування за кожен відпрацьований день. З цієї причини вона отримує такі компенсації:

[Indemnités]=[TOTALJOURS]*(EN
TRETIENJOUR+REPASJOUR)
[INDEMNITES]=104
У підсумку чиста заробітна плата, що підлягає виплаті виховательці, становить:
[SALAIREBASE]-
[COTISATIONSSOCIALES]+
[INDEMNITÉS]
[salaire NET]=368,77

3.3. Нагадування ADO.NET

Програма для розрахунку заробітної плати потребує інформації з бази даних [dbpam]. Її архітектура буде такою:

  • у [1] користувач надсилає запит
  • у [2] програма розрахунку заробітної плати обробляє його.
  • тоді їй можуть знадобитися дані з бази даних. Тоді вона надсилає запит до постачальника (provider) ADO.NET щодо SGBD, який використовується [4].
  • Цей провайдер використовує базу даних [5] і повертає результати провайдеру ADO.NET, який, у свою чергу, передає їх програмі
  • вона використовує ці результати та формує відповідь [5] для користувача

Тепер нагадаємо про основні інтерфейси, які постачальник ADO.NET надає своїм клієнтам [3].

У режимі підключення додаток:

  1. відкриває з'єднання з джерелом даних
  2. працює з джерелом даних у режимі читання/запису
  3. закриває з’єднання

Ці операції переважно стосуються трьох інтерфейсів ADO.NET:

  • IDbConnection, який інкапсулює властивості та методи з’єднання.
  • IDbCommand, що інкапсулює властивості та методи виконаного запиту SQL.
  • IDataReader, що інкапсулює властивості та методи результату команди SQL Select.

Інтерфейс IDbConnection

Служить для управління з'єднанням із базою даних. Серед методів M та властивостей P цього інтерфейсу є такі:

Назва
Тип
Роль
ConnectionString
P
рядок підключення до бази даних. Він визначає всі параметри, необхідні для встановлення з'єднання з конкретною базою даних.
Open
M
відкриває з’єднання з базою даних, визначеною в ConnectionString
Close
M
закриває з’єднання
BeginTransaction
M
починає транзакцію.
State
P
стан з'єднання: ConnectionState.Closed, ConnectionState.Open, ConnectionState.Connecting, ConnectionState.Executing, ConnectionState.Fetching, ConnectionState.Broken

Якщо Connection є класом, що реалізує інтерфейс IDbConnection, відкриття з’єднання можна здійснити наступним чином:

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

Інтерфейс IDbCommand

Використовується для виконання команди SQL або збереженої процедури. Серед методів M та властивостей P цього інтерфейсу є такі:

Назва
Тип
Роль
CommandType
P
вказує, що потрібно виконати — значення береться з переліку:
- CommandType.Text: виконує команду SQL, визначену у властивості CommandText. Це значення за замовчуванням.
- CommandType.StoredProcedure: виконує процедуру, збережену в базі даних
CommandText
P
- текст команди SQL, яку слід виконати, якщо CommandType = CommandType.Text
- ім’я збереженої процедури, яку слід виконати, якщо CommandType = CommandType.StoredProcedure
Connection
P
з'єднання IDbConnection, яке слід використовувати для виконання команди SQL
Transaction
P
транзакція IDbTransaction, в якій слід виконати замовлення SQL
Parameters
P
список параметрів налаштованого запиту SQL. Запит update articles set price=price*1.1 where id=@id має параметр @id.
ExecuteReader
M
для виконання запиту SQL Select. Отримуємо об’єкт IDataReader, що представляє результат запиту Select.
ExecuteNonQuery
M
для виконання команди SQL «Оновити», «Вставити», «Видалити». Отримуємо кількість рядків, на які вплинула операція (оновлені, вставлені, видалені).
ExecuteScalar
M
для виконання запиту SQL Select, який повертає лише один результат, як у запиті: select count(*) from articles.
CreateParameter
M
для створення параметрів IDbParameter для налаштованого запиту SQL.
Prepare
M
дозволяє оптимізувати виконання параметризованого запиту, коли він виконується багато разів з різними параметрами.

Якщо Command є класом, що реалізує інтерфейс IDbCommand, виконання команди SQL без транзакції матиме такий вигляд:

// відкриття з'єднання 
IDbConnection connexion=...
connexion.Open();
// підготовка запиту
IDbCommand commande=new Command();
commande.Connection=connexion;
// виконання команди select
commande.CommandText="select ...";
IDbDataReader reader=commande.ExecuteReader();
...
// виконання команд update, insert, delete
commande.CommandText="insert ...";
int nbLignesInsérées=commande.ExecuteNonQuery();
...
// закриття з'єднання
connexion.Close();

Інтерфейс IDataReader

використовується для інкапсуляції результатів виконання команди SQL Select. Об’єкт IDataReader представляє таблицю зі рядками та стовпцями, які обробляються послідовно: спочатку перший рядок, потім другий, ... Серед методів M та властивостей P цього інтерфейсу є такі:

Назва
Тип
Роль
FieldCount
P
кількість стовпців у таблиці IDataReader
GetName
M
GetName(i) повертає назву стовпця № i таблиці IDataReader.
Item
P
Item[i] представляє стовпець № i поточного рядка таблиці IDataReader.
Read
M
переходить до наступного рядка таблиці IDataReader. Повертає логічне значення True, якщо зчитування відбулося успішно, і False в іншому випадку.
Close
M
закриває таблицю IDataReader.
GetBoolean
M
GetBoolean(i): повертає булеве значення стовпця № i поточного рядка таблиці IDataReader. Інші аналогічні методи такі: GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString.
Getvalue
M
Getvalue(i): повертає значення стовпця № i поточного рядка таблиці IDataReader у вигляді типу object.
IsDBNull
M
IsDBNull(i) повертає True, якщо стовпець № i поточного рядка таблиці IDataReader не має значення, що позначається значенням SQL NULL.

Використання об’єкта IDataReader часто виглядає наступним чином:

// відкриття з'єднання 
IDbConnection connexion=...
connexion.Open();
// підготовка команди
IDbCommand commande=new Command();
commande.Connection=connexion;
// виконання команди select
commande.CommandText="select ...";
IDataReader reader=commande.ExecuteReader();
// обробка результатів
while(reader.Read()){
     // обробка поточного рядка
        ...
}
// закриття зчитувача
reader.Close();
// закриття з'єднання
connexion.Close();