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

سؤال في تحديد الصلاحيات للمستخدمين

مغلق
بدأه Dena22 في 18 نوفمبر 2005 · 19 رد · 3,850 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لو كانت الصلاحيات المتاحة في برنامجي مفصلة لكل شاشة فرعية

مثلا النافذة الفرعية "form2"( اضافة - بحث - تعديل )

و النافذة الفرعية "form3:( اضافة - بحث - تعديل )

فإن كود التحقق من الصلاحيات سيكون كالتالي

Do While rs.EOF
If rs![wins] = True Then
Form2.Command9.Enabled = True
Else
Form2.Command9.Enabled = False
End If
If rs![wedit] = True Then
Form2.Command2.Enabled = True
Else
Form2.Command2.Enabled = False
End If
loop

وهكذا...

وقمت بوضعه بداخل حدث click لزر الأمر ( دخول )الموجود في نافذة تسجيل الدخول

فإنه عند التشغيل يتم دخول جميع المستخدمين ويتم إعطاءهم جميع الصلاحيات؟؟؟؟!!!!!!! :(

ما سبب ذلك؟

علما بأنه بعد ظهور نافذة تسجيل الدخول فإنه تظهر النافذة الرئيسية للبرنامج التي منها يتم الدخول للنوافذ الفرعية "form2-form3"

أرجو المساعده :wacko:

تم تعديل هذه المشاركة بواسطة Dena22 في 18 نوفمبر 2005 في 22:10

#2

الأخت Dena22

السلام عليكم

يوجد مثال ضمن ردي هذا ، أرجو أن يفي بالغرض المطلوب .

Example.rar

#4

شكرا للجميع على الرد ولكن :blink:

المشكلة هي أنه عند وضع عبارة

If Not rs.EOF Then

---( كود التحقق من الصلاحيات )

---

end if

أو عبارة

Do While not rs.EOF

-----

loop

فإنه تظهر لي رسالة الخطأ المرفقة

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

ونفس الشيء يحدث عندما لا يتم كتابة أي من الجملتين السابقتين

post-23301-1132421016_thumb.jpg

#5

الأخت Dena22

في الحقيقة لم أطلع على كود الأخ العماني كما ذكر أخي المهنا ، ولكن المثال الذي قمت بوضعه حل لي الكثير من المعوقات التي واجهتني ، فهو ببساطة يسجل دخول المستخدم من خلال تغيير قيمة خاصية العنوان في الـ Frame الخاص بالنموذج frmMain الرئيسي بحيث يضع عبارة " تم تسجيل دخول مسؤول" ، وبذلك عند فتح أي نموذج بعد تسجيل الدخول يتم التحقق من العبارة المذكورة في النموذج الرئيسي ، فإذا كانت مسؤول يسمح بجميع الصلاحيات ، وإذا كانت "تم تسجيل دخول ضيف " يتم تحديد الصلاحيات " بناء على ذلك .

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

#6

أختي دينا لم اطلع على الكود في المرفقات :

لكن هذه فكرة خطرت لي :

قومي بعمل جدول في قاعدة البيانات خاص بأسماء المستخدمين على النحو التالي

رقم المستخدم - اسم المستخدم - كلمة المرور

الجدول الأخر الصلاحيات :

رقم المستخدم - رقم الصلاحية - نوع شاشة الصلاحية (يعني المبيعات - المشتروات - Form1- ....)-صلاحية الحذف - صلاحية التعديل .....

هذا الجدول بالذات الإخير

يتم تخزين رقم المستخدم من جدول المستخدمين ثم يتم تحديد فروع الصلاحية أي ماهي الأنواع تتاح من الصلاحيات لكل نافذة ثم هل صلاحية التعديل له متاحة وغيرها

يكون التخزين على النحو التالي

1   -   1   -   Sal   -    0   -   1 
1   -   1   -   Emp   -    0   -   0

حيث Sal اسم النافذة الخاصة لها هذه الصلاحيات . الصلاحية المتاحة 1 وغير المتاحة 0 , والحقل بطول 1 من نوع Char إذا كانت القاعدة Oracle أو نص بطول 1

في نافذة التحق من اسم المستخدم استعلمي من قاعدة البيانات عن رقم المستخدم اسم المستخدم وكلمة المرور ثم إذا كانت صحيحة قومي بعمل استعلام جلب الصلاحيات من جدول الصلاحيات برقم المستخدم

وقومي بحفضا في مصفوفة Array أو هيكل Strucure أو غيرة أو ضعيها في نفس PrivRs (سجل)ولكن اجعلي التعريف PrivRs عام على مستوى نوافذ البرنامج يعني في مودل ويكون من نوع Public وعند إحاجة لفتح نافذة ما يتم التأكد من الصلاحيات المتاحة للمستخدم من السجل PrivRs والكود نفس الي عملتية من قبل لكن التحقق في هذه الحالة سيكون مثلا لو كنت في شاشة الموضفين فسيكون فحص الصلاحيات على Emp وليست Sal .

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

حيث في المثال رقم المستخدم 1 له شاشتان وهي Sal و Emp مع صلاحياتها

أتمنا لكي التوفيق B)

تم تعديل هذه المشاركة بواسطة فواز الشمري في 19 نوفمبر 2005 في 21:21

#7

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

19_11_05_10_43_25_1132425805shrh.jpg

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

TTTFFFTTTFFFTTTFFTTFFTTFF

بحيث تكون F منع الصلاحية وT منح الصلاحية

عند الدخول للبرنامج يتم تعبئة صلاحيات المستخدم في متغيير محجوز خصيصاً لذلك مثلا

Public UserAuthr as string

وعند النقر على الزر المطلوب تستخدمي كود التحقق سواء كتب في موديول ويمرر لجميع الازرار او كتب في نفس الزر كالتالي مثلا

لنفترض ان هذا الزر صلاحيته الحرف الرابع من السلسلة فإن كان الحرف F نمنع المستخدم من المواصلة وإلا فليواصل العملية فنقول مثلا

if mid(UserAuth,4,1)="F" then 
    Msgbox " ليس لديك صلاحيات "
   exit sub
end if

تضع هنا بقية الكود للزر

تحياتي

OMANI FOR EVER

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

post-12787-12780191801974.jpg

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

#8

اخي omani ياريت لو توضح :

كيف بتقرأء

TTTFFFTTTFFFTTTFFTTFFTTFF

وهي في خانة واحدة :(

يعني كيف ستمنع الزر تعديل في شاشة العملاء مع العلم ان المستخدم لديه صلاحية التعديل في شاشة الموضفين مثلاً. :wacko:

#9

الأخ SAA شكرا جزيلا للرد ولكن الصلاحيات لدي مأخوذة من قاعدة بيانات

الأخ فواز الشمري أشكرك على الرد ، ولكن ما يغيظني :angry: :angry: :angry:

هو أنني سابقاً كنت قد عملت الصلاحيات على مستوى الشاشات فقط ، يعني كالتالي

الدخول لشاشة 1

الدخول لشاشة 2

الدخول لشاشة 3 وهكذا

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

وكان البرنامج عندي شغال 100% ، لكن عندما قمت بتحديد الصلاحيات لكل شاشة ظهرت عندي هذه المشكلة مع العلم بأنني وضعت حقل خاص لكل صلاحية في جدول المستخدمين كما أن شاشة الصلاحيات لدي هي نفس فكرة شاشة الصلاحيات التي وضعها الأخ omani ، و الصلاحيات تضاف في خانة خاصة في جدول اليوزر يكون فيها هذه الصلاحيات عبارة عن حقول ( نعم / لا)

ماسبب ظهور هذا الخطأ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

وما الداعي لعمل جدولين أساساً؟ المسألة كانت ابسط من ذلك ولكن لا أدري ماذا حدث؟؟؟؟؟؟؟؟؟؟؟؟

أرجو المساعدة :blink:

#10

شوفي اختي الكريمة :

انا الفكرة التي ذكرتها هي تتمثل فيا يلي :

وجود شاشة خاصة بالصلاحيات يتم فيها تحديد اسم المستخدم ثم

يحدد الشاشة بيانات الموضفين - لدية 3 صلاحيات فيها - تعديل - حذف -----

الشاشة الثانية شاشة المبيعات - لدية 3 صىحيات فيها هي - تعديل - لإضافة --

شاشة الحسابات - فيها صلاحيات - تعديل - حذف - إضافة - غير مصرح بالخدول

.

.

وهنا التصميم كما ترغبين لتكن مثلا كما في شاشة الأخ عماني :

قد تكون هناك أحيانا صلاحيات لا يمكن أن تعطى أي لا يمكن للمستخدم A الإطلاع على الحسابات

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

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

بالنسبة لماذا جدوليين :

الجدول الأول فيه اسم المستخد ورقمة وكلمة المرور .

طيب لو كان للمستخدم A صلاحية تعديل وحذف في شاشة المبيعات .

وكان لدية صلاحية في شاشة الحسابات تعديل ولإضافة .

كيف سأقوم بتسجيل هذه العمليات في الجدول الي هوا جدول المستخدمين :

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

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

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

تصبحون على خير :unsure:

#11

الأخ فواز الشمري

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

طيب لماذا سابقا كان يقوم بالدخول عندما كانت الصلاحيات على الشاشة ككل؟

وعند تحديد الصلاحيات لكل شاشة لماذا يقوم باختبار الصلاحية الأولى ثم يتوقف ويقوم بتحديد الخطأ على الصلاحية الثانية؟ بدليل أنني عندما ألغيت التحقق من باقي الصلاحيات قام بالدخول وتفعيل التحقق من الخاصية الأولى!!!!!!!!

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

/index.ph...topic=76227&hl=

أنا أعتذر على كثرة الأسئلة والإزعاج لكنني أحاول أن أتعلم أكثر

وبالنسبة للفكرة التي تقترحها ياريت لو ممكن مثال صغير جدا كي تتضح الفكرة أكثر.

وجزاك الله خيرا

#12

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

إخوانى الأعزاء

أسمحوا لى بالإدلاء بدلوى فى هذا الموضوع معكم

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

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

أعتقد أن مشكلتك فى الوصول لحقل معين فقط - فربما به خطأ لفظى أو قيم Null أو ما شابه ذلك

النصيحه التى أريد توصيلها هنا :

لماذا لا تقومى بعرض هذه الصلاحيات فى شكل أدوات CheckBox على النموذج - وتخفيها وقت لا تريديها - لترى أى الصلاحيات مفعلة وأيها غير مفعل؟

وأيضا يمكنك التعامل مع هذه الأدوات بأن تتحققى من قيمة الأداة CheckBox.Value=1 ومنها تعطيه الصلاحية للوصول أو لا

والإضافة هنا أنك سترينها وتستطيعى اختبارها - وهذا سيساعدك فى التحقق من الصحة والـ Debuging

والله من وراء القصد وهو يهدى السبيل

عن عبدالله بن عمر رضي الله عنهما أن رسول الله صلى الله عليه وسلم قال :

( أحب الناس إلى الله أنفعهم ، وأحب الأعمال إلى الله عز وجل سرور تدخله على مسلم ، أو تكشف عنه كربة ، أو تقضي عنه دينا ، أو تطرد عنه جوعا ، ولأن أمشي مع أخي المسلم في حاجة أحب إليّ من أن اعتكف في المسجد شهرا ، ومن كف غضبه ستر الله عورته ، ومن كظم غيظا ، ولو شاء أن يمضيه أمضاه ، ملأ الله قلبه رضا يوم القيامة ، ومن مشى مع أخيه المسلم في حاجته حتى يثبتها له ، أثبت الله تعالى قدمه يوم تزل الأقدام ، وإن سوء الخلق ليفسد العمل كما يفسد الخل العسل )

رواه الطبراني في الكبير

#13

الأخت العزيزة هذا مثال على كيفية تطبيق الفكرة التي ذكرتها في المشاركات السابقة :

في البداية :

يحتوى البرنامج على Class باسم SqlDataBase وهوا يحتوي جميع الأوامر المتعلقة بإدارة الاستعلامات و كذلك عمليات الفتح والإغلاق :

هذا مثال عن دالة في الـ Class تقوم بفتح قاعدة البيانات :

   
Public Function OpenAccessDataBse() As Boolean
On Error GoTo Er
    If dbsc.State = 0 Then
        dbsc.CursorLocation = adUseClient
        dbsc.Open Provider
    End If
    OpenAccessDataBse = True
    Exit Function
Er:
  Exception = Err.Description
End Function

دالة أخري لتمرير الاستعلامات Sql

   
Public Function Query(SQL As String) As Boolean
On Error GoTo Er
    If Me.Rs.State = adStatusOK Then Me.Rs.Close
    Me.Rs.Open SQL, dbsc, adOpenStatic, adLockOptimistic
    Query = True
    Exit Function
Er:
    Exception = Err.Description
End Function

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

   

Private Sub Command1_Click()
Dim SQL As String
    If Trim(txtUserName) <> "" And Trim(txt_UserPsw) <> "" Then
       SQL = "SELECT * FROM [User] WHERE user_name ='" & Trim(txtUserName) & "' And psw = '" & Trim(txt_UserPsw) & "'"

       With fawaz.Dbs
       If .OpenAccessDataBse Then
          If .Query(SQL) = True Then
             If Not (.Rs.BOF And .Rs.EOF) Then
                 If (.Query("SELECT * FROM Privilege WHERE User_id=" & .Rs.Fields("id"))) Then
                    If Not (.Rs.BOF And .Rs.EOF) Then
                         Set fawaz.Priv_User = .Rs
                         Unload Me
                         SetPriv
                         mdiMainProject.SetFocus
                    Else
                         MsgBox "áã íÊã ÅÚØÇÁ ÇáãÓÊÎÏã ÕáÇÍíÇÊ ÏÎæá ÇáÑÌÇÁ ãÑÇÌÚÉ ãÓÄá ÇáäÙÇã", vbInformation + vbMsgBoxRight, "Log In"
                    End If
                 Else
                     MsgBox "áÎØÃ Ýí ÇÓÊÚáÇã ÇáÕáÇÍíÇÊ", vbInformation + vbMsgBoxRight, "Log In"
                 End If
             Else
                MsgBox "ßáãÉ ÇáãÑæÑ Ãæ ÇÓã ÇáãÓÊÎÏã ÛíÑ ÕÍíÍ", vbCritical, "Log In"
             End If
          Else
             .GetExeptionMsg "ÎØÃ Ýí ÇáÅÓÊÚáÇã", vbCritical
          End If
      Else
         .GetExeptionMsg "ÎØÃ Ýí ÝÊÍ ÞÇÚÏÉ ÇáÈíÇäÇÊ", vbCritical
      End If
      End With
    End If
End Sub

Private Sub Command2_Click()
    If IsObject(fawaz.Dbs) Then
         Set fawaz.Dbs = Nothing
    End If
    If IsObject(fawaz.Priv_User) Then
        Set fawaz.Priv_User = Nothing
        End If
    End
End Sub

هاذا الكود فيه تعليقات في المثال يمكن الرجوع إليها :

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

إجراء اخر لإعطاء الصلاحيات :

'åÐÇ Úáì ãÓÊæì ÇáÞæÇÆã ááäÇÝÐÉ ÇáÑÆíÓíÉ
Private Sub SetPriv()
    'åá ááãÓÊÎÏã ÍÞ ÇáæÕæá áÔÇÔÉ ÇáãÓÊÎÏãíä
    If fawaz.ExecutPrive("form1", True) = True Then
        mdiMainProject.mnuUsers.Enabled = True
    Else
        mdiMainProject.mnuUsers.Enabled = False
    End If
        
    'åá ááãÓÊÎÏã ÍÞ ÇáæÕæá áÔÇÔÉ ÇáãÔÊÑíÇÊ
     If fawaz.ExecutPrive("form2", True) = True Then
        mdiMainProject.buy.Enabled = True
    Else
        mdiMainProject.buy.Enabled = False
    End If
End Sub

في بادية الدخول يتم فحص الصلاحيات على مستوى الشاشات مثلا المستخدم Fawaz ليست له الصلاحية في فتح شاشة المستخدمين نهائياُ لذلك يجب عند فتح النافذة ان نلغي تفعيل فتح شاشة المستخدمين من النافذة .

أما على مستوى الشاشات فتكمن في انه لدى المستخدم fawaz صلاحية الدخول للشاشة المشتريات , (طبعاً هي ستكون مفعلة من القائمة ) لذلك سوف يضغط المستخدم على المشتريات من القائمة لكن في شاشة المشتريات ليس له الحق في التعديل ولإضافة وله الحق في التعديل :

Private Sub buy_Click()
    fawaz.ExecutePrive "form1", , Form1
    Form1.Show
End Sub

جزئ من الدالة المسؤله عن تنفيذ الصلاحيات :

If Mnu = True Then
        If Priv_User.EOF = False Then
            If Priv_User.Fields("access") = 1 Then
                ExecutePrive = True  'ÊÝÚíá ÞÇÆãÉ ÝÊÍ ÇáäÇÝÐÉ
            Else
                ExecutePrive = False   'ÚÏã ÊÝÚíá ÞÇÆãÉ ÝÊÍ ÇáäÇÝÐÉ
            End If
        Else
            MsgBox "ÇáÔÇÔÉ ÇáÊí ÊÍãá ÇÓã" & form_Priv & " áã íÊã ÇáÚ辄 Úáì ÕáÇÍíÇÊ áåÇ "
        End If
   Else 'ÇáÕáÇÍíÇÊ Úáì ãÓÊæì ÇáäæÇÝÐÇ
       With Priv_User
       If Not Priv_User.EOF Then
            Select Case form_Priv
                Case "form1":
                   If .Fields("Delete") = 1 Then frm.cmdDelete.Enabled = True Else frm.cmdDelet.Enabled = False
                   If .Fields("Update") = 1 Then frm.cmdUpdate.Enabled = True Else frm.cmdUpdate.Enabled = False
                   If .Fields("Insert") = 1 Then frm.cmdInsert.Enabled = True Else frm.cmdInsert.Enabled = False
            End Select
        Else
             MsgBox "áÇ íæÌÏ ÕáÇÍíÉ"
        End If
        End With
    End If

يمرر للدالة اسم النافذة التي سيتم البحث عن صلاحياتها في قاعدة البيانات حيث تم وضع هذا الإسم في القاعدة وبالتالي سيتم البحث في السجل الخاص بهذه النافذة لمعرفة الصلاحيات .

تم تمرير ايظاُ متغير يوضح هل البحث حالياً عن صلاحيات القوائم بالنسبة لفتح النافذة ككل ام بحث الصلاحيات اخل النافذة . هناك حقل باسم Access يوضح هل للمستخدم حق الوصول للنافذة هذه .

يتم تمرير النافذة التي سيتم إلغاء التفعيل او الصلاحيات منها ,.

على عجالة جدا من الوقت كتبت هذا البرنامج أتتمنا للجميع أن يستفيد منه ليس فقط بالأفكار وإنما بطريقة كثابتة الكود وكيفية استخدام الـ Module والـ Class في البرامج والفائدة منهما .

البرنامج يعتبر ناقص ويمكن للكل الإضافة عليه بحسب الحاجة من الصلاحيات

قاعدة البيانات هناك تعليق أمام أسماء الحقول يمكن الرجوع إليها .

كتبت هذا البرنامج دون مراعاة المبتدئين في البرمجة لذا اعتذر وبشدة عن أي غموض في الكود لكني مستعد للإجابة عن أي استفسار في البرنامج:

dena.zip

#14
فواز الشمري كتب:
اخي omani ياريت لو توضح :

كيف بتقرأء

TTTFFFTTTFFFTTTFFTTFFTTFF

وهي في خانة واحدة  :(

يعني كيف ستمنع الزر تعديل في شاشة العملاء مع العلم ان المستخدم لديه صلاحية التعديل في شاشة الموضفين مثلاً. :wacko:

طبعاً يتم قراءة المفردة باستخدام الدالة Mid والتي من خلالها تستطيع تحديد الموقع انتظروني حد اعد مثالا لذلك حينما يتسنى لي الوقت

تحياتي

OMANI FOR EVER

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

post-12787-12780191801974.jpg

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

#15

شكرا أخي فواز على الرد

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

my ex.zip

#16

الأخطاء هي كتالي :

لما تريدين فتح النافذة form1 في بداية تحميل النافذه للذاكرة في الحدث Form_Load

استدعيتي الإجراء chuser ولكن الملاحضة المهمة ان هذا الإجراء سوف يفحص جميع النوافذ في البرنامج Form1,form2,form4 والبقية وفي كل نافذة يوجد استدعاء لنفس الإجراء يعني سيتم استدعاء الإجراء حوالي 11 مره ويتم المعالجة من جديد لذى حدثت المشكلة التي تعاني منها :

الحل كان فصل الفحص للنوافذ على نافذه نافذة فإذا اردت ان افتح Form1 أمرر للإجراء اسم النافذه التي اود فتحها , كما يلي :

	chuser "form1"

هناك فحص للإحتمالات التي سيأخذها المتغير TypeOfForm في الإجراء لذلك عملت Case تقوم بتميز النافذه التي سيتم تحديد الصلاحيات لها فإذا كانت على Form2 سيكون الفحص على ما يتعلق بـ Form2 فقط وليس جميع النوافذ .

وهذا الإجراء بعد التعديل :

Public Sub chuser(TypeOfForm As String)
If rs.State = adStateOpen Then rs.Close
rs.Open "users", db, adOpenDynamic, adLockOptimistic
rs.MoveFirst
rs.Find "uname='" + nam + "'", 0, adSearchForward, 1

If Not rs.EOF Then
    Select Case TypeOfForm
        Case "form2"
                If rs![wins] = True Then
                    Form2.Command9.Enabled = True
                Else
                    Form2.Command9.Enabled = False
                End If
                If rs![wedit] = True Then
                    Form2.Command2.Enabled = True
                Else
                    Form2.Command2.Enabled = False
                End If
                If rs![wdel] = True Then
                    Form2.Command3.Enabled = True
                Else
                    Form2.Command3.Enabled = False
                End If
        Case "form4" 
            If rs![sins] = True Then
                Form4.Command9.Enabled = True
            Else
                Form4.Command9.Enabled = False
            End If
            If rs![sedit] = True Then
                Form4.Command2.Enabled = True
            Else
                Form4.Command2.Enabled = False
            End If
            If rs![sdel] = True Then
                 Form4.Command3.Enabled = True
            Else
                 Form4.Command3.Enabled = False
            End If
        Case "form7"
            If rs![rwser] = True Then
                Form7.all.Enabled = True
            Else
                Form7.all.Enabled = False
            End If
            If rs![rwview] = True Then
                Form7.Command11.Enabled = True
            Else
                Form7.Command11.Enabled = False
            End If
        Case "form13"
            If rs![rsser] = True Then
                Form13.all.Enabled = True
            Else
                Form13.all.Enabled = False
            End If
                If rs![rsview] = True Then
                Form13.Command11.Enabled = True
            Else
                Form13.Command11.Enabled = False
            End If
        Case "form9"
            If rs![wcsi] = True Then
                Form9.k1.Value = True
            Else
                Form9.k1.Value = False
            End If
            If rs![scsi] = True Then
                Form9.k2.Value = True
            Else
                Form9.k2.Value = False
            End If
        Case "form10"
            If rs![mins] = True Then
                Form10.Command1.Enabled = True
            Else
                Form10.Command1.Enabled = False
            End If
            If rs![medit] = True Then
                Form10.Command3.Enabled = True
            Else
                Form10.Command3.Enabled = False
            End If
            If rs![mdel] = True Then
                Form10.Command4.Enabled = True
            Else
                Form10.Command4.Enabled = False
            End If
        Case "form11"
            If rs![wsins] = True Then
                 Form11.Command1.Enabled = True
            Else
                Form11.Command2.Enabled = False
            End If
            If rs![wsedit] = True Then
                Form11.Command3.Enabled = True
            Else
                Form11.Command3.Enabled = False
            End If
            If rs![wsdel] = True Then
                Form11.Command4.Enabled = True
            Else
                Form11.Command4.Enabled = False
            End If
        Case "form12"
            If rs![userins] = True Then
                Form12.Command1.Enabled = True
            Else
                Form12.Command1.Enabled = False
            End If
            If rs![useredit] = True Then
                Form12.Command3.Enabled = True
            Else
                Form12.Command3.Enabled = False
            End If
            If rs![userdel] = True Then
                Form12.Command4.Enabled = True
            Else
                Form12.Command4.Enabled = False
            End If
        Case "form6"
            If rs![comedit] = True Then
                Form6.Command4.Enabled = True
            Else
                Form6.Command4.Enabled = False
            End If
            If rs![comdel] = True Then
                Form6.Command3.Enabled = True
            Else
                Form6.Command3.Enabled = False
            End If
        Case "form1"
            If rs![bbk] = True Then
                Form1.tbuckup.Enabled = True
            Else
                Form1.tbuckup.Enabled = False
            End If
            If rs![tbbk] = True Then
                 Form1.rbuckup.Enabled = True
            Else
                 Form1.rbuckup.Enabled = False
            End If
    End Select
End If


End Sub

هناك بعض الأخطاء قد تضهر لكي في البرنامج سببه عدم تنسيق الكود بالشكل السليم . حاولي في حال حدوث خطأ ما عند العودة للنافذة الرئيسية وفتح نافذه اخرة ان تجعلي إغلاق النوافذ بدل Unload Me بـ Me.Hide

للمعالجة فقط . B)

ملاحضة : وجدت في البرنامج شفره For i = 1 To 10000 للدوران في سجل . :P

my ex.zip

#17

أستاذي الفاضل فواز الشمري

تأخرت بالرد عليكم ولكنني انشغلت قليلا عن المنتدى

ألف شكر لك على الرد الفعال والذي افادني كثيراً ، ومعذرة بالنسبة للأخطاء البرمجية

لدي سؤال بسيط وهو كيف يمكنني تحديد احدى صلاحيات ( اضافة - حذف - تعديل ) باستخدام ado

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

علماً بأنني استخدمت طريقة الربط من درس الأخ moh_190 الموضوع بقسم الدروس على الرابط التالي

/index.ph...T&f=136&t=52933

؟؟؟؟؟؟؟؟؟؟

#18

اولا كل عام وانتي بخير اختي دينا .

ياريت توضيح اكثر هل المشكلة في نفس البرنامج ام اخر.

لحل المشكلة كما اذكر لديكي زرين اضافة حفظ تعديل . عند ضغط زر الحفظ ضعي كود إلغاء التفعيل لزر التعديل في نهاية الأجراء .

B)

#19

وانت بخير وجميع اعضاء هذا المنتدى بالف خير وعافيه

المشكله التي ذكرتها هي في نفس البرنامج

شيء اخر احترت فيه وهو بالنسبة لزر ( الحفظ ) اذ انه يتم استخدامه مع زري التعديل والاضافة، كيف يمكنني تفعيله مع التعديل فقط او الاضافة فقط وذلك حسب الصلاحية المتاحه؟

بمعنى لو كانت الصلاحية المتاحة للمستخدم هي التعديل فقط فإنه عند النقر على زر الحفظ ( بعد التعديل طبعا) يقوم بحفظ التعديلات ولايقوم بتفعيل زر الاضافة؟

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

؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

والف شكر مقدما

#20

لا مشكلة من كثر الأسئلة الأهم هوا ان نفهم اختي .

حسب ما فهمت فلديكي زر حفض وزر تعديل وحذف.

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

في هذه الحالة اقترح عليكي عمل هيكل Strucure يحتوى على صلاحيات المستخدم بالنسبة للنافذة الحالية وبعد ذلك يمكنكي ان تقومي بمعالجة جميع البيانات في النافذة الحالية . هذا الهيكل يحمل اسم النافذة والصلاحيات .

أو فكرة اخرى اسهمل لكي وهي :

لوفرضنا ان المستخدم ليس له صلاحيات التعيدل ولكن المشكلة عند ضغط زر الحفظ لعملة الإضافة يتم تفعيل الزر الخاص بالتعديل على الرغم من ان البرنامج نجح فعلا في فتح النافذة والزر التعديل غير مفعل .

ضيفي شرط لفحص حالة الزر هل هوا مفعل ام غير مفعل وعلية ابني الشفرة المناسبة .

وإن لم <_< ضعي الكود الخاص بزر الحفض هنا في المنتدى ولكن مش مضغوط يعني ضعي الشفرة وانا بعدل لكي علية .

بالتوفيق ان شاء الله B)

هذا الموضوع مغلق.

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