none
SUMAR LOS CODIGOS IDENTICOS Y ACOMULARLOS EN MI DATAGRIDVIEW RRS feed

  • Pregunta

  • Buenas noches,

    Le agradezco y me colaboren ya que necesito que a la hora de introducir por un form el código de una persona con un valor si esa persona existe se sume el valor en la fila que aparece ese mismo código y no se agregue otra fila en mi datagridview, aparece así:

    CÓDIGO     APELLIDOS           NOMBRE                     VALOR

    01             BLANCO SAENZ     FRANKLIN ANTONIO     45.000

    02             MARTINEZ RAMOS   EFRAIN                     25.000

    01            BLANCO SAENZ     FRANKLIN ANTONIO      35.000

    Y quisiera que me aparezca así:

    CÓDIGO     APELLIDOS           NOMBRE                     VALOR

    01             BLANCO SAENZ     FRANKLIN ANTONIO     80.000

    02             MARTINEZ RAMOS   EFRAIN                     25.000


    Que al momento que le de clic al botón guardar la información que se alimenta en el form se sume o acumule el valor del código que ya existe y no que se agregue otra fila al datagridview y que se vea relejada esta información en mi base de datos en sql server.

    Le agradezco el código en Visual Basic.Net

    martes, 28 de mayo de 2019 1:42

Respuestas

  • Hola:
    En un Form como el de la imagen

    Copia y pega el siguiente codigo

    Public Class Form1
        Private moDataTable As New DataTable
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            'Añadimos las columnas.
            moDataTable.Columns.Add(New DataColumn("Codigo", Type.GetType("System.Int32")))
            moDataTable.Columns.Add(New DataColumn("Nombre", Type.GetType("System.String")))
            moDataTable.Columns.Add(New DataColumn("Apellidos", Type.GetType("System.String")))
            moDataTable.Columns.Add(New DataColumn("Valor", Type.GetType("System.Int32")))
            Me.DataGridView1.DataSource = moDataTable
        End Sub
        Private Sub btnAñadir_Click(sender As Object, e As EventArgs) Handles btnAñadir.Click
            If lF_bExisteCodigo(CInt(Me.txtCodigo.Text)) Then
                lP_Modificar()
            Else
                lP_Añadir()
            End If
        End Sub
        Private Sub lP_Añadir()
            Dim lDataRow As DataRow = moDataTable.NewRow
            ' Añadimos los datos
            lDataRow.Item("Codigo") = Me.txtCodigo.Text
            lDataRow.Item("Nombre") = Me.txtNombre.Text
            lDataRow.Item("Apellidos") = Me.txtApellidos.Text
            lDataRow.Item("Valor") = Me.txtValor.Text
            ' Agregamos el registros a la colección Rows
            moDataTable.Rows.Add(lDataRow)
            'Limpiar lo controles
            Me.txtCodigo.Text = ""
            Me.txtNombre.Text = ""
            Me.txtApellidos.Text = ""
            Me.txtValor.Text = ""
            Me.txtCodigo.Focus()
        End Sub
        Private Sub lP_Modificar()
            'Buscar la fila con ese codigo
            Dim Fila() As DataRow = moDataTable.Select("Codigo=" & txtCodigo.Text)
            If Fila.Length > 0 Then
                Fila(0).Item("Valor") = CInt(Fila(0).Item("Valor")) + CInt(txtValor.Text)
            End If
            'Limpiar lo controles
            Me.txtCodigo.Text = ""
            Me.txtNombre.Text = ""
            Me.txtApellidos.Text = ""
            Me.txtValor.Text = ""
            Me.txtCodigo.Focus()
        End Sub

        Private Function lF_bExisteCodigo(ByVal viCodigo As Integer) As Boolean
            Dim lbRetorno As Boolean = False
            Try
                Dim Consulta = From Valor In moDataTable Where Valor.Field(Of Integer)("Codigo") = viCodigo
                If Consulta.Count() > 0 Then
                    lbRetorno = True
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function
    End Class

    Un saludo desde Bilbo
    Carlos


    martes, 28 de mayo de 2019 6:53
  • Hola:
    Para este ejemplo, he creado una tabla con la siguiente estructura

    En un Form como el de la imagen

    Copia y pega el siguiente código

    Option Strict On
    Option Explicit On
    Imports System.ComponentModel
    Imports System.Data.SqlClient
    Imports System.Transactions
    Public Class Form1
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"
        Private moDataTable As New DataTable
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.btnQuitar.Enabled = False
            Me.btnGrabar.Enabled = False
            Me.DataGridView1.AllowUserToAddRows = False
            'Añadimos las columnas.
            moDataTable.Columns.Add(New DataColumn("Codigo", Type.GetType("System.Int32")))
            moDataTable.Columns.Add(New DataColumn("Nombre", Type.GetType("System.String")))
            moDataTable.Columns.Add(New DataColumn("Apellidos", Type.GetType("System.String")))
            moDataTable.Columns.Add(New DataColumn("Valor", Type.GetType("System.Int32")))
            Me.DataGridView1.DataSource = moDataTable
        End Sub
        Private Sub btnAñadir_Click(sender As Object, e As EventArgs) Handles btnAñadir.Click
            If Me.ValidateChildren = False Then
                MessageBox.Show("Datos incompletos", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return
            End If
            If lF_bExisteCodigoDT(CInt(Me.txtCodigo.Text)) Then
                lP_Modificar()
            Else
                lP_Añadir()
            End If
        End Sub
        Private Sub lP_Añadir()
            Dim lDataRow As DataRow = moDataTable.NewRow
            ' Añadimos los datos
            lDataRow.Item("Codigo") = Me.txtCodigo.Text
            lDataRow.Item("Nombre") = Me.txtNombre.Text
            lDataRow.Item("Apellidos") = Me.txtApellidos.Text
            lDataRow.Item("Valor") = Me.txtValor.Text
            ' Agregamos el registros a la colección Rows
            moDataTable.Rows.Add(lDataRow)
            '
            If Me.DataGridView1.RowCount > 0 Then
                Me.btnQuitar.Enabled = True
                Me.btnGrabar.Enabled = True
            End If
            'Limpiar lo controles
            Me.txtCodigo.Text = ""
            Me.txtNombre.Text = ""
            Me.txtApellidos.Text = ""
            Me.txtValor.Text = ""
            Me.txtCodigo.Focus()
            Me.ErrorProvider1.Clear()
        End Sub
        Private Sub lP_Modificar()
            'Buscar la fila con ese codigo
            Dim Fila() As DataRow = moDataTable.Select("Codigo=" & txtCodigo.Text)
            If Fila.Length > 0 Then
                Fila(0).Item("Valor") = CInt(Fila(0).Item("Valor")) + CInt(txtValor.Text)
            End If
            'Limpiar lo controles
            Me.txtCodigo.Text = ""
            Me.txtNombre.Text = ""
            Me.txtApellidos.Text = ""
            Me.txtValor.Text = ""
            Me.txtCodigo.Focus()
        End Sub
        Private Function lF_bExisteCodigoDT(ByVal viCodigo As Integer) As Boolean
            Dim lbRetorno As Boolean = False
            Try
                Dim Consulta = From Valor In moDataTable Where Valor.Field(Of Integer)("Codigo") = viCodigo
                If Consulta.Count() > 0 Then
                    lbRetorno = True
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bExisteCodigoDT", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function
        Private Sub btnQuitar_Click(sender As Object, e As EventArgs) Handles btnQuitar.Click
            lP_Quitar()
        End Sub
        Private Sub lP_Quitar()
            For Each lDataGridViewRow As DataGridViewRow In Me.DataGridView1.SelectedRows
                ' Eliminamos la fila.
                If lDataGridViewRow.Index >= 0 Then
                    Try
                        moDataTable.Rows.RemoveAt(lDataGridViewRow.Index)
                    Catch ex As Exception
                        MessageBox.Show(ex.Message, "lP_Quitar", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End Try
                End If
            Next
            If Me.DataGridView1.RowCount = 0 Then
                Me.btnQuitar.Enabled = False
                Me.btnGrabar.Enabled = False
            End If
        End Sub
        Private Sub btnGrabar_Click(sender As Object, e As EventArgs) Handles btnGrabar.Click
            Dim lsQueryInsert As String = "INSERT INTO prueba (codigo, nombre, apellidos, valor) values (@Codigo, @Nombre, @Apellidos, @Valor)"
            Dim lsQueryUpdate As String = "UPDATE prueba SET valor=valor+@Valor WHERE codigo=@Codigo"
            Try
                'Iniciamos una transaccion; hay que añadir la Referencia System.Transactions
                Using MiTransaccion As New TransactionScope()
                    Using loConexion As New SqlConnection(msCadenaSQL)
                        'Proceso de grabación de datos
                        loConexion.Open()   ' abrir conexión
                        For Each Fila As DataRow In moDataTable.Rows
                            'Ver si el codigo ya esta grabado en la tabla
                            If lF_bExisteCodigoTabla(CInt(Fila.Item("Codigo"))) = True Then
                                Using loComando As New SqlCommand(lsQueryUpdate, loConexion)
                                    'añadir parametros al comando
                                    loComando.Parameters.Add(New SqlParameter("@Codigo", Fila.Item("Codigo")))
                                    loComando.Parameters.Add(New SqlParameter("@Valor", Fila.Item("Valor")))
                                    loComando.ExecuteNonQuery()
                                End Using
                            Else
                                Using loComando As New SqlCommand(lsQueryInsert, loConexion)
                                    'añadir parametros al comando
                                    loComando.Parameters.Add(New SqlParameter("@Codigo", Fila.Item("Codigo")))
                                    loComando.Parameters.Add(New SqlParameter("@Nombre", Fila.Item("Nombre")))
                                    loComando.Parameters.Add(New SqlParameter("@Apellidos", Fila.Item("Apellidos")))
                                    loComando.Parameters.Add(New SqlParameter("@Valor", Fila.Item("Valor")))
                                    loComando.ExecuteNonQuery()
                                End Using
                            End If
                        Next
                    End Using
                    MiTransaccion.Complete()
                End Using
                moDataTable.Clear()
                Me.ErrorProvider1.Clear()
                Me.Cursor = Cursors.Default
                MessageBox.Show("Grabacion Finalizada", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch exOtros As Exception
                Me.Cursor = Cursors.Default
                MessageBox.Show(exOtros.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Function lF_bExisteCodigoTabla(ByVal viCodigo As Integer) As Boolean
            Dim lbRetorno As Boolean = False
            Try
                Dim lsQuery As String = "SELECT COUNT(*) FROM prueba WHERE codigo=@Codigo"
                Using loConexion As New SqlConnection(msCadenaSQL)
                    ' crear comando
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        'añadir parametro al comando
                        loComando.Parameters.Add(New SqlParameter("@Codigo", viCodigo))
                        loConexion.Open()   ' abrir conexión
                        lbRetorno = CInt(loComando.ExecuteScalar()) > 0
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bExisteCodigoTabla", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function
        Private Sub txtCodigo_Validating(sender As Object, e As CancelEventArgs) Handles txtCodigo.Validating
            If Me.txtCodigo.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProvider1.SetError(Me.txtCodigo, "Introduzca el Codigo")
            Else
                Me.ErrorProvider1.SetError(Me.txtCodigo, Nothing)
            End If
        End Sub
        Private Sub txtNombre_Validating(sender As Object, e As CancelEventArgs) Handles txtNombre.Validating
            If Me.txtNombre.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProvider1.SetError(Me.txtNombre, "Introduzca el Nombre")
            Else
                Me.ErrorProvider1.SetError(Me.txtNombre, Nothing)
            End If
        End Sub
        Private Sub txtApellidos_Validating(sender As Object, e As CancelEventArgs) Handles txtApellidos.Validating
            If Me.txtApellidos.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProvider1.SetError(Me.txtApellidos, "Introduzca el Apellido")
            Else
                Me.ErrorProvider1.SetError(Me.txtApellidos, Nothing)
            End If
        End Sub

        Private Sub txtValor_Validating(sender As Object, e As CancelEventArgs) Handles txtValor.Validating
            If Me.txtValor.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProvider1.SetError(Me.txtValor, "Introduzca el Valor")
            Else
                Me.ErrorProvider1.SetError(Me.txtValor, Nothing)
            End If
        End Sub
    End Class

    P.D.
    Pruebalo y mira como funciona, y despues lo adaptas al proyecto tuyo

    Un saludo desde Bilbo
    Carlos

    jueves, 30 de mayo de 2019 6:36

Todas las respuestas

  • Buenas noches amigo, no soy para nada experimentado pero creo poder ayudarte. Estos datos (Codigo, Apellidos, Nombre y Valor) son parte de una tabla de alguna base de datos?

    En caso de que estés trabajando con alguna BD, puedes crear una función, desde sql por ej, o desde VB mismo donde actualice cierta información de un determinado registro de una tabla. En este caso "TuTabla" donde tienes estos campos (Código, Apellidos, Nombre y Valor), deberias identificar el registro a modificar a través de su ID, luego modificar lo que deseas (en este caso sumar en el campo Valor ciertas cosas), luego guardar esos cambios en la BD, y por ultimo volver a ejecutar la función donde listas los registros de esa tabla y los muestras en un dataGridView.

    Si puedes copia un poco de código, de como listas estos resultados en el datagridview, como es el proceso de modificación del valor y su posterior actualización.

    Saludos Guille.

    martes, 28 de mayo de 2019 1:58
  • Gracias por la ayuda, pero necesito es que automáticamente se sume la cantidad que se agregue del mismo nombre que se encuentra en la base de datos para que no se creen varios campos con los mismos nombres y código. 
    martes, 28 de mayo de 2019 3:50
  • Hola:
    En un Form como el de la imagen

    Copia y pega el siguiente codigo

    Public Class Form1
        Private moDataTable As New DataTable
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            'Añadimos las columnas.
            moDataTable.Columns.Add(New DataColumn("Codigo", Type.GetType("System.Int32")))
            moDataTable.Columns.Add(New DataColumn("Nombre", Type.GetType("System.String")))
            moDataTable.Columns.Add(New DataColumn("Apellidos", Type.GetType("System.String")))
            moDataTable.Columns.Add(New DataColumn("Valor", Type.GetType("System.Int32")))
            Me.DataGridView1.DataSource = moDataTable
        End Sub
        Private Sub btnAñadir_Click(sender As Object, e As EventArgs) Handles btnAñadir.Click
            If lF_bExisteCodigo(CInt(Me.txtCodigo.Text)) Then
                lP_Modificar()
            Else
                lP_Añadir()
            End If
        End Sub
        Private Sub lP_Añadir()
            Dim lDataRow As DataRow = moDataTable.NewRow
            ' Añadimos los datos
            lDataRow.Item("Codigo") = Me.txtCodigo.Text
            lDataRow.Item("Nombre") = Me.txtNombre.Text
            lDataRow.Item("Apellidos") = Me.txtApellidos.Text
            lDataRow.Item("Valor") = Me.txtValor.Text
            ' Agregamos el registros a la colección Rows
            moDataTable.Rows.Add(lDataRow)
            'Limpiar lo controles
            Me.txtCodigo.Text = ""
            Me.txtNombre.Text = ""
            Me.txtApellidos.Text = ""
            Me.txtValor.Text = ""
            Me.txtCodigo.Focus()
        End Sub
        Private Sub lP_Modificar()
            'Buscar la fila con ese codigo
            Dim Fila() As DataRow = moDataTable.Select("Codigo=" & txtCodigo.Text)
            If Fila.Length > 0 Then
                Fila(0).Item("Valor") = CInt(Fila(0).Item("Valor")) + CInt(txtValor.Text)
            End If
            'Limpiar lo controles
            Me.txtCodigo.Text = ""
            Me.txtNombre.Text = ""
            Me.txtApellidos.Text = ""
            Me.txtValor.Text = ""
            Me.txtCodigo.Focus()
        End Sub

        Private Function lF_bExisteCodigo(ByVal viCodigo As Integer) As Boolean
            Dim lbRetorno As Boolean = False
            Try
                Dim Consulta = From Valor In moDataTable Where Valor.Field(Of Integer)("Codigo") = viCodigo
                If Consulta.Count() > 0 Then
                    lbRetorno = True
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function
    End Class

    Un saludo desde Bilbo
    Carlos


    martes, 28 de mayo de 2019 6:53
  • Buenas tardes, te envío el código que tengo para realizar este proceso, donde le añadí lo que me enviaste, pero tengo problemas a la hora de guardar la información ya que no se ve relejada en la tabla o datagridview.

    Imports System.Data.SqlClient

    Public Class frmdiezmos

        Private dt As New DataTable

        Private Sub frmdiezmos_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            mostrar()
        End Sub

        Public Sub limpiar()
            btnguardar.Visible = True
            btneditar.Visible = False

            txt_idmiembro.Text = ""
            txt_nombremiembro.Text = ""
            txt_apellidosmiembro.Text = ""
            txt_iddiezmo.Text = ""
            txt_valor.Text = ""
            cbodiaculto.Text = ""



        End Sub
        Private Sub mostrar()
            Try
                Dim func As New fdiezmos
                dt = func.mostrar
                datalistado.Columns.Item("Eliminar").Visible = False

                If dt.Rows.Count <> 0 Then
                    datalistado.DataSource = dt
                    txtbuscar.Enabled = True
                    datalistado.ColumnHeadersVisible = True
                    inexistente.Visible = False
                Else
                    datalistado.DataSource = Nothing
                    txtbuscar.Enabled = False
                    datalistado.ColumnHeadersVisible = False
                    inexistente.Visible = True
                End If


            Catch ex As Exception
                MsgBox(ex.Message)

            End Try
            btnnuevo.Visible = True
            btneditar.Visible = False

            buscar()

        End Sub

        Private Sub buscar()
            Try
                Dim ds As New DataSet
                ds.Tables.Add(dt.Copy)
                Dim dv As New DataView(ds.Tables(0))

                dv.RowFilter = cbocampo.Text & " like '" & txtbuscar.Text & "%'"

                If dv.Count <> 0 Then
                    inexistente.Visible = False
                    datalistado.DataSource = dv
                    ocultar_columnas()
                Else
                    inexistente.Visible = True
                    datalistado.DataSource = Nothing
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub


        Private Sub ocultar_columnas()
            datalistado.Columns(1).Visible = False
            datalistado.Columns(2).Visible = False
        End Sub


        Private Sub btnnuevo_Click(sender As Object, e As EventArgs) Handles btnnuevo.Click
            limpiar()
            mostrar()
        End Sub

        Private Sub btnguardar_Click(sender As Object, e As EventArgs) Handles btnguardar.Click

            If lF_bExisteCodigo(CInt(Me.txt_idmiembro.Text)) Then
                lP_Modificar()
            ElseIf Me.ValidateChildren = True And dtfecha.Text <> "" And txt_valor.Text <> "" And cbodiaculto.Text <> "" Then
                Try
                    Dim dts As New vdiezmos
                    Dim func As New fdiezmos


                    dts.gidmiembro = txt_idmiembro.Text
                    dts.gfecha = dtfecha.Text
                    dts.gvalor = txt_valor.Text
                    dts.gdia = cbodiaculto.Text


                    If func.insertar(dts) Then
                        MessageBox.Show("Diezmos registrado correctamente", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        mostrar()
                        limpiar()
                    Else
                        MessageBox.Show("Diezmos no fue registrado intente de nuevo", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        mostrar()
                        limpiar()
                    End If


                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Else
                MessageBox.Show("Falta ingresar algunos datos", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If

        End Sub
        Private Sub lP_Modificar()
            'Buscar la fila con ese codigo
            Dim Fila() As DataRow = dt.Select("idmiembro=" & txt_idmiembro.Text)
            If Fila.Length > 0 Then
                Fila(0).Item("valor") = CInt(Fila(0).Item("valor")) + CInt(txt_valor.Text)
            End If
            'Limpiar lo controles
            limpiar()
            Me.txt_idmiembro.Focus()
        End Sub
        Private Function lF_bExisteCodigo(ByVal viidmiembro As Integer) As Boolean
            Dim lbRetorno As Boolean = False
            Try
                Dim Consulta = From valor In dt Where valor.Field(Of Integer)("idmiembro") = viidmiembro
                If Consulta.Count() > 0 Then
                    lbRetorno = True
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function
        Private Sub datalistado_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles datalistado.CellContentClick
            If e.ColumnIndex = Me.datalistado.Columns.Item("Eliminar").Index Then
                Dim chkcell As DataGridViewCheckBoxCell = Me.datalistado.Rows(e.RowIndex).Cells("Eliminar")
                chkcell.Value = Not chkcell.Value
            End If
        End Sub

        Private Sub datalistado_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles datalistado.CellClick

            txt_iddiezmo.Text = datalistado.SelectedCells.Item(1).Value
            txt_idmiembro.Text = datalistado.SelectedCells.Item(2).Value
            dtfecha.Text = datalistado.SelectedCells.Item(3).Value
            txt_apellidosmiembro.Text = datalistado.SelectedCells.Item(4).Value
            txt_nombremiembro.Text = datalistado.SelectedCells.Item(5).Value
            cbodiaculto.Text = datalistado.SelectedCells.Item(6).Value
            txt_valor.Text = datalistado.SelectedCells.Item(7).Value

            btneditar.Visible = True
            btnguardar.Visible = False
        End Sub

        Private Sub btneditar_Click(sender As Object, e As EventArgs) Handles btneditar.Click
            Dim result As DialogResult
            result = MessageBox.Show("Realmente desea editar los datos de la asistencia", "Modificando Registro", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)

            If result = DialogResult.OK Then
                If Me.ValidateChildren = True And dtfecha.Text <> "" And txt_idmiembro.Text <> "" And txt_valor.Text <> "" And txt_iddiezmo.Text <> "" And cbodiaculto.Text <> "" Then
                    Try
                        Dim dts As New vdiezmos
                        Dim func As New fdiezmos

                        dts.giddiezmo = txt_iddiezmo.Text
                        dts.gidmiembro = txt_idmiembro.Text
                        dts.gfecha = dtfecha.Text
                        dts.gvalor = txt_valor.Text
                        dts.gdia = cbodiaculto.Text

                        If func.editar(dts) Then
                            MessageBox.Show("Diezmos modificado correctamente", "Modificando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
                            mostrar()
                            limpiar()
                        Else
                            MessageBox.Show("Diezmos no fue modificado intente de nuevo", "Modificando Registros", MessageBoxButtons.OK, MessageBoxIcon.Error)
                            mostrar()
                            limpiar()
                        End If


                    Catch ex As Exception
                        MsgBox(ex.Message)
                    End Try
                Else
                    MessageBox.Show("Falta ingresar algunos datos", "Modificando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            End If

        End Sub

        Private Sub cbeliminar_CheckedChanged(sender As Object, e As EventArgs) Handles cbeliminar.CheckedChanged
            If cbeliminar.CheckState = CheckState.Checked Then
                datalistado.Columns.Item("Eliminar").Visible = True
            Else
                datalistado.Columns.Item("Eliminar").Visible = False
            End If
        End Sub

        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles btneliminar.Click
            Dim result As DialogResult
            result = MessageBox.Show("¿Realmente desea eliminar el diezmo seleccionado?", "Eliminando Registros", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)

            If result = DialogResult.OK Then
                Try
                    For Each row As DataGridViewRow In datalistado.Rows
                        Dim marcado As Boolean = Convert.ToBoolean(row.Cells("Eliminar").Value)

                        If marcado Then
                            Dim onekey As Integer = Convert.ToInt32(row.Cells("iddiezmo").Value)
                            Dim vdb As New vdiezmos
                            Dim func As New fdiezmos
                            vdb.giddiezmo = onekey

                            If func.eliminar(vdb) Then
                            Else
                                MessageBox.Show("Diezmo no fue eliminado", "Eliminando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)

                            End If
                        End If
                    Next
                    Call mostrar()
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Else
                MessageBox.Show("Cancelando eliminación de registros", "Eliminando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Call mostrar()
            End If
            Call limpiar()
        End Sub

        Private Sub btnbuscarmiembros_Click(sender As Object, e As EventArgs) Handles btnbuscarmiembros.Click
            frmcreyente.txtflag.Text = "1"
            frmcreyente.ShowDialog()
        End Sub

        Private Sub txtbuscar_TextChanged(sender As Object, e As EventArgs) Handles txtbuscar.TextChanged
            buscar()
        End Sub


    End Class

    martes, 28 de mayo de 2019 22:14
  • Hola:

    > pero tengo problemas a la hora de guardar la información <
    ¿Donde quieres guardar la informacion?
    Parece ser que la quieres guardar en una tabla de SQLServer

    Tienes una serie de lineas como las siguientes

                Dim func As New fdiezmos
                dt = func.mostrar
                If func.insertar(dts) Then
                If func.editar(dts) Then
                If func.eliminar(vdb) Then

    Pero NO se ve el codigo de lo que hacen

    ¿Puedes explicar un poco que es lo que realmente quiere hacer para poder conocer un poco tu escenario?

    Un saludo desde Bilbo
    Carlos


    • Propuesto como respuesta Carlos_Ruiz_M miércoles, 29 de mayo de 2019 13:53
    miércoles, 29 de mayo de 2019 6:09
  • Buenas Tardes, mi problema es cuando voy a guardar un registro con el mismo código para que no se cree una nueva fila con los mismos datos, sino que cuando ingrese un código existente se sume el valor al que ya existe y se vaya acumulando.

    Este es el error que presenta cuando ejecuto el código  incluyendo la ayuda que me enviaste, pero no se como 

    relacionarla e incluirla dentro del código que tengo.

     Private Sub btnguardar_Click(sender As Object, e As EventArgs) Handles btnguardar.Click
            If Me.ValidateChildren = True And dtfecha.Text <> "" And txt_valor.Text <> "" And cbodiaculto.Text <> "" Then

                Try
                    Dim dts As New vdiezmos
                    Dim func As New fdiezmos

                    If lF_bExisteCodigo(CInt(Me.txt_idmiembro.Text)) Then
                        lP_Modificar()
                    Else
                        func.insertar(dts)
                    End If
                    dts.gidmiembro = txt_idmiembro.Text
                    dts.gfecha = dtfecha.Text
                    dts.gvalor = txt_valor.Text
                    dts.gdia = cbodiaculto.Text



                    If func.insertar(dts) Then
                        MessageBox.Show("Diezmos registrado correctamente", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        mostrar()
                        limpiar()
                    Else
                        MessageBox.Show("Diezmos no fue registrado intente de nuevo", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        mostrar()
                        limpiar()
                    End If


                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Else
                MessageBox.Show("Falta ingresar algunos datos", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If

        End Sub
        Private Sub lP_Modificar()
            'Buscar la fila con ese codigo
            Dim Fila() As DataRow = dt.Select("idmiembro=" & txt_idmiembro.Text)
            If Fila.Length > 0 Then
                Fila(0).Item("valor") =CInt(Fila(0).Item("valor")) + CInt(txt_idmiembro.Text)
            End If
            'Limpiar lo controles
            limpiar()
            Me.txt_idmiembro.Focus()
        End Sub
        Private Function lF_bExisteCodigo(ByVal viidmiembro As Integer) As Boolean
            Dim lbRetorno As Boolean = False
            Try
                Dim Consulta = From valor In dt Where valor.Field(Of Integer)("idmiembro") = viidmiembro
                If Consulta.Count() > 0 Then
                    lbRetorno = True
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function

    y esto es lo que me sale cuando lo ejecuto solo con el código que yo tengo, pero no me suma los valores con los mismos códigos:

     Con este codigo:

    Private Sub btnguardar_Click(sender As Object, e As EventArgs) Handles btnguardar.Click
            If Me.ValidateChildren = True And dtfecha.Text <> "" And txt_valor.Text <> "" And cbodiaculto.Text <> "" Then

                Try
                    Dim dts As New vdiezmos
                    Dim func As New fdiezmos

                    dts.gidmiembro = txt_idmiembro.Text
                    dts.gfecha = dtfecha.Text
                    dts.gvalor = txt_valor.Text
                    dts.gdia = cbodiaculto.Text



                    If func.insertar(dts) Then
                        MessageBox.Show("Diezmos registrado correctamente", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        mostrar()
                        limpiar()
                    Else
                        MessageBox.Show("Diezmos no fue registrado intente de nuevo", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        mostrar()
                        limpiar()
                    End If


                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Else
                MessageBox.Show("Falta ingresar algunos datos", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If

        End Sub


    miércoles, 29 de mayo de 2019 20:13
  • Buenas Tardes, mi problema es cuando voy a guardar un registro con el mismo código para que no se cree una nueva fila con los mismos datos, sino que cuando ingrese un código existente se sume el valor al que ya existe y se vaya acumulando.

    Este es el error que presenta cuando ejecuto el código  incluyendo la ayuda que me enviaste, pero no se como 

    relacionarla e incluirla dentro del código que tengo.

     Private Sub btnguardar_Click(sender As Object, e As EventArgs) Handles btnguardar.Click
            If Me.ValidateChildren = True And dtfecha.Text <> "" And txt_valor.Text <> "" And cbodiaculto.Text <> "" Then

                Try
                    Dim dts As New vdiezmos
                    Dim func As New fdiezmos

                    If lF_bExisteCodigo(CInt(Me.txt_idmiembro.Text)) Then
                        lP_Modificar()
                    Else
                        func.insertar(dts)
                    End If
                    dts.gidmiembro = txt_idmiembro.Text
                    dts.gfecha = dtfecha.Text
                    dts.gvalor = txt_valor.Text
                    dts.gdia = cbodiaculto.Text



                    If func.insertar(dts) Then
                        MessageBox.Show("Diezmos registrado correctamente", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        mostrar()
                        limpiar()
                    Else
                        MessageBox.Show("Diezmos no fue registrado intente de nuevo", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        mostrar()
                        limpiar()
                    End If


                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Else
                MessageBox.Show("Falta ingresar algunos datos", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If

        End Sub
        Private Sub lP_Modificar()
            'Buscar la fila con ese codigo
            Dim Fila() As DataRow = dt.Select("idmiembro=" & txt_idmiembro.Text)
            If Fila.Length > 0 Then
                Fila(0).Item("valor") =CInt(Fila(0).Item("valor")) + CInt(txt_idmiembro.Text)
            End If
            'Limpiar lo controles
            limpiar()
            Me.txt_idmiembro.Focus()
        End Sub
        Private Function lF_bExisteCodigo(ByVal viidmiembro As Integer) As Boolean
            Dim lbRetorno As Boolean = False
            Try
                Dim Consulta = From valor In dt Where valor.Field(Of Integer)("idmiembro") = viidmiembro
                If Consulta.Count() > 0 Then
                    lbRetorno = True
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function

    y esto es lo que me sale cuando lo ejecuto solo con el código que yo tengo, pero no me suma los valores con los mismos códigos:

     Con este codigo:

    Private Sub btnguardar_Click(sender As Object, e As EventArgs) Handles btnguardar.Click
            If Me.ValidateChildren = True And dtfecha.Text <> "" And txt_valor.Text <> "" And cbodiaculto.Text <> "" Then

                Try
                    Dim dts As New vdiezmos
                    Dim func As New fdiezmos

                    dts.gidmiembro = txt_idmiembro.Text
                    dts.gfecha = dtfecha.Text
                    dts.gvalor = txt_valor.Text
                    dts.gdia = cbodiaculto.Text



                    If func.insertar(dts) Then
                        MessageBox.Show("Diezmos registrado correctamente", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        mostrar()
                        limpiar()
                    Else
                        MessageBox.Show("Diezmos no fue registrado intente de nuevo", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        mostrar()
                        limpiar()
                    End If


                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Else
                MessageBox.Show("Falta ingresar algunos datos", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If

        End Sub


    Una opción a tu problema puede ser trabajar con selectionChanged, el evento del datagridview. Entiendo que en tu trabajo no estas usando base de datos, por lo que ingresas registros (que serán volátiles, al cerrar el programa se destruyen) y vas mostrando estos en un datagridView, pero cuando ingresas dos valores/montos a un mismo cliente, quieres que estos se sumen en la fila donde ya existe el mismo, evitando que se cree otra fila, estamos en sintonia?

    Una posible solución a esto, como te comentaba puede ser utilizando el selectionChanged del dataGridView, para esto el usuario deberá seleccionar una fila, a la cual se le modificara el valor, puedes crear un buscador para hacer mas fácil la búsqueda, pero la selección de la fila sera prescindible.

    Supongo que guardas los registros que ingresas en una Lista de objetos, deberas identificar a travez de su ID de la fila seleccionada el registro a modificar, haras tu actualizacion y posterior volveras a recorrer esta lista en en el dataGridView.

    Te parece? Podemos verlo mas en detalle si quieres probar.

    Saludos Guille.

    • Propuesto como respuesta Carlos_Ruiz_M jueves, 30 de mayo de 2019 13:54
    miércoles, 29 de mayo de 2019 20:53
  • Buenas Noches, con referente a lo siguiente:

    

    Si estoy trabajando con base de datos en sql server con una conexión con Visual Studio, ya tengo un buscador en el datagridview, solo necesito que los registros existentes bajo el mismo código se vayan sumando automáticamente mientras ingreso el valor a ese código o nombre y que se almacenen en la base de datos, para luego realizar un reporte con esa información. Le agradezco su ayuda.

    jueves, 30 de mayo de 2019 3:28
  • Hola:
    Para este ejemplo, he creado una tabla con la siguiente estructura

    En un Form como el de la imagen

    Copia y pega el siguiente código

    Option Strict On
    Option Explicit On
    Imports System.ComponentModel
    Imports System.Data.SqlClient
    Imports System.Transactions
    Public Class Form1
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"
        Private moDataTable As New DataTable
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.btnQuitar.Enabled = False
            Me.btnGrabar.Enabled = False
            Me.DataGridView1.AllowUserToAddRows = False
            'Añadimos las columnas.
            moDataTable.Columns.Add(New DataColumn("Codigo", Type.GetType("System.Int32")))
            moDataTable.Columns.Add(New DataColumn("Nombre", Type.GetType("System.String")))
            moDataTable.Columns.Add(New DataColumn("Apellidos", Type.GetType("System.String")))
            moDataTable.Columns.Add(New DataColumn("Valor", Type.GetType("System.Int32")))
            Me.DataGridView1.DataSource = moDataTable
        End Sub
        Private Sub btnAñadir_Click(sender As Object, e As EventArgs) Handles btnAñadir.Click
            If Me.ValidateChildren = False Then
                MessageBox.Show("Datos incompletos", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return
            End If
            If lF_bExisteCodigoDT(CInt(Me.txtCodigo.Text)) Then
                lP_Modificar()
            Else
                lP_Añadir()
            End If
        End Sub
        Private Sub lP_Añadir()
            Dim lDataRow As DataRow = moDataTable.NewRow
            ' Añadimos los datos
            lDataRow.Item("Codigo") = Me.txtCodigo.Text
            lDataRow.Item("Nombre") = Me.txtNombre.Text
            lDataRow.Item("Apellidos") = Me.txtApellidos.Text
            lDataRow.Item("Valor") = Me.txtValor.Text
            ' Agregamos el registros a la colección Rows
            moDataTable.Rows.Add(lDataRow)
            '
            If Me.DataGridView1.RowCount > 0 Then
                Me.btnQuitar.Enabled = True
                Me.btnGrabar.Enabled = True
            End If
            'Limpiar lo controles
            Me.txtCodigo.Text = ""
            Me.txtNombre.Text = ""
            Me.txtApellidos.Text = ""
            Me.txtValor.Text = ""
            Me.txtCodigo.Focus()
            Me.ErrorProvider1.Clear()
        End Sub
        Private Sub lP_Modificar()
            'Buscar la fila con ese codigo
            Dim Fila() As DataRow = moDataTable.Select("Codigo=" & txtCodigo.Text)
            If Fila.Length > 0 Then
                Fila(0).Item("Valor") = CInt(Fila(0).Item("Valor")) + CInt(txtValor.Text)
            End If
            'Limpiar lo controles
            Me.txtCodigo.Text = ""
            Me.txtNombre.Text = ""
            Me.txtApellidos.Text = ""
            Me.txtValor.Text = ""
            Me.txtCodigo.Focus()
        End Sub
        Private Function lF_bExisteCodigoDT(ByVal viCodigo As Integer) As Boolean
            Dim lbRetorno As Boolean = False
            Try
                Dim Consulta = From Valor In moDataTable Where Valor.Field(Of Integer)("Codigo") = viCodigo
                If Consulta.Count() > 0 Then
                    lbRetorno = True
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bExisteCodigoDT", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function
        Private Sub btnQuitar_Click(sender As Object, e As EventArgs) Handles btnQuitar.Click
            lP_Quitar()
        End Sub
        Private Sub lP_Quitar()
            For Each lDataGridViewRow As DataGridViewRow In Me.DataGridView1.SelectedRows
                ' Eliminamos la fila.
                If lDataGridViewRow.Index >= 0 Then
                    Try
                        moDataTable.Rows.RemoveAt(lDataGridViewRow.Index)
                    Catch ex As Exception
                        MessageBox.Show(ex.Message, "lP_Quitar", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End Try
                End If
            Next
            If Me.DataGridView1.RowCount = 0 Then
                Me.btnQuitar.Enabled = False
                Me.btnGrabar.Enabled = False
            End If
        End Sub
        Private Sub btnGrabar_Click(sender As Object, e As EventArgs) Handles btnGrabar.Click
            Dim lsQueryInsert As String = "INSERT INTO prueba (codigo, nombre, apellidos, valor) values (@Codigo, @Nombre, @Apellidos, @Valor)"
            Dim lsQueryUpdate As String = "UPDATE prueba SET valor=valor+@Valor WHERE codigo=@Codigo"
            Try
                'Iniciamos una transaccion; hay que añadir la Referencia System.Transactions
                Using MiTransaccion As New TransactionScope()
                    Using loConexion As New SqlConnection(msCadenaSQL)
                        'Proceso de grabación de datos
                        loConexion.Open()   ' abrir conexión
                        For Each Fila As DataRow In moDataTable.Rows
                            'Ver si el codigo ya esta grabado en la tabla
                            If lF_bExisteCodigoTabla(CInt(Fila.Item("Codigo"))) = True Then
                                Using loComando As New SqlCommand(lsQueryUpdate, loConexion)
                                    'añadir parametros al comando
                                    loComando.Parameters.Add(New SqlParameter("@Codigo", Fila.Item("Codigo")))
                                    loComando.Parameters.Add(New SqlParameter("@Valor", Fila.Item("Valor")))
                                    loComando.ExecuteNonQuery()
                                End Using
                            Else
                                Using loComando As New SqlCommand(lsQueryInsert, loConexion)
                                    'añadir parametros al comando
                                    loComando.Parameters.Add(New SqlParameter("@Codigo", Fila.Item("Codigo")))
                                    loComando.Parameters.Add(New SqlParameter("@Nombre", Fila.Item("Nombre")))
                                    loComando.Parameters.Add(New SqlParameter("@Apellidos", Fila.Item("Apellidos")))
                                    loComando.Parameters.Add(New SqlParameter("@Valor", Fila.Item("Valor")))
                                    loComando.ExecuteNonQuery()
                                End Using
                            End If
                        Next
                    End Using
                    MiTransaccion.Complete()
                End Using
                moDataTable.Clear()
                Me.ErrorProvider1.Clear()
                Me.Cursor = Cursors.Default
                MessageBox.Show("Grabacion Finalizada", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch exOtros As Exception
                Me.Cursor = Cursors.Default
                MessageBox.Show(exOtros.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Function lF_bExisteCodigoTabla(ByVal viCodigo As Integer) As Boolean
            Dim lbRetorno As Boolean = False
            Try
                Dim lsQuery As String = "SELECT COUNT(*) FROM prueba WHERE codigo=@Codigo"
                Using loConexion As New SqlConnection(msCadenaSQL)
                    ' crear comando
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        'añadir parametro al comando
                        loComando.Parameters.Add(New SqlParameter("@Codigo", viCodigo))
                        loConexion.Open()   ' abrir conexión
                        lbRetorno = CInt(loComando.ExecuteScalar()) > 0
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bExisteCodigoTabla", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function
        Private Sub txtCodigo_Validating(sender As Object, e As CancelEventArgs) Handles txtCodigo.Validating
            If Me.txtCodigo.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProvider1.SetError(Me.txtCodigo, "Introduzca el Codigo")
            Else
                Me.ErrorProvider1.SetError(Me.txtCodigo, Nothing)
            End If
        End Sub
        Private Sub txtNombre_Validating(sender As Object, e As CancelEventArgs) Handles txtNombre.Validating
            If Me.txtNombre.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProvider1.SetError(Me.txtNombre, "Introduzca el Nombre")
            Else
                Me.ErrorProvider1.SetError(Me.txtNombre, Nothing)
            End If
        End Sub
        Private Sub txtApellidos_Validating(sender As Object, e As CancelEventArgs) Handles txtApellidos.Validating
            If Me.txtApellidos.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProvider1.SetError(Me.txtApellidos, "Introduzca el Apellido")
            Else
                Me.ErrorProvider1.SetError(Me.txtApellidos, Nothing)
            End If
        End Sub

        Private Sub txtValor_Validating(sender As Object, e As CancelEventArgs) Handles txtValor.Validating
            If Me.txtValor.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProvider1.SetError(Me.txtValor, "Introduzca el Valor")
            Else
                Me.ErrorProvider1.SetError(Me.txtValor, Nothing)
            End If
        End Sub
    End Class

    P.D.
    Pruebalo y mira como funciona, y despues lo adaptas al proyecto tuyo

    Un saludo desde Bilbo
    Carlos

    jueves, 30 de mayo de 2019 6:36
  • Hola:
    Para este ejemplo, he creado una tabla con la siguiente estructura

    En un Form como el de la imagen

    Copia y pega el siguiente código

    Option Strict On
    Option Explicit On
    Imports System.ComponentModel
    Imports System.Data.SqlClient
    Imports System.Transactions
    Public Class Form1
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"
        Private moDataTable As New DataTable
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.btnQuitar.Enabled = False
            Me.btnGrabar.Enabled = False
            Me.DataGridView1.AllowUserToAddRows = False
            'Añadimos las columnas.
            moDataTable.Columns.Add(New DataColumn("Codigo", Type.GetType("System.Int32")))
            moDataTable.Columns.Add(New DataColumn("Nombre", Type.GetType("System.String")))
            moDataTable.Columns.Add(New DataColumn("Apellidos", Type.GetType("System.String")))
            moDataTable.Columns.Add(New DataColumn("Valor", Type.GetType("System.Int32")))
            Me.DataGridView1.DataSource = moDataTable
        End Sub
        Private Sub btnAñadir_Click(sender As Object, e As EventArgs) Handles btnAñadir.Click
            If Me.ValidateChildren = False Then
                MessageBox.Show("Datos incompletos", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return
            End If
            If lF_bExisteCodigoDT(CInt(Me.txtCodigo.Text)) Then
                lP_Modificar()
            Else
                lP_Añadir()
            End If
        End Sub
        Private Sub lP_Añadir()
            Dim lDataRow As DataRow = moDataTable.NewRow
            ' Añadimos los datos
            lDataRow.Item("Codigo") = Me.txtCodigo.Text
            lDataRow.Item("Nombre") = Me.txtNombre.Text
            lDataRow.Item("Apellidos") = Me.txtApellidos.Text
            lDataRow.Item("Valor") = Me.txtValor.Text
            ' Agregamos el registros a la colección Rows
            moDataTable.Rows.Add(lDataRow)
            '
            If Me.DataGridView1.RowCount > 0 Then
                Me.btnQuitar.Enabled = True
                Me.btnGrabar.Enabled = True
            End If
            'Limpiar lo controles
            Me.txtCodigo.Text = ""
            Me.txtNombre.Text = ""
            Me.txtApellidos.Text = ""
            Me.txtValor.Text = ""
            Me.txtCodigo.Focus()
            Me.ErrorProvider1.Clear()
        End Sub
        Private Sub lP_Modificar()
            'Buscar la fila con ese codigo
            Dim Fila() As DataRow = moDataTable.Select("Codigo=" & txtCodigo.Text)
            If Fila.Length > 0 Then
                Fila(0).Item("Valor") = CInt(Fila(0).Item("Valor")) + CInt(txtValor.Text)
            End If
            'Limpiar lo controles
            Me.txtCodigo.Text = ""
            Me.txtNombre.Text = ""
            Me.txtApellidos.Text = ""
            Me.txtValor.Text = ""
            Me.txtCodigo.Focus()
        End Sub
        Private Function lF_bExisteCodigoDT(ByVal viCodigo As Integer) As Boolean
            Dim lbRetorno As Boolean = False
            Try
                Dim Consulta = From Valor In moDataTable Where Valor.Field(Of Integer)("Codigo") = viCodigo
                If Consulta.Count() > 0 Then
                    lbRetorno = True
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bExisteCodigoDT", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function
        Private Sub btnQuitar_Click(sender As Object, e As EventArgs) Handles btnQuitar.Click
            lP_Quitar()
        End Sub
        Private Sub lP_Quitar()
            For Each lDataGridViewRow As DataGridViewRow In Me.DataGridView1.SelectedRows
                ' Eliminamos la fila.
                If lDataGridViewRow.Index >= 0 Then
                    Try
                        moDataTable.Rows.RemoveAt(lDataGridViewRow.Index)
                    Catch ex As Exception
                        MessageBox.Show(ex.Message, "lP_Quitar", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End Try
                End If
            Next
            If Me.DataGridView1.RowCount = 0 Then
                Me.btnQuitar.Enabled = False
                Me.btnGrabar.Enabled = False
            End If
        End Sub
        Private Sub btnGrabar_Click(sender As Object, e As EventArgs) Handles btnGrabar.Click
            Dim lsQueryInsert As String = "INSERT INTO prueba (codigo, nombre, apellidos, valor) values (@Codigo, @Nombre, @Apellidos, @Valor)"
            Dim lsQueryUpdate As String = "UPDATE prueba SET valor=valor+@Valor WHERE codigo=@Codigo"
            Try
                'Iniciamos una transaccion; hay que añadir la Referencia System.Transactions
                Using MiTransaccion As New TransactionScope()
                    Using loConexion As New SqlConnection(msCadenaSQL)
                        'Proceso de grabación de datos
                        loConexion.Open()   ' abrir conexión
                        For Each Fila As DataRow In moDataTable.Rows
                            'Ver si el codigo ya esta grabado en la tabla
                            If lF_bExisteCodigoTabla(CInt(Fila.Item("Codigo"))) = True Then
                                Using loComando As New SqlCommand(lsQueryUpdate, loConexion)
                                    'añadir parametros al comando
                                    loComando.Parameters.Add(New SqlParameter("@Codigo", Fila.Item("Codigo")))
                                    loComando.Parameters.Add(New SqlParameter("@Valor", Fila.Item("Valor")))
                                    loComando.ExecuteNonQuery()
                                End Using
                            Else
                                Using loComando As New SqlCommand(lsQueryInsert, loConexion)
                                    'añadir parametros al comando
                                    loComando.Parameters.Add(New SqlParameter("@Codigo", Fila.Item("Codigo")))
                                    loComando.Parameters.Add(New SqlParameter("@Nombre", Fila.Item("Nombre")))
                                    loComando.Parameters.Add(New SqlParameter("@Apellidos", Fila.Item("Apellidos")))
                                    loComando.Parameters.Add(New SqlParameter("@Valor", Fila.Item("Valor")))
                                    loComando.ExecuteNonQuery()
                                End Using
                            End If
                        Next
                    End Using
                    MiTransaccion.Complete()
                End Using
                moDataTable.Clear()
                Me.ErrorProvider1.Clear()
                Me.Cursor = Cursors.Default
                MessageBox.Show("Grabacion Finalizada", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch exOtros As Exception
                Me.Cursor = Cursors.Default
                MessageBox.Show(exOtros.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Function lF_bExisteCodigoTabla(ByVal viCodigo As Integer) As Boolean
            Dim lbRetorno As Boolean = False
            Try
                Dim lsQuery As String = "SELECT COUNT(*) FROM prueba WHERE codigo=@Codigo"
                Using loConexion As New SqlConnection(msCadenaSQL)
                    ' crear comando
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        'añadir parametro al comando
                        loComando.Parameters.Add(New SqlParameter("@Codigo", viCodigo))
                        loConexion.Open()   ' abrir conexión
                        lbRetorno = CInt(loComando.ExecuteScalar()) > 0
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_bExisteCodigoTabla", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function
        Private Sub txtCodigo_Validating(sender As Object, e As CancelEventArgs) Handles txtCodigo.Validating
            If Me.txtCodigo.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProvider1.SetError(Me.txtCodigo, "Introduzca el Codigo")
            Else
                Me.ErrorProvider1.SetError(Me.txtCodigo, Nothing)
            End If
        End Sub
        Private Sub txtNombre_Validating(sender As Object, e As CancelEventArgs) Handles txtNombre.Validating
            If Me.txtNombre.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProvider1.SetError(Me.txtNombre, "Introduzca el Nombre")
            Else
                Me.ErrorProvider1.SetError(Me.txtNombre, Nothing)
            End If
        End Sub
        Private Sub txtApellidos_Validating(sender As Object, e As CancelEventArgs) Handles txtApellidos.Validating
            If Me.txtApellidos.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProvider1.SetError(Me.txtApellidos, "Introduzca el Apellido")
            Else
                Me.ErrorProvider1.SetError(Me.txtApellidos, Nothing)
            End If
        End Sub

        Private Sub txtValor_Validating(sender As Object, e As CancelEventArgs) Handles txtValor.Validating
            If Me.txtValor.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProvider1.SetError(Me.txtValor, "Introduzca el Valor")
            Else
                Me.ErrorProvider1.SetError(Me.txtValor, Nothing)
            End If
        End Sub
    End Class

    P.D.
    Pruebalo y mira como funciona, y despues lo adaptas al proyecto tuyo

    Un saludo desde Bilbo
    Carlos

    Buen día, Franklin ese código puede ser una buena opción. Otra opción como te comentaba antes, es directamente en el datagridView donde mostras el DataSet que llenas con los datos de tu tabla de BD, utilizando la propiedad selectedfullrowselect del datagridview seleccionas la fila a modificar, asegurate de que el datagridview no tenga en true la propiedad de seleccion múltiple. Luego con el evento selectionChanged del datagrid extraes el ID de ese registro, el ID esta esta seguramente lo tenes en la columna "0" oculta en el datagrid.

    El ID te servirá como parámetro para hacer una pequeña función, que conecte con la BD y que sume el valor que tiene actual + el importe ingresado en un txt, luego actualizar y por ultimo volver a correr la función donde generas el dataSet y luego imprimis el datagrid.

    Saludos Guille.

    jueves, 30 de mayo de 2019 14:20
  • Hola:

    ¿Para que quieres un DGV si solo puedes modificar 1 fila, porque si quieres modificar mas de 1, antes tienes que validarlas?
    Para eso es mejor poner tantos controles como campos quieres modificar


    Un saludo desde Bilbo
    Carlos

    jueves, 30 de mayo de 2019 19:11