اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

مطلوب توزيع ركاب على الحافلات


ابوخليل
إذهب إلى أفضل إجابة Solved by jjafferr,

الردود الموصى بها

السلام عليكم
مشروع حملة حج خيرية .. طلب مني توزيع آلي للركاب حسب شروط محددة
عدد الباصات 5
يتسع الباص لـــ  49 كرسي
لكل باص مشرف خاص
عدد المشرفين 5 مع عائلاتهم
كل حاج معه مرافقين يختلف عددهم  من حاج لآخر ، ويمكن ان يكون الحاج وحيدا

المطلوب  بضغطة زر التوزيع على الباصات حسب الشروط التالية
1- توزيع المشرفين الخمسة على الباصات الخمسة كل حسب رقم الباص المسجل امامه .
2- توزيع بقية الحجاج على الباصات بشرط مهم وهو ان يكون كل حاج وعائلته ضمن باص واحد . وينطبق ذلك على المشرفين ايضا
3- تعبئة الباصات الاول ثم الذي يليه حتى اكتمال الباصات بالركاب
المرفقات :
جدولان : رئيسي وفرعي
الرئيسي سجل فيه بيانات الحاج  والفرعي سجل فيه بيانات المرافقين له
يشترك الحاج والمرافقين له بمعرف موحد بينهم  :  userid
ينفرد كل فرد  بمعرف خاص به : cardID

الشكر مقدما .. لكم جميعا احبتي

haj.mdb

  • Like 2
  • Thanks 1
رابط هذا التعليق
شارك

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

استاذنا الفاضل @ابوخليل سامحني لاني مسحت البيانات واضافات بيانات من عندي حتى افهم جزء من الموضوع

اضفت في جدول tblSub_Tsjeel عدد 156 مرافق

5 مشرفين + 84 حاج + 156 مرافق = 245 مقعد = اجمالي مقاعد الباصات 5 * 49 = 245 مقعد

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

On Error Resume Next

    ' تصفير حقل degree
    mySQL = "Update tbl_Tsjeel"
    mySQL = mySQL & " SET degree = 0"
    CurrentDb.Execute (mySQL)
    
    ' اذا كان مشرف يأخذ رقم 1
    mySQL = "Update tbl_Tsjeel"
    mySQL = mySQL & " SET degree = 1 WHERE id <=7"
    CurrentDb.Execute (mySQL)
    
    ' اذا كان راكب يأخذ رقم 2
    mySQL = "Update tbl_Tsjeel"
    mySQL = mySQL & " SET degree = 2 WHERE id >7"
    CurrentDb.Execute (mySQL)

    'توزيع المشرفين على 5 باصات
    mySQL = "Select * From tbl_Tsjeel"
    mySQL = mySQL & " WHERE degree = '1'"
    
    Set rst = CurrentDb.OpenRecordset(mySQL)
    rst.MoveLast: rst.MoveFirst
    Do While Not rst.EOF

    For i = 1 To 5
        rst.Edit
        rst!busNum = Str(i)

        rst.Update
        rst.MoveNext
        Next
Loop
    rst.Close: Set rst = Nothing
    
    '==============================================================
    
    'توزيع الحجاج على 5 باصات
    mySQL = "Select * From tbl_Tsjeel"
    mySQL = mySQL & " WHERE degree = '2'"
        
    Set rst = CurrentDb.OpenRecordset(mySQL)
    rst.MoveLast: rst.MoveFirst
    Do While Not rst.EOF

    For i = 1 To 5
        rst.Edit
        rst!busNum = Str(i)

        rst.Update
        rst.MoveNext
        Next
Loop
    rst.Close: Set rst = Nothing
    
    '==============================================================
    
    'توزيع المرافقين على 5 باصات
    mySQL = "Update tblSub_Tsjeel"
    
    mySQL = mySQL & " SET busNum = 0"
    CurrentDb.Execute (mySQL)
    
    
  Dim strSQL As String
    strSQL = "UPDATE tbl_Tsjeel " & vbCrLf
    strSQL = strSQL & "  INNER JOIN tblSub_Tsjeel " & vbCrLf
    strSQL = strSQL & "          ON tbl_Tsjeel.userid = tblSub_Tsjeel.userid SET tblSub_Tsjeel.busNum = [tbl_Tsjeel]![busNum];"
    CurrentDb.Execute (strSQL)

haj.mdb

تحياتي

رابط هذا التعليق
شارك

شاكر ومقدر تعبك ابو عبدالله ومحاولتك الوصول الى نتيجة مرضية
ولكن الحل بعيد عن المطلوب
آمل ان تستحضر التالي في المطلوب :
حقل id لا يمكن اعتماده في الشرط والتوزيع لانه عرضة للتغيير  كما تعلم  فبمجرد حذف البيانات والبدء من جديد حتما سيتغير
فالمطلوب وبكل بساطة ان يتم التوزيع حسب المعرف المشترك بين الحاج ومرافقيه  ولأضرب لك مثلا :
لنفرض ان الباص رقم واحد عند عملية التوزيع تبقى فيه 2 كراسي خالية هنا يجب ان يتم تعبئته بحاج لديه مرافق واحد ، او تعبئته بحاجين مفردين ، ولا يسمح بتعبئته بحاج لديه اكثر من مرافق ، فالمرافق الذي لديه اربعة مرافقين لو سمحنا له لتفرق مرافقوه بين اكثر من باص
والمطلوب ان يكون كل حاج ومرافقيه ضمن باص واحد
ملحوظة : لصعوبة تطبيق الفكرة (عمليا ) لا بأس ان نحصل في النتيجة النهائية على بعض الكراسي الشاغرة لتعذر تعبئتها ، لذلك يمكن معالجتها يدويا

رابط هذا التعليق
شارك

7 ساعات مضت, ابوخليل said:

حقل id لا يمكن اعتماده في الشرط والتوزيع لانه عرضة للتغيير

جميل يا غالي

اذا نعتمد على حقل username واذا كان يبدأ بمشرف نعطيه رقم واحد واذا كان حاج نعطيه رقم 2

ليكون كود تحديد degree كالتالي

On Error Resume Next

    ' تصفير حقل degree
    mySQL = "Update tbl_Tsjeel"
    mySQL = mySQL & " SET degree = 0"
    CurrentDb.Execute (mySQL)
    
    ' اذا كان مشرف يأخذ رقم 1 واذا كان حاج ياخذ رقم 2
    mySQL = "Select * From tbl_Tsjeel"
    Set rst = CurrentDb.OpenRecordset(mySQL)
    rst.MoveLast: rst.MoveFirst
    Do While Not rst.EOF

    For i = 1 To 5
        rst.Edit
        If Left(rst!UserName, 4) = "مشرف" Then
        rst!degree = "1"
        Else
        rst!degree = "2"
        End If
        rst.Update
        rst.MoveNext
        Next
        
Loop
    rst.Close: Set rst = Nothing

ارجو ان يكون تم اصلاح هذا الجزء

الكود كامل كالتالي

On Error Resume Next

    ' تصفير حقل degree
    mySQL = "Update tbl_Tsjeel"
    mySQL = mySQL & " SET degree = 0"
    CurrentDb.Execute (mySQL)
    
    ' اذا كان مشرف يأخذ رقم 1 واذا كان حاج ياخذ رقم 2
    mySQL = "Select * From tbl_Tsjeel"
    Set rst = CurrentDb.OpenRecordset(mySQL)
    rst.MoveLast: rst.MoveFirst
    Do While Not rst.EOF

    For i = 1 To 5
        rst.Edit
        If Left(rst!UserName, 4) = "مشرف" Then
        rst!degree = "1"
        Else
        rst!degree = "2"
        End If
        rst.Update
        rst.MoveNext
        Next
        
Loop
    rst.Close: Set rst = Nothing
    
    '==============================================================
    
    'توزيع المشرفين على 5 باصات
    mySQL = "Select * From tbl_Tsjeel"
    mySQL = mySQL & " WHERE degree = '1'"
    
    Set rst = CurrentDb.OpenRecordset(mySQL)
    rst.MoveLast: rst.MoveFirst
    Do While Not rst.EOF

    For i = 1 To 5
        rst.Edit
        rst!busNum = Str(i)

        rst.Update
        rst.MoveNext
        Next
Loop
    rst.Close: Set rst = Nothing
    
    '==============================================================
    
    'توزيع الحجاج على 5 باصات
    mySQL = "Select * From tbl_Tsjeel"
    mySQL = mySQL & " WHERE degree = '2'"
        
    Set rst = CurrentDb.OpenRecordset(mySQL)
    rst.MoveLast: rst.MoveFirst
    Do While Not rst.EOF

    For i = 1 To 5
        rst.Edit
        rst!busNum = Str(i)

        rst.Update
        rst.MoveNext
        Next
Loop
    rst.Close: Set rst = Nothing
    
    '==============================================================
    
    'توزيع المرافقين على 5 باصات
    mySQL = "Update tblSub_Tsjeel"
    
    mySQL = mySQL & " SET busNum = 0"
    CurrentDb.Execute (mySQL)
    
    
  Dim strSQL As String
    strSQL = "UPDATE tbl_Tsjeel " & vbCrLf
    strSQL = strSQL & "  INNER JOIN tblSub_Tsjeel " & vbCrLf
    strSQL = strSQL & "          ON tbl_Tsjeel.userid = tblSub_Tsjeel.userid SET tblSub_Tsjeel.busNum = [tbl_Tsjeel]![busNum];"
    CurrentDb.Execute (strSQL)

بانتظارك ان شاء الله

تحياتي

رابط هذا التعليق
شارك

لو لاحظت في مثالي المرفق انه يتم ادخال درجة الراكب : degree ، ورقم الباص : busNum  من قبل المستخدم

بحيث يمكننا ايضا من خلاله منح الدرجة ورقم الباص لأي راكب آخر 

وبهذا نستطيع تخصيص احد الباصات لفئة معينة من الركاب

اما الركاب الذين لا يدخل لهم هذين الحقلين فيطبق عليهم التوزيع العشوائي على الباصات

دعنا من المشرفين ومن في حكمهم فبإمكان المستخدم توزيعهم يدويا

المهم هو توزيع البقية على الشاغر من الكراسي كمجموعات (الحاج ومرافقيه = مجموعة )

واعتقد انه لن يتحقق ذلك الا باعتماد المعرف المشترك بينهم userid 

رابط هذا التعليق
شارك

السلام عليكم 🙂

 

اذا تسمحي اخوي ابو خليل ، واخوي محمد ابوعبدالله 🙂

 

مشاركتي لا تؤدي العمل بضغطة زر ، وانما تقدر تستفيد منها لتوزيع الغرف لاحقا ايضا 🙂

الاختيار ليس تلقائي ، ولكنه يسهل العمل كثيرا 🙂

ومن تجربتي مع الحجاج ، بعض الاوقات في مجموعة تحب ان تكون مع مجموعة اخرى في الباص ، فطريقتي سوف تسهل عليك 🙂

 

العمل كله بيكون في الجدول tbl_Groups ، والعمل بالمجموعات ، لذا :

1 و 2. استعلامات الحاقية ، فقط لاخذ بيانات الجدولين tbl_Tsjeel والجدول tblSub_Tsjeel  الى الجدول tbl_Groups

1158.Clipboard01.jpg.9949595a9a3b9d3aaaae0f7441ded3d2.jpg

.

4. نموذج العمل هو frm_Main

تختار من قائمة "في انتظار التوزيع" (وفي الواقع الاختيار عن طريق userid) ، العدد الذي تريده ، وفي الاسفل بتشوف عدد اختياراتك ، ومجموع الاشخاص اللذين اخترتهم ،

تختار الى اي باص تريد ان تلحقهم ، باختيار رقم الباص ، ثم النقر على الزر الاول (السهم من القائمة الى الباصات) ، وتلقائيا تشوف النتائج ،

واذا اردت ارجاع اي مجموعة ، فالاختيار يكون من قائمة الباص ، وتنقر على الزر بالاسفل (السهم من الباصات الى القائمة) ، وتلقائيا تشوف النتيجة 🙂

1158.Clipboard02.jpg.a20a38e8074a83f2fa84cddd16187f8c.jpg

.

هي لعبة اكثر منها عمل 🙂

1158.gif.330a60e2f61b0fd7a1441987a63017e5.gif

 

جعفر

1158.haj.mdb.zip

  • Like 8
  • Thanks 1
رابط هذا التعليق
شارك

استاذنا الغالي بزيادة @jjafferr ما شاء الله عليك وزادك الله من فضله وعلمه

منذ ساعه, jjafferr said:

هي لعبة اكثر منها عمل

لكنها اكثر من رائعة

تحياتي

  • Like 1
رابط هذا التعليق
شارك

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

رابط هذا التعليق
شارك

27 دقائق مضت, jjafferr said:

واصبح البرنامج مستعد يأخذ اي عدد

ممتاز

فقط واجهة خطأ برقم 2501 عندما يكون خيار تأكيد الاستعلامات الأجرائية مفعل وعند ظهور رسالة التأكيد والنقر على زر لا

image.png.637004cb5e7fcf0aa78385c7105878ee.png

image.png.e50391716b8890659958769e5eec63df.png

image.png.f5dbfc5dbc95faed47dfaa763b12da7e.png

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

وإلغاء الأجراء

شكرا لك استاذ 🌹

  • Like 2
رابط هذا التعليق
شارك

شكرا جزيلا اخوي كاسر 🙂

 

الظاهر بالغلط لعبت في اعدادات الاكسس ، وما كانت تطلع لي رسائل التحذير !!

 

بالاضافة الى حلك ، ولكني افضل إخفاء هذه الرسائل بإستعمال :

            DoCmd.SetWarnings False
                DoCmd.RunSQL mySQL
            DoCmd.SetWarnings True

و

    DoCmd.SetWarnings False
        DoCmd.RunSQL ("Delete * From tbl_Groups")
        DoCmd.OpenQuery "qry_Append_Tsjeel"
        DoCmd.OpenQuery "qry_Append_sub_Tsjeel"
    DoCmd.SetWarnings True

 

وقد تم تحديث الملف المرفق في مشاركتي السابقة ، شكرا لك 🙂

 

جعفر

  • Like 4
رابط هذا التعليق
شارك

يا سلام يابوعبدالله  هذا ما كنت ابحث عنه 
سلمت أناملك 

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

لا أملك تجاهك اخي الا الدعاء .. فنسأل الله الكريم ان يزيدك علما ورفعة ،
وأن يمن عليك بالصحة والعافية وسعة الرزق ، 
وأن يحفظ عليك أهلك وأولادك .
 

  • Like 2
رابط هذا التعليق
شارك

حياك الله اخوي ابوخليل 🙂
 

9 دقائق مضت, ابوخليل said:

يتبقى علي اكمال بعض المتطلبات والخصائص مثل :

1.تخصيص حافلة لفئة محددة  

2. ومثل حصر انواع من الركاب ككبار السن وذوي الاحتياجات الخاصة ،

3. وكذلك عمل اولوية لمن لم يسبق لهم الحج ،

4. واضافة بعض الخدمات كرسائل sms

بسبب انك عامل مجموعات في البرنامج ، والبرنامج يشتغل عليه ، والمسميات اللي تشوفها هي عبارة عن مسميات المجموعات ،

وعليه ، المجموعات 1 و 2 و 3 ، وزعهم يدويا على الباصات (عن طريق البرنامج طبعا)  ، ومو لازم يملؤا الباصات ،

وبعديت اعمل توزيع تلقائي ، فيضيف لك بقية العدد للباص ، ويكمل باقي الباصات 🙂

 

اما رقم 4 ، فما شاء الله تخصصك 🙂

 

جعفر

  • Like 3
رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information