none
proc que verifique si existe dato igual que no sea vacio RRS feed

  • Pregunta

  • buenas tengo este problema.

    realizo una validacion en un proc donde requiero  verificar si un empleado  cuenta con un idusuario. al guardar un nuevo empleado no es nesecario que este tenga un idusuario por lo que me guarda vacio, al hacer mi validacion

    if  exists(select idempleado,idusuario from tbempleado where idempleado<>@idempleado  and idusuario=@idusuario)
        set @mensaje='Usuario Registrado a otra persona'

    mi consulta es se puede hacer en una sola linea de codigo verificar si existe el dato pero que no contemple los vacios.

    sin necidad ir por el lado ELSE

    Saludos


    Ronald Fernandez

    martes, 25 de julio de 2017 4:25

Respuestas

  • Entiendo, entonces cuando el empleado no tiene un usuario asociado el valor del parámetro '@idusuario' es NULL, ¿verdad?. Por otro lado, creo que la expresión (idempleado <> @idempleado) es innecesario siendo que la intención es buscar si el usuario ya se encuentra asociado a algún empleado y el valor de @idempleado es seguro que aún no existe porque se trata de una operación de inserción, no de actualización.

    Debes anidar las instrucciones de condición para que no se sobreescriban los mensajes a menos que tu intención sea concatenar todos los resultados, lo dudo. Fíjate ademas, en el código que adjuntas, que si la primera condición resulta TRUE y la tercera condición resulta FALSE la inserción de cualquier forma se producirá, por eso es importante anidar las condiciones.

    IF EXISTS(SELECT 1 FROM tbempleado WHERE idempleado <> @idempleado 
    					AND (idusuario = @idusuario AND @idusuario IS NOT NULL))
        SET @mensaje = 'Usuario registrado a otra persona'
    ELSE
    BEGIN
        IF EXISTS(SELECT 1 FROM tbpersona WHERE idpersona <> @idpersona AND nrodoc = @nrodoc)
    	   SET @mensaje = 'Numero de documento pertenece a una persona ya registrada en el sistema'
        ELSE
        BEGIN
    	   IF EXISTS(SELECT idpersona FROM tbempleado WHERE idpersona = @idpersona)
    		  SET @mensaje = 'Persona ya esta registrado como empleado'
    	   ELSE 
    	   BEGIN
    		  INSERT INTO tbempleado(idempleado,idpersona,fechaini,estado,idcargo,idusuario)
    		  VALUES(@idempleado,@idpersona,@fechaini,@estado,@idcargo,@idusuario)   
    	   END
        END
    END
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta CosstCosst martes, 25 de julio de 2017 6:00
    martes, 25 de julio de 2017 5:45
  • Sí en lugar de NULL el valor del parámetro '@idusuario' es una cadena de longitud cero ('') entonces la expresión cambia:

    IF EXISTS(SELECT 1 FROM tbempleado WHERE idempleado <> @idempleado 
    					AND (idusuario = @idusuario AND @idusuario <> ''))
        SET @mensaje = 'Usuario registrado a otra persona'
    ELSE
    BEGIN


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta CosstCosst martes, 25 de julio de 2017 7:17
    martes, 25 de julio de 2017 5:50

Todas las respuestas

  • No estoy entendiendo del todo tu pregunta.

    "...Verificar si existe el dato pero que no contemple los vacíos", ¿a qué columna te refieres?. Si te refieres a la columna 'idusuario' pues no hay necesidad de discriminar los valores NULL o "vacíos"  -como le llamas- porque la expresión de comparación sólo buscará por los valores que sean iguales al valor contenido en el parámetro '@idempleado'.

    De no haber respondido a tu duda te agradeceré dar mayor detalle y claridad a tu pregunta, de ser posible adjuntando datos que respalden lo que mencionas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 25 de julio de 2017 4:43
  • hola  gracias por responder,

    lo que pasa esque  tengo dos tablas empleado y persona.. si la persona existe envio los datos desde el frmpersona al frmempelado donde no hay nesecidad deque este empleado tenga un idusuario.. por lo cual se guarda todos los campos en el proc guardar. en el mismo proc de guardar realizo las validaciones antes de que se guarden,

                    
    if  exists(select idempleado,idusuario from tbempleado where idempleado<>@idempleado  and idusuario=@idusuario)
        set @mensaje='Usuario Registrado a otra persona'
    if exists(select idpersona, nrodoc from tbpersona where idpersona<>@idpersona and nrodoc= @nrodoc)
        set @mensaje='Numero de documento pertenece a una persona ya registrada en el sistema'
    if exists(select idpersona from tbempleado where idpersona=@idpersona)
    set @mensaje='Persona ya esta registrado como Empleado'
    else begin
     insert into tbempleado(idempleado,idpersona,fechaini,estado,idcargo ,idusuario)
                     values( @idempleado,@idpersona,@fechaini,@estado,@idcargo,@idusuario)   

    cuando deseo ingresar otra persona la validacion me saldra el mensaje de 'Usuario Registrado a otra persona'

    lo que deseo es que no tome en cuenta los campos vacios de la colummna ya que este campo solo hara refernecia solo en ocaciones. entiendo que hay difernecia entre nulos y vacios..


    Ronald Fernandez

    martes, 25 de julio de 2017 5:09
  • Entiendo, entonces cuando el empleado no tiene un usuario asociado el valor del parámetro '@idusuario' es NULL, ¿verdad?. Por otro lado, creo que la expresión (idempleado <> @idempleado) es innecesario siendo que la intención es buscar si el usuario ya se encuentra asociado a algún empleado y el valor de @idempleado es seguro que aún no existe porque se trata de una operación de inserción, no de actualización.

    Debes anidar las instrucciones de condición para que no se sobreescriban los mensajes a menos que tu intención sea concatenar todos los resultados, lo dudo. Fíjate ademas, en el código que adjuntas, que si la primera condición resulta TRUE y la tercera condición resulta FALSE la inserción de cualquier forma se producirá, por eso es importante anidar las condiciones.

    IF EXISTS(SELECT 1 FROM tbempleado WHERE idempleado <> @idempleado 
    					AND (idusuario = @idusuario AND @idusuario IS NOT NULL))
        SET @mensaje = 'Usuario registrado a otra persona'
    ELSE
    BEGIN
        IF EXISTS(SELECT 1 FROM tbpersona WHERE idpersona <> @idpersona AND nrodoc = @nrodoc)
    	   SET @mensaje = 'Numero de documento pertenece a una persona ya registrada en el sistema'
        ELSE
        BEGIN
    	   IF EXISTS(SELECT idpersona FROM tbempleado WHERE idpersona = @idpersona)
    		  SET @mensaje = 'Persona ya esta registrado como empleado'
    	   ELSE 
    	   BEGIN
    		  INSERT INTO tbempleado(idempleado,idpersona,fechaini,estado,idcargo,idusuario)
    		  VALUES(@idempleado,@idpersona,@fechaini,@estado,@idcargo,@idusuario)   
    	   END
        END
    END
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta CosstCosst martes, 25 de julio de 2017 6:00
    martes, 25 de julio de 2017 5:45
  • Sí en lugar de NULL el valor del parámetro '@idusuario' es una cadena de longitud cero ('') entonces la expresión cambia:

    IF EXISTS(SELECT 1 FROM tbempleado WHERE idempleado <> @idempleado 
    					AND (idusuario = @idusuario AND @idusuario <> ''))
        SET @mensaje = 'Usuario registrado a otra persona'
    ELSE
    BEGIN


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta CosstCosst martes, 25 de julio de 2017 7:17
    martes, 25 de julio de 2017 5:50
  • muchisimas gracias Willams  me salvastes nuevamente.. si me funciono a la perfeccion.. saludos

    Ronald Fernandez

    martes, 25 de julio de 2017 5:59