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

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

قام بنشر

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

فى نموذج (Query_dataDor2) بيتم رصد درجات الدور الثانى للطلاب الراسبين فى بعض المواد ذات الدرجة باللون الأحمر بالدور الأول 

محتاج لما أضغط على زر تحديث الدرجة النهائية يعمل الآتى :

1- درجة الدور الأول طالما أكبر من أو تساوى 50 تترحل كما هى :

2- درجة الدور الثانى إذا كانت أصغر من 50 تترحل كما هى ، أما إن كانت أكبر من أو تساوى 50 تتحول لـ 50 

مثال توضيحى : الطالب الأول له دور ثان فى مواد ( الرياضيات - العلوم - اللغة الانجليزية ) 

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

الرياضيات مثلا  89 والعلوم 77 والانجليزى 77 إذًا أكبر من 50 تتحول لـ 50  ( ده النظام المعمول به إنه الطالب لو حصل على أكبر 50 يأخذ درجة الامتحان فقط  اللى هى 50 ) 

طيب لو حصل فى الرياضيات مثلا 36 تتحول لـ 36 ، وهكذا 

أتمنى تكون الفكرة وصلت 

 

cont.accdb

كما فى مثل هذه الصورة

Screenshot_٢٠٢٥-٠٧-٢٠-١٢-٠٦-٠٦-٩٣٩_com.miui.gallery-edit.jpg

قام بنشر

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

بدايةً وقبل الخوض في التجارب أكثر . جرب هذا الاستعلام الجزئي ، هل يفي بالغرض ؟

SELECT 
  data_dor2.name_student,
  data_dor2.National_ID,
  data_dor2.CLASS_CLASS,
  data_dor2.num_Glos,
  data_dor2.n_lgna_dor2,
  data_dor2.sery_dor2,
  data_dor2.Dor_Arb,
  data_dor2.Dor_Math,
  data_dor2.Dor_Drast,
  data_dor2.Dor_Since,
  data_dor2.Dor_Eng,
  data_dor2.Dor_comp,
  data_dor2.Dor_skills,
  data_dor2.Dor_Den,
  data_dor2.TDor_Arb,
  data_dor2.TDor_Math,
  data_dor2.TDor_Drast,
  data_dor2.TDor_Since,
  data_dor2.TDor_Eng,
  data_dor2.TDor_Comp,
  data_dor2.TDor_Skills,
  data_dor2.TDor_Den,
  data_dor2.N_Arb,
  data_dor2.N_Math,
  data_dor2.N_Drast,
  data_dor2.N_Since,
  data_dor2.N_Eng,
  data_dor2.N_Comp,
  data_dor2.N_Skills,
  data_dor2.N_Den,
  IIf(data_dor2.N_Arb=0, IIf(data_dor2.TDor_Arb>=50, data_dor2.TDor_Arb, data_dor2.TDor_Arb), IIf(data_dor2.TDor_Arb<50, data_dor2.TDor_Arb, 50)) AS Final_Arb,
  IIf(data_dor2.N_Math=0, IIf(data_dor2.TDor_Math>=50, data_dor2.TDor_Math, data_dor2.TDor_Math), IIf(data_dor2.TDor_Math<50, data_dor2.TDor_Math, 50)) AS Final_Math,
  IIf(data_dor2.N_Drast=0, IIf(data_dor2.TDor_Drast>=50, data_dor2.TDor_Drast, data_dor2.TDor_Drast), IIf(data_dor2.TDor_Drast<50, data_dor2.TDor_Drast, 50)) AS Final_Drast,
  IIf(data_dor2.N_Since=0, IIf(data_dor2.TDor_Since>=50, data_dor2.TDor_Since, data_dor2.TDor_Since), IIf(data_dor2.TDor_Since<50, data_dor2.TDor_Since, 50)) AS Final_Since,
  IIf(data_dor2.N_Eng=0, IIf(data_dor2.TDor_Eng>=50, data_dor2.TDor_Eng, data_dor2.TDor_Eng), IIf(data_dor2.TDor_Eng<50, data_dor2.TDor_Eng, 50)) AS Final_Eng,
  IIf(data_dor2.N_Comp=0, IIf(data_dor2.TDor_Comp>=50, data_dor2.TDor_Comp, data_dor2.TDor_Comp), IIf(data_dor2.TDor_Comp<50, data_dor2.TDor_Comp, 50)) AS Final_Comp,
  IIf(data_dor2.N_Skills=0, IIf(data_dor2.TDor_Skills>=50, data_dor2.TDor_Skills, data_dor2.TDor_Skills), IIf(data_dor2.TDor_Skills<50, data_dor2.TDor_Skills, 50)) AS Final_Skills,
  IIf(data_dor2.N_Den=0, IIf(data_dor2.TDor_Den>=50, data_dor2.TDor_Den, data_dor2.TDor_Den), IIf(data_dor2.TDor_Den<50, data_dor2.TDor_Den, 50)) AS Final_Den
FROM data_dor2
WHERE data_dor2.name_student Is Not Null;

 

وبناءً عليه نستكمل باقي المطلوب .. 

  • Like 1
قام بنشر
3 دقائق مضت, Barna said:

هل الصورة الموجودة في النموذج بعد التحديث هو المطلوب
 

1.jpg

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

قام بنشر
5 دقائق مضت, Barna said:

هل الصورة الموجودة في النموذج بعد التحديث هو المطلوب
 

1.jpg

سبقتني في الإستكمال :clapping: ، وهي لك

لأني كنت على وشك ارفاق الصورة التالية أيضاً أخي @Barna 😅

 

image.png.1e0ec22e52f284013de54c8275f110d8.png

  • Like 2
قام بنشر
1 دقيقه مضت, Foksh said:

سبقتني في الإستكمال :clapping: ، وهي لك

لأني كنت على وشك ارفاق الصورة التالية أيضاً أخي @Barna 😅

 

image.png.1e0ec22e52f284013de54c8275f110d8.png

هو المطلوب بالضبط

  • Like 1
قام بنشر
1 دقيقه مضت, Foksh said:

لأني كنت على وشك ارفاق الصورة التالية أيضاً أخي

بل نريد الطريقة ربما افضل من طريقتي ونتعلم منها بارك الله فيك

 

قام بنشر

هذا الاستعلام الذي خرجت به كما في الصورة السابقة نتيجته :-

SELECT 
    name_student, 
    National_ID, 
    CLASS_CLASS, 
    num_Glos, 
    n_lgna_dor2, 
    sery_dor2, 
    Dor_Arb,
    Dor_Math,
    Dor_Drast,
    Dor_Since,
    Dor_Eng,
    Dor_comp,
    Dor_skills,
    Dor_Den,
    TDor_Arb,
    TDor_Math,
    TDor_Drast,
    TDor_Since,
    TDor_Eng,
    TDor_Comp,
    TDor_Skills,
    TDor_Den,
    
    IIF(IsNumeric([Dor_Arb]),
        IIF(Val(Nz([Dor_Arb],0))>=50, 
            Val([Dor_Arb]),
            IIF(IsNull([TDor_Arb]) OR Val(Nz([TDor_Arb],-1))=-1,
                0,
                IIF(Val([TDor_Arb])>=50, 50, Val([TDor_Arb]))
            )
        ),
    0) AS N_Arb,
    
    IIF(IsNumeric([Dor_Math]),
        IIF(Val(Nz([Dor_Math],0))>=50, 
            Val([Dor_Math]),
            IIF(IsNull([TDor_Math]) OR Val(Nz([TDor_Math],-1))=-1,
                0,
                IIF(Val([TDor_Math])>=50, 50, Val([TDor_Math]))
            )
        ),
    0) AS N_Math,
    
    IIF(IsNumeric([Dor_Drast]),
        IIF(Val(Nz([Dor_Drast],0))>=50, 
            Val([Dor_Drast]),
            IIF(IsNull([TDor_Drast]) OR Val(Nz([TDor_Drast],-1))=-1,
                0,
                IIF(Val([TDor_Drast])>=50, 50, Val([TDor_Drast]))
            )
        ),
    0) AS N_Drast,
    
    IIF(IsNumeric([Dor_Since]),
        IIF(Val(Nz([Dor_Since],0))>=50, 
            Val([Dor_Since]),
            IIF(IsNull([TDor_Since]) OR Val(Nz([TDor_Since],-1))=-1,
                0,
                IIF(Val([TDor_Since])>=50, 50, Val([TDor_Since]))
            )
        ),
    0) AS N_Since,
    
    IIF(IsNumeric([Dor_Eng]),
        IIF(Val(Nz([Dor_Eng],0))>=50, 
            Val([Dor_Eng]),
            IIF(IsNull([TDor_Eng]) OR Val(Nz([TDor_Eng],-1))=-1,
                0,
                IIF(Val([TDor_Eng])>=50, 50, Val([TDor_Eng]))
            )
        ),
    0) AS N_Eng,
    
    IIF(IsNumeric([Dor_comp]),
        IIF(Val(Nz([Dor_comp],0))>=50, 
            Val([Dor_comp]),
            IIF(IsNull([TDor_Comp]) OR Val(Nz([TDor_Comp],-1))=-1,
                0,
                IIF(Val([TDor_Comp])>=50, 50, Val([TDor_Comp]))
            )
        ),
    0) AS N_Comp,
    
    IIF(IsNumeric([Dor_skills]),
        IIF(Val(Nz([Dor_skills],0))>=50, 
            Val([Dor_skills]),
            IIF(IsNull([TDor_Skills]) OR Val(Nz([TDor_Skills],-1))=-1,
                0,
                IIF(Val([TDor_Skills])>=50, 50, Val([TDor_Skills]))
            )
        ),
    0) AS N_Skills,
    
    IIF(IsNumeric([Dor_Den]),
        IIF(Val(Nz([Dor_Den],0))>=50, 
            Val([Dor_Den]),
            IIF(IsNull([TDor_Den]) OR Val(Nz([TDor_Den],-1))=-1,
                0,
                IIF(Val([TDor_Den])>=50, 50, Val([TDor_Den]))
            )
        ),
    0) AS N_Den
    
FROM data_dor2
WHERE (((data_dor2.[name_student])<>"IsNull"));

 

  • Thanks 1
قام بنشر
8 دقائق مضت, The best said:

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

استخدم هذه الشيفرة في زر التحديث مع اللاحقة له   ......

Private Sub أمر309_Click()
    Dim rst As DAO.Recordset
    Dim db As DAO.Database
    Dim ctl As Control
    Dim controlsList As New Collection
    Dim dorAwalField As String, dorThanField As String, finalField As String
    Dim dorAwalVal As Variant, dorThanVal As Variant, finalVal As Variant
    Dim i As Integer
    Dim excludedNames As Variant

    Set db = CurrentDb()
    Set rst = Me.RecordsetClone ' نسخة من مصدر بيانات النموذج

    ' أسماء الحقول التي نريد استثناؤها (اسم الطالب، رقم الجلوس)
    excludedNames = Array("name_student", "num_Glos")
    
    ' جمع الحقول الثلاثية فقط حسب الترتيب
    For Each ctl In Me.Controls
        If ctl.ControlType = acTextBox Then
            If IsExcluded(ctl.Name, excludedNames) = False Then
                If ctl.ControlSource <> "" Then ' مرتبط بحقل فعلي
                    controlsList.Add ctl.ControlSource
                End If
            End If
        End If
    Next ctl

    ' المرور على كل سجل في النموذج
    If Not rst.EOF Then rst.MoveFirst

    Do While Not rst.EOF
        rst.Edit
        For i = 1 To controlsList.Count Step 3
            If i + 2 <= controlsList.Count Then
                dorAwalField = controlsList(i)
                dorThanField = controlsList(i + 1)
                finalField = controlsList(i + 2)

                dorAwalVal = Nz(rst(dorAwalField), 0)
                dorThanVal = Nz(rst(dorThanField), -1)

                If dorThanVal <> -1 Then
                    If dorThanVal >= 50 Then
                        finalVal = 50
                    Else
                        finalVal = dorThanVal
                    End If
                Else
                    finalVal = dorAwalVal
                End If

                rst(finalField) = finalVal
            End If
        Next i
        rst.Update
        rst.MoveNext
    Loop

    rst.Close
    Set rst = Nothing
    Set db = Nothing

    Me.Requery ' لتحديث العرض في النموذج
    MsgBox "تم تحديث جميع الدرجات النهائية بنجاح.", vbInformation
End Sub
Private Function IsExcluded(fieldName As String, excludedList As Variant) As Boolean
    Dim item As Variant
    For Each item In excludedList
        If LCase(fieldName) = LCase(item) Then
            IsExcluded = True
            Exit Function
        End If
    Next item
    IsExcluded = False
End Function

وهذا ملفك بعد التعديل ...............

cont.accdb

  • Like 1
قام بنشر

أحسنتما وبارك الله لكما وجعله فى ميزان حسناتكما ...

# عندى طلب آخر هل من الممكن جعل حقل الدور الثانى اللى سيتم رصده فقط مُمَكَّن والباقى غير مُمَكَّن 

قام بنشر
6 دقائق مضت, The best said:

عندى طلب آخر هل من الممكن جعل حقل الدور الثانى اللى سيتم رصده فقط مُمَكَّن والباقى غير مُمَكَّن 

تفضل .................

 

1.jpg

cont.accdb

قام بنشر
6 دقائق مضت, Barna said:

تفضل .................

 

1.jpg

cont.accdb 756 kB · 0 downloads

بعد تجريب الملف لاحظت ما يلى ومعلم عليه 

عند رصد (1-) للطالب وده معناه أنه غائب لاحظت بيكتب درجةالدور الاول لا انا عاوزه يكتب (1-)

لان الطالب هنا معناه غائب فى الدور الثانى .

والباقى تمام

قام بنشر
4 ساعات مضت, The best said:

عند رصد (1-) للطالب وده معناه أنه غائب لاحظت بيكتب درجةالدور الاول لا انا عاوزه يكتب (1-)

لان الطالب هنا معناه غائب فى الدور الثانى .

هذه هي الصورة الناتجة ماذا تريد ؟؟؟؟
هل تريد مكان الدرجة النهائية يكتب 0 أم ماذا وضح بالشرح الكافي
 

1.jpg

قام بنشر
14 دقائق مضت, Barna said:

هذه هي الصورة الناتجة ماذا تريد ؟؟؟؟
هل تريد مكان الدرجة النهائية يكتب 0 أم ماذا وضح بالشرح الكافي
 

1.jpg

لو (1- ) يكتبها (1-) وليس درجة الدور الأول

لاحظ الصورة المرفقة

IMG_٢٠٢٥٠٧٢٠_١٨٣٣٤٣.jpg

قام بنشر
5 دقائق مضت, The best said:

لو (1- ) يكتبها (1-) وليس درجة الدور الأول

لاحظ الصورة المرفقة

هل هذه الحالة موجودة من ضمن السجلات في المرفق السابق ؟؟؟؟؟

 

قام بنشر
5 دقائق مضت, Barna said:

هل هذه الحالة موجودة من ضمن السجلات في المرفق السابق ؟؟؟؟؟

 

أنا نسيت أضعها فى المطلوب فى الأول 

لكن الباقى تمام 

 فتصبح الدرجة النهائية

 

لو حصل الطالب فى درجة الدور الثانى على أكبر من 50 =50 

لو أصغر من 50 =الدرجة التى حصل عليها نفسها .

ودول تمام فى الكود

يبقى الشرط ده وأنا نسيته 

لو كانت (1-) = 1- 

لأنه دى بتترصد للطالب الغائب .

هل محتاج حضرتك توضيح ؟ 

قام بنشر
1 دقيقه مضت, The best said:

بقى الشرط ده وأنا نسيته 

لو كانت (1-) = 1- 

لأنه دى بتترصد للطالب الغائب .

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

Private Sub أمر309_Click()
    Dim rst As DAO.Recordset
    Dim db As DAO.Database
    Dim ctl As Control
    Dim controlsList As New Collection
    Dim dorAwalField As String, dorThanField As String, finalField As String
    Dim dorAwalVal As Variant, dorThanVal As Variant, finalVal As Variant
    Dim i As Integer
    Dim excludedNames As Variant

    Set db = CurrentDb()
    Set rst = Me.RecordsetClone ' نسخة من مصدر بيانات النموذج

    ' أسماء الحقول التي نريد استثناؤها (اسم الطالب، رقم الجلوس)
    excludedNames = Array("num_Glos", "name_student")

    ' جمع أسماء الحقول المرتبطة بالدرجات، حسب ترتيب مربعات النص في النموذج
    For Each ctl In Me.Controls
        If ctl.ControlType = acTextBox Then
            If IsExcluded(ctl.Name, excludedNames) = False Then
                If ctl.ControlSource <> "" Then
                    controlsList.Add ctl.ControlSource
                End If
            End If
        End If
    Next ctl

    ' المرور على جميع السجلات وتحديث الدرجات
    If Not rst.EOF Then rst.MoveFirst

    Do While Not rst.EOF
        rst.Edit
        For i = 1 To controlsList.Count Step 3
            If i + 2 <= controlsList.Count Then
                dorAwalField = controlsList(i)
                dorThanField = controlsList(i + 1)
                finalField = controlsList(i + 2)

                dorAwalVal = Nz(rst(dorAwalField), 0)
                dorThanVal = Nz(rst(dorThanField), -1)

                If dorThanVal = -1 Then
                    finalVal = -1
                ElseIf dorThanVal >= 50 Then
                    finalVal = 50
                Else
                    finalVal = dorThanVal
                End If

                rst(finalField) = finalVal
            End If
        Next i
        rst.Update
        rst.MoveNext
    Loop

    rst.Close
    Set rst = Nothing
    Set db = Nothing

    Me.Requery ' لتحديث النموذج بعد التعديل
    MsgBox "تم تحديث جميع الدرجات النهائية بنجاح.", vbInformation
End Sub

 

قام بنشر

مشاركة مع الأستاذ @Barna ، من خلال استعلام التحديث التالي :smile: :-

UPDATE data_dor2
SET 
    N_Arb = IIF(Val(Nz([Dor_Arb], 0)) = -1, -1,
        IIF(IsNumeric([Dor_Arb]),
            IIF(Val(Nz([Dor_Arb], 0)) >= 50, 
                Val([Dor_Arb]),
                IIF(IsNull([TDor_Arb]) OR Val(Nz([TDor_Arb], -1)) = -1,
                    0,
                    IIF(Val([TDor_Arb]) >= 50, 50, Val([TDor_Arb]))
                )
            ),
        0)
    ),
    
    N_Math = IIF(Val(Nz([Dor_Math], 0)) = -1, -1,
        IIF(IsNumeric([Dor_Math]),
            IIF(Val(Nz([Dor_Math], 0)) >= 50, 
                Val([Dor_Math]),
                IIF(IsNull([TDor_Math]) OR Val(Nz([TDor_Math], -1)) = -1,
                    0,
                    IIF(Val([TDor_Math]) >= 50, 50, Val([TDor_Math]))
                )
            ),
        0)
    ),
    
    N_Drast = IIF(Val(Nz([Dor_Drast], 0)) = -1, -1,
        IIF(IsNumeric([Dor_Drast]),
            IIF(Val(Nz([Dor_Drast], 0)) >= 50, 
                Val([Dor_Drast]),
                IIF(IsNull([TDor_Drast]) OR Val(Nz([TDor_Drast], -1)) = -1,
                    0,
                    IIF(Val([TDor_Drast]) >= 50, 50, Val([TDor_Drast]))
                )
            ),
        0)
    ),
    
    N_Since = IIF(Val(Nz([Dor_Since], 0)) = -1, -1,
        IIF(IsNumeric([Dor_Since]),
            IIF(Val(Nz([Dor_Since], 0)) >= 50, 
                Val([Dor_Since]),
                IIF(IsNull([TDor_Since]) OR Val(Nz([TDor_Since], -1)) = -1,
                    0,
                    IIF(Val([TDor_Since]) >= 50, 50, Val([TDor_Since]))
                )
            ),
        0)
    ),
    
    N_Eng = IIF(Val(Nz([Dor_Eng], 0)) = -1, -1,
        IIF(IsNumeric([Dor_Eng]),
            IIF(Val(Nz([Dor_Eng], 0)) >= 50, 
                Val([Dor_Eng]),
                IIF(IsNull([TDor_Eng]) OR Val(Nz([TDor_Eng], -1)) = -1,
                    0,
                    IIF(Val([TDor_Eng]) >= 50, 50, Val([TDor_Eng]))
                )
            ),
        0)
    ),
    
    N_Comp = IIF(Val(Nz([Dor_comp], 0)) = -1, -1,
        IIF(IsNumeric([Dor_comp]),
            IIF(Val(Nz([Dor_comp], 0)) >= 50, 
                Val([Dor_comp]),
                IIF(IsNull([TDor_Comp]) OR Val(Nz([TDor_Comp], -1)) = -1,
                    0,
                    IIF(Val([TDor_Comp]) >= 50, 50, Val([TDor_Comp]))
                )
            ),
        0)
    ),
    
    N_Skills = IIF(Val(Nz([Dor_skills], 0)) = -1, -1,
        IIF(IsNumeric([Dor_skills]),
            IIF(Val(Nz([Dor_skills], 0)) >= 50, 
                Val([Dor_skills]),
                IIF(IsNull([TDor_Skills]) OR Val(Nz([TDor_Skills], -1)) = -1,
                    0,
                    IIF(Val([TDor_Skills]) >= 50, 50, Val([TDor_Skills]))
                )
            ),
        0)
    ),
    
    N_Den = IIF(Val(Nz([Dor_Den], 0)) = -1, -1,
        IIF(IsNumeric([Dor_Den]),
            IIF(Val(Nz([Dor_Den], 0)) >= 50, 
                Val([Dor_Den]),
                IIF(IsNull([TDor_Den]) OR Val(Nz([TDor_Den], -1)) = -1,
                    0,
                    IIF(Val([TDor_Den]) >= 50, 50, Val([TDor_Den]))
                )
            ),
        0)
    )
WHERE name_student <> "IsNull";

 

  • Like 1
قام بنشر
16 ساعات مضت, Barna said:

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

Private Sub أمر309_Click()
    Dim rst As DAO.Recordset
    Dim db As DAO.Database
    Dim ctl As Control
    Dim controlsList As New Collection
    Dim dorAwalField As String, dorThanField As String, finalField As String
    Dim dorAwalVal As Variant, dorThanVal As Variant, finalVal As Variant
    Dim i As Integer
    Dim excludedNames As Variant

    Set db = CurrentDb()
    Set rst = Me.RecordsetClone ' نسخة من مصدر بيانات النموذج

    ' أسماء الحقول التي نريد استثناؤها (اسم الطالب، رقم الجلوس)
    excludedNames = Array("num_Glos", "name_student")

    ' جمع أسماء الحقول المرتبطة بالدرجات، حسب ترتيب مربعات النص في النموذج
    For Each ctl In Me.Controls
        If ctl.ControlType = acTextBox Then
            If IsExcluded(ctl.Name, excludedNames) = False Then
                If ctl.ControlSource <> "" Then
                    controlsList.Add ctl.ControlSource
                End If
            End If
        End If
    Next ctl

    ' المرور على جميع السجلات وتحديث الدرجات
    If Not rst.EOF Then rst.MoveFirst

    Do While Not rst.EOF
        rst.Edit
        For i = 1 To controlsList.Count Step 3
            If i + 2 <= controlsList.Count Then
                dorAwalField = controlsList(i)
                dorThanField = controlsList(i + 1)
                finalField = controlsList(i + 2)

                dorAwalVal = Nz(rst(dorAwalField), 0)
                dorThanVal = Nz(rst(dorThanField), -1)

                If dorThanVal = -1 Then
                    finalVal = -1
                ElseIf dorThanVal >= 50 Then
                    finalVal = 50
                Else
                    finalVal = dorThanVal
                End If

                rst(finalField) = finalVal
            End If
        Next i
        rst.Update
        rst.MoveNext
    Loop

    rst.Close
    Set rst = Nothing
    Set db = Nothing

    Me.Requery ' لتحديث النموذج بعد التعديل
    MsgBox "تم تحديث جميع الدرجات النهائية بنجاح.", vbInformation
End Sub

 

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

لكنها نسفت ما عملناه 

المفروض درجة الدور الثانى فقط اللى لو كانت (1- ) تبقى ( 1- )

لكن درجة الدور الاول الناجح فيها تنتقل كما هى أرجع وأقول غلطتى من الأول : فكان المفروض أقول كده :

1- درجة الدور الأول طالما أكبر من أو تساوى 50 تترحل كما هى :

2- درجة الدور الثانى إذا كانت أصغر من 50 تترحل كما هى ، أما إن كانت أكبر من أو تساوى 50 تتحول لـ 50 

3- درجة الدور الثانى إذا كانت تساوى 1- تترحل كما هى الى 1-

لقطة الشاشة 2025-07-21 161800.png

قام بنشر
17 ساعات مضت, Foksh said:

مشاركة مع الأستاذ @Barna ، من خلال استعلام التحديث التالي :smile: :-

UPDATE data_dor2
SET 
    N_Arb = IIF(Val(Nz([Dor_Arb], 0)) = -1, -1,
        IIF(IsNumeric([Dor_Arb]),
            IIF(Val(Nz([Dor_Arb], 0)) >= 50, 
                Val([Dor_Arb]),
                IIF(IsNull([TDor_Arb]) OR Val(Nz([TDor_Arb], -1)) = -1,
                    0,
                    IIF(Val([TDor_Arb]) >= 50, 50, Val([TDor_Arb]))
                )
            ),
        0)
    ),
    
    N_Math = IIF(Val(Nz([Dor_Math], 0)) = -1, -1,
        IIF(IsNumeric([Dor_Math]),
            IIF(Val(Nz([Dor_Math], 0)) >= 50, 
                Val([Dor_Math]),
                IIF(IsNull([TDor_Math]) OR Val(Nz([TDor_Math], -1)) = -1,
                    0,
                    IIF(Val([TDor_Math]) >= 50, 50, Val([TDor_Math]))
                )
            ),
        0)
    ),
    
    N_Drast = IIF(Val(Nz([Dor_Drast], 0)) = -1, -1,
        IIF(IsNumeric([Dor_Drast]),
            IIF(Val(Nz([Dor_Drast], 0)) >= 50, 
                Val([Dor_Drast]),
                IIF(IsNull([TDor_Drast]) OR Val(Nz([TDor_Drast], -1)) = -1,
                    0,
                    IIF(Val([TDor_Drast]) >= 50, 50, Val([TDor_Drast]))
                )
            ),
        0)
    ),
    
    N_Since = IIF(Val(Nz([Dor_Since], 0)) = -1, -1,
        IIF(IsNumeric([Dor_Since]),
            IIF(Val(Nz([Dor_Since], 0)) >= 50, 
                Val([Dor_Since]),
                IIF(IsNull([TDor_Since]) OR Val(Nz([TDor_Since], -1)) = -1,
                    0,
                    IIF(Val([TDor_Since]) >= 50, 50, Val([TDor_Since]))
                )
            ),
        0)
    ),
    
    N_Eng = IIF(Val(Nz([Dor_Eng], 0)) = -1, -1,
        IIF(IsNumeric([Dor_Eng]),
            IIF(Val(Nz([Dor_Eng], 0)) >= 50, 
                Val([Dor_Eng]),
                IIF(IsNull([TDor_Eng]) OR Val(Nz([TDor_Eng], -1)) = -1,
                    0,
                    IIF(Val([TDor_Eng]) >= 50, 50, Val([TDor_Eng]))
                )
            ),
        0)
    ),
    
    N_Comp = IIF(Val(Nz([Dor_comp], 0)) = -1, -1,
        IIF(IsNumeric([Dor_comp]),
            IIF(Val(Nz([Dor_comp], 0)) >= 50, 
                Val([Dor_comp]),
                IIF(IsNull([TDor_Comp]) OR Val(Nz([TDor_Comp], -1)) = -1,
                    0,
                    IIF(Val([TDor_Comp]) >= 50, 50, Val([TDor_Comp]))
                )
            ),
        0)
    ),
    
    N_Skills = IIF(Val(Nz([Dor_skills], 0)) = -1, -1,
        IIF(IsNumeric([Dor_skills]),
            IIF(Val(Nz([Dor_skills], 0)) >= 50, 
                Val([Dor_skills]),
                IIF(IsNull([TDor_Skills]) OR Val(Nz([TDor_Skills], -1)) = -1,
                    0,
                    IIF(Val([TDor_Skills]) >= 50, 50, Val([TDor_Skills]))
                )
            ),
        0)
    ),
    
    N_Den = IIF(Val(Nz([Dor_Den], 0)) = -1, -1,
        IIF(IsNumeric([Dor_Den]),
            IIF(Val(Nz([Dor_Den], 0)) >= 50, 
                Val([Dor_Den]),
                IIF(IsNull([TDor_Den]) OR Val(Nz([TDor_Den], -1)) = -1,
                    0,
                    IIF(Val([TDor_Den]) >= 50, 50, Val([TDor_Den]))
                )
            ),
        0)
    )
WHERE name_student <> "IsNull";

 

أين أضعه ؟

  • تمت الإجابة
قام بنشر
12 دقائق مضت, The best said:

أين أضعه ؟

أخي الكريم ، اذا كنت تريد التنفيذ من خلال الزر ويكون كما في فكرة الأستاذ @Barna ، فتفضل هذا الحدث جربه ، وأخبرنا بالنتيجة :-

Public Sub UpdateFinalGrades()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim fld As DAO.Field
    
    Dim subjects As Variant
    subjects = Array("Arb", "Math", "Drast", "Since", "Eng", "Comp", "Skills", "Den")
    
    On Error GoTo ErrorHandler
    
    Set db = CurrentDb()
    
    strSQL = "SELECT * FROM data_dor2 WHERE name_student <> 'IsNull'"
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)
    
    If rs.RecordCount = 0 Then
        MsgBox "لا توجد سجلات ليتم تحديثها", vbInformation + vbMsgBoxRight, ""
        Exit Sub
    End If
    
    Do Until rs.EOF
        For Each subj In subjects
            Dim dor1 As String, dor2 As String, final As String
            dor1 = "Dor_" & subj
            dor2 = "TDor_" & subj
            final = "N_" & subj
            
            If Nz(rs.Fields(dor1).Value, 0) = -1 Or Nz(rs.Fields(dor2).Value, 0) = -1 Then
                rs.Edit
                rs.Fields(final).Value = -1
                rs.Update
            Else
                Dim grade As Double
                If IsNumeric(rs.Fields(dor1).Value) Then
                    If rs.Fields(dor1).Value >= 50 Then
                        grade = rs.Fields(dor1).Value
                    Else
                        If IsNull(rs.Fields(dor2).Value) Then
                            grade = 0
                        ElseIf rs.Fields(dor2).Value >= 50 Then
                            grade = 50
                        Else
                            grade = rs.Fields(dor2).Value
                        End If
                    End If
                    
                    rs.Edit
                    rs.Fields(final).Value = grade
                    rs.Update
                End If
            End If
        Next subj
        rs.MoveNext
    Loop
    DoCmd.Requery
    MsgBox "تم تحديث جميع الدرجات بنجاح", vbInformation + vbMsgBoxRight, ""
    Exit Sub
    
ErrorHandler:
    MsgBox " : حدث خطأ" & Err.Description, vbCritical + vbMsgBoxRight, ""
    rs.CancelUpdate
    If Not rs Is Nothing Then rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

 

تستطيع استخدامه في مديول واستدعائه من خلال الزر بإسم الدالة فقط :-

Private Sub أمر309_Click()
    UpdateFinalGrades
End Sub

 

أما استعلام التحديث السابق فتجاهله ، وجرب الطريقة الحالية .

الملف المرفق قبل لا أنسى 😅 

 

cont0.zip

قام بنشر

هل التصور صحيح في الصورة .................

Private Sub أمر309_Click()
    Dim rst As DAO.Recordset
    Dim db As DAO.Database
    Dim ctl As Control
    Dim controlsList As New Collection
    Dim dorAwalField As String, dorThanField As String, finalField As String
    Dim dorAwalVal As Variant, dorThanVal As Variant, finalVal As Variant
    Dim i As Integer
    Dim excludedNames As Variant

    Set db = CurrentDb()
    Set rst = Me.RecordsetClone ' نسخة من مصدر بيانات النموذج

    ' أسماء الحقول التي نريد استثناؤها (اسم الطالب، رقم الجلوس)
    excludedNames = Array("num_Glos", "name_student")

    ' جمع أسماء الحقول المرتبطة بالدرجات، حسب ترتيب مربعات النص في النموذج
    For Each ctl In Me.Controls
        If ctl.ControlType = acTextBox Then
            If IsExcluded(ctl.Name, excludedNames) = False Then
                If ctl.ControlSource <> "" Then
                    controlsList.Add ctl.ControlSource
                End If
            End If
        End If
    Next ctl

    ' المرور على جميع السجلات وتحديث الدرجات
    If Not rst.EOF Then rst.MoveFirst

    Do While Not rst.EOF
        rst.Edit
        For i = 1 To controlsList.Count Step 3
            If i + 2 <= controlsList.Count Then
                dorAwalField = controlsList(i)
                dorThanField = controlsList(i + 1)
                finalField = controlsList(i + 2)

                dorAwalVal = Nz(rst(dorAwalField), 0)
                dorThanVal = rst(dorThanField) ' بدون Nz حتى نتحقق من Null

                ' تنفيذ القاعدة:
                If IsNull(dorThanVal) Then
                    finalVal = dorAwalVal
                ElseIf dorThanVal = -1 Then
                    finalVal = -1
                ElseIf dorThanVal >= 50 Then
                    finalVal = 50
                Else
                    finalVal = dorThanVal
                End If

                rst(finalField) = finalVal
            End If
        Next i
        rst.Update
        rst.MoveNext
    Loop

    rst.Close
    Set rst = Nothing
    Set db = Nothing

    Me.Requery ' لتحديث النموذج بعد التعديل
    MsgBox "تم تحديث جميع الدرجات النهائية بنجاح.", vbInformation
End Sub

 

1.jpg

قام بنشر

أحسنتما وجزاكما الله خيرا وزادكما من علمه وفضله

  • Thanks 1

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