none
Calcular fecha vencimiento antes y después de vencerse el producto

    Pregunta

  • Buenas a todos

    Programo en vb.net

    Esta consulta me determina desde 10 días antes de vencerse el producto. 

    Dim Result As String = MiClase.FuncionBusqueda2("Select DATEDIFF(DAY, fech_expiracion, GETDATE()) as dias 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(String.Format("Faltan {0} días para vencer el producto   ", DiasFaltantes))
    
                        End If
                    End If

    Pero no me determina los días después de haberse vencido el producto.

    Creo que debería haber dos consultas:

    1. Antes de vencerse el producto (ya existe).
    2. Después de vencerse el producto (no existe).

    Lógica:

    Si fech_expiracion < fecha Actual Entonces

            Ejecutar la primera consulta

         "Faltan x cantidad días para vencerse el producto

    Sino

         Ejecutar la segunda consulta que no existe.

         El producto se venció (expiró) hace x cantidad de días

    fin

    Espero en Dios que alguien pueda ayudarme con el código.

    Bendiciones para todos. 

    miércoles, 28 de diciembre de 2016 13:50

Respuestas

  • EliannyRD,

    Si el valor de la columna [fech_expiracion] es mayor que la fecha actual (GETDATE()) es de esperar que el resultado retorne un valor negativo, a menos que en el procedimiento FuncionBusqueda() estés realizando algún tipo de conversión que retorne el valor absoluto (positivo).

    Has una prueba simple, coloca un literal de fecha mayor a hoy en vez del nombre de la columna, por ejemplo 30/12/2016, es de esperar que obtengas el mensaje: El producto venció hace 2 días.

    Dim Result As String = MiClase.FuncionBusqueda2("Select DATEDIFF(DAY, '20161230', GETDATE()) ...


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta EliannyRD miércoles, 28 de diciembre de 2016 17:39
    miércoles, 28 de diciembre de 2016 15:46
  • EliannyRD,

    Invierte el orden de los argumentos FechaInicio y FechaFin:

    SELECT DATEDIFF(DAY, GETDATE(), fech_expiracion) as dias ...


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta EliannyRD miércoles, 28 de diciembre de 2016 17:38
    miércoles, 28 de diciembre de 2016 16:55
  • "el Problema es que siempre retorna números positivos, ahora si retornara numerosos negativos cuando se vence fuera un exixo, pero no lo hace"

    Pero entonces tu consulta es de sql 

    Declare @TABLA table
    (fecha datetime)
    insert into @TABLA(fecha) VALUES('2016-12-18')
    insert into @TABLA(fecha) VALUES('2016-12-30')
    
    SELECT 
    
    CASE WHEN DATEDIFF(DAY, fecha, GETDATE()) >0  AND DATEDIFF(DAY, fecha, GETDATE()) <=10 THEN  'VENCE EN '  + CAST(DATEDIFF(DAY, fecha, GETDATE()) AS VARCHAR(10)) +' DIAS '  
         WHEN DATEDIFF(DAY, fecha, GETDATE()) <0                                           THEN     'VENCIÓ HACE '  + CAST(DATEDIFF(DAY, fecha, GETDATE())*-1 AS VARCHAR(10)) +' DIAS '  
    
    END
    FROM @TABLA

    quítale el *-1 si quieres que se vea negativo

    "este código no funciona: "

    Ese código funciona como inicialmente planteaste con los días ya recuperados.


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.





    • Editado Augusto1982 miércoles, 28 de diciembre de 2016 15:42
    • Marcado como respuesta EliannyRD miércoles, 28 de diciembre de 2016 17:39
    miércoles, 28 de diciembre de 2016 15:33
  • Gracias a Dios y a ustedes el problema está resuelto 100x%

    el Codigo me quedó asi:

     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))
                            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

    de verdad gracias a todos, pero con la ultima recomendación de Willams Morales se pudo resolver el problema, ya si retorna números negativos y positivos. 

    miércoles, 28 de diciembre de 2016 17:38

Todas las respuestas

  • Hola EliannRD recuerda que el DATEDIFF es la diferencia entre dos fechas (sea una fecha anterior o superior a la fecha actual) según el parámetro del tiempo sera el valor de retorno en este caso Day (días) retorna la diferencia en días sea esta positiva o negativa si ejecutas este select te despejara la duda:

    SELECT DATEDIFF(DAY, '2016-12-18', GETDATE()) Vence, DATEDIFF(DAY, '2016-12-30', GETDATE()) Vencido;

    si tu duda es que debería agregar a tu código

    If DiasFaltantes < 0 Then
        MessageBox.Show(String.Format("El producto vencio hace {0} días", DiasFaltantes))
    else

    MessageBox.Show(String.Format("Faltan {0} días para vencer el producto   ", DiasFaltantes))

    End If

    recuerda el DATEDIFF es la diferencia entre dos fechas con un valor de retorno que puede ser positivo o negativo, según tu caso:

    1. positivo = no se ha vencido

    2. negativo = el producto ya vencio

    y no es necesario agregar dos consultas el mismo DATEDIFF te dira si la diferencia es positiva o negativa.

    recuerda marcar como respuesta correcta

    • Editado Eldeyvi miércoles, 28 de diciembre de 2016 14:15
    miércoles, 28 de diciembre de 2016 14:15
  • asi no te vale?

       Dim Result As String = MiClase.FuncionBusqueda2("Select DATEDIFF(DAY, fech_expiracion, GETDATE()) as dias 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 And DiasFaltantes > 0 Then
                    MessageBox.Show(String.Format("Faltan {0} días para vencer el producto   ", DiasFaltantes))
                ElseIf DiasFaltantes <= 0 Then
                    MessageBox.Show(String.Format("El producto se venció hace {0} días   ", DiasFaltantes*-1))
                End If
            End If


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.


    miércoles, 28 de diciembre de 2016 14:16
  • Bueno espero haberte ayudado, si olvide agregar la condicion (DiasFaltantes <= 10 And DiasFaltantes > 0), y no cesitas multiplicar por - 1 para convertir el valor en negativo, ya que Int32 puede ser positivo o negativo. 

    lo que intente decir con "recuerda marcar como respuesta correcta" es que marques la respuesta que te ayudo o despejo tu problema.

     
    miércoles, 28 de diciembre de 2016 14:36
  • "y no cesitas multiplicar por - 1 para convertir el valor en negativo"

    Es correcto pero se multiplicó por -1 para que el mensaje no diga algo así como

    El producto se venció hace -12 días, sino

    El producto se venció hace 12 días, que tiene mas sentido.


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.



    • Editado Augusto1982 miércoles, 28 de diciembre de 2016 14:46
    miércoles, 28 de diciembre de 2016 14:45
  • este código no funciona:

     Dim Result As String = MiClase.FuncionBusqueda2("Select DATEDIFF(DAY, fech_expiracion, GETDATE()) as dias 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 And DiasFaltantes > 0 Then
                    MessageBox.Show(String.Format("Faltan {0} días para vencer el producto   ", DiasFaltantes))
                ElseIf DiasFaltantes <= 0 Then
                    MessageBox.Show(String.Format("El producto se venció hace {0} días   ", DiasFaltantes*-1))
                End If
            End If
    el Problema es que siempre retorna números positivos, ahora si retornara numerosos negativos cuando se vence fuera un exixo, pero no lo hace

    por favor Eldeyvi puedes plantear el código completo ya que este tiene fechas fijas

    SELECT DATEDIFF(DAY, '2016-12-18', GETDATE()) Vence, DATEDIFF(DAY, '2016-12-30', GETDATE()) Vencido;

    por ejemplo: '2016-12-18

    por favor...............................




    • Editado EliannyRD miércoles, 28 de diciembre de 2016 15:24
    miércoles, 28 de diciembre de 2016 15:08
  • "el Problema es que siempre retorna números positivos, ahora si retornara numerosos negativos cuando se vence fuera un exixo, pero no lo hace"

    Pero entonces tu consulta es de sql 

    Declare @TABLA table
    (fecha datetime)
    insert into @TABLA(fecha) VALUES('2016-12-18')
    insert into @TABLA(fecha) VALUES('2016-12-30')
    
    SELECT 
    
    CASE WHEN DATEDIFF(DAY, fecha, GETDATE()) >0  AND DATEDIFF(DAY, fecha, GETDATE()) <=10 THEN  'VENCE EN '  + CAST(DATEDIFF(DAY, fecha, GETDATE()) AS VARCHAR(10)) +' DIAS '  
         WHEN DATEDIFF(DAY, fecha, GETDATE()) <0                                           THEN     'VENCIÓ HACE '  + CAST(DATEDIFF(DAY, fecha, GETDATE())*-1 AS VARCHAR(10)) +' DIAS '  
    
    END
    FROM @TABLA

    quítale el *-1 si quieres que se vea negativo

    "este código no funciona: "

    Ese código funciona como inicialmente planteaste con los días ya recuperados.


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.





    • Editado Augusto1982 miércoles, 28 de diciembre de 2016 15:42
    • Marcado como respuesta EliannyRD miércoles, 28 de diciembre de 2016 17:39
    miércoles, 28 de diciembre de 2016 15:33
  • EliannyRD,

    Si el valor de la columna [fech_expiracion] es mayor que la fecha actual (GETDATE()) es de esperar que el resultado retorne un valor negativo, a menos que en el procedimiento FuncionBusqueda() estés realizando algún tipo de conversión que retorne el valor absoluto (positivo).

    Has una prueba simple, coloca un literal de fecha mayor a hoy en vez del nombre de la columna, por ejemplo 30/12/2016, es de esperar que obtengas el mensaje: El producto venció hace 2 días.

    Dim Result As String = MiClase.FuncionBusqueda2("Select DATEDIFF(DAY, '20161230', GETDATE()) ...


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta EliannyRD miércoles, 28 de diciembre de 2016 17:39
    miércoles, 28 de diciembre de 2016 15:46
  • el código esta así:

      'Determinar si un producto esta vencido **************************************************************************************************               
                    Dim Result As String = MiClase.FuncionBusqueda2("Select DATEDIFF(DAY, fech_expiracion, GETDATE()) as dias 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 < 0 Then
                            MessageBox.Show(String.Format("El producto vencio hace {0} días", DiasFaltantes))
                        Else
    
                            MessageBox.Show(String.Format("Faltan {0} días para vencer el producto   ", DiasFaltantes))
    
                        End If
                    End If


    fech_expiracion= 26/12/2016

    Fecha Acual = 28/12/2016

    Estando así debería retornar números negativos, es decir que se venció hace 2 días,

    El problema es que no retorna número negativos, siempre son positivos. 

    por favor, a partir de este código plantear el código correcto.

    esta es la función:

    Function FuncionBusqueda2(ByVal SQL2) As String
            Dim nombre As String = ""
            Dim selecciona As New SqlClient.SqlCommand(SQL2, conexion2)
            conexion2.Open()
            Dim comando As Object = selecciona.ExecuteScalar()
            conexion2.Close()
            If IsDBNull(comando) Then
                nombre = ""
            Else
                nombre = CType(comando, String)
                If nombre = Nothing Then
                    nombre = ""
                End If
            End If
            Return nombre
        End Function

    • Editado EliannyRD miércoles, 28 de diciembre de 2016 16:43
    miércoles, 28 de diciembre de 2016 16:37
  • EliannyRD,

    Invierte el orden de los argumentos FechaInicio y FechaFin:

    SELECT DATEDIFF(DAY, GETDATE(), fech_expiracion) as dias ...


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta EliannyRD miércoles, 28 de diciembre de 2016 17:38
    miércoles, 28 de diciembre de 2016 16:55
  • Gracias a Dios y a ustedes el problema está resuelto 100x%

    el Codigo me quedó asi:

     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))
                            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

    de verdad gracias a todos, pero con la ultima recomendación de Willams Morales se pudo resolver el problema, ya si retorna números negativos y positivos. 

    miércoles, 28 de diciembre de 2016 17:38