none
hacer calculos en grilla

    Pregunta

  • buenas tardes 

    amigos del foro si me pueden orientar por favor soy novato lo que  prentendo hacer una aplicacion de venta de productos por codigo barrra

     codigo para para búsqueda por código barra

    vb.net 2015 sql server 2015

     Private Sub TxtNombreProducto_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtNombreProducto.KeyPress
    
            If e.KeyChar = ChrW(13) Then
                eProducto.Nombre = TxtNombreProducto.Text
                eProducto.opcion = 1
                Dim dt = DirectCast(DgvDetalle.DataSource, DataTable)
    
                If dt IsNot Nothing Then
                    dt.Merge(objProducto.BUSCAR_PRODUCTOS_ACTIVOS(eProducto), True)
                Else
                    DgvDetalle.DataSource = objProducto.BUSCAR_PRODUCTOS_ACTIVOS(eProducto)
                    llamar()
                    EnlazarDetalle()
    
                End If
                TxtNombreProducto.Text = ""
                TxtNombreProducto.Focus()
            End If
        End Sub

    lo que hace esto es buscar codigo barra

    los productos activo cargarlos a una grilla que  llam DvgDetalle

    mi problema hacer el calculo pero valla mostrar las  cantidades

    cundo ingresado productos por codigo 

    que multiplique los productos que voy ingresado y me muestre el importe en la grilla

    formato que le doy

     Private Sub EnlazarDetalle()
    
    
    
            DgvDetalle.Columns(1).DataPropertyName = "Nombre"
            DgvDetalle.Columns(2).DataPropertyName = "Cantidad"
            DgvDetalle.Columns(3).DataPropertyName = "Precio"
            DgvDetalle.Columns(4).DataPropertyName = "Importe"
     End Sub

     

     


    • Editado djnilo jueves, 29 de diciembre de 2016 19:04
    jueves, 29 de diciembre de 2016 19:03

Respuestas

  • djnilo,

    El problema original del hilo es simple en su resolución, ha pasado un día y aún no logras cumplir con los objetivos. Te recomiendo que tomes atención al código propuesto, a las excepciones que recibes y a las recomendaciones que se te ofrecen. El mensaje de la excepción no es difícil de entender, menciona que la columna 'Cantidad' no existe como parte de la colección de columnas, entonces, o realmente no existe o existe pero con otro nombre, como deducirás basta con revisar que columnas existen en la colección.

    Si te complica demasiado entonces utiliza el índice de la columna (referir con el índice no es del todo recomendable):

    If e.KeyChar = ChrW(13) Then
    
    	eProducto.Nombre = TxtNombreProducto.Text
    	eProducto.opcion = 1
    
    	Dim dt = DirectCast(DgvDetalle.DataSource, DataTable)
    	If dt IsNot Nothing Then
    		Dim Fila As DataRow = dt.Rows.Cast(Of DataRow)().
    			FirstOrDefault(Function(f) f.Field(Of String)(0) = eProducto.Nombre)
    
    		If Fila IsNot Nothing Then
    			Fila.SetField(1, Fila.Field(Of Integer)(1) + 1)
    			Fila.SetField(3, Fila.Field(Of Integer)(1) *
    						  Fila.Field(Of Decimal)(2))
    		Else
    			dt.Merge(objProducto.BUSCAR_PRODUCTOS_ACTIVOS(eProducto), True)
    		End If
    	Else
    		DgvDetalle.DataSource = objProducto.BUSCAR_PRODUCTOS_ACTIVOS(eProducto)
    		llamar()
    		EnlazarDetalle()
    	End If
    	TxtNombreProducto.Text = ""
    	TxtNombreProducto.Focus()
    End If


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 30 de diciembre de 2016 21:24

Todas las respuestas

  • djnilo,

    Antes de agregar una nueva fila debes validar la existencia del código y en caso ya se encuentre cargado debes incrementar la cantidad y hacer el cálculo correspondiente para hallar el importe final.

    jueves, 29 de diciembre de 2016 19:17
  • Puedes tomar el siguiente ejemplo:

    If e.KeyChar = ChrW(13) Then
    	eProducto.Nombre = TxtNombreProducto.Text
    	eProducto.opcion = 1
    
    	Dim dt = DirectCast(DgvDetalle.DataSource, DataTable)
    	If dt IsNot Nothing Then
    		Dim Fila As DataRow = dt.Rows.Cast(Of DataRow)().
    			FirstOrDefault(Function(f) f.Field(Of String)("Nombre") = eProducto.Nombre)
    
    		If Fila IsNot Nothing Then
    			Fila.SetField("Cantidad", Fila.Field(Of Integer)("Cantidad") + 1)
    			Fila.SetField("Importe", Fila.Field(Of Decimal)("Cantidad") *
    						  Fila.Field(Of Decimal)("Precio"))
    		Else
    			dt.Merge(objProducto.BUSCAR_PRODUCTOS_ACTIVOS(eProducto), True)
    		End If
    	Else
    		DgvDetalle.DataSource = objProducto.BUSCAR_PRODUCTOS_ACTIVOS(eProducto)
    		llamar()
    		EnlazarDetalle()
    	End If
    	TxtNombreProducto.Text = ""
    	TxtNombreProducto.Focus()
    End If

    La fila recuperada a través de la función BUSCAR_PRODUCTOS_ACTIVOS() debe establecer el valor de 1 en la columna 'Cantidad'  y en la columna 'Importe' el mismo valor de la columna 'Precio', la idea es que dichas columnas muestren un valor inicial y no vacío tal como muestras en la imagen.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 29 de diciembre de 2016 19:48
  • gracias por responder Williams Morales 

    debo hacer una busqueda de productos si existe primero y luego aplicar esto que dices tu ?

    Consulto

    esta es la funcion para buscar un producto en la base datos si existe

    pero como la aplico a mi codigo  el orden por fa

    Public Function Existe(Entidad As CpE_Cls_PRODUCTO) As Boolean
            Dim Conn As New SqlConnection(Conexion.Connectionstring)
            Dim Cmd As New SqlCommand
            Dim Result As Boolean = False
            Try
                Conn.Open()
                Cmd.CommandText = "Select Nombre From producto Where Nombre=@CodigoBarra"
                Cmd.CommandType = CommandType.Text
                Cmd.Connection = Conn
                Cmd.Parameters.Add("@CodigoBarra", SqlDbType.VarChar).Value = Entidad.Nombre
    
                Dim reader As SqlDataReader = Cmd.ExecuteReader
                If reader.HasRows Then
                    Result = True
                End If
                reader.Close()
            Catch ex As Exception
                Throw New Exception(ex.Message)
            End Try
            Return Result
        End Function

    viernes, 30 de diciembre de 2016 0:37
  • djnilo,

    Creo que no me hice entender correctamente, mencionaba que tras leer un código se debe validar la existencia del mismo código en la grilla de datos, de existir el código se incrementará la cantidad y modificará el precio (columna Importe) del ítem registrado en la grilla caso contrario se agregará una nueva línea al pedido, el código propuesto hace esas tareas.

    El mensaje de error es claro, menciona que no existe la columna 'Cantidad' en el objeto de tipo DataTable. Pon un punto de interrupción en la instrucción 'If Fila IsNot Nothing Then' y lee un código de producto que ya exista en la grilla de datos, al detenerse la ejecución revisa el contenido (columnas) de la variable Fila: Table > Columns > List.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 30 de diciembre de 2016 1:10
  • la primera vez entra  pero no  hace el caculo lo  carga en la grilla

    luego cuando ingreso nuevamente me tira este error 

    Willams

    viernes, 30 de diciembre de 2016 17:50
  • djnilo,

    ¿Leíste el segundo párrafo del aporte anterior que realicé? ¿Pudiste observar las columnas que contiene la variable Fila?


    viernes, 30 de diciembre de 2016 18:09
  • no entra pasa directo 

     Else
                    DgvDetalle.DataSource = objProducto.BUSCAR_PRODUCTOS_ACTIVOS(eProducto)
                    'llamar()
                    EnlazarDetalle()
                End If
                TxtNombreProducto.Text = ""
                TxtNombreProducto.Focus()
            End If

    viernes, 30 de diciembre de 2016 18:58
  • djnilo,

    El problema original del hilo es simple en su resolución, ha pasado un día y aún no logras cumplir con los objetivos. Te recomiendo que tomes atención al código propuesto, a las excepciones que recibes y a las recomendaciones que se te ofrecen. El mensaje de la excepción no es difícil de entender, menciona que la columna 'Cantidad' no existe como parte de la colección de columnas, entonces, o realmente no existe o existe pero con otro nombre, como deducirás basta con revisar que columnas existen en la colección.

    Si te complica demasiado entonces utiliza el índice de la columna (referir con el índice no es del todo recomendable):

    If e.KeyChar = ChrW(13) Then
    
    	eProducto.Nombre = TxtNombreProducto.Text
    	eProducto.opcion = 1
    
    	Dim dt = DirectCast(DgvDetalle.DataSource, DataTable)
    	If dt IsNot Nothing Then
    		Dim Fila As DataRow = dt.Rows.Cast(Of DataRow)().
    			FirstOrDefault(Function(f) f.Field(Of String)(0) = eProducto.Nombre)
    
    		If Fila IsNot Nothing Then
    			Fila.SetField(1, Fila.Field(Of Integer)(1) + 1)
    			Fila.SetField(3, Fila.Field(Of Integer)(1) *
    						  Fila.Field(Of Decimal)(2))
    		Else
    			dt.Merge(objProducto.BUSCAR_PRODUCTOS_ACTIVOS(eProducto), True)
    		End If
    	Else
    		DgvDetalle.DataSource = objProducto.BUSCAR_PRODUCTOS_ACTIVOS(eProducto)
    		llamar()
    		EnlazarDetalle()
    	End If
    	TxtNombreProducto.Text = ""
    	TxtNombreProducto.Focus()
    End If


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 30 de diciembre de 2016 21:24
  • muchas gracias por tu paciencia willams morales voy seguir intentando

    domingo, 1 de enero de 2017 15:32