none
Condicion if para insetar un 0 dada una condicion RRS feed

  • Pregunta

  • Buen dia, en el siguiente procedimiento almacenado tengo una condicion en la que si la fecha es mayor o  igual al dia de hoy o si es nulo  el campo activo=1, cuando la fecha ingresada es mayor no tengo problema en que ingrese el 1 pero si ingreso un nulo ingresa un 0

    ¿Cual podria ser el problema?

    CREATE PROCEDURE spAgregarEmbarque (@num_embarque int,@fechas datetime,@descripcion Nvarchar(2500),@activo bit)
    AS
    BEGIN 
    
    SET NOCOUNT ON;
    DECLARE @Activo bit 
    			
    if @fechas=null  OR @fechas >= GETDATE() 
    SET @Activo=1
    else
    set @Activo=0
    INSERT INTO Embarques(num_embarque,fechas,descripcion,activo)
    VALUES (@num_embarque,@fechas,@descripcion,@activo)
    END


    • Editado Emma Grz martes, 19 de mayo de 2020 17:01
    lunes, 18 de mayo de 2020 22:19

Respuestas

  • No sirve de nada poner if @fechas=null

    Esa condición siempre es false.

    Hay que poner if @fechas IS null

    • Marcado como respuesta Emma Grz martes, 19 de mayo de 2020 17:02
    martes, 19 de mayo de 2020 5:32
  • Hola Emma Grz:

    En tu código existe algún pequeño defecto, y lo puedes implementar de un modo, quizá más simple.

    Además de definir la variable @Activo dentro del procedure, cuando ya esta en la firma del procedimiento, cosa que no se puede, también utilizas la variable @MotivoRetraso, que no aparece en lo que has pegado.

    Supongo que esto son cosas, del copia pega, prueba, y vuelve a pegar.

    De lo que solicitas entiendo que lo que quieres, es que aunque en el parámetro te envíen como Activo un true (1), si la fecha es null o la fecha es Mayor que la que dispone el Servidor sql, entonces le ponga un false (0) a ese valor para esa columna.

    CREATE PROCEDURE spAgregarEmbarque (@num_embarque int,@fechas datetime,@descripcion Nvarchar(2500),@activo bit)
    AS
    BEGIN 
    
    SET NOCOUNT ON;
    
    INSERT INTO dbo.embarques (num_embarque, fechas, descripcion, activo)
    VALUES (@num_embarque, @fechas, @descripcion, CASE WHEN @fechas < GETDATE() THEN 1 ELSE 0 end);
    
    END

    Utilizando el case when @fechas sea una fecha menor que la actual, entonces 1 (ya nos hemos librado del null) y sino un 0.

    Con el escenario que planteas, esta sería la resolución.

    create table embarques
    (
       num_embarque int
     , fechas       datetime
     , descripcion  Nvarchar(2500)
     , activo       bit
     );
    exec spAgregarEmbarque 1
    					 , '20190101'
    					 , 'primero'
    					 , 1;
    
    exec spAgregarEmbarque 2
    					 , null
    					 , 'segundo'
    					 , 1;
    
    EXEC spAgregarEmbarque 3
    					 , '20201231'
    					 , 'tercero'
    					 , 1;


    El primer registro es menor, por tanto activo (true)

    El segundo registro la fecha es null, por tanto activo (false)

    El tercer registro la fecha es mayor que ahora por tanto activo (false).


    martes, 19 de mayo de 2020 16:19

Todas las respuestas

  • Hola Emma Grz, 

      

    Gracias por levantar tu consulta en los foros de MSDN. Entendimos su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.  

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN.   

     

     Andres Aguilar

     ____________________________ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    martes, 19 de mayo de 2020 0:47
    Moderador

  • ¿Cual podria ser el problema?

    @descripcion Nvarchar(2500),@activo bit) AS BEGIN SET NOCOUNT ON; DECLARE @Activo bit

    Porqu has declarado la variable dos veces.

    Antonio Mata

    martes, 19 de mayo de 2020 3:45
  • No sirve de nada poner if @fechas=null

    Esa condición siempre es false.

    Hay que poner if @fechas IS null

    • Marcado como respuesta Emma Grz martes, 19 de mayo de 2020 17:02
    martes, 19 de mayo de 2020 5:32
  • Hola Emma Grz:

    En tu código existe algún pequeño defecto, y lo puedes implementar de un modo, quizá más simple.

    Además de definir la variable @Activo dentro del procedure, cuando ya esta en la firma del procedimiento, cosa que no se puede, también utilizas la variable @MotivoRetraso, que no aparece en lo que has pegado.

    Supongo que esto son cosas, del copia pega, prueba, y vuelve a pegar.

    De lo que solicitas entiendo que lo que quieres, es que aunque en el parámetro te envíen como Activo un true (1), si la fecha es null o la fecha es Mayor que la que dispone el Servidor sql, entonces le ponga un false (0) a ese valor para esa columna.

    CREATE PROCEDURE spAgregarEmbarque (@num_embarque int,@fechas datetime,@descripcion Nvarchar(2500),@activo bit)
    AS
    BEGIN 
    
    SET NOCOUNT ON;
    
    INSERT INTO dbo.embarques (num_embarque, fechas, descripcion, activo)
    VALUES (@num_embarque, @fechas, @descripcion, CASE WHEN @fechas < GETDATE() THEN 1 ELSE 0 end);
    
    END

    Utilizando el case when @fechas sea una fecha menor que la actual, entonces 1 (ya nos hemos librado del null) y sino un 0.

    Con el escenario que planteas, esta sería la resolución.

    create table embarques
    (
       num_embarque int
     , fechas       datetime
     , descripcion  Nvarchar(2500)
     , activo       bit
     );
    exec spAgregarEmbarque 1
    					 , '20190101'
    					 , 'primero'
    					 , 1;
    
    exec spAgregarEmbarque 2
    					 , null
    					 , 'segundo'
    					 , 1;
    
    EXEC spAgregarEmbarque 3
    					 , '20201231'
    					 , 'tercero'
    					 , 1;


    El primer registro es menor, por tanto activo (true)

    El segundo registro la fecha es null, por tanto activo (false)

    El tercer registro la fecha es mayor que ahora por tanto activo (false).


    martes, 19 de mayo de 2020 16:19
  • Hola Emma Grz, 

      

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las  respuestas proporcionadas?  

    Espero su respuesta.  

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN.  

    Andres Aguilar 

    ____________________________  

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    martes, 19 de mayo de 2020 16:26
    Moderador
  • Hola Emma Grz

    Gracias por confirmar que se ha encontrado una solución a la consulta realizada. Debido a ello, este hilo será cerrado. 

    Si es necesario, por favor abra un nuevo hilo. 

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN. 

     

     Andres Aguilar

    ____________________________ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    martes, 19 de mayo de 2020 17:51
    Moderador