تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
معالجة التنبيهات في البرامج (استقبال تنبيهات داخل البرنامج) Dev Express
#1
الموضوع للذين يعملون مع تقنية 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 
من جهة السيرفر تحتاج الى تشغيل خدمة Service Broker  عن طريق الاكواد التالية
تشغيل
PHP كود :
ALTER DATABASE [Database NameSET ENABLE_BROKER 
اطفاء
PHP كود :
ALTER DATABASE [Database NameSET 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(nameFROM 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.NVarChar50With {.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 
exmoneyCls : اسم الكلاس الذي يحتوي الدالة.
GetInstance: لا تهتم لها كثيرا (انا اعمل وفق تقنية Singleton Design Pattern) و هذا سبب وجودها , انت ستستدعيها بشكل مباشر.
ِِAutomatic_RefreshData : اجراء يقوم بتشغيل المزامنة و ربط التغيرات كما يلي

PHP كود :
Private Sub Automatic_RefreshData()

 
       Try
            If True Then
                AddHandler dep
.OnChangedAddressOf Changed
        
                dep
.Start()

 
           End If

 
       Catch ex As Exception

        End 
Try
 
   End Sub 

و ستحتاج هذا الاجراء ايضاً وهو خاص باقتناص التغيرات الحاصلة جعلته Task لكي لا يؤثر على سير البرنامج (يعمل في مسار منفصل)
PHP كود :
 Public Async Function Changed(ByVal sender As ObjectByVal 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_IDFalse)


 
           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.OnChangedAddressOf Changed

       
    End 
Function 
الاجراء GetCount_By_Year_ID_Pat_Transfer : هو اجراء يقوم بجلب عدد المراجعين من الجدول الذين يوافقون العام المحدد و غير مرحلين (يوجد حقل في الجدول من نوع Bit) للاشارة الى ان المراجع غير مرحل بعد 
كل سجل لم يرحل يكون لديه اشارة 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


الملفات المرفقة
.rar   TableDependency.SqlClient.rar (الحجم : 38.2 ك ب / التحميلات : 8)
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد
#2
مشكور اخي الكريم ،،

الفكرة هذي موجوده أيضا في قواعد بيانات FIREBASE بدون أدوات او كتابة كود .

وانت الآن افرحتنا بوجود الخدمة مع SQL SERVER ....


جزاك الله خير .
يا رحمن الدنيا والآخرة ورحيمهما
الرد
تم الشكر بواسطة: ابو ليلى
#3
وعليكم السلام ورحمة الله وبركاتة

اهلا وسهلا اخي / ابو ليلى 

اشتقنا لك ولمقالاتك الرائعة

اتمنى ان تكون بالف صحة وعافية

شكرا على هذا المقال الجميل
 
جزاك الله الف خير 

+1
5 نجوم
الرد
تم الشكر بواسطة: ابو ليلى , elgokr , elgokr
#4
(24-05-19, 05:39 AM)حريف برمجة كتب : مشكور اخي الكريم ،،

الفكرة هذي موجوده أيضا في قواعد بيانات FIREBASE بدون أدوات او كتابة كود .

وانت الآن افرحتنا بوجود الخدمة مع SQL SERVER ....


جزاك الله خير .
العفو منك اخي , شكرا لمرورك و تعليقك , يوجد الكثير للحديث عنه من خدمات في SqlServer و خصوصاً هذه الخدمة و لكن ضيق الوقت
يحول دائمأ , حتى هذه المقال جائت على عجل فرج الله همكم و همي (اللهم انك سميع عليم و مجيب للدعاء)


(24-05-19, 01:56 PM)sendbad100 كتب :
وعليكم السلام ورحمة الله وبركاتة

اهلا وسهلا اخي / ابو ليلى 

اشتقنا لك ولمقالاتك الرائعة

اتمنى ان تكون بالف صحة وعافية

شكرا على هذا المقال الجميل
 
جزاك الله الف خير 

+1
5 نجوم

اهلا اخي سندباد100 و انا مشتاق لكم اكثر لم اقطعكم يوما , كنت دائم المرور و لكن على عجل بسبب مشاغلي, صحتي و الحمد لله بخير ,
و اطلب من الله ان تكونوا جميعاً بخير وفقكم الله لما يحب و يرضى
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد
تم الشكر بواسطة: sendbad100 , elgokr
#5
اخي لو تكرمت ممكن تفيدنا بتنفيذ لاني مافهمت
اعجبتني الفكره بس لم افهمها
فلو تكرمت نفذ مشروع وارفعه هنا بارك الله فيك
الرد
تم الشكر بواسطة: elgokr , elgokr , ابو ليلى , ابو ليلى
#6
السلام عليكم استاذنا العزيز مجهود يشكر عليه بحق وربي يجعله في ميزان حسناتك .
بالله عندي كم استفسار واريدك علي الخاص فياريت رقم هاتفك
الرد
تم الشكر بواسطة: ابو ليلى
#7
السّلام عليكم و رحمة الله و بركاته
أستاذنا الكريم أبو ليلى
SqlTableDependency
هل من الممكن إذا كانت هذه المكتبة على شكل Dll تفيدنا بها الله يجازيك كل خير
حاولت كثيرا عن طريق Nuget و لم اتمكن من تحميلها
إحتراماتي
الرد
تم الشكر بواسطة:
#8
(17-10-20, 04:03 AM)عبد العزيز البسكري كتب :
السّلام عليكم و رحمة الله و بركاته
أستاذنا الكريم أبو ليلى
SqlTableDependency
هل من الممكن إذا كانت هذه المكتبة على شكل Dll تفيدنا بها الله يجازيك كل خير
حاولت كثيرا عن طريق Nuget و لم اتمكن من تحميلها
إحتراماتي

و عليكم السلام و رحمة الله و بركاته
تم ارفاق الملف مع رابط المشروع في الموضوع
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد
تم الشكر بواسطة: عبد العزيز البسكري
#9
بارك الله فيك و لك و جزاك خير الجزاء
إحتراماتي
الرد
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
Photo كيفية اطهار جدول داخل الأخر alsouf 1 643 20-10-20, 09:36 AM
آخر رد: Arfat007
  صناعة التقارير الطارئة حسب طلب العميل - Dev Express ابو ليلى 3 945 27-09-20, 06:42 PM
آخر رد: ابو محمد محمد محمد
  شرح خوارزميات معالجة الصور (من دروس الاستاذ فوزي برزنجي) ناديه الشجيري 17 23,258 20-03-20, 03:40 PM
آخر رد: معاند الحظ
  تنفيذ سكربت القاعدة مع انطلاق البرنامج + تحديث التعديلات على القاعدة ابو ليلى 1 856 24-01-20, 11:55 AM
آخر رد: عبد العزيز البسكري
  إضافة نغمات إفتتاحيّة أثناء تسطيب البرنامج عبد العزيز البسكري 11 2,208 23-01-19, 08:35 PM
آخر رد: عبد العزيز البسكري
  قاعدة بيانات مضمنة مع البرنامج viv 4 1,510 27-09-18, 08:01 PM
آخر رد: viv
  [درس فيديو] شرح ربط البرنامج بقاعدة بيانات, إدراج حذف تعديل جلب البيانات ( بدون أن تكتب سطر واحد) عبدالله الدوسري 4 1,898 08-02-18, 12:55 AM
آخر رد: Ameer Eagle
  حماية البرامج ابو ليلى 5 7,874 20-02-17, 01:34 AM
آخر رد: EnormousSoft
  الاستفادة من بارمترات الاخراج من SQL Server داخل برنامجك ابو ليلى 1 1,559 20-08-16, 02:16 AM
آخر رد: الوادي
  [درس فيديو] تشغيل اوامر Run من البرنامج & مثال غلق الويندوز بعد وقت محدد باستخدام VB.net أحمد النجار 1 1,997 23-12-15, 04:26 AM
آخر رد: الماجيك مسعد

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم