none
datagridview RRS feed

  • Pregunta

  • buenas tardes, quisiera solicitar su apoyo.

    esta ocasión, me enfrento al siguiente problema:

    estoy realizando un programa para la captura de un inventario, el formulario es bastante sencillo,

    solo 4 cuadros de texto y un datagridview.

    el primer textbox, grabara un numero de tienda

    el segundo textbox grabara el mueble

    el tercer textbox grabara el código y

    el cuarto textbox grabara la cantidad de piezas de ese codigo

    mi problema en particular es el siguiente.

    cuando ingreso un código ej: 0102056895 con la cantidad de piezas de 5, y posterior mente vuelvo a encontrar el mismo código con 8 piezas.

    el código en el datagridview se repite.

    como podría hacer para que el código no se repita, y que las cantidades del mismo código se sumen.

    ej. aparece 2 veces el código 0104010256  con 3 y 10 piezas

    solo quiero que aparezca una sola vez y la cantidad en automático se valla sumando y en vez de aparecer 2 cantidades de 3 y 10

    solo aparezca una por 13 piezas.

    agradezco de antemano sus respuestas.

    muchas gracias.

    jueves, 24 de agosto de 2017 21:52

Respuestas

  • Hola:

     lo que estaria nesecitando es que en el datagrid los codigos repetidos de un mueble se agrupen y solo me muestre un codigo con el total de piezas pero por mueble ej:

    en el mueble u546 tengo un 0104020156 con 35 piezas

    y en el mismo mueble encuentro el mismo codigo con 10 piezas que el total del codigo en ese mueble sea de 45

    y posteriormente en el mueble u612 nuevamente aparece el codigo 0104020156 con 10 piezas 

    que quede registrado en el datagrid en el mueble u546 con 45 piezas

    y en el u612 con 10 piezas.

     Entonces vamos por el camino correcto:

    Usa una Lista Genérica de clases y el DataSource del control

     Te dejo un ejemplo adaptado a tus necesidades comentadas:

    Public Class Form1
        Private _inventarioList  As New List(Of Inventario)()
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            _inventarioList = New List(Of Inventario)()
        End Sub
    
        Private Sub textBox4_KeyDown(sender As Object, e As KeyEventArgs) Handles textBox4.KeyDown
    
            If (e.KeyCode = Keys.Enter) Then
    
                If (Not String.IsNullOrWhiteSpace(textBox4.Text)) Then
    
                    Dim inventario As New Inventario()
                    inventario.Tienda = Convert.ToInt16(textBox1.Text)
                    inventario.Mueble = textBox2.Text
                    inventario.Codigo = textBox3.Text
                    inventario.Cantidad = Convert.ToDecimal(textBox4.Text)
    
                    Add(inventario)
    
                    dataGridView1.DataSource = Nothing
                    dataGridView1.DataSource = _inventarioList
                End If
            End If
        End Sub
    
        Private Sub Add(ByVal inventario As Inventario)
            If (Not _inventarioList.Any(Function(x) x.Mueble = inventario.Mueble And x.Codigo.Equals(inventario.Codigo))) Then
                _inventarioList.Add(inventario)
            Else
                For Each item As Inventario In _inventarioList
                    If (item.Mueble = inventario.Mueble And item.Codigo = inventario.Codigo) Then
                        item.Cantidad += inventario.Cantidad
                    End If
                Next
            End If
        End Sub
    End Class
    
    Public Class Inventario
        Public Property Tienda() As Integer
        Public Property Referencia() As String
        Public Property Mueble() As String
        Public Property Codigo() As String
        Public Property Cantidad() As Decimal
    End Class

    Resultado:

    Considero importante comentar, que las columnas del DataGridView estan vinculadas a los nombres de las propiedades de la clase en tiempo de diseño:

    Cada columna tiene mapeada una propiedad de la clase.

     Después de todo esto, solo restaría exportar la información tomando como fuente la LISTA GENÉRICA y como veras, para nada tendrás que meterte con el control DataGridView.

     Descarga el proyecto desde este link:

    TomaFisica-VB.NET 

     Espero que la información proporcionada te sea de utilidad.


    Saludos desde Monterrey, Nuevo León, México!!!

    sábado, 26 de agosto de 2017 13:52

Todas las respuestas

  • Hola SNAKE, pordrías decirnos de donde obtienes los datos, o sea base de datos supongo, pero además como cargas para consultar ej: DataTable, teniendo esos datos abría que evaluar la mejor forma de sumar, ya sea recorriendo el Table o directamente efectuando la consulta predeterminada al la base.

    Saludos

    jueves, 24 de agosto de 2017 22:58
  • Hola,

    La lógica sería: en el evento que agregas el registro primero debes recorrer el campo código de tu tabla (con un bucle for por ejemplo) adentro condiciona con un if si el código existe, si existe sumas en ese registro el campo cantidad, si no existe generas un nuevo registro.

    Esa sería una opción, si nos das más detalles de cómo cargas los datos te podríamos ayudar con tu código.

    Suerte!


    viernes, 25 de agosto de 2017 1:07
  • Hola Snake:

     La resolución de tu problema es sencillo, aunque dependerá de forma directa de como es que estés llenando el control DataGridView, te diré que existen dos formas:

    1. Utilizando la propiedad DataSource del control DataGridView ligándolo una colección como un DataTable o una Lista Genérica de clases, te diré que personalmente, prefiero las listas.

     Esta forma de trabajar tiene muchas ventajas ya que llenas un solo objeto y puedes utilizarlo para varios fines, entre ellos:

     a) Enviar la colección a la Bd sin necesidad de recorrer el control tomando los valores de las celdas

     b) Utilizando Linq, podrías fácilmente realizar cálculos matemáticos, como la sumatoria del Total de Precios, o total de productos ingresados,  esto en una sola linea de código y nuevamente sin tocar para nada el control, en este caso, el control pasa a segundo termino siendo solo un visor de datos ya que siempre trabajaras sobre la colección (Lista Genérica).

    2. Utilizar el método Add del Rows Collection del control, es decir, llenar el control manualmente, con este método siempre trabajaras ligado al control, si quieres sumar los totales, puedes recorrer el control o bien puedes usar Linq pero su uso es un poquito mas "compleja" (ojo que entrecomille compleja para que aquellos con mas experiencia no se alteren), si quieres eliminar un producto, tienes que eliminar el row, si quieres validar la existencia de uno, tienes que recorrer el control, si quisieras enviar la información capturada a la Bd tienes que recorrer el control, entonces, esta segunda opción no me gusta mucho (nuevamente remarco que de cualquier forma se recorre la colección de Rows del control, usando Linq (solo que Linq hace esto por debajo, quitándote la tarea de implementarlo explicitamente) o por medio explicito de un ciclo for, foreach, while):

     Entonces, si me preguntas ¿como solucionar tu necesidad de evitar artículos duplicados y en caso de existir sumar las cantidades?, te diré que, ¡usando una Lista Genérica de Clases!.

     En este articulo abordo estas dos formas de llenar el control y como hacer la validación que deseas, esa y otras funciones comunes que estoy seguro te seran de mucha utilidad:

    Llenar DataGridView con datos de TextBox’s usando Datasource o el método Add() 

      Lee el articulo y analiza lo ahí planteado, al final podrás encontrar el proyecto de descarga para Vb.Net que de cualquier forma aquí te dejo el link:

    LlenarDataGridView-Vb.Net 

    Analiza el código y si tienes alguna duda por favor hasmela saber.

     


    Saludos desde Monterrey, Nuevo León, México!!!


    viernes, 25 de agosto de 2017 2:10
  • buenas tardes, quisiera solicitar su apoyo.

    esta ocasión, me enfrento al siguiente problema:

    estoy realizando un programa para la captura de un inventario, el formulario es bastante sencillo,

    solo 4 cuadros de texto y un datagridview.

    el primer textbox, grabara un numero de tienda

    el segundo textbox grabara el mueble

    el tercer textbox grabara el código y

    el cuarto textbox grabara la cantidad de piezas de ese codigo

    mi problema en particular es el siguiente.

    cuando ingreso un código ej: 0102056895 con la cantidad de piezas de 5, y posterior mente vuelvo a encontrar el mismo código con 8 piezas.

    el código en el datagridview se repite.

    como podría hacer para que el código no se repita, y que las cantidades del mismo código se sumen.

    ej. aparece 2 veces el código 0104010256  con 3 y 10 piezas

    solo quiero que aparezca una sola vez y la cantidad en automático se valla sumando y en vez de aparecer 2 cantidades de 3 y 10

    solo aparezca una por 13 piezas.

    agradezco de antemano sus respuestas.

    muchas gracias.

    muchas gracias a todos, los datos los voy ingresando manualmente con los textbox codigo y cantidad

    mi objetivo es este:

    en una empresa en donde laboro hay que hacer inventarios, manejamos terminales motorola, las cuales nos facilitan el trabajo, cuando hacemos un inventario a la terminal tenemos que ponerle el numero de tienda en donde estamos trabajando, un numero de mueble, una referencia y posteriormente el codigo y la cantidad.

    una vez capturado y descargada la informacion de la terminal a la pc manda un archivo de texto, el cual procesamos en excel para darle texto en columnas

    ahora con el programa, se introduciria el todos los datos al datagrid, y posteriormente se exportaria todo el contenido de este control a un libro de excel.

    y lo que estaria nesecitando es que en el datagrid los codigos repetidos de un mueble se agrupen y solo me muestre un codigo con el total de piezas pero por mueble ej:

    en el mueble u546 tengo un 0104020156 con 35 piezas

    y en el mismo mueble encuentro el mismo codigo con 10 piezas que el total del codigo en ese mueble sea de 45

    y posteriormente en el mueble u612 nuevamente aparece el codigo 0104020156 con 10 piezas 

    que quede registrado en el datagrid en el mueble u546 con 45 piezas

    y en el u612 con 10 piezas.

    no se si me haya explicado.

    de lo contrario discupen por no saber expresarme correctamente.

    viernes, 25 de agosto de 2017 18:31
  • buenas tardes Marcelo, los datos los ingreso manualmente de los textbox codigo y cantidad
    viernes, 25 de agosto de 2017 18:33
  • muchas gracias Fernando, no comprendo del todo tu respuesta pero a la que entiendo creo es una muy buena opcion.
    viernes, 25 de agosto de 2017 18:35
  • muchas gracias Jose Luis. dare una revision a las ligas que dejas, agradesco mucho el apoyo.
    viernes, 25 de agosto de 2017 18:36
  • Snake,

    Por lo que observo la idea es volver a cargar nuevamente todo de forma manual como ya lo habían hecho con el terminal Motorola?

    No te convendría capturar automáticamente los datos que ya tenés en el archivo Excel o el txt?

    O sea capturas los datos para luego volver a exportarlos a otro Excel?

    Creo que por lo que necesitas ni siquiera haría falta un datagridview.

    Con solo un botón en tu formulario y solo código tendrías lo que estás buscando.

    Es mi humilde opinión.

    De todas formas si vas a seguir por el camino del formulario de la forma que planteas necesitariamos saber técnicamente como pasas los datos, mostranos el código que se ejecuta con el F12 propuesto para que te digamos por qué camino vas.

    viernes, 25 de agosto de 2017 19:38
  • Hola:

     lo que estaria nesecitando es que en el datagrid los codigos repetidos de un mueble se agrupen y solo me muestre un codigo con el total de piezas pero por mueble ej:

    en el mueble u546 tengo un 0104020156 con 35 piezas

    y en el mismo mueble encuentro el mismo codigo con 10 piezas que el total del codigo en ese mueble sea de 45

    y posteriormente en el mueble u612 nuevamente aparece el codigo 0104020156 con 10 piezas 

    que quede registrado en el datagrid en el mueble u546 con 45 piezas

    y en el u612 con 10 piezas.

     Entonces vamos por el camino correcto:

    Usa una Lista Genérica de clases y el DataSource del control

     Te dejo un ejemplo adaptado a tus necesidades comentadas:

    Public Class Form1
        Private _inventarioList  As New List(Of Inventario)()
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            _inventarioList = New List(Of Inventario)()
        End Sub
    
        Private Sub textBox4_KeyDown(sender As Object, e As KeyEventArgs) Handles textBox4.KeyDown
    
            If (e.KeyCode = Keys.Enter) Then
    
                If (Not String.IsNullOrWhiteSpace(textBox4.Text)) Then
    
                    Dim inventario As New Inventario()
                    inventario.Tienda = Convert.ToInt16(textBox1.Text)
                    inventario.Mueble = textBox2.Text
                    inventario.Codigo = textBox3.Text
                    inventario.Cantidad = Convert.ToDecimal(textBox4.Text)
    
                    Add(inventario)
    
                    dataGridView1.DataSource = Nothing
                    dataGridView1.DataSource = _inventarioList
                End If
            End If
        End Sub
    
        Private Sub Add(ByVal inventario As Inventario)
            If (Not _inventarioList.Any(Function(x) x.Mueble = inventario.Mueble And x.Codigo.Equals(inventario.Codigo))) Then
                _inventarioList.Add(inventario)
            Else
                For Each item As Inventario In _inventarioList
                    If (item.Mueble = inventario.Mueble And item.Codigo = inventario.Codigo) Then
                        item.Cantidad += inventario.Cantidad
                    End If
                Next
            End If
        End Sub
    End Class
    
    Public Class Inventario
        Public Property Tienda() As Integer
        Public Property Referencia() As String
        Public Property Mueble() As String
        Public Property Codigo() As String
        Public Property Cantidad() As Decimal
    End Class

    Resultado:

    Considero importante comentar, que las columnas del DataGridView estan vinculadas a los nombres de las propiedades de la clase en tiempo de diseño:

    Cada columna tiene mapeada una propiedad de la clase.

     Después de todo esto, solo restaría exportar la información tomando como fuente la LISTA GENÉRICA y como veras, para nada tendrás que meterte con el control DataGridView.

     Descarga el proyecto desde este link:

    TomaFisica-VB.NET 

     Espero que la información proporcionada te sea de utilidad.


    Saludos desde Monterrey, Nuevo León, México!!!

    sábado, 26 de agosto de 2017 13:52
  • buenas tardes fernando, en el trabajo utilizamos 4 terminales, por la carga de trabajo y debido a que las tienda estan creciendo, 4 terminales ya no son suficientes.

    el programa lo utilizaria en una notebook a la cual le conectaria un scaner de los que utilizan en la tienda, esto para leer el codigo, la cantidad y los demas codigos los tengo que teclear.

    por tanto los datos que voy a capturar pasarian directamente a excel, ya no cargaria nada de lo que esta en las terminales.

    el poco codigo que tengo es el siguiente,

    posteriormente voy a agregar el codigo que exportara el contenido del datagrid a excel, primero quisero hacer que los codigos no se repitan dentro del mismo mueble.

    muchas gracias por el apoyo.

    sábado, 26 de agosto de 2017 17:39
  • :-)

    muchas gracias Jose Luis, es exactamente lo que necesitaba.

    sábado, 26 de agosto de 2017 17:43