Fórum Depurar uma Stored Procedure #2013
20/01/2009
0
A SP segue logo abaixo... Objetivo: Verificar rotina de geração de ficha de avaliação associada a data de saida do servidor. Duvida: Por onde inicar essa depuração? set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go /******************************************************************************************************************************* | Nome: sp_EstagioProbatorioGerarFichasAvaliacao | Banco: BD_SGRH | Descrição: Prepara as fichas de avaliação de estágio probatório para um conjunto de servidores. | Parâmetros: mesavaliacao,anoavaliacao, numeroavaliacao,gravaavaliacao. | Retorna: Se gravaAvaliacao é nulo retorna os elegiveis ao estágio probatório. | Autor: José Wilson Batista | Criação: José Wilson Batista | Observações: | Agendamentos Associados (Servidor/Nome_JOB): |------------------------------------------------------------------------------------------------------------------------------- | Alterações |------------------------------------------------------------------------------------------------------------------------------- | Data Técnico Descrição | 18/12/2006 Érica Cruz Modificado para permitir que todos os elegiveis possam ter fichas salvas. | 21/12/2006 Érica Cruz Modificado para receber a partir de qual data inicio exercício devem ser geradas as fichas. | 24/01/2007 Érica Cruz Modificado para inserir mais um campo na tabela EstagioProbatorio CodigoTipoSituacao = 1 (Aberta) | 13/02/2007 Érica Cruz/Jean-Claude Modificado para comportar o tratamento da 2° e terceira avaliação. | 22/02/2007 Érica Cruz Incluido tratamento de erro na procedure para realizar rollback se necessário. | 05/03/2007 Érica Cruz Incluido update para tratar lotação das fichas geradas para legado. | 30/10/2007 Érica Cruz Inclusa condição para não gerar fichas de avaliados que já se desligaram da ANTT |------------------------------------------------------------------------------------------------------------------------------- ********************************************************************************************************************************/ ALTER PROCEDURE [dbo].[sp_EstagioProbatorioGerarFichasAvaliacao] @MesAvaliacao AS VARCHAR(2)=NULL, @AnoAvaliacao AS VARCHAR(4)=NULL, @NumeroAvaliacao TINYINT, @GravaAvaliacao INT = NULL, -- 18/12/2006 Érica Cruz - Modificado de VARCHAR(6000) = NULL @CodigoAvaliados VARCHAR(6000) = NULL, -- 18/12/2006 Érica Cruz - Incluso @CodigodSuperintendencia VARCHAR(6)= NULL, @DataInicioEmExercicio VARCHAR(30) -- 21/12/2006 Érica Cruz - Data no formato 31-01-2006 00:00:00 AS /*-- declara variáveis para testes DECLARE @MesAvaliacao AS VARCHAR(2) DECLARE @AnoAvaliacao AS VARCHAR(4) DECLARE @NumeroAvaliacao TINYINT DECLARE @GravaAvaliacao INT DECLARE @CodigoAvaliados VARCHAR(6000) DECLARE @CodigodSuperintendencia VARCHAR(6) DECLARE @DataInicioEmExercicio VARCHAR(30) SET @MesAvaliacao = 2 SET @AnoAvaliacao = 2007 SET @NumeroAvaliacao = 1 SET @GravaAvaliacao = null SET @CodigoAvaliados = null SET @CodigodSuperintendencia = null --210000 SET @DataInicioEmExercicio = 2001-01-01 00:00:00 */ -- declara variáveis DECLARE @CodigoLotacao VARCHAR(11) --NULL DECLARE @CodUnidadeOrganizacional VARCHAR(11) --NULL DECLARE @CodigoEmpregado NUMERIC --NULL DECLARE @DataInicioLotacao DATETIME DECLARE @DataFimLotacao DATETIME DECLARE @DiasTrabalhados NUMERIC(9,0) DECLARE @DiasAusente NUMERIC(9,0) DECLARE @TotalDiasTrabalhados NUMERIC(9,0) DECLARE @NumeroDiasAvaliacao INT DECLARE @DataInicioAvaliacao DATETIME DECLARE @DataFimAvaliacao DATETIME DECLARE @UltimoDiaAvaliacao CHAR(2) DECLARE @PeriodoAvaliacao INT -- 13/02/2007 -- Érica Cruz BEGIN TRANSACTION -- André Vaz 11/12/2006 IF (@MesAvaliacao is null ) and (@AnoAvaliacao is null) BEGIN set @MesAvaliacao =Cast(MONTH(GETDATE())as varchar(2)) set @AnoAvaliacao =Cast(YEAR(GETDATE()) as varchar(4)) END -- Defini último dia do mês de avaliação IF CAST(@MesAvaliacao as tinyint) IN (1, 3, 5, 7, 8, 10, 12) SET @UltimoDiaAvaliacao = 31 ELSE IF CAST(@MesAvaliacao as tinyint) <> 2 SET @UltimoDiaAvaliacao = 30 ELSE IF CAST(@AnoAvaliacao as int) % 4 <> 0 SET @UltimoDiaAvaliacao = 28 ELSE SET @UltimoDiaAvaliacao = 29 --Define dia da avaliação para a segunda quinzena SET @DataFimAvaliacao = CAST(@AnoAvaliacao + / + @MesAvaliacao + / + @UltimoDiaAvaliacao AS DATETIME) -- Define datas de início para a avaliação PRINT @NumeroAvaliacao IF (@NumeroAvaliacao = 1) BEGIN SET @NumeroDiasAvaliacao = 180 -- 2º quinzena do 6º mês SET @PeriodoAvaliacao = 180 END ELSE IF (@numeroAvaliacao = 2) BEGIN SET @NumeroDiasAvaliacao = 485 -- 2° quinzena do 16 mês SET @PeriodoAvaliacao = 305 END ELSE IF (@numeroAvaliacao = 3) BEGIN SET @NumeroDiasAvaliacao = 880 -- 2° quinzena do 36 mês SET @PeriodoAvaliacao = 395 END -- Seleciona A PRIMEIRA LOTAÇÃO DO Servidor (COLOCA DATA DE INÍCIO DE EXERCÍCIO NA PRIMEIRA LOTAÇÃO) SELECT ISNULL(l.CodSubUnidadeOrganizacional, l.CodUnidadeOrganizacional) AS CodLotacao, c.CodEmpregado AS CodigoEmpregado, c.Nome AS NomeEmpregado, isnull(d.DataExercicio,d.DataPosse) AS DataInicioLotacao, ISNULL(l.DataFimLotacao, @DataFimAvaliacao ) AS DataFimLotacao, DATEDIFF(dd, ISNULL(d.DataExercicio, d.DataPosse), ISNULL(l.DataFimLotacao, @DataFimAvaliacao ) ) + 1 AS DiasTrabalhados INTO #tblAvaliacaoEstagio FROM v_Concursados c left join Orgao o ON c.CodPostoTrab = o.CodOrgao inner join Lotacao l ON c.CodEmpregado = l.CodEmpregado inner join DadosFuncionais d ON c.CodEmpregado = d.CodEmpregado WHERE -- 30/10/2007 Érica Cruz - Condição inserida para gerar fichas apenas de servidores ativos no sistema d.DataSaidaEmpregado is null AND l.CodLotacao = (SELECT TOP 1 l1.CodLotacao FROM lotacao l1 WHERE l1.CodEmpregado = c.CodEmpregado) -- 20/12/2006 - Érica Cruz e Jean-Claude Condição inserida para separar os funcionários que tiveram avaliações -- realizadas de modo manual dos novos funcionarios serão avaliados pelo sistema, sendo estes aqueles que entraram em -- em data superior a 30/06/2006 AND d.DataExercicio > convert (datetime, @DataInicioEmExercicio,102) -- INSERE DEMAIS LOTAÇÕES DO EMPREGADO (se houver) INSERT INTO #tblAvaliacaoEstagio SELECT DISTINCT ISNULL(l.CodSubUnidadeOrganizacional, l.CodUnidadeOrganizacional) AS CodLotacao, ae.CodigoEmpregado AS CodigoEmpregado, ae.NomeEmpregado AS NomeEmpregado, l.DataInicioLotacao, ISNULL(l.DataFimLotacao, @DataFimAvaliacao ) AS DataFimLotacao, SUM ( DATEDIFF(dd, l.DataInicioLotacao, ISNULL(l.DataFimLotacao, @DataFimAvaliacao ) ) + 1) AS DiasTrabalhados FROM Lotacao l inner join #tblAvaliacaoEstagio ae on ae.CodigoEmpregado = l.CodEmpregado left join Orgao o on l.CodPostoTrab = o.CodOrgao WHERE l.CodLotacao NOT IN (SELECT TOP 1 l1.CodLotacao FROM lotacao l1 WHERE ae.CodigoEmpregado = l1.CodEmpregado) GROUP BY ISNULL(l.CodSubUnidadeOrganizacional, l.CodUnidadeOrganizacional), ae.CodigoEmpregado, ae.NomeEmpregado, l.DataInicioLotacao, ISNULL(l.DataFimLotacao, @DataFimAvaliacao ) -- Trecho para tratar o legado de fichas, isto é se a data do fim na lotação for maior que a datafimavaliação especifica a datafimavaliação -- como sendo a data de fim na lotação e recalcula os dias trabalhados. -- Érica Cruz 05/03/2007 UPDATE #tblAvaliacaoEstagio SET DataFimLotacao = @DataFimAvaliacao, DiasTrabalhados = DATEDIFF(dd,DataInicioLotacao,@DataFimAvaliacao) where DATEDIFF(dd,DataFimLotacao,@DataFimAvaliacao) <= 0 /* -- Seleciona Afastamentos no período I - por motivo de doença em pessoa da família; código 46 II - por motivo de afastamento do cônjuge ou companheiro; código 48 III- para atividade política; código 34 e 27 IV - para servir em organismo internacional; código 49 V - para participação em curso de formação; código 47 */ SELECT ae.CodLotacao, a.CodEmpregado, SUM(DATEDIFF(dd,DataInicio, DataTermino)) + 1 AS DiasAfastado INTO #tblAfastamentos FROM Afastamento a, #tblAvaliacaoEstagio ae WHERE a.CodAfastamento IN (46, 48, 34, 27, 49, 47) and a.CodEmpregado = ae.CodigoEmpregado and a.DataInicio >= ae.DataInicioLotacao --and a.DataTermino <= ae.DataFimLotacao GROUP BY ae.CodLotacao, a.CodEmpregado --- Diminui afastamentos na tabela de verificação de estágio UPDATE #tblAvaliacaoEstagio SET DiasTrabalhados = DiasTrabalhados - a.DiasAfastado FROM #tblAfastamentos a, #tblAvaliacaoEstagio ae WHERE a.CodEmpregado = ae.CodigoEmpregado and a.CodLotacao = ae.CodLotacao -- apaga tabela temporária de afastamentos DROP TABLE #tblAfastamentos -- APAGA TODOS QUE JÁ POSSUEM A AVALIACAO EM QUESTÃO E/OU POSSUEM MENOS DE DIAS TRABALHADOS QUE O NECESSÁRIO DELETE FROM #tblAvaliacaoEstagio WHERE CodigoEmpregado IN (SELECT CodigoEmpregado FROM EstagioProbatorio WHERE NumeroAvaliacao = @NumeroAvaliacao) or CodigoEmpregado IN ( SELECT a.CodigoEmpregado FROM #tblAvaliacaoEstagio a GROUP BY a.CodigoEmpregado, a.NomeEmpregado HAVING year( CAST(@DataFimAvaliacao as datetime) ) <> @AnoAvaliacao or month( CAST(@DataFimAvaliacao as datetime) ) > @MesAvaliacao or SUM(ISNULL(DiasTrabalhados,0)) < @NumeroDiasAvaliacao ) -- APAGA LOTAÇÕES EM QUE O EMPREGADO FICOU MENOS DE 60 DIAS DELETE FROM #tblAvaliacaoEstagio WHERE DiasTrabalhados < 60 -- APAGA AS LOTAÇÕES RELATIVAS AO PERIODO ANTERIOR AO VIGENTE DELETE FROM #tblAvaliacaoEstagio WHERE (datediff(dd,DataFimLotacao,@DataFimAvaliacao) > @PeriodoAvaliacao) -- APAGA LOTAÇÕES COM MENOS DE 60 DIAS NO PERIODO AVALIATIVO DELETE FROM #tblAvaliacaoEstagio WHERE (datediff(dd,DataFimLotacao,@DataFimAvaliacao)) > (@PeriodoAvaliacao - 60) -- VERIFICA SE OPERAÇÃO É DE GRAVAÇÃO PRINT @PeriodoAvaliacao PRINT @GravaAvaliacao PRINT @DataFimAvaliacao -- Se não é apenas recupera os elegíveis ao estágio probatório PRINT São Apresenados inclusive as unidades que não possuem avaliadores cadastrados, estas unidades não terão fichas de estágio preparadas!!! IF @GravaAvaliacao IS NULL begin IF @CodigodSuperintendencia IS NOT NULL BEGIN SELECT a.CodigoEmpregado, @NumeroAvaliacao as NumeroAvaliacao, a.DataInicioLotacao, a.DataFimLotacao AS DataFimLotacao, a.CodLotacao, a.NomeEmpregado, d.NumMatriculaSIAPE, d.DataExercicio, c.DescCargo, o.SiglaOrgao, (SELECT SiglaOrgao FROM Orgao WHERE CodOrgao = o.CodPaiOrgao) as Superintendencia, o.codEmpregado CodigoAvaliador, DiasTrabalhados FROM #tblAvaliacaoEstagio a, DadosFuncionais d, Orgao o, Cargo c WHERE a.CodigoEmpregado = d.CodEmpregado and a.CodLotacao = o.CodOrgao and o.CodPaiOrgao = @CodigodSuperintendencia and d.CodCargo = c.CodCargo ORDER BY --o.SiglaOrgao, a.NomeEmpregado, a.DataInicioLotacao END ELSE SELECT a.CodigoEmpregado, @NumeroAvaliacao as NumeroAvaliacao, a.DataInicioLotacao, a.DataFimLotacao AS DataFimLotacao, a.CodLotacao, a.NomeEmpregado, d.NumMatriculaSIAPE, d.DataExercicio, c.DescCargo, o.SiglaOrgao,(SELECT SiglaOrgao FROM Orgao WHERE CodOrgao = o.CodPaiOrgao) as Superintendencia, o.codEmpregado CodigoAvaliador, DiasTrabalhados FROM #tblAvaliacaoEstagio a, DadosFuncionais d, Orgao o, Cargo c WHERE a.CodigoEmpregado = d.CodEmpregado and a.CodLotacao = o.CodOrgao and d.CodCargo = c.CodCargo ORDER BY --o.SiglaOrgao, a.NomeEmpregado, a.DataInicioLotacao END -- Se é solicitada gravação verifica se deve inserir todos os selecionados como elegiveis ou somente alguns para os quais foi passado código de empregado ELSE IF @CodigoAvaliados is not null -- 18/12/2006 -- Érica Cruz -- @GravaAvaliacao substitiudo por @CodigoAvaliados BEGIN -- Insere apenas os Concursados com o código informado para a primeira avaliação e cujo coigo do avaliador não esteja nulo EXEC (INSERT INTO EstagioProbatorio ( CodigoEmpregado, NumeroAvaliacao, MesAvaliacao, AnoAvaliacao, InicioPeriodoAvaliacao, FimPeriodoAvaliacao, CodigoLotacaoEmpregado, CodigoAvaliador, CodigoTipoSituacao) SELECT a.CodigoEmpregado, + @NumeroAvaliacao + as NumeroAvaliacao, + @MesAvaliacao + AS MesAvaliacao, + @AnoAvaliacao + AS AnoAvaliacao, a.DataInicioLotacao, a.DataFimLotacao, a.CodLotacao, CASE WHEN a.CodLotacao = 440000 AND a.CodigoEmpregado = 1495 THEN 1654 WHEN a.CodLotacao = 440000 AND a.CodigoEmpregado <> 1495 THEN 749 WHEN a.CodLotacao = 410000 THEN 178 WHEN a.CodLotacao = 420000 THEN 1011 WHEN a.CodLotacao = 430000 THEN 2097 ELSE o.CodEmpregado END AS CodigoAvaliador, 1 as CodigoTipoSituacao FROM #tblAvaliacaoEstagio a, Orgao o WHERE a.DataInicioLotacao is not null and a.CodLotacao = o.CodOrgao and o.codempregado is not null and a.CodigoEmpregado IN ( + @CodigoAvaliados + ) ) -- 18/12/2006 -- Érica Cruz -- @GravaAvaliacao substitiudo por @CodigoAvaliados END -- 18/12/2006 -- Érica Cruz -- Trecho de else inserido para tratar os casos onde todas as avaliações selecionadas devem ser salvas. ELSE BEGIN -- Insere todos os Concursados selecionados para e que não tenham codigo avaliador nulo EXEC (INSERT INTO EstagioProbatorio ( CodigoEmpregado, NumeroAvaliacao, MesAvaliacao, AnoAvaliacao, InicioPeriodoAvaliacao, FimPeriodoAvaliacao, CodigoLotacaoEmpregado, CodigoAvaliador,CodigoTipoSituacao) SELECT a.CodigoEmpregado, + @NumeroAvaliacao + as NumeroAvaliacao, + @MesAvaliacao + AS MesAvaliacao, + @AnoAvaliacao + AS AnoAvaliacao, a.DataInicioLotacao, a.DataFimLotacao, a.CodLotacao, CASE WHEN a.CodLotacao = 440000 AND a.CodigoEmpregado = 1495 THEN 1654 WHEN a.CodLotacao = 440000 AND a.CodigoEmpregado <> 1495 THEN 749 WHEN a.CodLotacao = 410000 THEN 178 WHEN a.CodLotacao = 420000 THEN 1011 WHEN a.CodLotacao = 430000 THEN 2097 ELSE o.CodEmpregado END AS CodigoAvaliador, 1 as CodigoTipoSituacao FROM #tblAvaliacaoEstagio a, Orgao o WHERE a.DataInicioLotacao is not null and a.CodLotacao = o.CodOrgao and o.codempregado is not null) -- Incluso para não permitir codigo avaliador nulo END -- Verifica se ocorreu algum erro na transação de inserção nas tabelas do banco de dados -- Verificação inclusa em 22/02/2007 por Érica Cruz IF (@@ERROR = 0) BEGIN --SELECT * FROM #tblAvaliacaoEstagio DROP TABLE #tblAvaliacaoEstagio COMMIT TRANSACTION END ELSE BEGIN DROP TABLE #tblAvaliacaoEstagio ROLLBACK TRANSACTION PRINT Problemas ao realizar insert na tabela estagioprobatorio, favor verificar. END att., Alencar porto
Alencar Porto
Curtir tópico
+ 0Posts
20/01/2009
Luiz Maia
Gostei + 0
20/01/2009
Luiz Maia
Gostei + 0
20/01/2009
Alencar Porto
Gostei + 0
20/01/2009
Luiz Maia
Clique em Connect to Database e adicione uma conecão usando o wizard: Add Connection. Selecione o Microsoft SQL Server como seu data source, data base server. Coloque os logins e credenciais para o acesso e clique no botão "create a new data connection".
Agora, todos os objetos estão visiveis para vc. Basta expandir a aba, selecionar o banco desejado. Abaixo esta aberta uma SP:
Coloque os parametros necessarios para a execução da SP:
Agora é so colocar seus Breakspoints e iniciar o debug, usando as teclas F10, F11 e F12, como abaixo:
Note que vc tem a possibilidade de usar o recurso do Quick Watch, que vc consegue pegar os valores dos parametros em tempo de execução na janela de Output.
Qualquer duvida, so me contactar. Aguardo seu retorno Alencar. Abraços Luiz Maia
Gostei + 0
21/01/2009
Luiz Maia
Gostei + 0
21/01/2009
Alencar Porto
Muito obrigado
Alencar Porto
Gostei + 0
21/01/2009
Luiz Maia
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)