none
contador en datagridview RRS feed

  • Pregunta

  • Buenas a todos/as

    Programo en vb.net

    Tengo un pequeño sistema de ventas.

    Los productos cunados se agregan a la facturación se ven así: ver Imagen.

    Con este código controlo que no se introduzcan productos o artículos repetidos al datagridview.

     If DGVDetalle_Factura.Rows.Cast(Of DataGridViewRow).Where(Function(r) Not r.IsNewRow).Any(Function(r) CStr(r.Cells(1).Value) = txtCodigoProducto.Text) Then
                        MsgBox("El Producto ya existe en la lista ")
                        txtCodigoProducto.Clear()
                        txtCodigoProducto.Focus()
                        Return
                    End If

    Ya este código no lo quiero, lo que quiero es, que cuando detecte un producto o artículo que ya existe en el datagridview; no quiero que salga este mensaje ("El Producto ya existe en la lista "), en vez de eso que sume un numero a la columna cantidad en el datagridview.

    Es decir que si agrego un producto varias veces lo valla sumando en la columna cantidad en el datagridview.

    Espero su ayuda.

    Gracias por adelantado.


    sábado, 4 de mayo de 2019 14:41

Respuestas

  • Hola:
    En un Form como el de la imagen

    Copia y pega el siguiente código

    Public Class Form3
        Private mdtDataTable As New DataTable
        Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.dgv.AllowUserToAddRows = False
            'Añadimos las columnas.
            mdtDataTable.Columns.Add(New DataColumn("Producto", Type.GetType("System.Int32")))
            mdtDataTable.Columns.Add(New DataColumn("Descripcion", Type.GetType("System.String")))
            mdtDataTable.Columns.Add(New DataColumn("Cantidad", Type.GetType("System.Int32")))
            '
            Dim lDataRow As DataRow = mdtDataTable.NewRow
            lDataRow.Item("Producto") = 1
            lDataRow.Item("Descripcion") = "aaa"
            lDataRow.Item("Cantidad") = 1
            mdtDataTable.Rows.Add(lDataRow)
            '
            lDataRow = mdtDataTable.NewRow
            lDataRow.Item("Producto") = 2
            lDataRow.Item("Descripcion") = "bbb"
            lDataRow.Item("Cantidad") = 1
            mdtDataTable.Rows.Add(lDataRow)
            '
            lDataRow = mdtDataTable.NewRow
            lDataRow.Item("Producto") = 1
            lDataRow.Item("Descripcion") = "aaa"
            lDataRow.Item("Cantidad") = 2
            mdtDataTable.Rows.Add(lDataRow)
            '
            Me.dgv.DataSource = mdtDataTable
        End Sub
        Private Sub btnAñadir_Click(sender As Object, e As EventArgs) Handles btnAñadir.Click
            Dim lDataRow As DataRow = mdtDataTable.NewRow
            lDataRow.Item("Producto") = CInt(txtProducto.Text)
            lDataRow.Item("Descripcion") = txtDescripcion.Text
            lDataRow.Item("Cantidad") = lF_iCantidad(CInt(txtProducto.Text))
            mdtDataTable.Rows.Add(lDataRow)
            '
            Me.txtProducto.Text = ""
            Me.txtDescripcion.Text = ""
        End Sub

        Private Function lF_iCantidad(ByVal viProducto As Integer) As Integer
            Dim liRetorno As Integer = 0
            Try
                Dim Consulta = From dt In mdtDataTable.AsEnumerable Where dt.Field(Of Integer)("Producto") = viProducto Group By Producto = dt.Field(Of Integer)("Producto") Into row = Group, Contador = Count() Select Producto, Contador
                '
                For Each datos In Consulta
                    liRetorno = datos.Contador + 1
                Next
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return liRetorno
        End Function
    End Class

    Un saludo desde Bilbo
    Carlos

    martes, 7 de mayo de 2019 9:17

Todas las respuestas

  • Hola  

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te hago la recomendación de ingresar al siguiente enlace en donde puedes encontrar una posible solución para tu problema.

    https://www.incanatoit.com/2014/12/contadores-acumuladores-programacion-visual-basic-net.html

    http://www.foro.vb-mundo.com/forum/programacion/visual-basic-net/149689-contador-en-vb-net

    https://social.msdn.microsoft.com/Forums/es-ES/acb0899a-801d-4467-9cbe-d632368f9b16/contador-y-acumulador-en-c?forum=vcses

    Gracias por usar los foros de MSDN.

    Carlos Ruiz
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
    • Propuesto como respuesta Pablo Rubio viernes, 10 de mayo de 2019 14:32
    lunes, 6 de mayo de 2019 14:56
  • Gracias por contestar 

    me podrías poner un ejemplo, ya que el problema es complejo.  Es decir que si agrego un producto varias veces lo valla sumando en la columna cantidad en el datagridview.

    por ejemplo, si agrego 3 veces el producto teclado, en la columna cantidad del datagridviewdebería  salir 3

    lunes, 6 de mayo de 2019 16:17
  • Buenas tardes estimado ¿Dónde se encuentra almacenada la información y como realiza el ingreso del producto?

    • Editado Tintina lunes, 6 de mayo de 2019 20:35
    lunes, 6 de mayo de 2019 20:31
  • Gracias por contestar

    la información se encuentra en la base de datos SQL SERVER

    PARA CARGAR EL GRID, realiza la siguiente búsqueda. 

      Private Sub txtCodigoProducto_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtCodigoProducto.KeyDown
    
    
    
            Dim MiClase As New conexion2
    
    
    
            If (e.KeyData = Keys.Enter) Then
    
    
                Dim DescripcionEncontrada As String
                Dim PresionUnitarioEncontrada As String
                Dim CantidadEncontrada As String
                Dim Activo01 As String
    
                If Trim(txtCodigoProducto.Text) = "" Then
                    MsgBox("Debe introducir un código del producto")
                    txtCodigoProducto.Focus()
                    Return
                End If
    
                If DGVDetalle_Factura.Rows.Cast(Of DataGridViewRow).Where(Function(r) Not r.IsNewRow).Any(Function(r) CStr(r.Cells(1).Value) = txtCodigoProducto.Text) Then
                    MsgBox("El Producto ya existe en la lista")
                    txtCodigoProducto.Clear()
                    txtCodigoProducto.Focus()
                    Return
                End If
    
                'Determinar si un producto esta vencido **************************************************************************************************               
                Dim Result As String = MiClase.FuncionBusqueda2("SELECT DATEDIFF(DAY, GETDATE(), fech_expiracion) as dias FROM Tbla_Producto WHERE ProductoConExpiracion = 'SI' AND cod_producto = '" & txtCodigoProducto.Text & "'")
    
    
    
                If Not String.IsNullOrEmpty(Result) Then
                    Dim DiasFaltantes As Double = Convert.ToDouble(Result)
                    If DiasFaltantes < 0 Then
                        MessageBox.Show(String.Format("No se puede agregar el producto, éste venció (expiró) hace {0} días", DiasFaltantes))
                        txtCodigoProducto.Clear()
                        txtCodigoProducto.Focus()
                        Return
                    ElseIf DiasFaltantes > 0 And DiasFaltantes <= 15 Then
    
                        MessageBox.Show(String.Format("Advertencia, solo Faltan {0} días para vencerse (expirar) el producto   ", DiasFaltantes))
                    End If
                    'End If
                End If
    
                   ***********************************************************************************               
    
    
    
                Dim Parametros As New List(Of SqlParameter)
    
                Parametros.Add(New SqlParameter("@cod_producto", Convert.ToString(txtCodigoProducto.Text)))
    
                Dim DescripcionEncontrada0x As String = Convert.ToString(MiClase.FuncionBusqueda03(" Select descrip_Producto FROM Tbla_Producto WHERE cod_producto = @cod_producto", Parametros.ToArray()))
    
                DescripcionEncontrada = DescripcionEncontrada0x
    
                If Convert.ToString(DescripcionEncontrada) = "" Then
                    MsgBox("producto no existe")
                    txtCodigoProducto.Clear()
                    txtCodigoProducto.Focus()
                    Return
                End If
    
    
    
                PresionUnitarioEncontrada = MiClase.FuncionBusqueda("Select precio_ventaALDetalle  From Tbla_Producto Where cod_producto ='" & txtCodigoProducto.Text & "'  ")
                Dim PresionUnitarioEncontrada02 As Double
                PresionUnitarioEncontrada02 = Format(CType(PresionUnitarioEncontrada, Double), "#,##0.00")
    
    
    
                CantidadEncontrada = MiClase.FuncionBusqueda("Select cantidad  From Tbla_Producto Where cod_producto ='" & txtCodigoProducto.Text & "'  ")
                'Activo >0 and
    
                Dim ITBIS2 As String
                ITBIS2 = MiClase.FuncionBusqueda2("Select porcentajeDEITBIS  From Tbla_Producto Where  cod_producto='" & txtCodigoProducto.Text & "'  ")
    
    
    
                If CantidadEncontrada = 0 Then
                    MsgBox("Se ha agotado la existencia de este producto")
                    txtCodigoProducto.Clear()
                    txtCodigoProducto.Focus()
                    Return
                End If
                '************************************************
    
                Activo01 = MiClase.FuncionBusqueda("Select Activo  From Tbla_Producto Where cod_producto ='" & txtCodigoProducto.Text & "'  ")
    
    
                If Activo01 = 0 Then
                    MsgBox("Este producto está inactivo.")
                    txtCodigoProducto.Clear()
                    txtCodigoProducto.Focus()
                    Return
                End If
    
                '*************************************************************
    
                If DGVDetalle_Factura.Rows.Cast(Of DataGridViewRow).Where(Function(r) Not r.IsNewRow).Any(Function(r) CStr(r.Cells(1).Value) = txtCodigoProducto.Text) Then
                    MsgBox("El Producto ya existe en la lista")
                    txtCodigoProducto.Clear()
                    txtCodigoProducto.Focus()
                    Return
                End If
    
    
                DGVDetalle_Factura.Rows.Add(Str(txtCodigoFactura.Text), txtCodigoProducto.Text, DescripcionEncontrada, 1, PresionUnitarioEncontrada02, (Val(PresionUnitarioEncontrada / 100) * ITBIS2 * 1), 0.0)
                '
            End If
    

    gracias por adelantado. 

    • Propuesto como respuesta Carlos_Ruiz_M lunes, 6 de mayo de 2019 22:54
    lunes, 6 de mayo de 2019 21:00
  • Hola:
    En un Form como el de la imagen

    Copia y pega el siguiente código

    Public Class Form3
        Private mdtDataTable As New DataTable
        Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.dgv.AllowUserToAddRows = False
            'Añadimos las columnas.
            mdtDataTable.Columns.Add(New DataColumn("Producto", Type.GetType("System.Int32")))
            mdtDataTable.Columns.Add(New DataColumn("Descripcion", Type.GetType("System.String")))
            mdtDataTable.Columns.Add(New DataColumn("Cantidad", Type.GetType("System.Int32")))
            '
            Dim lDataRow As DataRow = mdtDataTable.NewRow
            lDataRow.Item("Producto") = 1
            lDataRow.Item("Descripcion") = "aaa"
            lDataRow.Item("Cantidad") = 1
            mdtDataTable.Rows.Add(lDataRow)
            '
            lDataRow = mdtDataTable.NewRow
            lDataRow.Item("Producto") = 2
            lDataRow.Item("Descripcion") = "bbb"
            lDataRow.Item("Cantidad") = 1
            mdtDataTable.Rows.Add(lDataRow)
            '
            lDataRow = mdtDataTable.NewRow
            lDataRow.Item("Producto") = 1
            lDataRow.Item("Descripcion") = "aaa"
            lDataRow.Item("Cantidad") = 2
            mdtDataTable.Rows.Add(lDataRow)
            '
            Me.dgv.DataSource = mdtDataTable
        End Sub
        Private Sub btnAñadir_Click(sender As Object, e As EventArgs) Handles btnAñadir.Click
            Dim lDataRow As DataRow = mdtDataTable.NewRow
            lDataRow.Item("Producto") = CInt(txtProducto.Text)
            lDataRow.Item("Descripcion") = txtDescripcion.Text
            lDataRow.Item("Cantidad") = lF_iCantidad(CInt(txtProducto.Text))
            mdtDataTable.Rows.Add(lDataRow)
            '
            Me.txtProducto.Text = ""
            Me.txtDescripcion.Text = ""
        End Sub

        Private Function lF_iCantidad(ByVal viProducto As Integer) As Integer
            Dim liRetorno As Integer = 0
            Try
                Dim Consulta = From dt In mdtDataTable.AsEnumerable Where dt.Field(Of Integer)("Producto") = viProducto Group By Producto = dt.Field(Of Integer)("Producto") Into row = Group, Contador = Count() Select Producto, Contador
                '
                For Each datos In Consulta
                    liRetorno = datos.Contador + 1
                Next
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return liRetorno
        End Function
    End Class

    Un saludo desde Bilbo
    Carlos

    martes, 7 de mayo de 2019 9:17
  • buenos días y perdón por la demora.

    La forma mas sencilla para verificar que se encuentra dicho elemento ingresado es recorrer el DGV:

    Dim i As Integer =

    While i < DGVistaimagenes.Rows.Count

                if DGVistaimagenes.Rows(i).Cells(2).Value = txtDescripcion.text then

               DGVistaimagenes.Rows(i).Cells(2).Value = DGVistaimagenes.Rows(i).Cells(2).Value + 1

                '-----------------------------------------------

                en esta sección actualizas la base de datos

                '------------------------------------------------

                'salimos del ciclo

                end while

                end if

                i= i +1

    end while

    Espero que haya resuelto tu duda

    Saludos

    • Propuesto como respuesta Pablo Rubio viernes, 10 de mayo de 2019 14:32
    martes, 7 de mayo de 2019 14:50
  • saludos a todos, 

    todavía no he podido, adaptar el código lamentablemente, 

    jueves, 9 de mayo de 2019 23:12