none
determinar si un producto está vencido al facturar.

    Pregunta

  • Hola a todos,

    Programa en vb.net

    Estoy desarrollando un pequeño sistema de ventas.

    En el registro producto hay artículos que tienen fecha de vencimiento.

    Por ejemplo, tengo artículo que se llama: ampicilina 500 y se vence 22/12/2016

    Si voy a facturar ese artículo, debería por lo menos decirme que está vencido.

    Intento hacerlo con este código y no me funciona.

    Dim VencimientoProducto As String
                    VencimientoProducto = MiClase.FuncionBusqueda2("Select FechaVencimiento  From Tbla_Producto Where ProductoConExpiracion ='SI' AND DATEDIFF(day, GetDate(), FechaVencimiento) <= 10 and  cod_producto='" & txtCodigoProducto.Text & "'  ")
                    If VencimientoProducto <> "" Then
    
                        MessageBox.Show("El producto está a menos de 10 días de vencer")
                    End If


    Gracias de antemano 

    sábado, 24 de diciembre de 2016 14:28

Respuestas

  • EliannyRD,

    Es probable que el procedimiento esté retornando un carácter de longitud cero (String.Empty) porque el código no existe o porque la expresión retorna NULL, por tanto, la excepción FormatException se produce al intentar convertir String.Empty a un valor numérico.

    Intenta con lo siguiente:

    Dim Result As String = MiClase.FuncionBusqueda2("
    	SELECT DATEDIFF(DAY, GETDATE(), fech_expiracion) 
    	FROM Tbla_Producto 
    	WHERE ProductoConExpiracion = 'SI' AND cod_producto = '" & txtCodigoProducto.Text & "'")
    
    If Not String.IsNullOrEmpty(Result) Then
    	Dim DiasFaltantes As Int32 = Convert.ToInt32(Result)
    
    	If DiasFaltantes > 10 Then
    		MessageBox.Show(DiasFaltantes.ToString)
    	Else
    		MessageBox.Show(String.Format("El producto está a {0} días de vencer", DiasFaltantes))
    	End If
    Else
    	MessageBox.Show("El código ingresado no existe")
    End If


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta EliannyRD sábado, 24 de diciembre de 2016 17:42
    sábado, 24 de diciembre de 2016 17:11

Todas las respuestas

  • EliannyRD,

    La consulta de selección podría recuperar la fecha de vencimiento o la cantidad de días por vencer de un determinado producto y sobre ese valor la aplicación debería determinar las acciones a tomar, sin embargo entiendo que el procedimiento FuncionBusqueda2() retorna un tipo string, ¿verdad?, si es así no es lo adecuado, como tampoco es correcto no parametrizar la consulta y de eso creo que bastante claro lo tienes aunque noto que no lo pones en práctica. Vamos, si el procedimiento retorna un tipo string, para mi gusto deberíamos tomar la cantidad de días por vencer -y no la fecha de vencimiento- para evitar problemas con formatos de fecha, algo como:

    Dim DiasFaltantes As Int32 = Convert.ToInt32(MiClase.FuncionBusqueda2(
    	"SELECT DATEDIFF(DAY, GETDATE(), FechaVencimiento) 
    	FROM Tbla_Producto 
    	WHERE ProductoConExpiracion = 'SI' AND cod_producto = '" & txtCodigoProducto.Text & "'"))
    
    If DiasFaltantes > 10 Then
    	'Facturar producto
    Else
    	MessageBox.Show(String.Format("El producto está a {0} días de vencer", DiasFaltantes))
    End If


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 24 de diciembre de 2016 15:14
  • Gracias por contestar: Willams Morale

    Realmente tu código se ve tiene lógica, pero no hace nada. 

    y la función se que está bien, porque yo la huso mucho. 

    el código me quedó así:

     Dim DiasFaltantes As Int32 = Convert.ToInt32(MiClase.FuncionBusqueda2("SELECT DATEDIFF(DAY, GetDate(), FechaVencimiento) FROM(Tbla_Producto) WHERE ProductoConExpiracion = 'SI' AND cod_producto = '" & txtCodigoProducto.Text & "'"))
    
                    If DiasFaltantes > 10 Then
    
                    Else
                        MessageBox.Show(String.Format("El producto está a {0} días de vencer", DiasFaltantes))
    
                    End If

    la consulta no hala nada 

    sábado, 24 de diciembre de 2016 15:41
  • EliannyRD,

    ¿Que operaciones tienes en el bloque IF? Si lo tienes tal y como muestras lo mas probable es que no realice nada porque el producto seleccionado tiene mas de 10 días por vencer.

    If DiasFaltantes > 10 Then
    	MessageBox.Show(DiasFaltantes.ToString)
    	'Facturar producto...
    Else
    	MessageBox.Show(String.Format("El producto está a {0} días de vencer", DiasFaltantes))
    End If



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 24 de diciembre de 2016 15:53
  • Realmente no se que pasa

    MessageBox.Show(DiasFaltantes.ToString)

    ni el mensaje muestra de los días faltantes, 

    no hace nada. 

    estoy confundida. 

    sábado, 24 de diciembre de 2016 16:02
  • EliannyRD,

    ¿Estas segura que el flujo del programa pasa por las instrucciones que recuperan los días faltantes?

    Pon un punto de interrupción en la instrucción ( Dim DiasFaltantes As Int32 = ... ) para validar si efectivamente se ejecuta la instrucción y de hacerlo para corroborar el valor que obtienes.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 24 de diciembre de 2016 16:07
  • hice un arreglo de un campo de vencimiento que estaba mal.

    ahora si hala, pero da error. 

    el código codo así ahora: 

     Dim DiasFaltantes As Int32 = Convert.ToInt32(MiClase.FuncionBusqueda2("SELECT DATEDIFF(DAY, GetDate(), fech_expiracion) FROM(Tbla_Producto) WHERE ProductoConExpiracion = 'SI' AND cod_producto = '" & txtCodigoProducto.Text & "'"))
    
                    If DiasFaltantes > 10 Then
                        MessageBox.Show(DiasFaltantes.ToString)
                    Else
                        MessageBox.Show(String.Format("El producto está a {0} días de vencer", DiasFaltantes))
                        MessageBox.Show(DiasFaltantes.ToString)
                    End If

    • Editado EliannyRD sábado, 24 de diciembre de 2016 16:21
    sábado, 24 de diciembre de 2016 16:20
  • EliannyRD,

    ¿Por qué enmarcas entre paréntesis el nombre de la tabla?

    SELECT ... FROM tbla_Producto WHERE ...


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 24 de diciembre de 2016 16:24
  • le quite el parentisis y sale otro error diferente. 

    La cadena de entrada no tiene el formato correcto.


    • Editado EliannyRD sábado, 24 de diciembre de 2016 16:29
    sábado, 24 de diciembre de 2016 16:27
  • EliannyRD,

    Es probable que el procedimiento esté retornando un carácter de longitud cero (String.Empty) porque el código no existe o porque la expresión retorna NULL, por tanto, la excepción FormatException se produce al intentar convertir String.Empty a un valor numérico.

    Intenta con lo siguiente:

    Dim Result As String = MiClase.FuncionBusqueda2("
    	SELECT DATEDIFF(DAY, GETDATE(), fech_expiracion) 
    	FROM Tbla_Producto 
    	WHERE ProductoConExpiracion = 'SI' AND cod_producto = '" & txtCodigoProducto.Text & "'")
    
    If Not String.IsNullOrEmpty(Result) Then
    	Dim DiasFaltantes As Int32 = Convert.ToInt32(Result)
    
    	If DiasFaltantes > 10 Then
    		MessageBox.Show(DiasFaltantes.ToString)
    	Else
    		MessageBox.Show(String.Format("El producto está a {0} días de vencer", DiasFaltantes))
    	End If
    Else
    	MessageBox.Show("El código ingresado no existe")
    End If


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta EliannyRD sábado, 24 de diciembre de 2016 17:42
    sábado, 24 de diciembre de 2016 17:11
  • Resuelto 100x%

    solo me queda una ultima pregunta: 

    usted me dise:  como tampoco es correcto no parametrizar la consulta 

    yo he intentado no parametrizar este tipo de consulta, pero no me sale. 

    podrías quitarle a esta consulta el: parametrizar, para así arreglar mas de 20 consultas que tengo: 

    que el señor te siga bendiciendo, llegaras muy lejos...................

    sábado, 24 de diciembre de 2016 17:42
  • Espero su respuesta: 

    yo he intentado no parametrizar este tipo de consulta, pero no me sale. 

    podrías quitarle a esta consulta el: parametrizar, para así arreglar mas de 20 consultas que tengo: 

    domingo, 25 de diciembre de 2016 17:59
  • EliannyRD,

    Creo que entendiste mal, las buenas practicas indican que las consultas sql que requieren parámetros deben ser adjuntados (los argumentos) en una colección de parámetros de la clase DbCommand (implementación según proveedor de datos) a lo que se llama parametrizar, lo que vienes haciendo actualmente es concatenar valores a una cadena que contiene una consulta sql, lo cuál no es correcto. Noto que has abierto un nuevo hilo al respecto y es lo que corresponde por ser una nueva pregunta.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 25 de diciembre de 2016 19:01