none
fecha mayor o igual a la fecha ingresada RRS feed

  • Pregunta

  • buenas tardes

    si alguien me puede orientar por fa

    necesito que el usuario ponga una fecha mayor o igual a la fecha guardada en la base datos 

    pero si ingresa una fecha menor que le muestre un mensaje que diga fecha invalida

    como que adema muestra fecha mayor para hacer la comparacion

             

    Dim query As String = "SELECT * FROM Projects WHERE CreatedDate >= @fecha"
                Dim cmd As New SqlCommand(query, conn)

               cmd.Parameters.AddWithValue("@fecha", txtDate.Text)
                Dim drd As SqlDataReader = cmd.ExecuteReader()

                Dim da As New SqlDataAdapter(cmd)
                If drd.Read() Then
                    txtDate.Text = CDate(drd("CreateDate"))
                    MsgBox("vamos bien ")
                End If

    me manda un error

    ingreso en la caja texto de esta forma la fecha 2015/01/20

    dice esto la conversion del tipo de datos nvarchar en datetime produjo un valor fuera del intervalo

    sábado, 20 de diciembre de 2014 18:41

Respuestas

  • Prueba cambiando la condición, es sólo que debes darte cuenta cual es el error.

    If (DateDiff(DateInterval.Day, Convert.ToDateTime(txtFechaIngresada.Text).Date, Convert.ToDateTime(txtDate.Text).Date) < 0) Then

    -----------------------------------------------------------------------------------------------------
    Espero haberte ayudado con mi sugerencia, si resolvió tu problema no olvides marcarla como respuesta.

    Willams Morales P.
    Arequipa - Perú

    • Marcado como respuesta djnilo martes, 23 de diciembre de 2014 12:23
    lunes, 22 de diciembre de 2014 21:03

Todas las respuestas

  • Hola,

    Primero, sí sólo esperas recibir un valor no uses un DataReader usa ExecuteScalar() que devuelve sólo un valor (la primera columna de la primera fila del conjunto de resultados)

    Segundo, el error está en la consulta por la misma razón que la ejecutas como texto. Te sugiero que utilices procedimiento almacenados con parámetros INPUT o OUTPUT (según requieras) y evites todos estos problemas

    Haces uso de parámetros? Estás mandando una cadena y en ella debes de concatenar los valores, insisto que es una mala práctica pero esto resolverá el problema

    Dim query As String = "SELECT * FROM Projects WHERE CreatedDate >= '" & txtDate.Text & "'"
                Dim cmd As New SqlCommand(query, conn)
    
                Dim drd As SqlDataReader = cmd.ExecuteReader()
    
                Dim da As New SqlDataAdapter(cmd)
                If drd.Read() Then
                    txtDate.Text = CDate(drd("CreateDate"))
                    MsgBox("vamos bien ")
                End If

    Finalmente, el formato con el que SQL SERVER interpreta una fecha depende del idioma configurado para el usuario que inicia la sesión.  Revisa si el formato yyyy/mm/dd funcionará. Además deberías usar controles de fecha y hora.
    -----------------------------------------------------------------------------------------------------
    Espero haberte ayudado con mi sugerencia, si resolvió tu problema no olvides marcarla como respuesta.

    Willams Morales P.
    Arequipa - Perú





    sábado, 20 de diciembre de 2014 19:15
  • williams como lo hago con procedmiento almacenado como dices tu para no tener ese error

    com el sql para ademas sacar maxima fecha para comparar

    Dim query As String = "SELECT * FROM Projects WHERE CreatedDate >= '" & txtDate.Text & "'"
                Dim cmd As New SqlCommand(query, conn)
    
                Dim drd As SqlDataReader = cmd.ExecuteReader()
    
                Dim da As New SqlDataAdapter(cmd)
                If drd.Read() Then
                    txtDate.Text = CDate(drd("CreateDate"))
                    MsgBox("vamos bien ")
                End If

    sábado, 20 de diciembre de 2014 20:16
  • A ver, vamos a ordenar las cosas. Tu necesitas saber cuál es la máxima fecha ingresada y con ee valor harás tu comparación en tu aplicación. Tenemos que crear un procedimiento que te devuelva la máxima fecha y para ello hacemos lo siguiente

    CREATE PROCEDURE uspMaxFechaProyecto
    AS
    BEGIN
      SET NOCOUNT ON;
    
      SELECT
        MAX(CreatedDate)
      FROM
        Projects;
    END

    Como vez, el procedimiento sólo devolverá la máxima fecha y como es sólo un valor haremos uso de ExecuteScalar.

    Dim cmd As New SqlCommand("uspMaxFechaProyecto", conn)
    
    txtDate.Text = cmd.ExecuteScalar()

    Ahora, con el valor devuelto sabrás si la fecha es mayor o igual. 

    Para ello puede utilizar la función DateDiff

    If (DateDiff(DateInterval.Day, txtFechaIngresada.Text, txtDate.Text) > 0) Then

    ...

    End If

    -----------------------------------------------------------------------------------------------------
    Espero haberte ayudado con mi sugerencia, si resolvió tu problema no olvides marcarla como respuesta.

    Willams Morales P.
    Arequipa - Perú


    sábado, 20 de diciembre de 2014 21:28
  • Try
                conn.Open()
                Dim cmd As New SqlCommand("uspMaxFechaProyecto", conn)
                 txtDate.Text = cmd.ExecuteScalar()

                If (DateDiff(DateInterval.Day, txtFechaIngresada.Text, txtDate.Text) > 0) Then

    me resalta un error aqui por que pusite otro campo txfechaingrada si  solo es un campo txtdate  que ingresa el usuario la fecha pero necesito que le diga que si ingresa una fecha menor a la que esta la base datos  que le muestre un mesaje  fecha invalida

                    MsgBox("")

                End If

                drd.Close()
                conn.Close()
            Catch ex As Exception
                'Nos mostrara en un ventana el error'
                MsgBox(ex.Message)
            End Try

    sábado, 20 de diciembre de 2014 22:29
  • Lo que te menciona el error es que se está pasando valores que no son de tipo fecha o por lo menos no de manera explicita.

    If (DateDiff(DateInterval.Day, Convert.ToDateTime(txtFechaIngresada.Text).Date, Convert.ToDateTime(txtDate.Text).Date) >= 0) Then

    'Es una fecha igual o mayor a la máxima fecha almacenada

    End If

    Lo que intento hacer ahí es que si producto de la condición el valor es menor que cero es porque la nueva fecha a ingresar es anterior a la máxima fecha almacenada en la bd

    -----------------------------------------------------------------------------------------------------
    Espero haberte ayudado con mi sugerencia, si resolvió tu problema no olvides marcarla como respuesta.

    Willams Morales P.
    Arequipa - Perú


    sábado, 20 de diciembre de 2014 22:58
  • Joseph, porque implementar lógica de negocio en un procedimiento?

    La bd sólo debe de servir para contener datos y velar por la integridad de los mismos, los procedimientos no deberían contener lógica que es propia de la aplicación.





    sábado, 20 de diciembre de 2014 23:18
  • como llama a este procedimiento almacenado que hiciste

    joseph

    por fa  son novato

    domingo, 21 de diciembre de 2014 1:27
  • sigo sin entender como hacer funcionar este procedimento y por que poner otro campo fecha

    si lo necesito compara con el ingreso del usuario la fecha el campo txtdate

    por fa 

    ry
                conn.Open()
                Dim cmd As New SqlCommand("uspMaxFechaProyecto", conn)
                txtDate.Text = cmd.ExecuteScalar()
                If (DateDiff(DateInterval.Day, Convert.ToDateTime(txtFechaIngresada.Text).Date, Convert.ToDateTime(txtDate.Text).Date) >= 0) Then

                    MsgBox("esta bien")
                Else
                    MsgBox("la fecha ingresa es menor debe ingresar una fecha valida")


                End If

                conn.Close()
            Catch ex As Exception
                'Nos mostrara en un ventana el error'
                MsgBox(ex.Message)
            End Try

    domingo, 21 de diciembre de 2014 1:29
  • joseph no logro hacer funcionar   tu procedimiento


     Protected Sub Button3_Click(sender As Object, e As System.EventArgs) Handles Button3.Click
            conn.Open()
            Dim cmd As New SqlCommand()
            cmd.Connection = conn
            cmd.CommandType = CommandType.StoredProcedure
            cmd.CommandText = "fechacomparar"

            cmd.Parameters.AddWithValue("@fecha", txtDate.Text)

            cmd.ExecuteNonQuery()

            conn.Close()

            Try

            Catch ex As Exception
             
                MsgBox(ex.Message)
            End Try

    end sub

    domingo, 21 de diciembre de 2014 5:11
  • buenas tardes

    si alguien me puede orientar por fa

    necesito que el usuario ponga una fecha mayor o igual a la fecha guardada en la base datos 

    pero si ingresa una fecha menor que le muestre un mensaje que diga fecha invalida

    como que adema muestra fecha mayor para hacer la comparacion

             

    Dim query As String = "SELECT * FROM Projects WHERE CreatedDate >= @fecha"
                Dim cmd As New SqlCommand(query, conn)

               cmd.Parameters.AddWithValue("@fecha", txtDate.Text)
                Dim drd As SqlDataReader = cmd.ExecuteReader()

                Dim da As New SqlDataAdapter(cmd)
                If drd.Read() Then
                    txtDate.Text = CDate(drd("CreateDate"))
                    MsgBox("vamos bien ")
                End If

    me manda un error

    ingreso en la caja texto de esta forma la fecha 2015/01/20

    dice esto la conversion del tipo de datos nvarchar en datetime produjo un valor fuera del intervalo

    hola, ibas muy bien. Te recomiendo,uses parámetros como,bien haces aqui. Lo único que te faltaba es que debes convertir,la cadena en un datetime así...

    cmd.Parameters.AddWithValue("@fecha", Convert.ToDateTime(txtDate.Text))

    ya que el tipo esperado es Date


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    lunes, 22 de diciembre de 2014 4:36
    Moderador
  • luego debería optimizar tu consulta... Si únicamente vas a devolver un único campo nunca hagas un SELECT * FROM...

    utiliza con bien te indicaron el ExecuteScalar()con,esto se evita enviar por red datos,innecesarios con la pérdida de rendiemiento que esto provoca


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    lunes, 22 de diciembre de 2014 4:42
    Moderador
  • Sergio Parra como lo hago como dices tu con el executescalar por fa

    estoy rabiando hace varios dias con esto por 

    lunes, 22 de diciembre de 2014 14:06
  • en este codigo trato  que el usuario si ingresa una fecha menor a la guardada en la base datos le muestre un mensaje fecha invalida que le diga que tiene que  ingresar una  fecha mayor o igual a la guardada en la base datos 

    por fa

     conn.Open()
                Try
                    Dim SQLbuscar As String
                SQLbuscar = "SELECT  * FROM Projects  WHERE CreatedDate >= @fecha"
                Dim cmd As New SqlCommand(SQLbuscar, conn)
                cmd.CommandType = CommandType.Text

                cmd.Parameters.AddWithValue("@fecha", Convert.ToDateTime(txtDate.Text))
                 Dim drd As SqlDataReader = cmd.ExecuteReader()

                Dim da As New SqlDataAdapter(cmd)
                If drd.Read() Then

                    txtProjectName.Text = drd.Item("ProjectName")
                    MsgBox("vamos bien ")
                Else
                    MsgBox("Debe ingresar una fecha valida")
                End If
                conn.Close()
            Catch ex As Exception
                'Nos mostrara en un ventana el error'
                MsgBox(ex.Message)
            End Try

                             
    lunes, 22 de diciembre de 2014 14:48
  • joseph no lo logro hacer funcionar tu codigo lo puse en un mismo boto todo deberia funcionar igual

    en esta linea como llamo a tu codigo

    try
    {
    
    //Método
    
    }
    
    catch(Exception ex)
    {
    
    MessageBox.Show(ex.Message);
    
    }

    lunes, 22 de diciembre de 2014 14:50
  • Lo que te menciona el error es que se está pasando valores que no son de tipo fecha o por lo menos no de manera explicita.

    If (DateDiff(DateInterval.Day, Convert.ToDateTime(txtFechaIngresada.Text).Date, Convert.ToDateTime(txtDate.Text).Date) >= 0) Then

    'Es una fecha igual o mayor a la máxima fecha almacenada

    End If

    Lo que intento hacer ahí es que si producto de la condición el valor es menor que cero es porque la nueva fecha a ingresar es anterior a la máxima fecha almacenada en la bd

    -----------------------------------------------------------------------------------------------------
    Espero haberte ayudado con mi sugerencia, si resolvió tu problema no olvides marcarla como respuesta.

    Willams Morales P.
    Arequipa - Perú


    djnilo,

    Que problemas has tenido para completar la solución que te propuse?

    lunes, 22 de diciembre de 2014 14:56
  • Williams  

    no pued0  hacer funcionar tu codigo

    If (DateDiff(DateInterval.Day, Convert.ToDateTime(txtFechaIngresada.Text).Date, Convert.ToDateTime(txtDate.Text).Date) >= 0) Then

      Try
                conn.Open()
                Dim cmd As New SqlCommand("uspMaxFechaProyecto", conn)
                txtDate.Text = cmd.ExecuteScalar()
                If (DateDiff(DateInterval.Day, Convert.ToDateTime(txtFechaIngresada.Text).Date, Convert.ToDateTime(txtDate.Text).Date) >= 0) Then

                    MsgBox("esta")
                Else
                    MsgBox("la fecha ingresa es menor debe ingresar una fecha valida")


                End If

                conn.Close()
            Catch ex As Exception
                'Nos mostrara en un ventana el error'
                MsgBox(ex.Message)
            End Try

    lunes, 22 de diciembre de 2014 15:19
  • Pero mencioname que problemas tienes. 
    lunes, 22 de diciembre de 2014 15:49
  • en primer no entiendo esta linea de codigo que pusiste

     If (DateDiff(DateInterval.Day, Convert.ToDateTime(txtFechaIngresada.Text).Date, Convert.ToDateTime(txtDate.Text).Date) >= 0) Then

    en esta dos cajas le ingreso la fecha menores a la que estan en la base datos ingresa igual y muestra el mensaje estan 

    y no se porque pusiste esta caja de texto txtfechaingresa

    si solo ocupo txtdate

    lo otro  txtDate.Text = cmd.ExecuteScalar()

    no deberia combirtir esta caja en datetime si la convierto me manda un error booleano

    ingreso de fecha 20/12/2011 si el usuario ingreso esta fecha menor a la que esta guardada deberi mandar un mensaje fecha invalida 

    por fa

      Try

                conn.Open()
                Dim cmd As New SqlCommand("uspMaxFechaProyecto", conn)
                txtDate.Text = cmd.ExecuteScalar()

                If (DateDiff(DateInterval.Day, Convert.ToDateTime(txtFechaIngresada.Text).Date, Convert.ToDateTime(txtDate.Text).Date) >= 0) Then

                    MsgBox("esta")
                Else
                    MsgBox("la fecha ingresa es menor debe ingresar una fecha valida")


                End If

                conn.Close()

    lunes, 22 de diciembre de 2014 16:04
  • lo otro  txtDate.Text = cmd.ExecuteScalar()

    no deberia combirtir esta caja en datetime si la convierto me manda un error booleano

    Debes de convertir a string: 

    txtDate.Text = Convert.ToString(cmd.ExecuteScalar())

    ingreso de fecha 20/12/2011 si el usuario ingreso esta fecha menor a la que esta guardada deberi mandar un mensaje fecha invalida

    Donde ingresas la fecha 20/12/2011??? Pongo en DateDiff el control txtfechaingresada.text, asumiendo que tienes un lugar donde ingresas la fecha, en todo caso has el cambio conveniente.


    lunes, 22 de diciembre de 2014 16:22
  • consulta  cuando ingreso una fecha que no esta en la base datos ejemplo 20/12/2011 no compara el procedimiento almacenado 

    se supone que el procedimiento almacenacenado me busca la fecha  maxima 

    correcto si o no ?

    yo necesito que sea mayor o igual a la fecha guardada en la base datos

    si ingresa otra fecha como esta 20/12/2011 no deberia pasar debe estar mal el if que tengo

    20/12/2011 

    Try
                conn.Open()
                Dim cmd As New SqlCommand("uspMaxFechaProyecto", conn)
                txtDate.Text = Convert.ToString(cmd.ExecuteScalar())

                If (DateDiff(DateInterval.Day, Convert.ToDateTime(txtFechaIngresada.Text).Date, Convert.ToDateTime(txtDate.Text).Date) >= 0) Then

                    MsgBox("esta")
                Else
                    MsgBox("la fecha ingresa es menor debe ingresar una fecha valida")


                End If

                conn.Close()
            Catch ex As Exception
                'Nos mostrara en un ventana el error'
                MsgBox(ex.Message)
            End Try

    lunes, 22 de diciembre de 2014 20:24
  • Prueba cambiando la condición, es sólo que debes darte cuenta cual es el error.

    If (DateDiff(DateInterval.Day, Convert.ToDateTime(txtFechaIngresada.Text).Date, Convert.ToDateTime(txtDate.Text).Date) < 0) Then

    -----------------------------------------------------------------------------------------------------
    Espero haberte ayudado con mi sugerencia, si resolvió tu problema no olvides marcarla como respuesta.

    Willams Morales P.
    Arequipa - Perú

    • Marcado como respuesta djnilo martes, 23 de diciembre de 2014 12:23
    lunes, 22 de diciembre de 2014 21:03
  • Dim query As String = "SELECT COUNT(*) FROM Projects WHERE CreatedDate >= @fecha"
                
                cmd.Parameters.AddWithValue("@fecha", Convert.ToDateTime(txtDate.Text)
                 Dim cuenta As Integer = Convert.ToInt32(cmd.ExecuteScalar())     
                 If cuenta > 0 Then
                     txtDate.Text = CDate(drd("CreateDate"))
                     MsgBox("vamos bien ")
                 End If


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos


    lunes, 22 de diciembre de 2014 21:34
    Moderador
  • como ves simplemente obtenemos la cuenta de registros que cumplen la condición de la fecha y si se obtiene alguna cuenta mayor de 0 entonces actuar en consecuencia.

    de todas formas te recomiendo no copiar y pegar codigo "a lo loco". Analiza las respuestas y adapta a tu lógica lo que veas necesario. También debes ser mas explicito cuando dices "me da error". Explica mas detalladamente lo que te ocurre o muestra algún mensaje que obtengas.

    un saludo


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    lunes, 22 de diciembre de 2014 21:37
    Moderador
  • muchas gracias Willams Morales Por tu paciencia Gracias Sergio Parra, Joseph Arquimedes 
    martes, 23 de diciembre de 2014 12:26
  • tu codigo no puede hacer funcionar 

    Sergio Parra

    onn.Open()
            Try
              
                Dim query As String = "SELECT COUNT(*) FROM Projects WHERE CreatedDate >= @fecha"
                Dim cmd As New SqlCommand(query, conn)
                cmd.CommandType = CommandType.Text
                cmd.Parameters.AddWithValue("@fecha", Convert.ToDateTime(txtDate.Text))
                Dim cuenta As Integer = Convert.ToInt32(cmd.ExecuteScalar())
                If cuenta > 0 Then

                    ' txtProjectName.Text = drd.Item("ProjectName")
                    MsgBox("vamos bien ")
                Else
                    MsgBox("Debe ingresar una fecha valida")
                End If

                conn.Close()
            Catch ex As Exception
                'Nos mostrara en un ventana el error'
                MsgBox(ex.Message)
            End Try
        End Sub

    martes, 23 de diciembre de 2014 12:27