none
proc que inserte en una tabla y actualice otra RRS feed

  • Pregunta

  • hola tengo un problema.   con el procedimiento  que realice no se enque estoy fallando.

    create table tbempleado
    (
    idempleado nvarchar(10) primary key not null,
    idpersona nvarchar(10)not null,
    fechaini datetime,
    estado nvarchar(10)null,
    idcargo nvarchar(10)null,
    idusuario nvarchar(10)null
    )
    go

    create table tbpersona
    (
    idpersona nvarchar(10) primary key not null,
    nombre nvarchar(50) not null,
    apaterno nvarchar(50) not null,
    apmaterno nvarchar(50) not null,
    tipodocumento nvarchar(20)not null,
    nrodoc nvarchar (10)unique not null,
    fechanacimiento date,
    sexo nvarchar(6)null,
    direccion nvarchar(100)null,
    telefono nvarchar(8) null,
    correo  nvarchar(50)null,
    fechaini datetime,
    obs nvarchar (255),
    idusuario nvarchar(10)null,
    idestado nvarchar(10)null,
    )
    go

    create proc spinsertar_empleado

    @idempleado nvarchar(10) ,
    @idpersona nvarchar(10),
    @idcargo nvarchar(10) ,
    @idusuario nvarchar(10),
    @nombre nvarchar(50),
    @apaterno nvarchar(50),
    @apmaterno nvarchar(50),
    @tipodocumento nvarchar(50),
    @nrodoc nvarchar(10),
    @fechanacimiento date,
    @sexo nvarchar(6),
    @telefono nvarchar(8),
    @correo  nvarchar(50),
    @direccion nvarchar(100),
    @fechaini datetime,
    @estado nvarchar(10),
    @mensaje nvarchar(50) out
    as
    begin
    --adicionado
    if exists(select idpersona from tbempleado where idpersona=@idpersona)
    begin
    set @mensaje='Persona ya esta Registrado Como Empleado'
    end

    declare @nur int
    if (select max(convert(int,substring(idempleado,3,10))) from tbempleado) is not null
        begin
            select @nur= max(CONVERT(int,substring(idempleado,3,10)))from tbempleado
            select @idempleado = 'EM'+ REPLICATE('0',8-DATALENGTH(CONVERT(VARCHAR,@nur+1)))+ CONVERT(varchar,@nur+1)
        end
    else
            select @idempleado='EM00000001'

            begin tran
             insert into tbempleado(idempleado,idpersona,fechaini,estado,idcargo ,idusuario)
            Values    (@idempleado,@idpersona,@fechaini,@estado,@idcargo,@idusuario)    
                
            
    update tbpersona set
            nombre=@nombre,
            apaterno = @apaterno,
            apmaterno=@apmaterno,
            tipodocumento=@tipodocumento,
            nrodoc=@nrodoc,
            fechanacimiento=@fechanacimiento,
            sexo=@sexo,
            direccion=@direccion,
            telefono= @telefono,
            correo = @correo
            where idpersona= @idpersona

            set @mensaje='OK'

                If(@mensaje='OK')
                commit tran
                else
                rollback tran
                set @mensaje='no se Actualizo la tabla Persona'
            end
        
    go

    solo me realiza la insercion los campos solicitado en la tabla empleado pero no me actualiza la tabla persona.


    Ronald Fernandez

    viernes, 21 de julio de 2017 16:10

Respuestas

  • Te comento que realice los cambio descrito pero sigue sin efectuar los cambios.

    Sí has seguido los pasos que te he recomendado entonces no veo la razón para que no se realice la operación de actualización sobre la tabla 'tbpersona', a menos -que como ya te he indicado- ocurra que el valor del parámetro '@idpersona' no exista en la columna 'idpersona' de la tabla 'tbpersona', por tanto la expresión de comparación nunca resulta verdadera y en consecuencia la actualización nunca se produce.

    ¿Has creado la restricción de integridad referencial 'FK_tbempleado_idpersona' que te he propuesto?. La idea de crear una restricción de tipo Foreign Key es de controlar que los valores que se escriben en una columna externa correspondan a un valor existente en la tabla principal, eso evitará que -por ejemplo- puedas escribir el valor 10 en la columna 'tbemplado.idpersona' sí no existe el valor en la columna 'tbpersona.idpersona'.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta CosstCosst domingo, 23 de julio de 2017 4:44
    sábado, 22 de julio de 2017 16:26

Todas las respuestas

  • Tienes certeza que el valor que contiene el parámetro '@idpersona' existe en la columna 'tbpersona.idpersona'. ¿Tienes implementado una restricción de tipo Foreign Key para la columna 'tbempleado.idpersona'?

    ALTER TABLE dbo.tbempleado ADD CONSTRAINT FK_tbempleado_idpersona 
        FOREIGN KEY(idpersona) REFERENCES dbo.tbpersona(idpersona);
    GO

    - El procedimiento almacenado debería ser menos complejo respecto a los flujos de decisión:

    CREATE PROC spinsertar_empleado 
        @idempleado      nvarchar(10),
        @idpersona       nvarchar(10),
        @idcargo         nvarchar(10),
        @idusuario       nvarchar(10),
        @nombre          nvarchar(50),
        @apaterno        nvarchar(50),
        @apmaterno       nvarchar(50),
        @tipodocumento   nvarchar(50),
        @nrodoc          nvarchar(10),
        @fechanacimiento date,
        @sexo            nvarchar(6),
        @telefono        nvarchar(8),
        @correo          nvarchar(50),
        @direccion       nvarchar(100),
        @fechaini        datetime,
        @estado          nvarchar(10),
        @mensaje         nvarchar(50) OUT
    AS
    BEGIN        
        SET NOCOUNT ON;
    
        BEGIN TRANSACTION
        BEGIN TRY
    	   INSERT INTO tbempleado
    		  (idempleado, idpersona, fechaini, estado, idcargo, idusuario)
    	   SELECT
    		  CONCAT('EM', (SELECT RIGHT(CONCAT('0000000000', COALESCE(MAX(CONVERT(int, 
    			 SUBSTRING(idempleado, 3, 10))), 0) + 1), 10) FROM tbempleado)), 
    		  @idpersona, @fechaini, @estado, @idcargo, @idusuario
    	   WHERE
    		  NOT EXISTS (SELECT 1 FROM tbempleado WHERE idpersona = @idpersona);
             
    	   UPDATE tbpersona
    	   SET
    		  nombre = @nombre,
    		  apaterno = @apaterno,
    		  apmaterno = @apmaterno,
    		  tipodocumento = @tipodocumento,
    		  nrodoc = @nrodoc,
    		  fechanacimiento = @fechanacimiento,
    		  sexo = @sexo,
    		  direccion = @direccion,
    		  telefono = @telefono,
    		  correo = @correo
    	   WHERE 
    		  idpersona = @idpersona;
        END TRY
        BEGIN CATCH
    	   SELECT   ERROR_MESSAGE() AS ErrorMessage; 
    	   IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;  
        END CATCH
    
        IF @@TRANCOUNT > 0  COMMIT TRANSACTION;  
    END
    GO
    

    Has los cambios propuestos y coméntanos como te fue.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 21 de julio de 2017 16:53
  • Hola Wiliams  muchas Gracias por tu pronta respuesta.. te comento que realice los cambio descrito pero sige sin efecrtuar los cambios.

    otra consuta tengo la variable @mensaje que me notifica el error en el visual pero  este mensaje no me muestra nada cuando ternima la instruccion. solo sale la ventana sin ninguna palabra.


    Ronald Fernandez

    viernes, 21 de julio de 2017 21:05
  • Te comento que realice los cambio descrito pero sigue sin efectuar los cambios.

    Sí has seguido los pasos que te he recomendado entonces no veo la razón para que no se realice la operación de actualización sobre la tabla 'tbpersona', a menos -que como ya te he indicado- ocurra que el valor del parámetro '@idpersona' no exista en la columna 'idpersona' de la tabla 'tbpersona', por tanto la expresión de comparación nunca resulta verdadera y en consecuencia la actualización nunca se produce.

    ¿Has creado la restricción de integridad referencial 'FK_tbempleado_idpersona' que te he propuesto?. La idea de crear una restricción de tipo Foreign Key es de controlar que los valores que se escriben en una columna externa correspondan a un valor existente en la tabla principal, eso evitará que -por ejemplo- puedas escribir el valor 10 en la columna 'tbemplado.idpersona' sí no existe el valor en la columna 'tbpersona.idpersona'.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta CosstCosst domingo, 23 de julio de 2017 4:44
    sábado, 22 de julio de 2017 16:26
  • hola si  te comento que si me resulto revise mis parametros y tenia el valor del idempleado en el idpersona por ello no me actualizaba. muchisimass gracias por la colaboracion...

    Ronald Fernandez

    domingo, 23 de julio de 2017 4:43