• الإعلانات

    • فيصل الحربي

      تسجيل عضوية جديدة في المنتدى   01/31/2016

      السلام عليكم ورحمة الله وبركاته  عزيزي العضو الجديد :  حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة )  فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK)  وقم بتفعيل إشتراككم من هناك   

الغملاسي

المشرفين القدامى
  • عدد المشاركات

    1,597
  • تاريخ الانضمام

  • تاريخ اخر زياره

كل شيء نشر بواسطة الغملاسي

  1. ( الشموع الموقــَدات لكشف تضارب البيانات ) السلام عليكم في هذه المقالة سنتطرق لموضوع تضارب البيانات concurrency violation الغير واضح المعالم. لماذا؟ السبب أن الحلول متعددة بحيث تعتمد على وضع و وقت و كيفية التضارب. ناهيك عن تعدد أنواع التضارب , لذلك أوقدنا الشموع لرؤية هذا التضارب عن كثب. هنالك على حسب علمي المتوضع ثلاثة وضعيات أو استراتيجيات لهذه المشكلة وهي كالتالي: أولاً ما يعرف بـ استراتيجية التضارب المشؤوم pessimistic concurrency strategy. ثانياً: ما يعرف بـ استراتجية التضارب المحمود optimistic concurrency strategy . ثالثاً: ما يعرف بـ استراتيجية الاخر هو الاولى Last in wins strategy . لكن قبل كل ذلك, ينبغي علينا تعريف مالمقصود بـتضارب البيانات. هي عملية تحدث بين مستخدمين أو أكثر بحيث يقومان بالعمل على نفس البيانات في نفس الوقت هذه العملية كما تعلمون تعرف بـ concurrency violation متى يقع التضارب ؟ تقع المشكلة عند عملية التحديث سواءً في الاضافة أو التعديل او الحذف, لكن ليس في عملية الاختيار Select Statement إلا ان عملية الاختيار, كما سيأتينا لاحقاً انها كذلك لم تسلم من عملية تضارب البيانات. وإن كان البرنامج يعمل كما ينبغي. إلا ان المعطيات ستكون غير صحيحة. هنالك تفسير إيجابي للتضارب وهو : Maximize the amount of work that can be done by all users at the same time, and most importantly, make all users feel like they’re important الاستراتيجية الاولى : استراتيجية التضارب المشؤوم pessimistic concurrency strategy. الوضع : ان يكون فقط مستخدم واحد يُحدث في نفس الوقت, وهذا المستخدم غير مشروط ربما يكون عمر في المرة الاولى ويكون زيد في المرة الثانية. من يجلب البيانات أول هو احق بالتحديث عن سواه. الاستراتيجية الاولى تعتمد على غلق الحقل الذي هو قيد الاستخدام كتحديث حتى ينتهي منه المستخدم الحالي ثم بعد ذلك يفتح هذا الحقل للمستخدم الاخر. لكن لن يتم اعتماد تحديث المستخدم الاخر, هذه العملية تعرف بـالتحديث المفقود a lost update. على سبيل المثال زيد وعمر قاما بجلب بيانات عامود الراتب الشهري, وكان الصف الاول فيه القيمة 5000 درهم, تم قفل الحقل لمصلحة زيد, زيد زاد على الصف الاول 1000 درهم الان البيانات لن تصل إلى عمر, وعمر ما زال ينتظر عملية جلب البيانات, ولن يفلح, حتى يفرغ زيدٌ منها, الان قام زيد بالتحديث فاصبحت 6000 درهم. تم فتح القفل عن الحقل, الان وصلت البيانات إلى عمر 6000 درهم . عمر قام بانقاص 2000 درهم لتصبح 4000 درهم , قام عمر بتحديث البيانات. لم يقبل التحديث لان التحديث المقفول بزيد لا يمكن تخطيه بتحديث عمر الغير مقفل في بداية الامر حتى وان كان عمر من حدث فيما بعد. السبب كما ذكرنا أن هذه العملية تضمن تحديث واحد فقط في الوقت نفسه. لذلك يعرف تحديث عمر بالتحديث المفقود lost update و الراتب الشهري في النهاية هو 6000 درهم . ملاحظة: بما أن الحل متعلق بقفل الحقل, فهو واضح انه لا يدعم تقنية الاتصال المنقطع Disconnected environment الاستراتيجية الثانية : استراتجية التضارب المحمود optimistic concurrency strategy . الوضع : ان يكون اعتماد التحديث للبيانات متزامن مع الطرفين. الاستراتيجية الثانية لا تعتمد على غلق الحقل, انما تعتمد على من يحدث اولاً قبل الاخرين. لنفترض ان مستخدمان قاما بجلب البيانات و كانت قيمة الصف , عبارة عن حجز تذكرة وباقي من كراسي الغير محجوزة 5 كراسي , قام المستخدم الاول بإعتماد الحجز له فاصبحت 4 وبما ان الحقل غير مقفل اثناء عمل المستخدم الاول عليه, استطاع المستخدم الثاني جلب البيانات وهي 5 الان المستخدم الاخر قام بحجز كرسي له فاصبحت 4 قام بالتحديث , تم قبول التحديث ,الان قام المستخدم الاول ليحدث نفس الحقل بالقيمة 4 تم رفض التحديث كون القيمة العائدة هي القيمة الحالية وهي 4 كراسي فقط و كذلك قيمة الصف القديمة ليست مطابقة للقيمة الاصلية في قاعدة البيانات والتي كانت 5 كراسي . في الاخير, تم اعتماد حجزي المستخدمان مع ان الكراسي المحجوزة هو كرسي واحد فقط بمعنى اخر تم حجز كرسي لشخصين... متى يحدث التضارب المحمود : يحدث عندما يجلب مستخدم قيمة ما ويقوم الاخر بجلب نفس القيمة ثم يغيرها ويحدثها , ثم يقوم الاول بمحاولة تحديث القيمة التي تغيرت بواسطة المستخدم الاخر , هنا تقع المشكلة أو ما يعرف بـ optimistic concurrency violation لماذا : لانه شرط هذه التقنية أن شرط التحديث يعتمد على التحقق من البيانات المُحدثة الحالية Current مع البيانات الاصلية في قاعدة البيانات Original Data . ملاحظة: الـ Dataset مصصمة لأجل هذه التقنية وهي داعمة لها و تتبناها. الاستراتيجية الثالثة : استراتيجية الاخر هو الاولى Last in wins strategy . الوضع : هو أن من يحدث أخرًا لا يفقد تحديثه. الحل الثالث : لا يعتمد على غلق الحقل, انما يعتمد على من يحدث اخرًا بعد الاخرين. لنفترض ان مستخدمان قاما بجلب البيانات و كانت قيمة الصف , عبارة عن حجز تذكرة وباقي من كراسي الغير محجوزة 5 كراسي , قام المستخدم الاول بإعتماد الحجز له فاصبحت 4 وبما ان الحقل غير مقفل اثناء عمل المستخدم الاول عليه, استطاع المستخدم الثاني جلب البيانات وهي 5 الان المستخدم الاخر قام بحجز كرسي له فاصبحت 4 قام بالتحديث , تم قبول التحديث ,الان قام المستخدم الاول ليحدث نفس الحقل بالقيمة 4 تم قبول التحديث وتم فقد قيمة تحديث المستخدم الاول وهي 4 كراسي فقط تم اعتماد حجز المستخدم الاخر ,مع ضياع قيمة تحديث المستخدم الاول. لماذا: لاسبب بسيط أن هذه التقنية لا تعتمد على تدقيق تطابق البيانات المُحدثة بالبيانات الاصلية في قاعدة البيانات. ملاحظة: اعتماد شرطية المفتاح الاساسي أو وقت التحديث أو رقم الصف, هي احدى حلول هذه الوضعية. الحلول المطروحة: لمشكلة التضارب المشؤوم pessimistic concurrency strategy. الحلول كثيرة باستخدام احدى عوازل العنصر transaction المتوفرة في النسخة 2005 لنتعرف على هذه الحلول بالتعرف على العوازل و انوعها. مستوى العزل isolation level ماهو مستوى العزل : هو عزل عملية التحديث الكلي transaction عن تحديث كلي أخر transaction هنالك ثلاثة عوائق عند عملية التحديث الكلي وهم كالتالي : اولاً : القراءة القذرة Dirty Read ثانياً : القراءة المتعجلة non repeatable Read ثالثًا : القراءة الوهمية phantom Read القراءة القذرة Dirty Read تحدث هذه القراءة عندما يقوم مستخدمان أو اكثر, بالتعامل مع بيانات تم رفض تحديثها عن طريق عملية التراجع عن التحديث Roll back عبر مستخدم ثالث. على سبيل المثال: قام المستخدم الاول بتحويل 100 درهم من أموال الحساب الجاري وهي 500 درهم إلى حساب التوفير الذي ليس به شيء,ومع ان حساب الجاري مقفل إلا ان المستخدم الاخر استطاع أن يجلب قيمة الحساب الحالية وهي بعد التحول اصبحت 400 درهم, قام المستخدم الاول بعملية التحديث إلا أن التحديث قد فشل , لسببٍ ما , على سبيل المثال حساب التوفير أغلق.. الان تمت عملية التراجع Roll back أُعيدت المئة درهم لحساب الجاري و تم فتح القفل, لكن لازال المستخدم الاخر يتعامل مع الراتب على اساس 400 درهم, لذلك هذا المنطق يعرف بالقراءة القذرة. القراءة المتعجلة nonrepeatable Read تحدث عندما نقوم بقراءة بيانات تم تحديثها اثناء قرائتنا لها. على سبيل المثال: قام المستخدم الاول بتشغيل تقرير الرواتب وكان حينها 1000 درهم للموظف الاول في نفس الوقت كان مستخدم اخر يستخدم الحقول نفسها , حيث قام بزيادة راتب الموظف بـ 500 درهم فبينما يفترض أن يكون راتب الموظف الاول هو 1500 درهم إلا ان التقرير كان يعرض الراتب على اساس 1000 درهم فقط, لذلك يعرف هذا المنطق بالقراءة المتعجلة. القراءة الوهمية phantom Read تحدث عندما نقوم بقراءة بيانات تم أضافة بيانات أخرى معها ولم ندركها. على سبيل المثال: قام المستخدم الاول بتشغيل تقرير الرواتب وكان حينها 1000 درهم للموظف الاول في نفس الوقت كان مستخدم اخر يستخدم الحقول نفسها , حيث قام بأضافة علاوة بدل الزوجية بمبلغ 500 درهم , وبما أن العلاوة لم تكون حاضرة وقت تحميل التقرير فهي قيمة مجهولة للمستخدم الاول , لذلك كان يفترض أن يكون المجموع في التقرير 1500 درهم إلا ان التقرير كان يعرض الراتب على اساس 1000 درهم فقط, لذلك يعرف هذا المنطق بالقراءة الواهمة. اي القراءة الغير صحيحة أو القراءة الظالمة. الخيارات المتوفرة في مستوى العزل في SQL Server 2005 Chaos هذا الخيار غير مدعم في الـ SQLClient, ومدعم عبر الـ ADO.NET بشكل عام, مثلاً في ADODB يعرف بـ adXactChaos , وهو عازل عنيد لايسمح بالكتابة على البيانات التي يتعامل معها. ReadUncommitted هذا الخيار هو أقل مستوى للعزل (حيث تنطبق عليه المعوقات كلها) وهو واضح من اسمه انه يقرء حتى القيمة التي لم تكون في الوضع Committed . ReadCommitted: هذا الخيار الافتراضي ينتظر القيمة التي في وضع التعديل, حتى تصبح Committed فيكمل المهمة أو يقوم بالتراجع. هذا الخيار لا يستطيع أن يعدل ما يتم تعديله من عنصر أخر, بينما العناصر الاخرى تستطيع تعديل ما يعدله هذا الـ transaction هذا العنصر يستخدم Row Versioning كإحدى الثوابت التي يعول عليها في عملياته. الـ Row Version هو عبارة عن صف ينشأ في قاعدة البيانات tempdb كنوع من الثوابت لمعرفة اخر حاله للصف قبل التعديل. يتم ذلك عبر specific transaction عنصر خاص يقوم بعملية الربط بـ Link List بحيث تسند قيمة الصف في قاعدة البيانات الاصلية بينما تسند نسخة الصف Version في قاعدة البيانات tempdb . كذلك يستخدم الاقفال المشتركة shared locks لمنع القراءات القذرة ,لكن البيانات يمكن تغيرها قبل ان ينتهي هو من مهامه , لذلك القراءة المتعجلة و الوهمية nonrepeatable & phantom reads, احتمالية حدوثها واردة لا محالة. ملاحظة: لإستخدام هذا النوع من العزل على قاعدة البيانات المعنية, نفذ هذا الكود.READ_COMMITTED_SNAPSHOT RepeatableRead: هذا الخيار لا يستطيع أن يعدل قيمة لم يحن إعتمادها ولا يستطيع عنصر اخر ان يعدل ما يتم تعديله في هذا العنصر الحالي, حتى ينتهي منها ويتم اعتمادها Committed . هذا العنصر يستخدم الاقفال المشتركة shared locks وهذا يعني حماية البيانات المستخدمة من اي طرف اخر, إلا للقراءة فقط, لكن المشكلة أنه يسمح كذلك بإضافة صفوف جديدة, مما يسهم في مشكلة القراءة الوهمية Read phantom . :Serializable هذا الخيار هو أعلى مستوى للعزل (حيث لا تنطبق عليه المعوقات كلها) يُمنع هذا العزل من قراءة بيانات تستخدم من قبل الاخرين, وكذلك يمنع اي عنصر خارجي باستخدام ما هو قيد التعديل عنده.حتى الاضافة يمنعها فلا يسمح بإخال صف جديد ضمن الصفوف التي لديه حتى ينتهي منها. فهو عازل صارم للغاية. Snapshot هذا الخيار يستخدم نسخة الصف كذلك Row Versioning في بدء عملياته, هذا الخيار تُحجب عنه الصفوف التي يتم التعديل عليها من اطراف اخرى,فهو يرى فقط البيانات التي لم تمس من قبل الاخرين. وهو لا يتطلب قفل الصفوف عند عملية القراءة ,إلا أنه يستخدمه في عملية التراجع عن التعديل Rolled Back . ملاحظة: لإستخدام هذا النوع من العزل على قاعدة البيانات المعنية , نفذ هذا الكود. ALTER DATABASE Northwind SET ALLOW_SNAPSHOT_ISOLATION ON GO() Unspecified غير محدد. ملاحظة : العوازل الـ 6 مدعمة جميعها في الـ Compact framework نصائح في استخدام العزل المناسب للمشاريع العزل ReadUncommitted يفضل في المشاريع التي يتم التعامل مع البيانات بشكل سريع وفي اقصر وقت. العزل RepeatableRead يفضل في المشاريع التي تتطلب دقة كاملة في تشغيل التحديثات التامة , مع ضمان منع اي تحديث من اطراف اخرى, حتى ينته الحالي من عمليته الحالية. العزل Serializable يفضل في المشاريع التي تتطلب دقة تامة عند التعامل مع البيانات , بحيث تمنع حتى عملية الادخال من اطراف اخرى , حتى ينتهي الـ transaction من عمليته . العزل Snapshot يفضل في المشاريع التي تستخدم محاسبات معقدة و لغرض القراءة فقط. في الاخير وبلا ادنى شك أن هذا الفتات لا يغطي حقيقة تقنية العزل, إلا ان المقالة جرتنا للخوض فيه. شاهد النصوص البرمجية لذلك. ' If no item of combobox selected If Me.cboxIsoLevel.SelectedIndex < 0 Then MsgBox("ComboBox is required in Pessimistic Strategy ") Return End If ' Create a connection object for datareader. Using Cnn As New SqlConnection(My.Settings.NorthwindConnectionString) ' Open the connection object. Cnn.Open() ' Note that you have to alter Northwind database ' Enable the Read Committed with Snapshots isolation level ' Script example... ' ******************************* ' ALTER DATABASE Northwind ' SET ALLOW_SNAPSHOT_ISOLATION ON ' GO() ' ******************************* ' Create local transaction. Using transaction As SqlTransaction = _ Cnn.BeginTransaction(IsolationLevel.Snapshot) ' Create local command object. Using cmd As New SqlCommand(Nothing, Cnn) ' Assign command transaction property ' To transaction object. cmd.Transaction = transaction Try ' Create query that update contactname ' Depend on ALFKI id. Dim strCommand As String = _ "Update Customers SET ContactName = '" & txtPessimistic.Text & _ "' WHERE CustomerID = 'ALFKI'" ' Assign the query to command text property. cmd.CommandText = strCommand ' Execute updates. cmd.ExecuteNonQuery() ' Sleep for 10 seconds, for testing purposes. Threading.Thread.Sleep(10000) ' Push(Data) transaction.Commit() ' Clear dataset and refill it again. FillData() ' Handling concurrency exception. Catch ex As DBConcurrencyException MsgBox(ex.Message) ' Handling others exception. Catch ex As Exception MsgBox(ex.Message) End Try End Using ' Implicitly disposes (closes) connection, 'and rolls back transaction (if not already committed). End Using End Using End Sub الحلول المطروحة: لمشكلة التضارب المحمود optimistic concurrency strategy. الحل الاول : استخدام الحدث RowUpdated Event التابعة للـ DataAdpater بهي نستطيع أن نعرف هل حدث التصادم أم لا و ببعض خصائصه نتحكم بالخطأ الذي صدر من صفٍ ما . الحل الثاني: هو تمكين الخاصية ContinueUpdateOnError بحيث تساوي True لتكملة التحديث حتى وان كان هنالك خطأٌ ما في صفٍ ما, بحيث يقوم بتخطي الخطأ دون تحديثه, مع استمرار تحديث الصفوف التي بعده. هذه الخاصية : تمنع إنهيار أو تجمد البرنامج , وكذلك تمنع رسالة الخطأ الافتراضية . الخاصية ContinueUpdateOnError هي احدى خواص الـ DataAdapter . ثالثاً : يمكنك امساك التضارب عبر القالب DBConcurrencyException شاهد النصوص البرمجية لعمل ذلك. نكتب هذا الكود في صفحة الـ DataSet.vb Imports System.Handling_Database_Operation_Conflicts.rar
  2. السلام عليكم إضافة إلى الميزات و التحسينات التي وضعتها شركة Microsoft بشأن تقنية الـ .NET جاءت ميزة اللاتزامنية asynchronous بشكل سهل للغاية , مما يمكن المبرمجين من إقتناء هذه التقنية بشكل أفضل مما سبق. العنصر BackgroundWorker هو الـ Component الجاهز لتأدية هذه المهام اللاتزامنية Multi Threading . بحيث يعمل على Thread منفصل عن الـ UI Thread مهام واجهة البرنامج, لذلك هو يعمل في الخفاء background . هذا العنصر له أحداث يسّرت من تقسيم العمل فيه بشكل واضح و جلي وهو سهل للغاية , لنبدأ الرحلة. فكرة عن الدرس: سنقوم بإجراء عملية حسابية مطولة و سنرى كيف نوظفها عن طريق هذا العنصر,بحيث يمكِنُنا من العمل على خانة نصية أخرى , بينما يقوم هو بمتابعة العملية حتى النهاية ثم يعود بالناتج في خانةٍِ أخرى. أولاً متطلبات العمل : حمل المثال ستجد مشروع باسم Start-BackgroundWorker يتكون من StatusStrip يضم عارضة مرئية ProgressBar و عنوان Label , كذلك على النموذج زرين و خانتين نصيتين و BGW الـ BGW هو عنصر BackgroundWorker تم إدراجه من القائمة ToolBox و اختصرنا اسمه الى BGW, كذلك أضفنا مهام لهذا المشروع ,لتُمكِنُكَ من كتابة النصوص البرمجية في مكانها الصحيح . شاهد الصورة التوضيحية , بالضغط المزدوج على المهمة الاولى ستذهب إلى حدث تحميل النموذج. في حدث التحميل Form Load Event..... من الخصائص المهمة للعنصر BackgroundWorker خاصية WorkerReportsProgress و WorkerSupportsCancellation, و هما ذوات قيمة منطقية كقيمة راجعة Boolean Value في حالة تمكين الخاصية الاولى سنكون قادرين على إستخدام الـ ProgressBar مع هذا العنصر أما الخاصية الثانية WorkerSupportsCancellation فإنها تمكِنُنا من إلغاء المهمة إذا رغبنا في ذلك. سنجعل كلتا الخاصيتين تساويان القيمة True . 'Enable Report Progress        BGW.WorkerReportsProgress = True        'Enable Cancellation        BGW.WorkerSupportsCancellation = True في حدث الضغط على الزر btnStart ..... ستجد بعض النصوص مكتوبة من قبل, لإعطاء سرعة في إنجاز المشروع,وهي لا تؤثر على فهم الدرس. المطلوب منا في هذا الحدث أن ننادي إجراء RunWorkerAsync للعنصر BackgroundWorker هذا الاجراء يقوم بتشغيل المهمة,وقد يحتوي على ممرر أو دون ممرر , سنقوم بتشغيل هذ الاجراء بحيث نممر له قيمة رقمية ليذهب بها إلى حدث أخر, سنتعرف عليه فيما بعد, بهذا الشكل يتم تفعيل المهمة. 'Run async process, High number for good example.        BGW.RunWorkerAsync(90000) في حدث الضغط على زر الإلغاء btnCancel ..... سنقوم بإلغاء المهمة عن طريق السلوك CancelAsync بحيث نتحقق قبل الالغاء بالخاصية المنطقية IsBusy فإن كانت المهمة في معمعة العمل فإن هذه الخاصية ستعود بالقيمة True غير ذلك ستعود بالقيمة False في حالة أن المهمة اُنجزت أو تعطلت بظهور خطءٍ ما Error . بهذا الشكل 'If the backgroundWorker is busy, still working then        If Me.BGW.IsBusy Then            'Cancel the process            BGW.CancelAsync()        End If في الحدث DoWork التابع للعنصر BackgroundWorker ...... عندما نقوم بتشغيل المهمه عن طريق RunWorkerAsync فإن هذا الأمر يقوم بتفعيل الحدث DoWork. في هذا الحدث سنقوم بإنشاء عنصر من نوع BackgroundWorker بهذا الشكل 'Create backgroundWorker object        Dim worker1 As BackgroundWorker = _        CType(sender, BackgroundWorker)إن عملية الـ casting اي التحويل هي العملية الشرعية الوحيدة للتعامل مع هذا العنصر فكما هو منوه عليه في MSDN أنه ليست هنالك إمكانية بإستخدام العنصر بشكل مباشر وإنما نقوم بعملية إنشاء عنصر أخر ثم نستخدم التحويل CType لنمرر sender على اساس backgroundWorker ثم نستخدم الخاصية Result التابعة للقالب DoWorkEventArgs التي من خلالها نستطيع جلب ناتج العملية بعد الانتهاء, سيكون بهذا الشكل إستخدامها. 'Return Result by passing (Number(e.Argument),Object, and event (e))        e.Result = LoopLong(e.Argument, worker1, e) حيثُ LoopLong إجراء نحن أنشأناهُ وفيه النصوص البرمجية اللازمة للعملية الحسابية كمثال فقط. الممررات , الممرر الاول e.Argument هي القيمة التي أسندناها في حدث الضغط على الزر, وهي 90000 الممرر الثاني هو العنصر الذي صنعناه للتو وهو worker1 , أما الممرر الثالث فهو القالب DoWorkEventArgs , لانه الاجراء LoopLong لكي يتوافق مع هذه التقنية, لابد أن يضم ممررين إضافيين هما ممرر من نوع BackgroundWorker و الحدث DoWorkEventArgs . في حدث الـ ProgressChanged ..... هذا الحدث يتم تفعيله عندما نقوم بمناداة السلوك ReportProgress . الذي سنستخدمه لاحقاً. في هذا الحدث سنقوم بإسناد القيمة العائدة من الممرر ProgressChangedEventArgs إلى الـProgressBar بهذا الشكل. 'Assign the Percentage Process to ProgressBar Object.        ProgressBar1.Value = e.ProgressPercentage في الوظيفة LoopLong ..... الان هذا هو عملك , كمبرمج أو مطور ولك وظيفة بطيئة العمل بحكم الوظائف التي تؤديها فينبغي عليك أن تجعلها تعمل في الخفاء حتى لا تؤثر على واجهة البرنامج مما ينتج عن ذلك عملية التجمد أو عدم الاستجابة للمستخدم ... نبدأ بتعريف الوظيفة و ممررتها. Public Function LoopLong(ByVal count As Integer, _    ByVal worker As BackgroundWorker, ByVal e As DoWorkEventArgs) As String() هذه الوظيفة تممرر لها ثلاثة قيم الاولى count القيمة الرقيمة التي نرسلها من الممرر e.Argument من الحدث DoWork الممرر الثاني هو العنصر الذي قمنا بتعريفة بعملية التحويل Casting وهو worker1 أما الممرر الثالث فهو القالب DoWorkEventArgs و الذي يمثلها e في الحدث DoWork. كما تلاحظ هذه الوظيفة تعود بقيمة مصفوفية String() نصية النوع. في بداية هذه الوظيفة سنقوم بإنشاء متغير نصي النوع ليقوم بإرجاع عائد العملية الحسابية في هذه الوظيفة بهذا الشكل. 'Declare a string var for holding the final result.        Dim Result As String = String.Empty ثم نقوم بعمل حلقة , لتقوم بعملية حسابية, بالمتغير I إلى قيمة الممرر count و تتخطى عشر أرقام في كل حلقة بهذا الشكل. 'Loop until i reachs the count value        For i As Integer = i To count Step 10 ثم نقوم بإسناد قيمة نصية مع قيمة الـ I للمتغير Result بهذا الشكل 'Assign some string & numbers to Result var            Result &= "This is Number : " & i.ToString ثم نعود إلى أول السطر (كعملية تنسيق الكتابة فقط) بهذا الشكل 'Assign new line to Result var.            Result &= vbCrLf ثم سنقوم بالتحقق هل تم إلغاء المهمة عن طريق الخاصية CancellationPending إذا كان كذلك سنقوم بإرجاع قيمتين الاولى فارغة لتنظيف الخانة النصية و الثانية إخبارية لإعلام المستخدم ان المهم قد اُلغيت. بهذا الشكل. 'If cancel is pending then (user Pressed cancel button)            If worker.CancellationPending Then                'Return the below strings                Return New String() {"", "Operation was cancelled by user..."}            End If بعدها سنقوم بتفعيل الحدث ProgressChanged عن طريق إسناد قيمة للإجراء ReportProgress العائد للممرر worker 'Return percentage of the total task will processing.            worker.ReportProgress((i / count) * 100) في الاخير عندما ننتهي من الحلقة for سنقوم بإرجاع القيمة النصية المصفوفية بهذا الشكل. Next        'If the process completed successfully        'Return the string array result back to callers        Return New String() {Result, "Operation done successfully.."} ستعود القيمة Result للخانة النصية و القيمة الثانية للعنوان في الـ StatusBar Strip في الحدث RunWorkerCompleted ... هذا الحدث يتم تفعيله عندما يقوم الحدث DoWork بإرجاع قيمةٍ ما. هذا الحدث يقع مرة واحدة فقط سواءً إكتملت المهمة أو لا فإنه سيتم تنفيذه في نهاية المطاف. سنقوم في هذا الحدث بإختبار الخاصية Error هل هي ليست فارغة,لنقوم بإنشاء خطأ يظهر للمستخدم بهذا الشكل. 'If there's an error then throw it        If Not e.Error Is Nothing Then            Throw New Exception(e.Error.ToString)        End If في الاخير سنقوم بعرض القيم العائدة عن طريق الخصاصية Result في كل من الخانة النصية و العنوان بهذا الشكل. 'Finally get the result() as an array.        Me.txtResult.Text = e.Result(0).ToString        Me.lblResultProcess.Text = e.Result(1).ToString بما أن الوظيفة LoopLong ترجع قيمة نصية مصفوفية Array فإني بذلك أستطيع أن أعطي كل خانة, القيمة العائدة لها. هذا واللهُ أعلى و أعلم. BackgroundWorker.zip
  3. السلام عليكم درس في كيفية مخاطبة Flash MX 2004 مع vb.net والعكس الطريقة كالتالي أولاً نقوم بإدراج Shockwave Flash Objects وذلك عن طريق إختيار الـ ToolBox ثم بالزر الإيمن نختار Add / Remove Items ثم في الـ Com Tab نختار الـ Shockwave Flash Objects بعد عملية الإدراج لهذا الـ Control سيكون بمثابة الحاوية لفلم Flash MX 2004 وسيتم تحديد الفلم عن طريق الخاصية Movie بحيث نسند لها مسار الفلم نستطيع قراءة الرسائل الموجهة من Flash MX 2004 إلى VB.NET عن طريق الحدث FSCommand بحيث يملك هذا الحدث ممرر باسم e كـ FSCommandEvent قبل أن أتكلم عن الخاصية e دعنا نتعرف على الامر fsCommand في Flash MX 2004 التركيبة النصية لهذا الامر fscommand("command", "parameters") ومثال على ذلك يكون بهذا الشكل fscommand("SendMessage", "arabTeam"); الان الكلمة SendMessage هو اسم المتغير أو قيمة نصية بمثابة المتغير الذي يحتوي على القيمة arabTeam و arabTeam هو في الحقيقة ممرر parameter لإحتواء القيمة المراد إرسالها لـ (مثلاً VB.NET أو اي برنامج أخر) نستطيع عن طريق الخاصية e معرفة المتغير مع قيمته بحيث تملك هذا الخاصية متغير باسم command سيكون بهذا الشكل If e.command = "SendMessage" Then            lblMessage.Text = e.args.ToString()        End If تلاحظ الشرط إذا كان اسم الـ command يساوي اسم المتغير فإن الممرر سيكون في الـ e.args سيكون فيه في هذا المثال القيمة arabTeam هذا بالنسبة لإرسال القيمة من Flash MX 2004 إلى VB.NET و العكس اي من VB.NET إلى Flash MX 2004 سيكون كالتالي أولاً في Flash MX 2004 نستخدم السلوك Watch Method يحتوي على ثلاثة ممررات ( الثالث إختياري لذلك قمنا بحذفه نسبةً لهذا المشروع) الأول هو اسم العنصر المراد مراقبته الثاني هو اسم الوظيفة التي ستنفذ بموجب ذلك (وظيفة فيها نصوص برمجية تعمل عندما يلتقط السلوك watch اسم العنصر في الممرر الأول , شاهد هذا المثال _root.watch("Event", values); كما تلاحظ الـ root هو المشهد الرئيسي في Flash و يعرف بـ stage ثم السلوك watch وبه اسم العنصر وهو Event و values هو اسم الوظيفة الوظيفة مكتوبة بهذا الشكل function values(prop, null, TagValue) { whichButton(TagValue); } الان prop الممرر الأول سيحوي القيمة Event الممرر الثاني يعرف ب oldvalue لا نحتاجه ضمن مشروعنا لذلك اسندنا لهُ القيمة null و الثالث هو TagValue يحوي القيمة الجديدة و التي ستكون مرسلة من VB.NET ثم باقي النصوص whichButton هذه ايضاً وظيفة ترسل قيم لشغيل الصوت في فلاش أو إيقافه أوإعادة الصوت كما هو في الملف المرفق . الان لإرسال قيمة من VB.NET إلى Flash MX 2004 سيكون بهذا الشكل fs.SetVariable("Event", 1) حيث fs هو اسم العنصر الذي أدرجناه في النموذج الذي يحوي ملف أو فلم Flash ثم إستخدمنا الإجراء SetVariable ثم كتبنا اسم العنصر Event و أرسلنا له القيمة 1 هذه القيمة ستكون في الممرر TagValue هذا والله أعلى و أعلم Flash.zip
  4. السلام عليكم مسابقة إنشاء و تصميم برنامج إدارة مكتب تأجير المركبات . السلام عليكم. يتشرف منتدى Visual Basic.NET مشرفين و إداريين, بإطلاق أول مسابقة فعلية برمجية في تخصص لغة Visual Basic.NET 2005, التي نرجوا من خلالها, رفع المستوع العام للأعضاء و المشرفين سواءً بسواء, ونقل الاعضاء الكرام من البرمجة السطحية الى الواقع العملي, إضافة الى إشعال الحماسة البرمجية بين الاعضاء الكرام, وذلك حِرصاً منا على تفعيل النشاط العام في المنتدى. متطلبات الاشتراك في المسابقة. أن تكون عضواً أو خبيراً. يمكن أن يشترك في المشروع أكثر من شخص أو عضو. بمشروع واحد. شروط مسابقة إنشاء مشروع أو برنامج إدارة مكتب تأجير المركبات أن يكون تحليل و تصميم المشروع على لغة Visual Basic.NET 2005 أن يكون تحليل و تصميم قاعدة البيانات على SQL 2005 ما هو غير ضروري في هذا المشروع. لانرغب حقيقة في المشروع أو المسابقة الاولى بوضع شرط تشفير البيانات . ولا كذلك بوضع حساب للمستخدم بحيث يدخل بالاسم و كلمة المرور. هذا معفي عنه في هذا المشروع , فلا نرى انه مناسب في المسابقة الاولى, مع اهميته وحاجتنا إليه, إلا أننا سنتغاض عنه الان. الدرجات و النقاط التي من شأنها أن تجعلك صاحب أفضل مشروع في هذه المسابقة. 1. تحليل المشروع عبر Class diagram في فجول بيسك دوت نت 2005 = 80 نقطة 2. تحليل قاعدة البيانات في SQL 2005 عبر Diagram تساوي 120 نقطة 3. وضع القيم المناسبة في العنصر الملائم لها (مثلاً ليس منطقي أن نضع الوقت و التاريخ في متغير نصي) = 100 نقطة 4. إفراغ الذاكرة من بقايا المتغيرات و حذفها منها = 50 نقطة 5. التسميات الصحيحة السليمة code guide line لإسماء العناصر و المتغيرات = 100 نقطة 6. وضع التعليقات الواضحة Comments الغير مخلة بالفهم ولا المطولة = 50 نقطة 7. سرعة فتح البرنامج ( اي ليس بطيئ ) = 50 نقاط 8. سهولة استخدام البرنامج usability & Accessibility و فهمه من الوهلة الاولى = 100 نقطة 9. استخدام الالوان التي من شأنها إراحة عين المستخدم ( اي الابتعاد عن الزخرفة الزائدة و التعقيدات) = 100 نقطة 10. التحقق من سلامة البيانات المُدخلة Validation Data = 400 نقطة 11. عدم تجمد البرنامج بوضع كل رسائل الخطء في المكان المناسب = 200 نقطة 12. إمكانية تطوير المشروع و ترقيته أو تحديثه عبر ( Click Once ) = 50 نقطة. راجع هذا الرابط 13. وضع دليل ( ملفات المساعدة ) Help Files لإرشاد المستخدم = 100 نقطة 14. تنصيب المشروع و إزالته عبر تقنية Installation Setup = 100 نقطة راجع هذا الرابط 15. استخدام انسب و افضل الطرق في برمجة العناصر, مثلاً أن تكتب حلقة Loop لِجلب بياناتٍ ما,ويمكن جلب تلك البيانات دون استخدام الحلقة = 100 العلامة الكاملة 1700 نقطة. علامة الرسوب = أقل من 900 نقطة. أخر موعد لإستلام المشاريع هو 1 نوفمبر لسنة 2007 اي الموفق للتاريخ الرقمي 1 \ 11 \ 2007 في كلمات أخرى : عزيزي المتسابق, لازال الوقت مبكراً للبدء في المشروع , يمكنك أن تستقل ذلك في قراءة معظم المتطلبات عبر النصائح و الارشادات المتوفرة لك على هذا الرابط. كذلك يفضل أن يتم تسليم المشروع في أخر يوم أو يومان, لربما تتنبهت لأمر, قد غاب عنك طيلة تطوير المشروع, فتتداركه قبل التسليم. والله يوفقكم لما فيه الخير و البركة.
  5. السلام عليكم جم من الفوائد, في تسهيل العمل على بيئة التطوير IDE الخاصة بلغات الـ NET. اتمنى من اخواني الاعضاء و الخبراء و المشرفين, ان يساهموا في تفعيل هذا المشاركة, بالمشاركةِ بأي حيلة أو فكرة أو فائدة من شأنِها تسهيل العمل على هذه البيئة , و ابتدي أنا بحول الله. الفائدة الأولى : إنشاء مجلد الملفات المتنوعة Miscellaneous files لغرض فتح الملفات المرافقة في تطوير المشروع مباشرتاً من بيئة VisualBasic.NET 2005 وذلك إختصارً للوقت و تقليل عناء البحث عن تلك الملفات في زخم المجلدات و ماشابهها . العمل : من بيئة الـ .NET نذهب إلى القائمة Tools ثم Options ثم من الـ Environment نحدد الـ Documents ثم نضع علامة الصح على مربع النص بمقابل الكلمة show Miscellaneous files in solution explorer الان لمشاهدة الملفات المتنوع مع المشروع لابد أن نفتح ملف عن طريق File—Open files بعد فتح ملف ما سيظهر لك في خانة الـ Solution Explorer الشكل التالي معلومة : إذا عينت مثلاً 5 مواد items في الملفات المتنوعة فعند إضافة ملف أخر سيتم إستبدالة بأول مادة item تمت إضافتها في هذا المجلد . وللعلم كل مشروع له مجلد الملفات المتنوعة خاص به ( ليس مشترك بين المشاريع )
  6. السلام عليكم راجع هذا الرابط
  7. السؤال قد طُرح من قبل يمكنك البحث في ذلك الشأن. لإستفادة من الخانة النصية تتكلم العربية على هذا الرابط تجدها بالتوفيق إن شاء الله.
  8. تجميع الحقول حسب المدى Group Range

    لا ليس كذلك ( لا داعي للحلقة هاهنا ) الحل عبر الكائن BindingManagerBase استخدمه ككلمة مفتاحية في عملية البحث , و إن شاء الله ستجد الكثير عنه.
  9. كيف نعمل تتابع ( تسلسل ) للسجلات

    في خصائص المفتاح الاساسي هنالك الـ Identity Increment قيمة الزيادة و Identity Seed قيمة بدء الزيادة. والله أعلم
  10. السلام عليكم ماذا تقصد لل Structure ؟ هل تقصد الـ Metadata يعني مثل الـ XSD FILE أم ماذا ؟
  11. تجميع الحقول حسب المدى Group Range

    أبحث في المنتدى بالكلمة المفتاحية Navigator
  12. كيف نعمل تتابع ( تسلسل ) للسجلات

    أبحث في المنتدى بشكل عام عن كل من ( Primery Key و Identity و DBCC ) بالتوفيق إن شاء الله.
  13. [مخالف - عنوان غير مناسب :]سؤال برمجي

    تأسف إدارة الفريق العربي لغلق الموضوع وذلك لمخالفته قوانين المشاركات. فقرة اختيار عنوان مناسب لمحتوى الموضوع. قواعد طرح المشاركات http://www.arabteam2000-forum.com/index.php?showtopic=29343
  14. تأسف إدارة الفريق العربي لغلق الموضوع وذلك لمخالفته قوانين المشاركات. فقرة اختيار عنوان مناسب لمحتوى الموضوع. قواعد طرح المشاركات http://www.arabteam2000-forum.com/index.php?showtopic=29343 لا عنوان يدل على محتوى الموضوع. ولا هو في المكان المناسب. ولم تستخدم البحث , حيثُ اوجيب على هذا السؤال أكثر من مرة منذِ قبل. راجع المنتدى المناسب لطرح مثل هذا السؤال, ولكن بعنوان يدل على مضمونه و محتواه إليك منتدى تصميم و برمجة التقارير
  15. تأسف إدارة الفريق العربي لغلق الموضوع وذلك لمخالفته قوانين المشاركات. فقرة اختيار عنوان مناسب لمحتوى الموضوع. قواعد طرح المشاركات http://www.arabteam2000-forum.com/index.php?showtopic=29343
  16. [مخالف - عنوان غير مناسب :]مشكله مع كود البحث

    تأسف إدارة الفريق العربي لغلق الموضوع وذلك لمخالفته قوانين المشاركات. فقرة اختيار عنوان مناسب لمحتوى الموضوع. قواعد طرح المشاركات http://www.arabteam2000-forum.com/index.php?showtopic=29343
  17. جعل الفرن كي كمبوبوكس

    عزيزي بارك الله فيك, مثل هذه الجداول ( الدول, الجنسيات, المدن, المحافظات,الالوان,...الى اخره) تعرف بالجداول المساعدة, lookup tables هذه الجداول ليس من المنطق أن تكون ذات علاقة لا one to many ولا غيرها , إنما فقط هي جداول مساعدة لا أكثر. وتربط في النماذج لا في قاعدة البيانات , بإستثناء اكسس ديتابيس. وحل ذلك يكون على الشكل التالي: cboxNationality.DataSource = Me.DsMain1 cboxNationality.DisplayMember = "LOOKUPNationality.Nationality" cboxNationality.ValueMember = "LOOKUPNationality.Nationality_ID" cboxNationality.DataBindings.Add( _ New Binding("SelectedValue", DVMain1, "Nationality")) cboxNationality.DropDownStyle = ComboBoxStyle.Simple على اعتبار ان DVMain1 هي عبارة عن DataView Object وفي 2005 الامر لا يحتاج سِوى أن تضع قائمة منسدلة في النموذج , ومن ثم تقوم بإدراج الجدول المساعد (الجنسيات) على هذه القائمة المنسدلة ليقوم هو نيابتاً عنك بربط الجدول بهذه القائمة و ما تبقى سوى تحديد القيمتان لكل من عرض اسماء الجنسايات بـ Display Member و حفظ ارقام الجنسيات بالخاصية Value Member و الله الموفق. لحل مشكلتك فقط شاهد الصورة. هذه خصائص القائمة المنسدلة لديك. Combo Box
  18. تأسف إدارة الفريق العربي لغلق الموضوع وذلك لمخالفته قوانين المشاركات. فقرة اختيار عنوان مناسب لمحتوى الموضوع. قواعد طرح المشاركات http://www.arabteam2000-forum.com/index.php?showtopic=29343
  19. تأسف إدارة الفريق العربي لغلق الموضوع وذلك لمخالفته قوانين المشاركات. فقرة اختيار عنوان مناسب لمحتوى الموضوع. قواعد طرح المشاركات http://www.arabteam2000-forum.com/index.php?showtopic=29343
  20. مشكلة في طباعة التقرير فارجوا المساعده

    تم حل مشكلتي على هذا الرابط
  21. ضع مثال حتى يسهل ذلك على المجيب على السؤال, استخدم في هذه الحالة Cross Tab و خصص الحقل الافقي و العامودي.
  22. تسلم يا عادل على هذا الحل, في الحقيقة أنا لا مشكلة لدي في الارقام. في الاصل أن الارقام في النموذج تعتمد على تهيئة النموذج, وفي التقرير تعتمد على تهيئة الحاسوب , لا أكثر. السلام عليكم.
  23. السلام عليكم في اي مساحة فاضية في التقرير كما تشاهد الاسهم الخضراء بالزر الايمن ثم اتبع باقي الخطوات في الصورة المرفقة. بالتوفيق إن شاء الله.
  24. عزيزي أنت تعمل على الـ DataSet وليس الـ DataSource فهذا فيه فرق يحفظك الله. بعد جلب البيانات اشترط ان يكون العرض وفق قيمة معينة. على سبيل المثال. Dim rpt2 As New Report2 rpt2.SummaryInfo.ReportTitle = "الفريق العربي للبرمجة" rpt2.SetDataSource(ds) rpt2.RecordSelectionFormula = "{emp.EmpNo}=" & cboxID.Text CRV.ReportSource = rpt2 هنالك أكثر من طريقة لتحديد الممرر. شاهد المرفق. بالتوفيق إن شاء الله. CrystalReportFormulaFieldParam.rar
  25. سلسلة حيل و افكار في بيئة التطوير NET.

    الفائدة الثالثة: توظيف المشاريع المعتمدة Projects Dependencies بشكل يستفاد من هذه التقنية هذا صندوق الحوار يتيح لك إمكانية بناء عنصر building project Compiling قبل مشروعك المعني . بحيث يعتمد مشروعك على عنصر لابد أن يُبنى أولاً ثم يتبعه مشروعك , كمثلاً custom control يتم تطويرة في نفس الـ solution وهذا يعني أن أ يعتمد على ب وليس العكس صحيح , دعنا نشاهد ذلك نختار الـمشروع Project من Solution Explorer بالزر الأيمن ثم إختر ProjectDependencies الان لنذهب إلى التبويبة Build Order في نفس صندوق الحوار لنرى تسلسل البناء بهذا الشكل الخلاصة كالتالي أولاً أن مشروع الإختبار يعتمد على الـ Custom Control لذلك بعد تخصيص ذلك يتم بناء الـ Round Button App أولاً ثم يليه المشروع الذي يختبر هذا وهو TestRoundButton بحيث كلما تم تطوير الـ Round Button App تظهر تلك التعديلاً في المستضيف وهو TestRoundButton مع بقاء تشغيله (هنالك فرق بين التشغيل وبين البناء ) TestRoundButton كمشروع إفتراضي في الـ solution اي as startup project والله أعلم.