none
No graba en la tabla los cambios efectuados en el primer registro de un datagridview.

    Pregunta

  • Buenas tardes:

    Llevo tiempo y no doy con la solución.

    No me guarda en la tabla los cambios efectuados en un datagridview, y siempre es la primera fila del datagridview.

    El código es el siguiente:

     Private Sub acumular()
            Try
                Using cnn As New SqlConnection(AccesoBd.CadenaConexion)
                    vCommand = New SqlCommand("pTransferenciasS", cnn)
                    vCommand.CommandType = CommandType.StoredProcedure
                    vAdapter = New SqlDataAdapter(vCommand)
                    vBuilder = New SqlCommandBuilder(vAdapter)
                    vDs = New DataSet()
                    vCommand.Parameters.AddWithValue("@vencimiento", MDIMenu.vfechapago)
                    vAdapter.Fill(vDs, "FACTURAS_RECIBIDAS")
                    vTable = vDs.Tables("FACTURAS_RECIBIDAS")
                    cnn.Open()
                    DataGridView1.DataSource = ""
                    DataGridView1.DataSource = vTable
                    DataGridView1.BeginEdit(True)
                    'DataGridView1.Columns("VENCIMIENTO").Width = 100
                    DataGridView1.Columns("ACREEDOR").Width = 270
                    'DataGridView1.Columns("CIF").Width = 80
                    DataGridView1.Columns("IMPORTE").Width = 80
                    DataGridView1.Columns("IMPORTE").DefaultCellStyle.Format = "N2"
                    DataGridView1.Columns("IMPORTE").DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight
                    DataGridView1.Columns("IMPORTE_ACUMULADO").Width = 100
                    DataGridView1.Columns("IMPORTE_ACUMULADO").DefaultCellStyle.Format = "N2"
                    DataGridView1.Columns("IMPORTE_ACUMULADO").DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight
                    DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
                End Using
                Dim vpt1 As String
                Dim vps2 As Double
                vps2 = 0.0
                Dim fila As Integer = 0
                Dim vpt2 As String
                Dim vps1 As Double
                While fila <= DataGridView1.RowCount - 1
                    vpt1 = DataGridView1.Rows(fila).Cells(2).Value
                    vps1 = 0.0
                    vpt2 = ""
                    While DataGridView1.Rows(fila).Cells(2).Value = vpt1 And fila <= DataGridView1.RowCount - 1
                        vps1 = vps1 + DataGridView1.Rows(fila).Cells(4).Value
                        If vpt2 = "" Then
                            vpt2 = vpt2 & DataGridView1.Rows(fila).Cells(8).Value
                        Else
                            vpt2 = vpt2 & ", " & DataGridView1.Rows(fila).Cells(8).Value
                        End If
                        DataGridView1.Rows(fila).Cells(11).Value = MDIMenu.vfechapago
                        DataGridView1.Rows(fila).Cells(12).Value = True
                        If fila = DataGridView1.RowCount - 1 Then
                            DataGridView1.Rows(fila).Cells(5).Value = vps1
                            DataGridView1.Rows(fila).Cells(10).Value = vpt2
                            DataGridView1.Rows(fila).Cells(12).Value = False
                            vps2 = vps2 + vps1
                            fila = DataGridView1.RowCount
                            Exit While
                        Else
                            If fila < DataGridView1.RowCount - 1 Then
                                fila = fila + 1
                            End If
                        End If
                    End While
                    If fila < DataGridView1.RowCount - 1 Then
                        fila = fila - 1
                        DataGridView1.Rows(fila).Cells(5).Value = vps1
                        DataGridView1.Rows(fila).Cells(10).Value = vpt2
                        DataGridView1.Rows(fila).Cells(12).Value = False
                        vps2 = vps2 + vps1
                        fila = fila + 1
                    End If
                End While
                Dim vPA As String = "pTransferenciasT"
                Dim vT As String = "FACTURAS_RECIBIDAS"
                GuardarCambios(vPA, vT)
                'FUsuarios.GuardarCambios(vPA, vT)
            Catch expSQL As SqlException
                MsgBox(expSQL.ToString, MsgBoxStyle.OkOnly, "SQL Exception")
            End Try
        End Sub
    
        Private Sub GuardarCambios(vStored As String, vTable As String)
            Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
            Try
                Using cnn As New SqlConnection(AccesoBd.CadenaConexion)
                    vCommand = New SqlCommand(vStored, cnn)
                    vCommand.CommandType = CommandType.StoredProcedure
                    vAdapter = New SqlDataAdapter(vCommand)
                    vBuilder = New SqlCommandBuilder(vAdapter)
                    vDs = New DataSet()
                    vAdapter.Fill(vDs, vTable)
                    vBuilder.QuotePrefix = "["
                    vBuilder.QuoteSuffix = "]"
                    vAdapter.InsertCommand = vBuilder.GetInsertCommand()
                    vAdapter.UpdateCommand = vBuilder.GetUpdateCommand()
                    vAdapter.DeleteCommand = vBuilder.GetDeleteCommand()
                    Dim n As Integer = vAdapter.Update(dt)
                    MessageBox.Show("Nº de registros afectados:   " & CStr(n))
                End Using
            Catch expSQL As SqlException
                Dim men As String
                If expSQL.Number = 2627 Then
                    If expSQL.Message.IndexOf("PRIMARY") <> -1 Then
                        men = "Error por intentar grabar valores duplicados en campos clave, corrija el problema y vuelva a intentar"
                    ElseIf expSQL.Message.IndexOf("UNIQUE") <> -1 Then
                        men = "Error por intentar grabar valores duplicados en campos de valores únicos, corrija el problema y vuelva a intentar"
                    Else
                        men = "Error general en la base de datos"
                    End If
                ElseIf expSQL.Number = 515 Then
                    men = "Algunos datos no han sido ingresados y son necesario para completar la operación, corrija el problema y vuelva a intentar"
                Else
                    men = "Error general en la base de datos"
                End If
                MsgBox(men)
            End Try
            If DataGridView1.ReadOnly = False Then
                DataGridView1.ReadOnly = True
            End If
        End Sub
    

    No logro dar con el problema, seguramente será una nimiedad, pero uno cuando repasa lo mismo varias veces acaba obcecado y así es difícil dar con la solución.

    Gracias y saludos.

    lunes, 5 de diciembre de 2016 17:09

Respuestas

  • Hola, buenos días.

    Solucionado. Antes de ir a GuardarCambios, posicioné el DataGridView en la primera fila.

     DataGridView1.BindingContext(vTable).Position = 0

    Muchas gracias y saludos.

    • Marcado como respuesta Ángelroso martes, 6 de diciembre de 2016 11:47
    martes, 6 de diciembre de 2016 11:47