الأربعاء، 20 نوفمبر 2013

ما هي ملفات ذات امتداد XSD وكيف يستفاد منها

ماهي ملفات XSD ؟
هي ملفات تساعدنا في استعراض التقارير او ارسال واستلام بيانات من  والى  Stored procedure الموجودة بداخل قاعدة البيانات بطريقة سهلة وواضحة  .
اي التقرير في بيئة الفجوال ستوديو لا يمكن استخدامه عن طريق الاتصال المنفصل او عن طريق الكود بصورة عامة لأنه يحتاج الى ملف ذو امتداد .XSD يحدد  له الحقول التي سيعرض بها البيانات التي نملئها من قاعدة البيانات  . اي تكون العملية بشكل التالي
اي البيانات تأتي من قاعدة البيانات الى ملف XSD الذي نحن نحمله بالبيانات ومنه تعرض داخل التقرير هذه البيانات  والتقرير يعرض داخل مستعرض تقارير  Report Viewer  او تستخدم مباشرة من بدون تقارير

لأدراج ملف .XSD من داخل المشروع نختار اضافة كائن جديد ومن قائمة Data نختار DataSet



شكل الملف بعد ادراجه داخل المشروع يعرض لنا في ToolBox اداوات جديدة نستخدمها في هذه الملفات وسوف نشرحها بلتفصيل




كما نعلم التقرير يحتاج لأعمدة تعرض فيه اي حقول لذالك ندرج DataTable لتكوين اعمدة  المطلوبة للتقرير ونوع كل عمود  يحدد من خصائصه وكذالك بقية الخصائص الخاص بكل عمود او حقل. 

وكيف نملئى هذه الاعمدة بالبيانات  ؟
نملئها عن طريق TableAdapter ايضا ندرجه في اسفل  DataTable الذي كوناه لكي ننفذ عمليات على TableAdapter  وهو يملئ  الجدول  DataTable بالبيانات  .




وهذا  Query الموجودة داخل TableAdapter نكونها عن طريق سحب  Query من Toolbox وبعد سحب والقائه على  TableAdapter سيعرض لنا الشاشة التالية


توجد به ثلاث خيارات
1.     Use SQL statements هنا نحن نكتب جملة SQL ونحدد البيانات التي نريدها ان تعرض وكيف
2.     Create new stored procedures هنا ننشئ بروسيجر جديدة ونضيفه في قاعدة البيانات
3.     Use existing stored procedures  هنا نستخدم مباشرة بروسيجر موجودة في قاعدة البيانات

في حال اخترنا الخيار الأول ستضهر لنا هذه الشاشة ونكتب به Sql  التي نود ان تنفذ


في هذا SQL جعلنا يبحث عن اسم معين

توضيح محتويات الصفحة .... 

Query Builder : هي لتنفيذ جملة Sql والتاكد من صحتها
Advanced Options : هي تحديد امكانية اضافة وحذف وتعديل مباشرة على الجدول اي يضيف Query الخاص بلحذف والتعديل  مباشرة. وهذه الخاصية ل اتفعل اذا اذا كان احد حقول الجدول يحتوي على مفتاح رئيسي تستطيع اضافته


بعد اكمال العمل نضغط next  ستضهر هذه الشاشة

يوجد به اسمين للبروسيجر او الفاكشن  التي كتبناها وكيف سيتم استدعاها
1.     Fill A DataTable هي اسم الدالة التي نريد استدعائها عن ملئى حقول الجدول DataTabel بالبيانات
2.     Return a DataTabel هي اسم الدالة  SelectMethod التي سنستدعيها في التقارير لتمرير البيانات لها

بعد اضافة  query وتفعيل الاضافة والحذف والتعديل تلقائيا تكتب عبارة Sql  الخاصة بكل من الاضافة والحذف والتعديل والاختيار الخاصة بالجدول
بشكل اجرائات (insert,delete,update, select) نستطيع استدعائها وتمرير البرامترات لها . ونستطيع تغيرها  ومعرفتها بضغط  tableAdapter الخاص بجدول والتحكم بالخصائص







العلاقات بين الجداول Relation تستخدم لعمل علاقة بين اكثر من جدول لجلب بيانات من اكثر من جدول الى تقرير او الى المشروع للتعامل معها وهي عملية معروفة جدول رئيسي وثانوي ومفتاح رئيسي وثانوي يربط الجدولين


هناك طريقة مباشرة لتكوين Data table  و TableAdapter مباشرة بدون تصميم حقل حقل وهو عن طريق الاتصال ببروسيجر موجود بقاعدة البيانات فيه كل مدخلات ومخرجات التقرير فقط نسحب TableAdapter وندرجه ونختار

Use existing stored procdures   ونختار البروسيجر من قاعدة البيانات وهو تلقائيا سيكون لنا الجدول الخاص به بكل سهولة وكذالك Query الخاصة به


كيف نستدعي الدوال الموجودة داخل ملفات XSD من البرنامج  ؟

لعمل نسخة من جدول معين نكون كائن جديد  من Dataset.xsd وبعدها اسم الجدول المطلوب  نكتب التالي
VB.net Code
Dim dsCopy As New DataSet1.AdminsManageDataTable


C# Code
DataSet1.AdminsManageDataTable dsCopy = new DataSet1.AdminsManageDataTable();




لتنفيد  Query موجودة ضمن TableAdapter  نكون كائن جديد من ذالك TableAdapter ونستدعي اي دالة موجودة ضمنه ونرسل لها الجدول المراد ملئه بالبيانات الذي كوناه قبل قليل  والبرامترات الخاصة بالجدول
VB.net Code
Dim TabelAdapb As New DataSet1TableAdapters.AdminsManageTableAdapter
   TabelAdapb.Fill(dsCopy, "h%")  



C# Code
DataSet1TableAdapters.AdminsManageTableAdapter TabelAdapb = new DataSet1TableAdapters.AdminsManageTableAdapter();
TabelAdapb.Fill(dsCopy, "h");



الأن لكي نعرض هذه البيانات داخل   GridView1 ويكون الكود كامل
VB.net Code
Dim dsCopy As New DataSet1.AdminsManageDataTable
Dim TabelAdapb As New DataSet1TableAdapters.AdminsManageTableAdapter
TabelAdapb.Fill(dsCopy, "h")
GridView1.DataSource = dsCopy


C# Code
DataSet1.AdminsManageDataTable dsCopy = new DataSet1.AdminsManageDataTable();
DataSet1TableAdapters.AdminsManageTableAdapter TabelAdapb = new DataSet1TableAdapters.AdminsManageTableAdapter();
TabelAdapb.Fill(dsCopy, "h");



وفي التقارير تستدعى بشكل التالي نرسل اسم الدالة والبرامترات هنا اتحدث عن ASP.net تقارير اما تقاير تطبيقات الوندوز يكون نفس الطريقة السابقة
VB.net Code
  ObjectDataSource1.SelectMethod = "GetData"
            ObjectDataSource1.SelectParameters.Clear()
            ObjectDataSource1.SelectParameters.Add("AdminFullName", DbType.String)
            ObjectDataSource1.SelectParameters("AdminFullName").DefaultValue = "h"
  Me.ReportViewer1.LocalReport.Refresh()



C# Code
ObjectDataSource1.SelectMethod = "GetData";
ObjectDataSource1.SelectParameters.Clear();
ObjectDataSource1.SelectParameters.Add("AdminFullName", DbType.String);
ObjectDataSource1.SelectParameters("AdminFullName").DefaultValue = "h";
this.ReportViewer1.LocalReport.Refresh();



الان لنعود الى صفحة تسمية الدالة عند الاستدعاء
1.     Fill a DataTable  كان اسمها fill  وهو ما فعلنا في استعائها كدالة في ملئ grid View
2.     Return a DataTabel  كان اسمها GetData واستدعينها في التقرير
الان عرفنا الفرق في استخدام هذين الاسمين

الجمعة، 18 أكتوبر 2013

تسجيل عمليات المستخدمين على قاعدة البيانات Triggers

 عند بناء اي نظام متعدد الصلاحيات ومتعدد مستوى الأدخال ومدراء كثيرون على النظام يقومون بأدخال بيانات وحذفها والتعديل عليها في الجداول نحتاج لتسجيل كل عملية لكل مستخدم على قاعدة البيانات حتى نعرف ماذا فعل كل مستخدم او مدير ضمن النظام داخل المشروع من تغيرات على البيانات الجداول . 

وبطريقة اخرى .
دائما نحتاج في برامج قواعد البيانات تسجيل كل العمليات  التي يقوم بها  المستخدمين على قاعدة البيانات من اضافة وحذف وتعديل حتى يكون مدير النظام على بينة بكل عمليات المستخدمين  التي يقومون بها على قاعدة البيانات 


يوفر لنا SQL Server خاصية تسمى  Triggers 

 Triggers   موجودة مع كل جدول    تتنفذ  تلقائيا عند اجراء عمليات حذف او اضافة او تعديل على الجدول . نكون بيها اجرائات  لتقوم بتسجيل كل تغير على هذا الجدول  من اضافة سجل او تعديل سجل او حذف سجل يحدث في الجدول  .

مثال : لنفرض ان لدينا جدول اسمه Admins  كما في الشكل   

UserFillName
UserNo
Hussien ahmed talib
2
Salahm hamed
1
Waeel  ahmed
3
Kaeed katib
2

ونحن نريد تسجيل كل تغير (تحديث) يقوم به المدراء على اي قيد في الجدول  يحدث على 
1.حقل  اسم المستخدم   UserFillName  
2. حقل UserNo   هو حقل يخزن فيه ID  الخاص بلمدير من جدول AdminManager الذي   قام بتغير هذا الاسم  

بداية : نضغط على الجدول Admin  ومن Triggers نختار اضافة   Triggers جديد 



نكون   TRIGGER  جديد
create TRIGGER [dbo].[trgName]
ونجعله يتحكم بلجدول  Admin 
  ON [dbo].[Admin ]
بعد كلمة  AFTER نختار العملية (insert,delete,update) الذي نريده ان يرتبط به هذا الأجراء   [dbo].[trgName]  اي متى نريد هذا الاجراء ان يتنفذ عند الحذف او عند التعديل او عند الاضافة في هذا الجدول

نجعل هذا   TRIGGER  الاجراء  [dbo].[trgName]  يعمل عند التحديث على الجدول نكتب بعد after كلمة Update معناه ينفذ الاجراء بعد  كل عملية التعديل على سجل من سجلات  الجدول
AFTER UPDATE






في داخل هذا الأجراء نعمل نتحقق على   حقل الأسم   UserFillName   هل  تم تغير البيانات فيه هكذا
IF UPDATE(UserFillName)
 BEGIN
 
END
وفي داخل شرط  التحقق   نجلب :
1. القيمة القديمة  Deleted  للحقل    الأسم   UserFillName 
2. القيمة الجديدة   Inserted  للحقل   الأسم   UserFillName 
3. UserNo  عنوان ID الخاص بلمدير الذي حدثت البيانات فيه 
SELECT @OldDate = (SELECT UserFillName FROM Deleted)
SELECT @NewDate = (SELECT UserFillName FROM Inserted)
SELECT @UserNo = (SELECT UserNo FROM Inserted)

وبعدها نرسل   البيانات  التي حصل عليها التحديث  الى اجراء الحفظ في جدول  TabelHistory لكل نحفظ التغيرات على بيانات الحقل في صف جديد في الجدول
exec dbo.InsertHistory @OldDate,@NewDate,@UserNo


كود  TRIGGER الاجراء   [dbo].[trgName]  كامل

create TRIGGER [dbo].[trgName]
  ON [dbo].[Admin ]
AFTER UPDATE
AS
BEGIN

SET NOCOUNT ON;
DECLARE @OldDate nvarchar(40)
DECLARE @NewDate nvarchar(40)
DECLARE @UserNo int

IF UPDATE(UserFillName)
 BEGIN
SELECT @OldDate = (SELECT UserFillName FROM Deleted)
SELECT @NewDate = (SELECT UserFillName FROM Inserted)
SELECT @UserNo = (SELECT UserNo FROM Inserted)

IF @OldDate <> @NewDate
BEGIN
exec dbo.InsertHistory @OldDate,@NewDate,@UserNo
END
 END
END

هنا ننشئ اجراء لحفظ عمليات التغير على الجدول الذي نستدعي عند كل عملية تحديث على الجدول

create PROCEDURE [dbo].[InsertHistory]
(@OldName varchar(40),@NewName varchar(40) ,@UserNo int )
AS
BEGIN

SET NOCOUNT ON;

Insert into dbo.TabelHistory
([ OldName ],[ NewName ],[UserNo])

Values
( @ OldName ,@ NewName ,@UserNo )
END
جدول  TabelHistory الذي يخزن به حركات المستخدمين وتعديلاتهم على الجداول 

OldName
NewName
UserNo
Hussien ahmed talib
Hussien ahmed
1
Salahm hamed
Salahm hamed najam
1



جدول AdminManager

وهذا الجدول خاص بأسماء المدراء الحقيقية  وID الخاص بكل مدير يفيدنا في تحويل ID الخاص بلمدراء الى اسمهم الحقيقي

UserName
UserNo
Admin1
1
Admin2
2
Admin3
3
Admin4
4