none
No funciona el AceptChanges, no se generan los cambios RRS feed

  • Pregunta

  • Buenas tardes a todos, mi problema es que al querer editar los valores de la fila no se producen los cambios. Tengo un dataset creado en el propio proyecto con 3 tablas(Personas, A favor, Deudores). La idea es que a medida que se cumplen ciertas condiciones estos valores se vayan cambiando, pero no funciona.

    Cabe aclarar que todas las busquedas las hago con bucles porque tampoco funcionaba el Rows.find.

    Private Sub aceptchanges()
            RichTextBox1.Clear()
            Dim totalafavor As Decimal = 0
            Dim sobra As Decimal = 0



            For Each dr As DataRow In ds.Tables("A favor").Rows
                totalafavor = 0
                sobra = 0

                For Each filas As DataRow In ds.Tables("Deudores").Rows
                    If Val(dr("A favor")) > 0 Then
                        totalafavor = 0
                        totalafavor = Val(dr("A favor")) - Val(filas("Debe"))
                        If totalafavor > 0 Then
                            RichTextBox1.Text = RichTextBox1.Text & dr("Nombre") & " " & "recibe de " & " " & filas("Nombre") & " " & "$" & (filas("Debe") * (-1)) & Chr(13)

                            For Each buscar As DataRow In ds.Tables("A favor").Rows
                                If buscar("Nombre") = dr("Nombre") Then
                                    buscar.BeginEdit()
                                    buscar("Nombre") = dr("Nombre")
                                    buscar("A favor") = totalafavor
                                    buscar.EndEdit()
                                    ds.Tables("A favor").AcceptChanges()
                                    Exit For
                                End If
                            Next


                            For Each buscardeudores As DataRow In ds.Tables("Deudores").Rows
                                If buscardeudores("Nombre") = filas("Nombre") Then
                                    buscardeudores.BeginEdit()
                                    buscardeudores("Nombre") = filas("Nombre")
                                    buscardeudores("Debe") = 0
                                    buscardeudores.EndEdit()
                                    ds.Tables("Deudores").AcceptChanges()
                                    Exit For
                                End If
                            Next




                        Else


                            If totalafavor = 0 Then
                                RichTextBox1.Text = RichTextBox1.Text & dr("Nombre") & " " & "recibe de " & " " & filas("Nombre") & " " & "$" & (filas("Debe") * (-1)) & Chr(13)



                                For Each buscardeudores2 As DataRow In ds.Tables("Deudores").Rows
                                    If buscardeudores2("Nombre") = filas("Nombre") Then
                                        buscardeudores2.BeginEdit()
                                        buscardeudores2("Nombre") = filas("Nombre")
                                        buscardeudores2("Debe") = 0
                                        buscardeudores2.EndEdit()
                                        ds.Tables("Deudores").AcceptChanges()
                                        Exit For
                                    End If
                                Next

                                For Each buscar2 As DataRow In ds.Tables("A favor").Rows
                                    If buscar2("Nombre") = dr("Nombre") Then
                                        buscar2.BeginEdit()
                                        buscar2("Nombre") = dr("Nombre")
                                        buscar2("A favor") = 0
                                        buscar2.EndEdit()

                                        ds.Tables("A favor").AcceptChanges()
                                    End If
                                    Exit For
                                Next
                                Exit For


                            Else
                                If totalafavor < 0 Then
                                    sobra = Val(filas("Debe") * (-1)) - Val(dr("A favor"))
                                    RichTextBox1.Text = RichTextBox1.Text & dr("Nombre") & " " & "recibe de " & " " & filas("Nombre") & " " & "$" & dr("A favor") & Chr(13)


                                    For Each buscardeudores3 As DataRow In ds.Tables("Deudores").Rows
                                        If buscardeudores3("Nombre") = filas("Nombre") Then
                                            buscardeudores3.BeginEdit()
                                            buscardeudores3("Nombre") = filas("Nombre")
                                            buscardeudores3("Debe") = sobra
                                            buscardeudores3.EndEdit()
                                            ds.Tables("Deudores").AcceptChanges()
                                            Exit For
                                        End If
                                    Next




                                    For Each buscar3 As DataRow In ds.Tables("A favor").Rows
                                        If buscar3("Nombre") = dr("Nombre") Then
                                            buscar3.BeginEdit()
                                            buscar3("Nombre") = dr("Nombre")
                                            buscar3("A favor") = 0
                                            buscar3.EndEdit()
                                            ds.Tables("A favor").AcceptChanges()
                                            Exit For
                                        End If
                                    Next
                                    Exit For

                                End If
                            End If
                        End If
                    End If
                Next
            Next

        End Sub


    martes, 28 de octubre de 2014 11:15

Respuestas

  • Según eso, lo que estás haciendo está bien. El AcceptChanges es irrelevante, no te aporta ningún beneficio mientras simplemente mantengas los datos en la variable "ds", así que si quieres puedes suprimirlo. Puede que haya algún pequeño error en tu código, que está muy liado con los varios bucles anidados y no se entiende todo junto de un simple vistazo. Pero el principio general es correcto y debería funcionar.

    Evidentemente, los datos que metas en "ds" solo persistirán mientras dure la visibilidad de la variable ds. Si ves que en algún momento se pierde la información, significa que no está bien controlado el ciclo de vida de la variable (algún "New" de más). En el código que has aportado no se ve dónde se declara y se inicializa, así que no es posible determinar si existe algún error.

    Como ya te digo, en principio es lícito guardar los datos en el dataset y cambiarlos como lo haces. Si aparentan no guardarse, tiene que ser algún problema de instanciación del Dataset (por ejemplo, con el código que has puesto metes los datos en ds, y antes de presentarlos, el código pasa por algún sitio donde se vuelve a hacer un "New" de esa variable). Sigue la ejecución paso-a-paso con el debugger (no solo la rutina que has copiado en este foro, sino todas las partes donde se inicialice, modifique o consuma esa variable), verificando en cada momento el contenido hasta que detectes cuál es el sitio en el que no contiene lo que pensabas que debía contener en ese punto.

    martes, 28 de octubre de 2014 18:59
  • El nombre "AcceptChanges" es engañoso: hace lo contrario de lo que parece. Lo que hace ese método es marcar todos los datos del DataTable como "no cambiados" (es decir, le dice al datatable "debes dar por aceptados todos los datos que tienes, porque ya hemos hecho algo en otro sitio para grabarlos en la base de datos"). En consecuencia, si llamas al AcceptChanges y después llamas al Update para que se graben los datos modificados, no se graba nada (porque todo está marcado como "no modificado"). Por cierto, en tu código no se ve dónde haces el Update, lo que sí se ve es que no lo haces ANTES del AcceptChanges, como debe de ser. Si lo haces después, obviamente las cosas no funcionarán nada bien, por los motivos antes comentados.
    martes, 28 de octubre de 2014 11:58

Todas las respuestas

  • El nombre "AcceptChanges" es engañoso: hace lo contrario de lo que parece. Lo que hace ese método es marcar todos los datos del DataTable como "no cambiados" (es decir, le dice al datatable "debes dar por aceptados todos los datos que tienes, porque ya hemos hecho algo en otro sitio para grabarlos en la base de datos"). En consecuencia, si llamas al AcceptChanges y después llamas al Update para que se graben los datos modificados, no se graba nada (porque todo está marcado como "no modificado"). Por cierto, en tu código no se ve dónde haces el Update, lo que sí se ve es que no lo haces ANTES del AcceptChanges, como debe de ser. Si lo haces después, obviamente las cosas no funcionarán nada bien, por los motivos antes comentados.
    martes, 28 de octubre de 2014 11:58
  • Buenas tardes y gracias por tu tiempo primero.

     Por otro lado gracias por la aclaración del acceptchanges. Te comento que en lugar del accept hacia un update pero tuve que borrarlo y barajar otras opciones ya que me pedía la conexión del command.connection. El tema es que no se como se realiza la conexión ya que no es una base de datos, sino, como explico un dataset creado en el mismo programa.

    Saludos

    martes, 28 de octubre de 2014 12:42
  • Sí, efectivamente el Update sirve para pasar los datos del DataSet a la base de datos. Si no tienes base de datos, no puedes hacer un Update. Lo cual nos lleva a la pregunta lógica: ¿Qué quieres hacer con esos datos que el DataSet tiene en memoria? ¿Dónde quieres que se guarden, o qué quieres hacer con ellos?
    martes, 28 de octubre de 2014 15:09
  • Lo que quiero hacer es editar los datos que hay en memoria y luego reutilizarlos sin enviarlos a ninguna base, por lo visto estoy trabajando de forma equivocada. Podría resolver este problema trabajando con archivos no?.

     La idea es que las personas que utilizen el programa no tengan que instalar nada, por eso mi idea era trabajar con tablas, almacenar los datos ahi y luego reutilizarlos(borrarlos, editarlos, etc).

    Espero tu respuesta, gracias nuevamente

    martes, 28 de octubre de 2014 18:33
  • Según eso, lo que estás haciendo está bien. El AcceptChanges es irrelevante, no te aporta ningún beneficio mientras simplemente mantengas los datos en la variable "ds", así que si quieres puedes suprimirlo. Puede que haya algún pequeño error en tu código, que está muy liado con los varios bucles anidados y no se entiende todo junto de un simple vistazo. Pero el principio general es correcto y debería funcionar.

    Evidentemente, los datos que metas en "ds" solo persistirán mientras dure la visibilidad de la variable ds. Si ves que en algún momento se pierde la información, significa que no está bien controlado el ciclo de vida de la variable (algún "New" de más). En el código que has aportado no se ve dónde se declara y se inicializa, así que no es posible determinar si existe algún error.

    Como ya te digo, en principio es lícito guardar los datos en el dataset y cambiarlos como lo haces. Si aparentan no guardarse, tiene que ser algún problema de instanciación del Dataset (por ejemplo, con el código que has puesto metes los datos en ds, y antes de presentarlos, el código pasa por algún sitio donde se vuelve a hacer un "New" de esa variable). Sigue la ejecución paso-a-paso con el debugger (no solo la rutina que has copiado en este foro, sino todas las partes donde se inicialice, modifique o consuma esa variable), verificando en cada momento el contenido hasta que detectes cuál es el sitio en el que no contiene lo que pensabas que debía contener en ese punto.

    martes, 28 de octubre de 2014 18:59
  • Genial Alberto muchas gracias por tu ayuda voy a mirar cual es el problema y luego te cuento.
    martes, 28 de octubre de 2014 19:02