منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

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

الكود الأول  للفورم 1: لحفظ درجات المصفوفة (on)
مع جمعها مع المصفوفة (to) التي قيمتها (0)
ثم اظهار الناتج في مصفوفة (tr)

الكود الثاني للفورم 2: لحفظ درجات المصفوفة (to) مع تحديث الجمع المصفوفة (tr)
كود :
*أولا: فورم رصد درجات الأعمال*
`
Private Sub Save_Grade()
   Try
       If DataGridView1.Rows.Count = 0 OrElse (DataGridView1.Rows.Count = 1 AndAlso DataGridView1.Rows(0).IsNewRow) Then
           MessageBox.Show(" عفواً ، لا توجـد بيانــات للحفظ", "تنبيــه", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
           Exit Sub
       End If

       Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; " & "Data Source=" & Application.StartupPath & "\DataBase\Data_Base.accdb")
       If DataGridView1.Rows.Count = 0 Then Exit Sub
       con.Open()

       For i As Integer = 0 To DataGridView1.Rows.Count - 2
           Dim IDStudent As Integer = Val(DataGridView1.Rows(i).Cells(0).Value)
           Dim IDClas As Integer = CInt(listClas.SelectedIndices(0) + 1)
           Dim ClassroomID As Integer = CInt(Combroom.SelectedIndex + 1)
           Dim IDSemester As Integer = Val(CombSemester.Text)
           Dim ONValue As Integer = Val(DataGridView1.Rows(i).Cells(5).Value)
           DataGridView1.Rows(i).Cells(7).Value = ONValue

           Dim query As String = "SELECT * FROM TBL_Final1 WHERE IDStudent = ? AND IDClas = ? AND ClassroomID = ? AND IDSemester = ?"
           Dim command As New OleDbCommand(query, con)
           command.Parameters.AddWithValue("?", IDStudent)
           command.Parameters.AddWithValue("?", IDClas)
           command.Parameters.AddWithValue("?", ClassroomID)
           command.Parameters.AddWithValue("?", IDSemester)
           Dim reader As OleDbDataReader = command.ExecuteReader()

           If reader.HasRows Then
               reader.Close()
               query = "UPDATE TBL_Final1 SET ON" & CombCourses.SelectedIndex + 1 & " = ? WHERE IDStudent = ? AND IDClas = ? AND ClassroomID = ? AND IDSemester = ?"
               command = New OleDbCommand(query, con)
               command.Parameters.AddWithValue("?", ONValue)
               command.Parameters.AddWithValue("?", IDStudent)
               command.Parameters.AddWithValue("?", IDClas)
               command.Parameters.AddWithValue("?", ClassroomID)
               command.Parameters.AddWithValue("?", IDSemester)
               command.ExecuteNonQuery()
           Else
               reader.Close()
               query = "INSERT INTO TBL_Final1 (IDStudent, IDClas, ClassroomID, IDSemester, ON" & CombCourses.SelectedIndex + 1 & ") VALUES (?, ?, ?, ?, ?)"
               command = New OleDbCommand(query, con)
               command.Parameters.AddWithValue("?", IDStudent)
               command.Parameters.AddWithValue("?", IDClas)
               command.Parameters.AddWithValue("?", ClassroomID)
               command.Parameters.AddWithValue("?", IDSemester)
               command.Parameters.AddWithValue("?", ONValue)
               command.ExecuteNonQuery()
           End If
       Next
       con.Close()
       MsgBox("تم رصد درجــات الصــف : " & " " & listClas.Text & Chr(13) & " لمــادة : " & CombCourses.Text & " * بنجــاح " & "", MsgBoxStyle.Information, "الإجـــراء")
   Catch ex As Exception
       MsgBox(Err.Description, MsgBoxStyle.Information)
   Finally
   End Try
End Sub

-----------------------------------------```

*ثانيا: فورم رصد درجات الامتحان*

Private Sub Save_Grade()
   Try
       If DataGridView1.Rows.Count = 0 OrElse (DataGridView1.Rows.Count = 1 AndAlso DataGridView1.Rows(0).IsNewRow) Then
           MessageBox.Show(" عفواً ، لا توجـد بيانــات للحفظ", "تنبيــه", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
           Exit Sub
       End If

       Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; " & "Data Source=" & Application.StartupPath & "\DataBase\Data_Base.accdb")
       If DataGridView1.Rows.Count = 0 Then Exit Sub
       con.Open()

       For i As Integer = 0 To DataGridView1.Rows.Count - 2
           Dim IDStudent As Integer = Val(DataGridView1.Rows(i).Cells(0).Value)
           Dim IDClas As Integer = CInt(listClas.SelectedIndices(0) + 1)
```
تفضل الكودين بعد الترتيب الكامل، وتم تضمين منطق جمع الدرجات (ON + TO = TR) بطريقة صحيحة وآمنة.

أولاً: فورم رصد درجات الأعمال (ON)

PHP كود :
Private Sub Save_Grade()
 
   Try
        If DataGridView1
.Rows.Count 0 OrElse (DataGridView1.Rows.Count 1 AndAlso DataGridView1.Rows(0).IsNewRowThen
            MessageBox
.Show(" عفواً ، لا توجـد بيانــات للحفظ""تنبيــه"MessageBoxButtons.OKMessageBoxIcon.ErrorMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)
 
           Exit Sub
        End 
If

 
       Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" Application.StartupPath "\DataBase\Data_Base.accdb")
 
       con.Open()

 
       For i As Integer 0 To DataGridView1.Rows.Count 2
            Dim IDStudent 
As Integer Val(DataGridView1.Rows(i).Cells(0).Value)
 
           Dim IDClas As Integer listClas.SelectedIndices(0) + 1
            Dim ClassroomID 
As Integer Combroom.SelectedIndex 1
            Dim IDSemester 
As Integer Val(CombSemester.Text)
 
           Dim ONValue As Integer Val(DataGridView1.Rows(i).Cells(5).Value)
 
           DataGridView1.Rows(i).Cells(7).Value ONValue

            Dim courseIndex 
As Integer CombCourses.SelectedIndex 1

            Dim query 
As String "SELECT * FROM TBL_Final1 WHERE IDStudent=? AND IDClas=? AND ClassroomID=? AND IDSemester=?"
 
           Dim command As New OleDbCommand(querycon)
 
           command.Parameters.AddWithValue("?"IDStudent)
 
           command.Parameters.AddWithValue("?"IDClas)
 
           command.Parameters.AddWithValue("?"ClassroomID)
 
           command.Parameters.AddWithValue("?"IDSemester)
 
           Dim reader As OleDbDataReader command.ExecuteReader()

 
           If reader.HasRows Then
                reader
.Close()
 
               query "UPDATE TBL_Final1 SET ON" courseIndex "=? WHERE IDStudent=? AND IDClas=? AND ClassroomID=? AND IDSemester=?"
 
               command = New OleDbCommand(querycon)
 
               command.Parameters.AddWithValue("?"ONValue)
 
               command.Parameters.AddWithValue("?"IDStudent)
 
               command.Parameters.AddWithValue("?"IDClas)
 
               command.Parameters.AddWithValue("?"ClassroomID)
 
               command.Parameters.AddWithValue("?"IDSemester)
 
               command.ExecuteNonQuery()
 
           Else
                reader
.Close()
 
               query "INSERT INTO TBL_Final1 (IDStudent, IDClas, ClassroomID, IDSemester, ON" courseIndex ") VALUES (?, ?, ?, ?, ?)"
 
               command = New OleDbCommand(querycon)
 
               command.Parameters.AddWithValue("?"IDStudent)
 
               command.Parameters.AddWithValue("?"IDClas)
 
               command.Parameters.AddWithValue("?"ClassroomID)
 
               command.Parameters.AddWithValue("?"IDSemester)
 
               command.Parameters.AddWithValue("?"ONValue)
 
               command.ExecuteNonQuery()
 
           End If

 
           ' قراءة TO
            Dim TOValue As Integer = 0
            Dim cmdTO As New OleDbCommand("SELECT TO" & courseIndex & " FROM TBL_Final1 WHERE IDStudent=? AND IDClas=? AND ClassroomID=? AND IDSemester=?", con)
            cmdTO.Parameters.AddWithValue("?", IDStudent)
            cmdTO.Parameters.AddWithValue("?", IDClas)
            cmdTO.Parameters.AddWithValue("?", ClassroomID)
            cmdTO.Parameters.AddWithValue("?", IDSemester)
            Dim resultTO = cmdTO.ExecuteScalar()
            If Not IsDBNull(resultTO) Then TOValue = CInt(resultTO)

            ' 
تحديث TR
            Dim TRValue 
As Integer ONValue TOValue
            Dim cmdTR 
As New OleDbCommand("UPDATE TBL_Final1 SET TR" courseIndex "=? WHERE IDStudent=? AND IDClas=? AND ClassroomID=? AND IDSemester=?"con)
 
           cmdTR.Parameters.AddWithValue("?"TRValue)
 
           cmdTR.Parameters.AddWithValue("?"IDStudent)
 
           cmdTR.Parameters.AddWithValue("?"IDClas)
 
           cmdTR.Parameters.AddWithValue("?"ClassroomID)
 
           cmdTR.Parameters.AddWithValue("?"IDSemester)
 
           cmdTR.ExecuteNonQuery()
 
       Next

        con
.Close()
 
       MsgBox("تم رصد درجــات الصــف: " listClas.Text vbCrLf "لمــادة: " CombCourses.Text " بنجــاح"MsgBoxStyle.Information"الإجـــراء")

 
   Catch ex As Exception
        MsgBox
("خطأ: " ex.MessageMsgBoxStyle.Critical)
 
   End Try
End Sub 


ثانياً: فورم رصد درجات الامتحان (TO)

PHP كود :
Private Sub Save_Grade()
 
   Try
        If DataGridView1
.Rows.Count 0 OrElse (DataGridView1.Rows.Count 1 AndAlso DataGridView1.Rows(0).IsNewRowThen
            MessageBox
.Show(" عفواً ، لا توجـد بيانــات للحفظ""تنبيــه"MessageBoxButtons.OKMessageBoxIcon.ErrorMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)
 
           Exit Sub
        End 
If

 
       Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" Application.StartupPath "\DataBase\Data_Base.accdb")
 
       con.Open()

 
       For i As Integer 0 To DataGridView1.Rows.Count 2
            Dim IDStudent 
As Integer Val(DataGridView1.Rows(i).Cells(0).Value)
 
           Dim IDClas As Integer listClas.SelectedIndices(0) + 1
            Dim ClassroomID 
As Integer Combroom.SelectedIndex 1
            Dim IDSemester 
As Integer Val(CombSemester.Text)
 
           Dim TOValue As Integer Val(DataGridView1.Rows(i).Cells(5).Value)
 
           DataGridView1.Rows(i).Cells(7).Value TOValue

            Dim courseIndex 
As Integer CombCourses.SelectedIndex 1

            Dim query 
As String "SELECT * FROM TBL_Final1 WHERE IDStudent=? AND IDClas=? AND ClassroomID=? AND IDSemester=?"
 
           Dim command As New OleDbCommand(querycon)
 
           command.Parameters.AddWithValue("?"IDStudent)
 
           command.Parameters.AddWithValue("?"IDClas)
 
           command.Parameters.AddWithValue("?"ClassroomID)
 
           command.Parameters.AddWithValue("?"IDSemester)
 
           Dim reader As OleDbDataReader command.ExecuteReader()

 
           If reader.HasRows Then
                reader
.Close()
 
               query "UPDATE TBL_Final1 SET TO" courseIndex "=? WHERE IDStudent=? AND IDClas=? AND ClassroomID=? AND IDSemester=?"
 
               command = New OleDbCommand(querycon)
 
               command.Parameters.AddWithValue("?"TOValue)
 
               command.Parameters.AddWithValue("?"IDStudent)
 
               command.Parameters.AddWithValue("?"IDClas)
 
               command.Parameters.AddWithValue("?"ClassroomID)
 
               command.Parameters.AddWithValue("?"IDSemester)
 
               command.ExecuteNonQuery()
 
           Else
                reader
.Close()
 
               query "INSERT INTO TBL_Final1 (IDStudent, IDClas, ClassroomID, IDSemester, TO" courseIndex ") VALUES (?, ?, ?, ?, ?)"
 
               command = New OleDbCommand(querycon)
 
               command.Parameters.AddWithValue("?"IDStudent)
 
               command.Parameters.AddWithValue("?"IDClas)
 
               command.Parameters.AddWithValue("?"ClassroomID)
 
               command.Parameters.AddWithValue("?"IDSemester)
 
               command.Parameters.AddWithValue("?"TOValue)
 
               command.ExecuteNonQuery()
 
           End If

 
           ' قراءة ON
            Dim ONValue As Integer = 0
            Dim cmdON As New OleDbCommand("SELECT ON" & courseIndex & " FROM TBL_Final1 WHERE IDStudent=? AND IDClas=? AND ClassroomID=? AND IDSemester=?", con)
            cmdON.Parameters.AddWithValue("?", IDStudent)
            cmdON.Parameters.AddWithValue("?", IDClas)
            cmdON.Parameters.AddWithValue("?", ClassroomID)
            cmdON.Parameters.AddWithValue("?", IDSemester)
            Dim resultON = cmdON.ExecuteScalar()
            If Not IsDBNull(resultON) Then ONValue = CInt(resultON)

            ' 
تحديث TR
            Dim TRValue 
As Integer ONValue TOValue
            Dim cmdTR 
As New OleDbCommand("UPDATE TBL_Final1 SET TR" courseIndex "=? WHERE IDStudent=? AND IDClas=? AND ClassroomID=? AND IDSemester=?"con)
 
           cmdTR.Parameters.AddWithValue("?"TRValue)
 
           cmdTR.Parameters.AddWithValue("?"IDStudent)
 
           cmdTR.Parameters.AddWithValue("?"IDClas)
 
           cmdTR.Parameters.AddWithValue("?"ClassroomID)
 
           cmdTR.Parameters.AddWithValue("?"IDSemester)
 
           cmdTR.ExecuteNonQuery()
 
       Next

        con
.Close()
 
       MsgBox("تم رصد درجات الامتحــان للصف: " listClas.Text vbCrLf "لمادة: " CombCourses.Text " بنجاح"MsgBoxStyle.Information"الإجــراء")

 
   Catch ex As Exception
        MsgBox
("خطأ: " ex.MessageMsgBoxStyle.Critical)
 
   End Try
End Sub 

ملاحظات إضافية:
تأكد من وجود الحقول ON1, TO1, TR1 ... في جدول TBL_Final1.
في كلا الفورمين، الحقل رقم 5 يمثل الدرجة التي تُدخلها.
الحقل رقم 7 يظهر فيها الدرجة النهائية لكل طالب.
التحقق من القيم يتم بالاعتماد على SelectedIndex + 1 لضمان الربط الصحيح بين المادة والمصفوفة المناسبة.
أجرب الكود وأخبركــــــــــــ بما يكون
وباركــــــــــ اللهُ فيكـــــــ أخــي الحبيب
تم تجربة الكود وتبين الآتي:

1- الكود الأول شغال 100% ولا إشكال فيه (100 نجمـة وزيـادة)

2- الكود الثاني شغال فيه خطأ بسيط هو:
درجات المصفوفة (on) يتم حفظها في حقول المصفوفة (to)
تم بفضل الله تعالى تعديل الكود وهو شغال 100٪
كود :
Private Sub Save_Grade()
    Try
        If DataGridView1.Rows.Count = 0 OrElse (DataGridView1.Rows.Count = 1 AndAlso DataGridView1.Rows(0).IsNewRow) Then
            MessageBox.Show(" عفواً ، لا توجـد بيانــات للحفظ", "تنبيــه", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
            Exit Sub
        End If

        Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\DataBase\Data_Base.accdb")
        con.Open()

        For i As Integer = 0 To DataGridView1.Rows.Count - 2
            Dim IDStudent As Integer = Val(DataGridView1.Rows(i).Cells(0).Value)
            Dim IDClas As Integer = listClas.SelectedIndices(0) + 1
            Dim ClassroomID As Integer = Combroom.SelectedIndex + 1
            Dim IDSemester As Integer = Val(CombSemester.Text)
            Dim courseIndex As Integer = CombCourses.SelectedIndex + 1

            ' قراءة TOValue من العمود الصحيح
            Dim TOValue As Integer = Val(DataGridView1.Rows(i).Cells(6).Value) ' تعديل الفهرس حسب الحاجة

            ' تحديث TO
            Dim query As String = "UPDATE TBL_Final1 SET TO" & courseIndex & "=? WHERE IDStudent=? AND IDClas=? AND ClassroomID=? AND IDSemester=?"
            Dim command As New OleDbCommand(query, con)
            command.Parameters.AddWithValue("?", TOValue)
            command.Parameters.AddWithValue("?", IDStudent)
            command.Parameters.AddWithValue("?", IDClas)
            command.Parameters.AddWithValue("?", ClassroomID)
            command.Parameters.AddWithValue("?", IDSemester)
            command.ExecuteNonQuery()

            ' قراءة ON
            Dim ONValue As Integer = 0
            Dim cmdON As New OleDbCommand("SELECT ON" & courseIndex & " FROM TBL_Final1 WHERE IDStudent=? AND IDClas=? AND ClassroomID=? AND IDSemester=?", con)
            cmdON.Parameters.AddWithValue("?", IDStudent)
            cmdON.Parameters.AddWithValue("?", IDClas)
            cmdON.Parameters.AddWithValue("?", ClassroomID)
            cmdON.Parameters.AddWithValue("?", IDSemester)
            Dim resultON = cmdON.ExecuteScalar()
            If Not IsDBNull(resultON) Then
                ONValue = CInt(resultON)
            End If

            ' تحديث TR
            Dim TRValue As Integer = ONValue + TOValue
            Dim cmdTR As New OleDbCommand("UPDATE TBL_Final1 SET TR" & courseIndex & "=? WHERE IDStudent=? AND IDClas=? AND ClassroomID=? AND IDSemester=?", con)
            cmdTR.Parameters.AddWithValue("?", TRValue)
            cmdTR.Parameters.AddWithValue("?", IDStudent)
            cmdTR.Parameters.AddWithValue("?", IDClas)
            cmdTR.Parameters.AddWithValue("?", ClassroomID)
            cmdTR.Parameters.AddWithValue("?", IDSemester)
            cmdTR.ExecuteNonQuery()
        Next

        con.Close()
        MsgBox("تم رصد درجات الامتحــان للصف: " & listClas.Text & vbCrLf & "لمادة: " & CombCourses.Text & " بنجاح", MsgBoxStyle.Information, "الإجــراء")
    Catch ex As Exception
        MsgBox("خطأ: " & ex.Message, MsgBoxStyle.Critical)
    End Try
End Sub
```