Skip to content

3. Vaka Çalışması

Bir kullanıcının, bir belediyenin “Maison de la petite enfance” derneğine bağlı çocuk bakıcılarının maaş hesaplamalarını simüle etmesine olanak tanıyan bir .NET uygulaması yazmak istiyoruz. Uygulamanın DotNet kodunun yapısı kadar kodun kendisi de üzerinde durulacaktır.

3.1. veritabanı

Maaş bordrosunu oluşturmak için gerekli statik veriler, dbpam (pam=Çocuk Bakıcısı Maaşı) adlı bir SQL Server Express veritabanında yer almaktadır. Bu veritabanının sa adlı bir yöneticisi vardır ve şifresi msde'dir.

 

Veritabanında EMPLOYES, COTISATIONS ve INDEMNITES adlı üç tablo bulunur ve bunların yapısı şu şekildedir:


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

Yapı:

SS
çalışanın sosyal güvenlik numarası - birincil anahtar
NOM
çalışanın adı
prenom
ad
ADRESSE
adresi
VILLE
şehri
CODEPOSTAL
posta kodu
INDICE
maaş endeksi - [INDICE] tablosundaki [INDEMNITES] alanına ait yabancı anahtar

İçeriği şu şekilde olabilir:

Image


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

Yapı:

İçeriği şu şekilde olabilir:

Sosyal güvenlik prim oranları çalışandan bağımsızdır. Yukarıdaki tablo sadece bir satırdan oluşur.


Table INDEMNITES : rassemble les différentes indemnités dépendant de l'indice de l'employé
INDICE
maaş endeksi - birincil anahtar
BASEHEURE
bir saatlik bakım hizmetinin net fiyatı (Euro)
ENTRETIENJOUR
bakım günü başına euro cinsinden bakım ücreti
REPASJOUR
bakım hizmeti verilen her gün için euro cinsinden yemek ödeneği
INDEMNITESCP
Ücretli izin ödeneği. Bu, temel maaşa uygulanacak bir yüzde oranıdır.

İçeriği şu şekilde olabilir:

Image

Ödeneklerin çocuk bakıcısından bakıcıya farklılık gösterebileceği unutulmamalıdır. Bu ödenekler, çocuk bakıcısının maaş endeksi aracılığıyla o bakıcıya özel olarak belirlenir. Örneğin, maaş endeksi 2 olan Bayan Marie Jouveinal’ın (EMPLOYES tablosu) saatlik ücreti 2,1 avrodur (INDEMNITES tablosu).

Üç tablo arasındaki ilişkiler şu şekildedir:

EMPLOYES (INDICE) sütunu ile INDEMNITES (INDICE) sütunu arasında bir yabancı anahtar ilişkisi vardır.

Bu şekilde oluşturulan [dbpam] veritabanı, SQL Server Express klasöründe iki dosya oluşturur:

'deki [dbpam.mdf, dbpam_log.ldf] dosyaları başka bir makineye taşınabilir ve bu makinedeki SGBD SQL Server Express'e yeniden eklenebilir. Bunun için aşağıdaki adımları izleyin:

  • BD ve [dbpam] dosyaları bir klasöre kopyalanır
 
  • SQL Server Express
  • SQL Server Management Studio Express istemcisi ile [dbpam.mdf] dosyasını SGBD dosyasına ekleyin:
  1. [Databases] dosyasına sağ tıklayın / Ekle
  2. [dbpam.mdf] dosyasını bir düğme aracılığıyla seçin ([Add] dosyası gösterilmemiştir)
  3. Eklenen dosya, daha önce mevcut olmaması gereken bir BD dosyası oluşturacaktır. Burada, [Attach As] alanında, yeni BD dosyasına [dbpam2] adı verilmiştir.
  4. Yeni BD dosyası ve tabloları görülüyor

Bir BD dosyasını ekleme tekniği, bir BD dosyasını bir iş istasyonundan diğerine aktarmak için kullanışlıdır ve burada zaman zaman bu yöntemi kullanacağız.

3.2. 'de bir çocuk bakıcısının maaşının hesaplanma yöntemi

Şimdi bir çocuk bakıcısının aylık maaşının hesaplanma yöntemini sunacağız. Örnek olarak, ödeme yapılacak ay boyunca 20 gün boyunca 150 saat çalışmış olan Bayan Marie Jouveinal'ın maaşını ele alacağız.

Aşağıdaki unsurlar dikkate alınır:

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

[TOTALJOURS]: total des jours
 travaillés dans le mois
[TOTALHEURES]=150
[TOTALJOURS]= 20
Çocuk bakıcısının temel maaşı aşağıdaki formülle hesaplanır:
[SALAIREBASE]=([TOTALHEURES]*
[BASEHEURE])*(1+
[INDEMNITESCP]/100)
[SALAIREBASE]=(150*[2.1])*(1+0.15)= 362,25
Bu temel maaştan belirli miktarda sosyal güvenlik primi kesilmelidir:

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
Toplam sosyal güvenlik primleri:
[COTISATIONSSOCIALES]=[SALAIR
EBASE]*(CSGRDS+CSGD+SECU+RETR
[COTISATIONSSOCIALES]=97,48
Ayrıca, çocuk bakıcısı, çalıştığı her gün için geçim ödeneği ve yemek ödeneği almaya hak kazanır. Bu kapsamda aşağıdaki ödenekleri alır:

[Indemnités]=[TOTALJOURS]*(EN
TRETIENJOUR+REPASJOUR)
[INDEMNITES]=104
Sonuç olarak, çocuk bakıcısına ödenecek net maaş şu şekildedir:
[SALAIREBASE]-
[COTISATIONSSOCIALES]+
[INDEMNITÉS]
[salaire NET]=368,77

3.3. Hatırlatmalar ADO.NET

Maaş hesaplama uygulaması, [dbpam] veritabanındaki bilgilere ihtiyaç duyar. Uygulamanın mimarisi şu şekilde olacaktır:

  • [1]'te kullanıcı bir talep oluşturur
  • [2]'te, bordro uygulaması bu talebi işler.
  • Bu durumda veritabanındaki verilere ihtiyaç duyabilir. Ardından, SGBD tarafından kullanılan [4] sağlayıcısına (provider) ADO.NET sorgusu gönderir.
  • Bu sağlayıcı, [5] veritabanını işler ve sonuçları ADO.NET sağlayıcısına iletir; bu sağlayıcı da sonuçları uygulamaya iletir
  • Uygulama bu sonuçları işleyerek kullanıcı için [5] yanıtını oluşturur

Şimdi, bir ADO.NET sağlayıcısının [3] müşterilerine sunduğu başlıca arayüzleri hatırlatalım.

Bağlı modda, uygulama:

  1. veri kaynağıyla bir bağlantı kurar
  2. veri kaynağıyla okuma/yazma modunda çalışır
  3. bağlantıyı kapatır

Bu işlemlerle esas olarak üç ADO.NET arayüzü ilgilidir:

  • IDbConnection, bağlantının özelliklerini ve yöntemlerini kapsar.
  • IDbCommand, yürütülen SQL komutunun özelliklerini ve yöntemlerini kapsar.
  • IDataReader, SQL Select komutunun sonucunun özelliklerini ve yöntemlerini kapsar.

IDbConnection arayüzü

Veritabanıyla olan bağlantıyı yönetmek için kullanılır. Bu arayüzün M yöntemleri ve P özellikleri arasında şunlar bulunur:

Ad
Tür
Rol
ConnectionString
P
veritabanına bağlantı dizesi. Belirli bir veritabanıyla bağlantı kurulması için gerekli tüm parametreleri belirtir.
Open
M
ConnectionString ile tanımlanan veritabanına bağlantıyı açar
Close
M
bağlantıyı kapatır
BeginTransaction
M
işlemi başlatır.
State
P
bağlantı durumu: ConnectionState.Closed, ConnectionState.Open, ConnectionState.Connecting, ConnectionState.Executing, ConnectionState.Fetching, ConnectionState.Broken

Connection, IDbConnection arayüzünü uygulayan bir sınıf ise, bağlantı şu şekilde açılabilir:

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

IDbCommand arayüzü

Bir SQL komutunu veya depolanmış bir yordamı yürütmek için kullanılır. Bu arayüzün M yöntemleri ve P özellikleri arasında şunlar bulunur:

Ad
Tür
Rol
CommandType
P
yürütülmesi gerekeni belirtir - değerlerini bir sıralamadan alır:
- CommandType.Text: CommandText özelliğinde tanımlanan SQL komutunu yürütür. Bu, varsayılan değerdir.
- CommandType.StoredProcedure: veritabanında depolanmış bir yordamı yürütür
CommandText
P
- CommandType = CommandType.Text ise çalıştırılacak SQL komutunun metni
- CommandType = CommandType.StoredProcedure ise çalıştırılacak saklı yordamın adı
Connection
P
SQL emrini yürütmek için kullanılacak IDbConnection bağlantısı
Transaction
P
SQL emrini yürütmek için kullanılacak IDbTransaction işlemi
Parameters
P
parametreleri ayarlanmış bir SQL emrinin parametre listesi. "update articles set price=price*1.1 where id=@id" emrinin @id parametresi vardır.
ExecuteReader
M
SQL ve Select emirlerini yürütmek için. Select emrinin sonucunu temsil eden bir IDataReader nesnesi elde edilir.
ExecuteNonQuery
M
komutunu kullanarak SQL Update, Insert, Delete komutunu çalıştırmak. İşlemden etkilenen satır sayısı (güncellenen, eklenen, silinen) elde edilir.
ExecuteScalar
M
SQL Select emrini çalıştırmak için; örneğin select count(*) from articles gibi tek bir sonuç veren bir emir.
CreateParameter
M
SQL emrinin parametrelerini içeren IDbParameter emrini oluşturmak için.
Prepare
M
farklı parametrelerle birden çok kez yürütüldüğünde, parametreli bir sorgunun yürütülmesini optimize etmenizi sağlar.

Command, IDbCommand arayüzünü uygulayan bir sınıf ise, işlem içermeyen bir SQL emrinin yürütülmesi aşağıdaki gibi olacaktır:

// bağlantı açılır 
IDbConnection connexion=...
connexion.Open();
// komut hazırlığı
IDbCommand commande=new Command();
commande.Connection=connexion;
// select komutunun yürütülmesi
commande.CommandText="select ...";
IDbDataReader reader=commande.ExecuteReader();
...
// update, insert, delete komutlarının yürütülmesi
commande.CommandText="insert ...";
int nbLignesInsérées=commande.ExecuteNonQuery();
...
// bağlantı kapatma
connexion.Close();

IDataReader arayüzü

, SQL ve Select emirlerinin sonuçlarını kapsüllemek için kullanılır. Bir IDataReader nesnesi, sırayla işlenen satır ve sütunlardan oluşan bir tabloyu temsil eder: önce 1. satır, sonra 2. satır, ... Bu arayüzün M yöntemleri ve P özellikleri arasında şunlar bulunur:

Ad
Tür
Rol
FieldCount
P
IDataReader tablosundaki sütun sayısı
GetName
M
GetName(i), IDataReader tablosundaki i numaralı sütunun adını döndürür.
Item
P
Item[i], IDataReader tablosunun geçerli satırındaki i numaralı sütunu temsil eder.
Read
M
IDataReader tablosunun bir sonraki satırına geçer. Okuma işlemi başarılı olursa True boole değerini, aksi takdirde False değerini döndürür.
Close
M
IDataReader tablosunu kapatır.
GetBoolean
M
GetBoolean(i): IDataReader tablosunun geçerli satırındaki i numaralı sütunun boole değerini döndürür. Diğer benzer yöntemler şunlardır: GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString.
Getvalue
M
Getvalue(i): IDataReader tablosunun geçerli satırındaki i numaralı sütunun değerini object türü olarak döndürür.
IsDBNull
M
IsDBNull(i), IDataReader tablosunun geçerli satırındaki i numaralı sütunda değer yoksa (bu durum SQL NULL değeriyle gösterilir) True değerini döndürür.

Bir IDataReader nesnesinin kullanımı genellikle aşağıdaki gibidir:

// bağlantı açma 
IDbConnection connexion=...
connexion.Open();
// komut hazırlığı
IDbCommand commande=new Command();
commande.Connection=connexion;
// select komutunun yürütülmesi
commande.CommandText="select ...";
IDataReader reader=commande.ExecuteReader();
// sonuçların değerlendirilmesi
while(reader.Read()){
     // mevcut satırı işleme
        ...
}
// okuyucuyu kapat
reader.Close();
// bağlantıyı kapat
connexion.Close();