الموضوع للذين يعملون مع تقنية Dev Express فقط
السلام عليكم و رحمة الله و بركاته
كل عام و انتم بخير , تقبل الله دعائكم و زين بالصالحات اعمالكم
مر وقت طويل على اخر مشاركة معكم , مشاغل الدنيا التي لا تنتهي.
اليوم نتحدث عن فكرة جميلة قد تكون راودت اغلبكم و الكثير منكم ربما عمل بها او حاول تطبيقها.
في ظل تطور التطبيقات كان لزاماً علينا ان نقتبس من بعضها الافكار و نطبقها في مشاريعنا.
و لكي لا نطيل الحديث كثيرا الفكرة برمتها تتمحور حول ايجاد الية لاستقبال التنبيهات داخل البرنامج مثل برامج (الواتس اب و الماسنجر و غيرها). كلنا يعرف نظام الاخطارات داخل هذه التطبيقات و كيف انها بمجرد ورود رسائل جديدة تقوم بتفعيل الاخطارات عبر ايقونة صغيرة
تظهر على واجهة التطبيق تفيد بورود عدد محدد من الرسائل.
غالبا تكون هذه التطبيقات بنظام شبكي (وجود اكثر من طرف يتشاركون التطبيق فيما بينهم).
في مشاريعنا الشبكية قد نظطر احيانا لعزل الواجهات وفق صلاحيات محددة , قد يتشارك اكثر من عضو على نفس الجدول ولكن لكل عضو صلاحية محددة (البعض لديه صلاحية ادخال بيانات اولية , بينما الاخر يعالج ارتباطات اخرى للبيانات).
حتى تتضح الصورة اكثر , انا لدي برنامج خاص بمشفى و تحديدا يعالج فكرة ايرادات مالية للمراجعين .
يقسم هذا البرنامج الى اكثر من واجهة
واجهة في الاستقبال يقوم الموظف بادخال بيانات اولية للمراجع فقط (اسم,عمر,هاتف,عنوان...الخ)
واجهة في الادارة المالية تقوم باستقبال هذه البيانات و من ثم تقوم بادراج اجراءات خاصة لهذا المراجع و حسابات مالية تتناسب مع نوع كل اجراء.
هكذا نظام يعتمد على تقسيم المهام في الغالب ستحتاج فيه الى الية تقوم بتنبيه الادارة المالية بوجود ملفات للمراجعين في الاستقبال بحاجة الى معالجة مالية فيقوم موظف الادارة المالية بترحيل البيانات اليه و استكمال باقي الاجراءات الخاصة به.
حتى هذه النقطة الامور مفهومة من الناحية النظرية .
من الناحية العملية انت بحاجة الى تقنية تنبيه للادارة المالية التي تقبع بعيدا عن واجهة الاستقبال .
في لغة البرمجة نحن نحتاج الى الكثير من التفكير بايجاد وسيلة مرضية و سلسة في نفس الوقت لمعالجة هذه العقبة.
و حتى لا نضيع وقتاً كثيرا , هناك خدمات يوفرها لك السيرفر (SQL Server ) تحديدا لاننا نتعامل معه بشكل كبير .
هذه الخدمة توفر لك مراقبة الجدول من حيث كل حركة (ادخال , تعديل , حذف) و بعدها يمكنك اصدار رسالة تستقبلها في واجهة البرنامج تكون بمثابة تنبيه عن حصول تغيرات على الجدول تعرف هذه التقنية باسم (SqlDependency) و هي تندرج في باب خدمة (ٍService Broker) . يمكنك البحث عن كيفية استخدام التقنية و الحصول على الكثير من المعلومات.
يجدر الذكر ان هذه التقنية صصمت للعمل مع (ASp) و ليس مع تطبيقات سطح المكتب.
انا لن اعتمد عليها بشكل مباشر بل ساعتمد على مكتبة مجانية تغنيني من عناء انشاء و تجهيز الكثير من الامور
بسم الله نبدأ
المكتبة مجانية و يوجد لها اكثر من اصدار يخص تطبيقات سطح المكتب و تطبيقات الويب.
اسم المكتبة (SqlTableDependency) يمكنك تحميلها عبر (NuGet Package) الخاصة بالـ Visual Studio
صورة من برنامج يستخدم المكتبة (دقق عند ترحيل البيانات)
الفكرة نشئت في البرنامج على كائن رئيسي هو (المراجع) هذا المراجع له جدولين بنفس البنية .
الجدول الاول يتعامل معه موظف الاستقبال لادخال البيانات الاولية يمكنك اعتباره جدول مؤقت.
بعد اشعار موظف الادارة المالية بوجدود بيانات في هذا الجدول يتم عندها نقل هذه البيانات الى جدول اخر موجود لدى الادارة المالية.
و بعدها يرتبط هذا الكائن بعمليات اخرى سلف ذكرها .
الاخطارات التي تظهر في نافذة الترحيل تفيد بان هناك بيانات لمراجعين و يجب على الادراة التصرف حيالهم.
بعد عملية الترحيل للبيانات تختفي هذه الاخطارات (و قد يحافظ موظف الادارة على وجود هذه البيانات في جدول الاستقبال او قد يحذفها) كونها قد رحلت الى جدول الادارة.
حتى تستطيع ان تطبق نفس الفكرة يجب ان يكون برنامجك شبكي و ان تكون لديك قاعدة بيانات تحتوي على الجداول اللازمة للتعامل معها.
في هذا البرنامج لدي جدول يقوم الاستقبال بادخال اسماء المراجعين فيه و بعدها انا احتاج الى تنبيه يظهر لدى الادارة بوجود بيانات قيد الانتظار و تحتاج الى ترحيل.
الجدول بسيط جداً صممه باي شكل تريد و باي حقول تحبها.
و صمم كلاس خاص للجدول فيه حقول توافق حقول الجدول (شرحنا عنها سابقا في مقال منفصل).
بعد ان تكون قد حملت المكتبة انت تحتاج الى استيراد المراجع في واجهة النموذج كما يلي
PHP كود :
Imports TableDependency.SqlClient
Imports TableDependency.SqlClient.Base
Imports TableDependency.SqlClient.Base.EventArgs
تشغيل
PHP كود :
ALTER DATABASE [Database Name] SET ENABLE_BROKER
PHP كود :
ALTER DATABASE [Database Name] SET DISABLE_BROKER
PHP كود :
SELECT is_broker_enabled FROM sys.databases WHERE name = 'Database name'
او يمكنك وضع اجراء خاص ينفذ العملية لك بعيدأ عن العمل اليدوي
Stored Procedure
PHP كود :
Create procedure [dbo].[exmoney_RunBroker]
@dbname NVarchar(50)
As
DECLARE @ActualDB NVarchar(50) =( SELECT quotename(name) FROM sys.databases WHERE NAME = @dbname )
DECLARE @sql AS NVARCHAR(MAX)
SELECT @sql = 'USE master '
EXEC(@sql)
SELECT @sql = ' ALTER DATABASE ' + @ActualDB + ' SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE'
EXEC(@sql)
الدالة الخاصة به يمكنك وضعها في كلاس منفصل
PHP كود :
Public Sub RunBroker(dbname As String)
If Check_BROKER(dbname) = 0 Then
Using Cmd As New SqlClient.SqlCommand() With
{.CommandType = CommandType.StoredProcedure,
.CommandText = "exmoney_RunBroker",
.Connection = Dal.DataAccessLayer.GetInstance.GetConnection}
Cmd.Parameters.Add(New SqlParameter("@dbname", SqlDbType.NVarChar, 50) With {.Value = dbname})
Dal.DataAccessLayer.GetInstance.OpenConnection()
Cmd.ExecuteScalar()
Dal.DataAccessLayer.GetInstance.CloseConnection()
End Using
End If
End Sub
يمكنك مناداة الدالة مع بداية تشغيل البرنامج و ارسال الوسائط اللازمة.
بعد ذلك انت بحاجة الى تعريف كائن من النوع TableDependency و ربطه مع الجدول المراد مراقبة التغييرات عليه.
PHP كود :
Private dep As SqlTableDependency(Of Pats_Temp)
بعدها نحتاج الى تشغيل الخدمة في واجهة البرنامج , دعنا نسميها المزامنة
PHP كود :
Private Sub Play_Broker()
exmoneyCls.GetInstance.RunBroker(Set_DataBases)
dep = New TableDependency.SqlClient.SqlTableDependency(Of Pats_Temp)(ConnectionString, "Pats_Temp")
Automatic_RefreshData()
End Sub
GetInstance: لا تهتم لها كثيرا (انا اعمل وفق تقنية Singleton Design Pattern) و هذا سبب وجودها , انت ستستدعيها بشكل مباشر.
ِِAutomatic_RefreshData : اجراء يقوم بتشغيل المزامنة و ربط التغيرات كما يلي
PHP كود :
Private Sub Automatic_RefreshData()
Try
If True Then
AddHandler dep.OnChanged, AddressOf Changed
dep.Start()
End If
Catch ex As Exception
End Try
End Sub
و ستحتاج هذا الاجراء ايضاً وهو خاص باقتناص التغيرات الحاصلة جعلته Task لكي لا يؤثر على سير البرنامج (يعمل في مسار منفصل)
PHP كود :
Public Async Function Changed(ByVal sender As Object, ByVal e As RecordChangedEventArgs(Of Pats_Temp)) As Task
Await Task.Delay(30)
Dim Num As Integer = Pats_TempCls.GetInstance.Pats_Temp_GetCount_By_Year_ID_Pat_Transfer(SetGet_Year_ID, False)
If Num > 0 Then
Badge1.Properties.Text = Num
Badge1.Visible = True
ElseIf Num > 99 Then
Badge1.Properties.Text = "+99"
Badge1.Visible = True
ElseIf Num = 0 Then
Badge1.Properties.Text = "0"
Badge1.Visible = False
End If
RemoveHandler dep.OnChanged, AddressOf Changed
End Function
كل سجل لم يرحل يكون لديه اشارة False.
Badge1 : من ادوات Dev Express سيتم تفصيلها لاحقاً (هي الدائرة الحمراء التي تحتوي على الرقم)
الان في صندوق الادوات و بعد انجزنا اغلب العمل , يبقى لدينا تخصيص بسيط لم يسعفني الوقت في انجازه
نختار الاداة التالية
هذه الاداة تضاف الى النموذج الرئيسي و تستطيع التعامل معها بشكل مرئي نحددها و نختار من Smart Tag الخاص بها
Edit Element لتظهر لنا الصورة التالية
ابحث في خصائصها لتتعرف عليها بشكل اكبر
انتهى عملنا و اصبح لديك القدرة على اظهار اخطار (تنبيه عددي) وفق الاكواد السابقة.
بما ان المقال قصيرة اردت ان انوه الى اداة اخرى جيدة و مفيدة و الكثير يطلب تواجدها
هذه الاداة تشبة Splash Screen (مؤشر انتظار) تفيد في الانتظار الى حين انجاز بعض المهام
الجيد في هذه الاداة انها تتلون حسب الستايل المستخدم
يمكنك تحصيلها في صندوق الادوات و بعد اضافتها الى الفورم
تختار اضافة Wait Form و هو فورم عادي ينزل مع الفورمات الموجودة لديك
وهذا شكله
طريقة استخدامه بسيطة جداً وفق الكود التالي
ضع الكود قبل مجموعة المهام التي تريد انجازها و تحتاج الى وقت
PHP كود :
SplashScreenManagerMain.ShowWaitForm()
SplashScreenManagerMain.SetWaitFormCaption("يرجى الانتظار")
SplashScreenManagerMain.SetWaitFormDescription("جاري المعالجة")
PHP كود :
SplashScreenManagerMain.CloseWaitForm()
بارك الله لكم في ما تبقى من شهر رمضان و اعاننا الله و اياكم على صيامه و قيامه.
لا تنسونا من صالح دعواتكم (لي و لاهلي)
مرفق ملف TableDependency.SqlClient.dll الاصدار الاخير (8.5.8.0) حتى تاريخ 17-10-2020 متوافق مع Net FrameWork 4.5.2
رابط المشروع على github.com monitor-table-change-with-sqltabledependency
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال