none
No selecciona el correcto

    Pregunta

  • Hola, a la hora de leer el código de barra de un producto me trae a un datagrid el producto que esta seleccionado de un datagrid donde tengo todos los productos y no el producto correspondiente al código de barra.,

    Este es el código que tengo:

      Private Sub txtleerbarra_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles txtleerbarra.TextChanged
            If CType(sender, TextBox).TextLength = 13 Then
                Dim Nombre, PrecioUnitario, Cantidad, Total, cantidad2, sinstock As String
    
                Nombre = DataGridView1(1, DataGridView1.CurrentRow.Index).Value
                PrecioUnitario = DataGridView1(2, DataGridView1.CurrentRow.Index).Value
    
    
                Dim Result As Integer = 0
                Int32.TryParse(txtcant.Text, Result)
    
                If Result > 0 AndAlso
                    Result <= Convert.ToInt32(DataGridView1(3, DataGridView1.CurrentRow.Index).Value) Then
    
                    Cantidad = txtcant.Text
                    Total = DataGridView1(2, DataGridView1.CurrentRow.Index).Value * Val(txtcant.Text)
                    DataGridView2.Rows.Add(Nombre, PrecioUnitario, Cantidad, Total)
                    cantidad2 = DataGridView1(3, DataGridView1.CurrentRow.Index).Value - Val(txtcant.Text)
                    DataGridView1(3, DataGridView1.CurrentRow.Index).Value = cantidad2
                    txtcant.Text = 1
                    txtleerbarra.Clear()
    
                    sinstock = DataGridView1(1, DataGridView1.CurrentRow.Index).Value
    
                    If DataGridView1(3, DataGridView1.CurrentRow.Index).Value = "0" Then
                        Call EliminarFila()
                        Call cargarProductos()
    
                        MsgBox("Atencion el siguiente producto quedo sin stock " & sinstock & "", MsgBoxStyle.OkOnly, "ERROR")
                    End If
    
    
                Else
                    MsgBox("No hay suficiente stock o hay valores nulos.", MsgBoxStyle.OkOnly, "ERROR")
                    txtcant.Focus()
                End If
    
               End Sub

    Otra duda es como puedo jacer para poder utilizar la función en caso de que el código no sea de 13 dígitos.

    Cualquier cosa solo díganme.

    Saludos.
    miércoles, 7 de diciembre de 2016 13:35

Respuestas

  • EstebanQuito125478,

    No veo que luego de capturar el código realices una búsqueda en la colección de filas para recuperar una referencia de fila según un valor de código coincidente, según el código que muestras únicamente tomas la fila actualmente seleccionada.

    Private Sub txtleerbarra_TextChanged(ByVal sender As Object, ByVal e As EventArgs)
    	
    	Dim txt = CType(sender, TextBox)
    
    	If txt.TextLength = 13 Then
    		
    		Dim row As DataGridViewRow = DataGridView1.Rows.Cast(Of DataGridViewRow)().
                FirstOrDefault(Function(x) Convert.ToString(x.Cells(0).Value).Equals(txt.Text))
    
            If row IsNot Nothing Then
                DataGridView1.ClearSelection()
                row.Selected = True
                
    			'Insertar código, la fila coincidente está seleccionada actualmente
            Else
                MessageBox.Show("No se han encontrado coincidencias...")
            End If
    	End If
    End Sub



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Federico32113 jueves, 8 de diciembre de 2016 15:17
    miércoles, 7 de diciembre de 2016 19:42
  • EstebanQuito125478,

    No, no es ningún mensaje de error, es un mensaje informando que no existe ninguna referencia a una fila que coincida con el valor que contiene la propiedad Text del objeto 'txtleerbarra'.

    En todo caso, vamos a ponernos de acuerdo, lees un código (a través de un lector óptico) e intentas buscar dicho valor en todas las filas de la columna de índice 6 del objeto 'DataGridView1', ¿verdad?, si es así, y si recibes el mensaje "No se han encontrado coincidencias..." no hay porque restarle credibilidad al mensaje, es que efectivamente el valor no existe en la colección de filas.

    Coloca un punto de interrupción en la instrucción donde se ejecuta la consulta Linq y verifica cual es el valor del objeto txt.Text, ¿es un valor que se encuentra en la grilla de datos?

    De forma adicional, ya que existe una referencia de fila (variable row) puedes hacer uso de ella:

    Nombre = row.Cells(1).Value.ToString()
    PrecioUnitario = CDec(row.Cells(2).Value)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Editado Willams Morales miércoles, 7 de diciembre de 2016 22:44
    • Marcado como respuesta Federico32113 jueves, 8 de diciembre de 2016 15:18
    miércoles, 7 de diciembre de 2016 22:41

Todas las respuestas

  • EstebanQuito125478,

    No veo que luego de capturar el código realices una búsqueda en la colección de filas para recuperar una referencia de fila según un valor de código coincidente, según el código que muestras únicamente tomas la fila actualmente seleccionada.

    Private Sub txtleerbarra_TextChanged(ByVal sender As Object, ByVal e As EventArgs)
    	
    	Dim txt = CType(sender, TextBox)
    
    	If txt.TextLength = 13 Then
    		
    		Dim row As DataGridViewRow = DataGridView1.Rows.Cast(Of DataGridViewRow)().
                FirstOrDefault(Function(x) Convert.ToString(x.Cells(0).Value).Equals(txt.Text))
    
            If row IsNot Nothing Then
                DataGridView1.ClearSelection()
                row.Selected = True
                
    			'Insertar código, la fila coincidente está seleccionada actualmente
            Else
                MessageBox.Show("No se han encontrado coincidencias...")
            End If
    	End If
    End Sub



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Federico32113 jueves, 8 de diciembre de 2016 15:17
    miércoles, 7 de diciembre de 2016 19:42
  • Me salta el mensaje de error "no se encontraron...".

    Que necesito modificar? Agregue lo que me dijiste.

     
     Dim txt = CType(sender, TextBox)
    
            If txt.TextLength = 13 Then
    
                Dim row As DataGridViewRow = DataGridView1.Rows.Cast(Of DataGridViewRow)().
                          FirstOrDefault(Function(x) Convert.ToString(x.Cells(6).Value).Equals(txt.Text))
    
                If row IsNot Nothing Then
                    DataGridView1.ClearSelection()
                    row.Selected = True
    
                    Dim Nombre, PrecioUnitario, Cantidad, Total, cantidad2, sinstock As String
    
                    Nombre = DataGridView1(1, DataGridView1.CurrentRow.Index).Value
                    PrecioUnitario = DataGridView1(2, DataGridView1.CurrentRow.Index).Value
    
    
                    Dim Result As Integer = 0
                    Int32.TryParse(txtcant.Text, Result)
    
                    If Result > 0 AndAlso
                        Result <= Convert.ToInt32(DataGridView1(3, DataGridView1.CurrentRow.Index).Value) Then
    
                        Cantidad = txtcant.Text
                        Total = DataGridView1(2, DataGridView1.CurrentRow.Index).Value * Val(txtcant.Text)
                        DataGridView2.Rows.Add(Nombre, PrecioUnitario, Cantidad, Total)
                        cantidad2 = DataGridView1(3, DataGridView1.CurrentRow.Index).Value - Val(txtcant.Text)
                        DataGridView1(3, DataGridView1.CurrentRow.Index).Value = cantidad2
                        txtcant.Text = 1
                        txtleerbarra.Clear()
    
                        sinstock = DataGridView1(1, DataGridView1.CurrentRow.Index).Value
    
                        If DataGridView1(3, DataGridView1.CurrentRow.Index).Value = "0" Then
                            Call EliminarFila()
                            Call cargarProductos()
    
                            MsgBox("Atencion el siguiente producto quedo sin stock " & sinstock & "", MsgBoxStyle.OkOnly, "ERROR")
                        End If
    
    
                    Else
                        MsgBox("No hay suficiente stock o hay valores nulos.", MsgBoxStyle.OkOnly, "ERROR")
                        txtcant.Focus()
                    End If
                    'Insertar código, la fila coincidente está seleccionada actualmente
                Else
                    MessageBox.Show("No se han encontrado coincidencias...")
                End If
            End If
        End Sub



    miércoles, 7 de diciembre de 2016 21:07
  • EstebanQuito125478,

    No, no es ningún mensaje de error, es un mensaje informando que no existe ninguna referencia a una fila que coincida con el valor que contiene la propiedad Text del objeto 'txtleerbarra'.

    En todo caso, vamos a ponernos de acuerdo, lees un código (a través de un lector óptico) e intentas buscar dicho valor en todas las filas de la columna de índice 6 del objeto 'DataGridView1', ¿verdad?, si es así, y si recibes el mensaje "No se han encontrado coincidencias..." no hay porque restarle credibilidad al mensaje, es que efectivamente el valor no existe en la colección de filas.

    Coloca un punto de interrupción en la instrucción donde se ejecuta la consulta Linq y verifica cual es el valor del objeto txt.Text, ¿es un valor que se encuentra en la grilla de datos?

    De forma adicional, ya que existe una referencia de fila (variable row) puedes hacer uso de ella:

    Nombre = row.Cells(1).Value.ToString()
    PrecioUnitario = CDec(row.Cells(2).Value)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Editado Willams Morales miércoles, 7 de diciembre de 2016 22:44
    • Marcado como respuesta Federico32113 jueves, 8 de diciembre de 2016 15:18
    miércoles, 7 de diciembre de 2016 22:41
  • La información brindada me ayudo mucho desde ya gracias.

    Otra pequeña duda, al restar la cantidad del producto que fue leído por el lector de código de barra me resta la cantidad no de ese producto sino del que esta seleccionado en el datagrid.

    Este es el codigo que se encarga de eso:

     cantidad3 = row.Cells(3).Value.ToString()  
    cantidad2 = cantidad3 - Val(txtcant.Text)
    DataGridView1(3, DataGridView1.CurrentRow.Index).Value = cantidad2

    En la variable "cantidad2" queda el valor para suplantar pero al asignarlo para realizar el descuento al producto leído por el código, no realiza el descuento al este sino al seleccionado del datagrid.
    jueves, 8 de diciembre de 2016 1:27
  • EstebanQuito125478,

    Entiendo que ya habíamos convenido que la fila seleccionada -en la grilla de datos- es la fila que coincide con el código leído, ¿verdad?.

    Antes de hacer las operaciones, ¿has validado que luego de leer el código (mediante el lector óptico) queda seleccionada la fila coincidente?, si es así entonces basta con:

    row.Cells(3).Value = CInt(row.Cells(3).Value) - CInt(txtcant.Text)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 8 de diciembre de 2016 4:12