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

أريد عمل كود بإستخدام Select Case

بدأه محمد السيد صابر في 24 مايو 2008 · 11 رد · 3,553 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الإخوة الأعزاء ،

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

لدينا جدول يحتوى على الحقول التالية: رقم الموظف ، إسم الموظف ، إسم التدريب (هناك أكثر من 14 نوع مختلف من التدريبات) ، تاريخ التدريب.

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

على سبيل المثال : الموظف رقم 20 إسمه محمد السيد أخذ تدريب إسعافات أولية بتاريخ 12/05/2007 ، فى هذه الحالة أريد من الكود أن ينظر أولآ لنوع التدريب إذا كان إسعافات أولية يضيف على التاريخ 360 يوم بمعنى سنة ، أما إذا كان نوع التدريب مثلاً مقاومة حريق يضيف على التاريخ 180 يوم (6 شهور). وهكذا لكل نوع تدريب عدد معين من الأيام تضاف للتاريخ ثم تظهر فى الحقل الجديد (تاريخ التدريب القادم).

ولكم كل الشكر والتحية وجزاكم الله كل الخير والسلام عليكم ورحمة الله وبركاته

#2

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

من خلال سؤالك يتضح ان لديك إلمام بعمل الدالة select case ولكن تريد معرفة كيفية تطبيقها على فكرتك التي وضحتها ؟؟

لنفرض ان الجدول اسمه tblEmp ويحتوي الحقول (رقم الموظف- اسم الموظف-اسم الدورة-تاريخ التدريب ) وبالطبع تاريخ التدريب القادم وهذا ما يهمك!!

ولنفرض ايضا ان لديك نموذج tblEmp وفيه الحقول المشار اليها اعلاه مع تاريخ التدريب القادم .

طيب سنقوم بعمل الخطوات التالية :-

1- فتح نموذج النموذج tblEmp بوضع التصميم

2-وضع اجراء حدث- بعد التحديث- في الحقل( تاريخ التدريب) وهو كالتالي:

Dim sd As Date
Select Case CoType
Case Is = "اسعافات اولية"
sd = DateAdd("d", 360, [CoDate])
Me.NxtDaet = sd
Case Is = "مقاومة حريق"
sd = DateAdd("m", 6, [CoDate])
Me.NxtDaet = sd
End Select

CoType =اسم الدورة

CoDate = تاريخ التدريب

NxtDate=تاريخ التدريب القادم

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

الايام "d" ولإضافة الشهور "m" ولإضافة سنوات "yyyy" ويمكنك مراجعة help في الاكسس لهذا الدالة لمزيد من التفصيل

هذا كل شيئ ومرفق مثال

أخوك مشكاة

M_SleCaseExp.rar

#3

بارك الله فيك اخي Mishkat ibrahim وبعد اذنك

اخي محمد السيد صابر

الحقل المطلوب يعتبر حقل محسوب وتخزينه بالجدول غير مجدي

لذا تم استخدام الدالة iif بالاستعلام وسيكون مصدر النموذج هو الاستعلام

ارجو ان يفي المرفق بالمطلوب

بالتوفيق للجميع

M_SleCaseExp.rar

#4

الأخ العزيز مشكاة

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

إليك الملف المرفق كامل لتوضيح الفكرة ، أرجو تطبيق فكرة الحل عليه وشكراً

Trainings_db1.rar

#5

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

الأخ العزيز يوسف أحمد ، أولاً ألف شكر لمداخلتك ، هو فعلاً الحقل محسوب لكن الفكرة كلها كما ذكرت من قبل للأخ مشكاة أن ال Combo box هو الأساس لأن الأمر يتوقف على إسم التدريب (الموجود داخله) ، أما بالنسبة للدالة IIF فأعتقد أنها لا تصلح لإن إحتمالات الشرط كثيرة أكثر من 15 إحتمال لذا فإن الدالة Select Case هى المناسبة على حد معرفتى ولكن إن كان لدى أحد أى فكرة أخرى فأهلاً وسهلاً بها. وشكراً

#6

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

وبعد اذن اخونا واستاذنا العزيز يوسف أحمد المحترم،، اشكرك على الملاحظة القيمة!!

ومسا الخير يا أخ محمد ..

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

أولا : النموذج تم تصميمه بشكل جدولي والحقل غير محسوب أو (غير منظم ) وبالتالي أي قيمه تدخل في هذا الحقل بالتأكيد ستتكرر الى جميع الحقول.

ثانيا : الكومبو بوكس combo box ليس له علاقه بالنموذج الجدولي فعلى سبيل المثال اذا اخترت دورة First Aid - Red Cressant لاتتغير لجميع الموظفين.

ثالثا: اذا قمت بتحديد السجل رقم 2 مثلا وقمت باختيار من الكومبو بوكس اي دورة يتم تحديث الحقل NextDate بناء

على تاريخ السجل الحالي وهو رقم 2 وبناء على الدورة التي اخترتها من الكومبو بكس وليس النموذج الجدولي وبالطبع سيتكرر الى جميع الحقول.

انظر الصورة

post-156430-1211647504_thumb.jpg

الصورة 2

post-156430-1211647534_thumb.jpg

طيب الى هنا انتهت الملاحظات :

الاستنتاج:-

لايمكن ان يعمل الحقل الغير محسوب (NextDate)في النموذج الجدولي لأن القيمة ستكرر الى كافة الحقول وبالتالي ليس هذا ما تريده بالطبع !!!

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

طيب كيف نحل المشكلة ؟!!

1- بحاجة الى كود جديد ليقوم بالانتقال خلال كل سجل من السجلات الموجوده في النموذج ويقوم بتحديث NextDate بناء على التاريخ الموجود في السجل نفسه وبناء على الاختيار من combo box اسم التدريب.

2- بحاجة الى اضافة حقل جديد الى الجدول الرئيسي Test_Plan وهو NextDate ويكون نوعه تاريخ/وقت. ضروري جدا

3- بحاجة الى عمل وظيفة اجرائية محلية private sub وليكن اسمها مثلا selecR ليتم استدعائها عند الحاجة.

4- بحاجة الى عمل جدول خاص فقط باسم الدورات الموجود عندك ليتم اسناد قيمة الكومبو بوكس combo Box اليها.

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

نشرح الموضوع بعد العشاء اصل انا مش متغدي يا محمد seeYou

أخوك مشكاة

#7

و أنا معك يا أستاذ ، بالهنا والشفا مقدماً ، فى إنتظارك ،،،،،

#8

select case لا تصلح في الاستعلامات لكثرة الشروط

select case لا تصلح في النموذج المستمر

خطرت لي فكرة

أولاً : نحتاج إلى جدول الدورات كما قال الأخ Mishkat خاص بالدورات يحتوي على ( رمز الدورة ونوع بياناته رقم _ اسم الدورة ) ونحتاج أيضا في الجدول المسمى tblEmp حقل رمز الدورة

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

واعطيت رمز الدورة في الجدول 1 للاسعافات الأوليه ورقم 2 مقاومة الحريق

نقوم بعمل دالة عامة كما يلي

Public Function NextDate(ByVal VarCoTypecode As Integer, ByVal VarCoDate As Date)
 Dim sd As Date
 Select Case VarCoTypecode
 Case Is = 1
 sd = DateAdd("d", 360, VarCoDate)
 Case Is = 2
 sd = DateAdd("m", 6, VarCoDate)

 End Select
 NextDate = sd
 End Function

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

الوسيطة أو البارامتر الثاني هو تاريخ التدريب وقد اسميته VarCoDate

نقوم بإجراء العمليات الحسابية وفق الشروط التي نريد

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

NextDate: NextDate([CoTypecode];[CoDate])

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

هذا مثال على ذلك تجدون الحودة النمطية والاتعلام في هذا المثال

الرجاء إجراء عدة اختبارات على هذه الطريقة فلم أدقق أو أختبرها بشكل كبير

هذا هو المثال

M_SleCaseExp.rar

#9

الأخوة الأعزاء ، سلام الله عليكم جميعا ، أشكركم جميعاً من كل قلبى على إهتمامكم بما طرحته وأود أن أبلغكم بأن الحمد لله قد وصلت إلى الفكرة التى كنت أريدها وأحب أن أعتذر للأخ يوسف أحمد حيث أن فكرته قد نفعت بعد أن إعتقدت أن الدالة IIF لا تصلح للشروط الكثيرة ولكنى قلت أجرب وبالفعل نجحت فكرته حيث جربت مع هذه الدالة أكثر من 11 شرط داخل إستعلام فوجدتها قد عملت بنجاح والآن ها هى الفكرة فى الملف المرفق حيث يوجد داخل النموذج Combo box تختار منه إسم التدريب الذى تريد سيعطيك فكرة عامة عن الذين أخذوا هذا التدريب وفى أى تاريخ سيكون موعد التدريب القادم وهذا ما كنت أريد بالفعل. - لرؤية النتيجة بوضوح أختاروا من الCombo box التدريب Health and Safety Induction حيث أن هناك أكثر من شخص حصلوا على هذا التدريب فى مثالنا الحالى

ولكم جميعاً جزيل الشكر

Trainings_db1.rar

#10

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

عدنا

بسم الله ماشاء الله عليك يا ابو سارة الطريقة عجيبة وجميله جدا معلش احنا على قد الحال ..

قبل العشا جاءك الرد يا محمد من المشرف العزيز أبو سارة ..

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

طيب الآن لديك عدة طرق لتطبيق الفكرة !!

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

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

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

بالنسبة الى الشرح

1- الكود الذي سيتم اضافته في combo box بعد التحديث هو :-

On Error Resume Next
Dim i As Integer
Dim RcCont As Integer
Dim stRc As Integer
stRc = 1
RcCont = DCount([Employee ID], "Test_Plan")
Me.Recordset.MoveFirst
For i = Val(stRc) To (RcCont + Val(stRc) - 1)
selecR
If i <> (RcCont + Val(stRc) - 1) Then
Me.Recordset.MoveNext
End If
Next
Me.Recordset.MoveFirst

ترجمة الكود هو:

تعريف أو التصريح (i) و(RcCont) و(stRc) يمثل رقم

تم تحديد قيمة stRc تساوي 1

تم تحديد قيمة RcCont = اجمالي السجلات

الذهاب الى بداية السجلات moveFirst

سيتم الآن التحرك خلال سجل سجل بواسطة الدالة for حيث ستبدأ من السجل الأول الى آخر سجل موجود في الجدول Test_Plan

selecR= هذا هو اسم الوظيفة للدالة select case التي قمنا بكتابتها أول مرة تم وضع اسم لها لكي نستدعيها وقت الحاجة.

بعد الانتهاء من آخر سجل يتم الرجوع الى اول سجل moveFirst .

كود الدالة select case كما تم كتابتها سابقا وهي

Private Sub selecR()
Dim sd As Date
Select Case Combo22
Case Is = "Health and Safety Induction"
sd = DateAdd("m", 6, [Date])
Me.NxtDate = sd
Case Is = "Confined Space"
sd = DateAdd("m", 4, [Date])
Me.NxtDate = sd
Case Is = "Working at Height"
sd = DateAdd("m", 3, [Date])
Me.NxtDate = sd
Case Is = "First Aid - Red cressant"
sd = DateAdd("yyyy", 2, [Date])
Me.NxtDate = sd
Case Is = "Fire Extinguishers - ECDA"
sd = DateAdd("m", 5, [Date])
Me.NxtDate = sd
Case Is = "Chlorine Accrediation"
sd = DateAdd("m", 8, [Date])
Me.NxtDate = sd
End Select

End Sub

كما هو واضح اسم الوظيفة selecR

طبعا لا تنسى اضافة جدول خاص لأسم الدورات فقط وليكن اسمه في مثالنا هذا tblTrNm وهو يحتوي الحقل Training Name نوع نص وAot نوع ترقيم تلقائي

كما لا تنسى اضافة حقل NxtDate في جدول Test_Plan نوع تاريخ/وقت.

كده خلصنا ومرفق لك الملف

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

أخوك مشكاة

Msh_Trainings_UD.rar

#11

الحمد لله اخي محمد السيد صابر انك توصلت الى الحل

وتحية حب وتقدير لمشرفنا واستاذي الغالي على قلبي ابو سارة لمشاركته معنا وقد سعدت كثيراً بمروره بعد غياب ( اسأل الله له التوفيق والسداد )

والله من زمان يا ابو سارة عن لمساتك الرائعة ... سلمت يمينك

مع الشكر والتقدير للجميع،،،

#12

الأخوة الكرام

أبو إبراهيم

وأبو أحمد

شكر لكما وحلولكم تفي بالغرض ولكنني أحببت أن نوجد للأخ السائل أكثر من حل ليأخذ أي من تلك الحلول حسب رغبته

أخي يوسف غيابي هو إنشغالي بتعلم لغة فيجول بيسك دوت نيت لأن حاجة العمل تتطلب ذلك وكان لازاماً علي تعلم هذه اللغة ولا أنتم في القلب ولم أنساكم

أكرر شكري لكم

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