الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف يتم تنظيم تحديث البيانات

بدأه hymss في 5 فبراير 2010 · 9 رد · 1,186 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

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

----------------

لدي برنامج اداري للموظفين بشركة ويعمل على شبكة محليه ويستخدم من قبل عدة مدخلي بيانات من اماكن متفرقه وصادفتني مشكلة تحديث البيانات حيث قد يتم تعديل بيانات سجل من قبل احد مدخلي البيانات وفي نفس الوقت يتم تحديثها بشكل آخر من قبل مدخل آخر

سؤالي :

هل هناك آلية لتنظيم ذلك

#2

هل من مشارك

#3

السلام عليكم

يااخي هذا هو العيب الأساسي لقواعد البيانات الخادمة ويسمي بالـ Concurrency Control ولا يوجد حل واحد لهذه المشكلة يصلح مع جميع الحالات، عليك هنا أن تقيم أي الحلول أصلح لك وذلك بالإعتماد على طبيعة البرنامج والبيئة التي يعمل عليها البرنامج.

على العموم هنالك عدة حلول منها:

1- قفل الجدول Table Lock بحيث لا يمكن لأي مستخدم التعديل عليه وهي طريقة غير فعالة ومعقدة في تطبيقها وبها مشاكل كثيرة

2- إضافة حقل جديد للجدول من النوع UniqueIdentifier هذا على أساس أنك تستخدم SQL Server وهذا الحقل يجب أن يحتوي على قيمة فريدة ولكي تقي نفسك التعقيدات يمكنك أن تمرر له الدالة newid المدعومة بواسطة الـ SQL Server عند الإدخال والتعديل والتي تقوم بتوليد قيمة فريدة. بحيث يكون سيناريو التعديل كالاتي:

- إسترجاع كامل السجل وعرضة على النافذة بغرض التعديل.

- إجراء التعديلات بواسطة المستخدم.

- بعد أن يضغط المستخدم على زر التعديل يجب عليك أن تقوم بالمقارنة بين قيمة الحقل الفريد التي قمت بإسترجاعها مع السجل في الخطوة الأولى بالقيمة المسجلة حالياً في قاعدة البيانات، إذا إختلفت هذا يعني أن هنالك مستخدم آخر قام بالتعديل على السجل وعندها يمكنك تنبيه المستخدم بأن هنالك شخص آخر قام بالتعديل على هذا السجل أو عرض التعديلات أو ... (هذا يرجع إلى متطلبات العمل)، أما في حالة تساوي القيمتين فإنك تقوم بعملية التعديل بصورة طبيعية.

والله الموفق

#4

هل الدالة newid تعطي قيمة جديدة لكل حقل يتم تعديله حاليا

أم انها تعطي قيمة ثابته لكل حقل على حده

وإذا كانت تعطي قيمة لكل حقل على حدة فما الفائدة منها لا سيما إذا اردت أن تعدل على حقل قديم

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

=========================================================

أم بالنسبة لصديقنا العزيز hymss فأقترح عليك عندما تريد أن تعدل على القاعدة أن تضيف خاصية القراءة فقط على ملف قاعدة البيانات وذلك عن طريق التحكم في Attributes الخاصة به

بحيث لا يستطيع أح أن يعدل عليه أثناء عملية تعديل أخرى على نفس القاعدة

أكيد يجب عليه فك الحظر مرة أخرة على القاعدة بعد الإنتهاء من عملية التعديل

كما أن البرنامج يجب أن يتأكد من أن قاعدة البيانات متاحة للتعديل من خصائصها وذلك ليتمكن من التعديل وإلا فإن البرنامج ينبهه بأن هنالك عملية تعديل تجري حاليا على البرنامج

***

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

ولكنها طبعا غير عمليه في حالة الأنظمة الكبيرة

تقبل تحياتي

###################################################################

طريقة أخرى بعد القليل من الإستنبطاط والتفكير :P

طبعا طريقة الأستاذ Ammar Gaffar جيدة ولكن ماذا لو كان لا يستخدم sql server

يوجد حل منطقي يمكنك أن تستخدمه وهو يشبه طريقة Ammar Gaffar وإليك الخطوات :

إعمل حقل وليكن بأسم accessibility وليحتوي على قيمتين

إما

Allow

أو

Deny

وقيمة هذا الحقل (accessibility ) الإفتراضية هي Allow

فعندما يدخل المستخدم للتعديل فإنه يعمل فحص لقيمة الحقل accessibility وإذا كانت Allow

عندها يقوم النموذج بجلب المعلومات للتعديل ولكن قبل الشروع في عملية التعديل يعمل تلقائيا على تغيير قيمة accessibility الى Deny يحفظها في الوقت الحالي على القاعدة ( مؤقتا طبعا ) فإذا إنتهى من التعديل يرجعها كما في السابق Allow

وبذلك إذا دخل أي مستخدم الى نفس الحقل في الوقت الحالي فسيجد قيمة الحقل accessibility هي Deny وبالتالي لن يستطيع التعديل :ph34r: وذلك لأنك أضفت شرطا مسبقا يجب من خلاله أن تكون قيمة الحقل هي Allow وذلك حتى يتمكن المستخدم من التعديل عليه

الطريقة بسيطة قابلة للتطبيق على أي قاعدة وتعمل بنفس مبدأ الدالة التي ذكرها الأخ Ammar Gaffar

وفي الختام سلام

تم تعديل هذه المشاركة بواسطة psa في 9 فبراير 2010 في 14:44

Chail .. Get Focus .. Then Catch Your Target

#5
psa كتب:

هل الدالة newid تعطي قيمة جديدة لكل حقل يتم تعديله حاليا

أم انها تعطي قيمة ثابته لكل حقل على حده

وإذا كانت تعطي قيمة لكل حقل على حدة فما الفائدة منها لا سيما إذا اردت أن تعدل على حقل قديم

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

=========================================================

أم بالنسبة لصديقنا العزيز hymss فأقترح عليك عندما تريد أن تعدل على القاعدة أن تضيف خاصية القراءة فقط على ملف قاعدة البيانات وذلك عن طريق التحكم في Attributes الخاصة به

بحيث لا يستطيع أح أن يعدل عليه أثناء عملية تعديل أخرى على نفس القاعدة

أكيد يجب عليه فك الحظر مرة أخرة على القاعدة بعد الإنتهاء من عملية التعديل

كما أن البرنامج يجب أن يتأكد من أن قاعدة البيانات متاحة للتعديل من خصائصها وذلك ليتمكن من التعديل وإلا فإن البرنامج ينبهه بأن هنالك عملية تعديل تجري حاليا على البرنامج

***

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

ولكنها طبعا غير عمليه في حالة الأنظمة الكبيرة

تقبل تحياتي

السلام عليكم

الدالة newid تعطي قيمة فريدة هذا هو عملها فقط، ولا علاقة لها بحل المشكلة هي فقط تساعد في الحل.

إليك الحل بالتفصيل:

أولاً يجب إضافة حقل واحد جديد للجدول قيد التعديل مثلاً باسم Row_Id ونوع الحقل UniqueIdentifier ، ويتم مناداة الدالة newid في حالة الإدخال لأول مرة وحفظ القيمة التي تقوم الدالة بإرجاعها في الحقل Row_Id ، طبعاً حفظ الحقول الأخري بالقيم المدخلة بواسطة المستخدم. على سبيل المثال قيمة الحقل Row_Id هي 1

عند إسترجاع السجل بواسطة المستخدم لأغراض تعديل البيانات يتم أيضاً إسترجاع قيمة الحقل Row_Id وهي 1 وحفظها في متغير داخل النموذج.

بعد إجراء التعديلات بواسطة المستخدم والضغط على زر التعديل يجب أن تقوم بإسترجاع قيمة الحقل Row_Id مرة أخرى قبل إجراء التعديل ومقارنته بالقيمة المخزنة في المتغير هنالك حالتان:

الأولى أن القيم متساوية وهذا يعني أنه لم يتم تعديل السجل بواسطة مستخدم آخر منذ إسترجاع السجل لأغراض التعديل حتى الضغط على زر التعديل، في هذه الحالة يتم حفظ التعديلات بصورة طبيعية مع مراعاة مناداة الدالة newid مرة أخرى وحفظ القيمة المسترجعة في الحقل Row_Id

الحالة الثانية أن ان القيم غير متساوية وهذا يعني أن السجل تم تعديله بواسطة مستخدم آخر مر بنفس الخطوات وطابقة نتيجة المقارنة كما في الحالة الأولى.

بالنسبة لتغيير الـ Attribute للملف ، هذا ينطبق على قواعد البيانات العادية مثل الأكسس والإكسل وغيرها ، وفي حالة صاحب الموضوع أعتقد أن قاعدة البيانات هي SQL Server أو Oracle لأن النظام يعمل على الشبكة والمعروف أن الأكسس لا يدعم تعددية المستخدمين بصورة جيدة.

حتى إذا إفترضنا أن قاعدة البيانات المستخدمة هي أكسس ، فطريقة قفل قاعدة البيانات عند إجراء التعديل غير فعالة بالمرة لأنه يمكن أن تكون عمليات على الجداول الأخرى.

والله الموفق

#6

شكرا على التوضيح

ما رايك أخ Ammar Gaffar في الحل الجديد الذي أرفقته مع الرد السابق وما مدى جدواه ؟؟

تم تعديل هذه المشاركة بواسطة psa في 9 فبراير 2010 في 14:53

Chail .. Get Focus .. Then Catch Your Target

#7
psa كتب:

ما رايك أخ Ammar Gaffar في الحل الجديد الذي أرفقته مع الرد السابق وما مدى جدواه ؟؟

في حالة أن البرنامج يعمل عن طريق الشبكة بواسطة أكثر من مستخدم من أكثر من موقع حسب ماذكرة الأخ صاحب الموضوع يجب أن تكون قاعدة البيانات من الأنواع الخادمة Server ، ولكن لنفترض أنه يستخدم الأكسس، الطريقة التي ذكرتها هي تطبيق لنفس الفكرة على قاعدة بيانات أخرى لا تتوفر فيها مثل الدالة newid ولكن العيب الوحيد في إستخدام الحقل المقترح accessibility هو أن النظام يقوم بتعديل هذه القيمة عند الإسترجاع بغرض التعديل إلى Deny ، ماذا لو قام المستخدم بإلغاء التعديلات؟ وماذا لو حدث خلل في الإتصال باقاعدة البيانات؟ وماذا لو إنفصل التيار الكهربائي فجأة عن الجهاز؟ في هذه الحالة ستبقى قيمة الحقل هي Deny ولا يستطيع أي مستخدم في النظام أن يقوم بتعديل هذا السجل أبداً إلا بالدخول مباشرة في قاعدة البيانات.

يمكنك تطبيق نفس الفكرة التي طرحتها بإضافة الحقل accessibility وجعله يقبل قيم نصية، ويمكنك إستبدال الدالة newid بدالة تقوم بتوليد رقم فريد.

والله الموفق

#8
Ammar Gaffar كتب:

ماذا لو قام المستخدم بإلغاء التعديلات؟ وماذا لو حدث خلل في الإتصال باقاعدة البيانات؟ وماذا لو إنفصل التيار الكهربائي فجأة عن الجهاز؟ في هذه الحالة ستبقى قيمة الحقل هي Deny ولا يستطيع أي مستخدم في النظام أن يقوم بتعديل هذا السجل أبداً إلا بالدخول مباشرة في قاعدة البيانات.

طبعا لابد من وجود مستخدم مسئول في النظام يمكن إستثنائه من كافة القيود لكي يعدل أو يحزف ما يريد بدون أي قيود وذلك في حالة حدوث شئ من هذا القبيل ،،

هذا الحديث يقودنا مباشرة الى موضوع الصلاحيات وهو موضوع شائك نوعا ما

تقبل تحياتي

Chail .. Get Focus .. Then Catch Your Target

#9
psa كتب:

طبعا لابد من وجود مستخدم مسئول في النظام يمكن إستثنائه من كافة القيود لكي يعدل أو يحزف ما يريد بدون أي قيود وذلك في حالة حدوث شئ من هذا القبيل ،،

هذا الحديث يقودنا مباشرة الى موضوع الصلاحيات وهو موضوع شائك نوعا ما

تقبل تحياتي

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

والله الموفق

#10

الف شكر للاخوة الاعزاء Ammar Gaffar و psa

سأجرب كل الطرق المذكورة واحدد الانسب لي

الله يعطيكم العافيه جميعاً ما قصرتم واكرر شكري وتقديري

مواضيع مشابهة