Skip to content

3. دراسة الحالة

نرغب في كتابة تطبيق .NET يسمح للمستخدم بإجراء محاكاة لحساب رواتب المربيات في جمعية "Maison de la petite enfance" في إحدى البلديات. سنركز على تنظيم كود التطبيق 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]

قد يكون محتواه كما يلي:


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
بدل الإجازات المدفوعة الأجر. وهي نسبة مئوية تُطبق على الراتب الأساسي.

قد يكون محتواها كما يلي:

تجدر الإشارة إلى أن البدلات قد تختلف من مربية أطفال إلى أخرى. فهي مرتبطة بمربية أطفال معينة من خلال مؤشر راتبها. وبالتالي، فإن السيدة ماري جوفينال التي لديها مؤشر راتب يبلغ 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 Update، Insert، Delete. نحصل على عدد الأسطر المتأثرة بالعملية (المحدثة، المضافة، المحذوفة).
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();
...
// تنفيذ أمر التحديث والإدراج والحذف
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();