Usuário com melhor resposta
Ajuda com Stored Procedure

Pergunta
-
Olá pessoal,
Utilizamos o SQL Server 2017 e desenvolvemos a seguinte Stored Procedure, quase tudo está está funcionando corretamente, exceto ao atualizar o campo DTLIMITECONTEFETIVO .
DROP PROCEDURE IF EXISTS ATUALIZA_DATAS_ETAPAS_TURMAS_DISCIPLINAS; GO CREATE PROCEDURE ATUALIZA_DATAS_ETAPAS_TURMAS_DISCIPLINAS( @PERIODOLETIVO AS VARCHAR(6), @CODCOLIGADA AS INT, @CODFILIAL AS INT, @CODTIPOCURSO AS INT, @DTLIMITE AS DATETIME, @DTINICIAL AS DATETIME, @CODCURSO AS VARCHAR(10), @REPETEDATA AS VARCHAR(1), @CODUSUARIO AS VARCHAR(20) ) AS BEGIN DECLARE @ANO AS VARCHAR(4) SET @ANO = SUBSTRING(@PERIODOLETIVO, 1, 4) -- ATUALIZA ETAPAS DAS FALTAS UPDATE A SET DTINICIODIGITACAO = CASE WHEN A.DESCRICAO = 'JANEIRO' THEN CAST(('01/01/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'FEVEREIRO' THEN CAST(('01/02/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'MARÇO' THEN CAST(('01/03/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'ABRIL' THEN CAST(('01/04/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'MAIO' THEN CAST(('01/05/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'JUNHO' THEN CAST(('01/06/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'JULHO' THEN CAST(('01/07/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'AGOSTO' THEN CAST(('01/08/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'SETEMBRO' THEN CAST(('01/09/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'OUTUBRO' THEN CAST(('01/10/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'NOVEMBRO' THEN CAST(('01/11/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'DEZEMBRO' THEN CAST(('01/12/' + @ANO) AS datetime) ELSE NULL END, DTLIMITEDIGITACAO = CASE WHEN A.DESCRICAO = 'TOTAL DE FALTAS' THEN NULL ELSE @DTLIMITE END, DTLIMITECONTPREVISTO = CASE WHEN A.DESCRICAO = 'JANEIRO' THEN CAST(('01/01/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'FEVEREIRO' THEN CAST(('01/02/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'MARÇO' THEN CAST(('01/03/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'ABRIL' THEN CAST(('01/04/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'MAIO' THEN CAST(('01/05/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'JUNHO' THEN CAST(('01/06/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'JULHO' THEN CAST(('01/07/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'AGOSTO' THEN CAST(('01/08/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'SETEMBRO' THEN CAST(('01/09/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'OUTUBRO' THEN CAST(('01/10/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'NOVEMBRO' THEN CAST(('01/11/' + @ANO) AS datetime) WHEN A.DESCRICAO = 'DEZEMBRO' THEN CAST(('01/12/' + @ANO) AS datetime) ELSE NULL END, DTLIMITECONTEFETIVO = CASE WHEN A.DESCRICAO = 'JANEIRO' AND @REPETEDATA = 'N' THEN EOMONTH ( CAST(('01/01/' + @ANO) AS datetime) ) WHEN A.DESCRICAO = 'FEVEREIRO' AND @REPETEDATA = 'N' THEN EOMONTH ( CAST(('01/02/' + @ANO) AS datetime) ) WHEN A.DESCRICAO = 'MARÇO' AND @REPETEDATA = 'N' THEN EOMONTH ( CAST(('01/03/' + @ANO) AS datetime) ) WHEN A.DESCRICAO = 'ABRIL' AND @REPETEDATA = 'N' THEN EOMONTH ( CAST(('01/04/' + @ANO) AS datetime) ) WHEN A.DESCRICAO = 'MAIO' AND @REPETEDATA = 'N' THEN EOMONTH ( CAST(('01/05/' + @ANO) AS datetime) ) WHEN A.DESCRICAO = 'JUNHO' AND @REPETEDATA = 'N' THEN EOMONTH ( CAST(('01/06/' + @ANO) AS datetime) ) WHEN A.DESCRICAO = 'JULHO' AND @REPETEDATA = 'N' THEN EOMONTH ( CAST(('01/07/' + @ANO) AS datetime) ) WHEN A.DESCRICAO = 'AGOSTO' AND @REPETEDATA = 'N' THEN EOMONTH ( CAST(('01/08/' + @ANO) AS datetime) ) WHEN A.DESCRICAO = 'SETEMBRO' AND @REPETEDATA = 'N' THEN EOMONTH ( CAST(('01/09/' + @ANO) AS datetime) ) WHEN A.DESCRICAO = 'OUTUBRO' AND @REPETEDATA = 'N' THEN EOMONTH ( CAST(('01/10/' + @ANO) AS datetime) ) WHEN A.DESCRICAO = 'NOVEMBRO' AND @REPETEDATA = 'N' THEN EOMONTH ( CAST(('01/11/' + @ANO) AS datetime) ) WHEN A.DESCRICAO = 'DEZEMBRO' AND @REPETEDATA = 'N' THEN EOMONTH ( CAST(('01/12/' + @ANO) AS datetime) ) WHEN A.DESCRICAO = 'JANEIRO' AND @REPETEDATA = 'S' THEN @DTLIMITE WHEN A.DESCRICAO = 'FEVEREIRO' AND @REPETEDATA = 'S' THEN @DTLIMITE WHEN A.DESCRICAO = 'MARÇO' AND @REPETEDATA = 'S' THEN @DTLIMITE WHEN A.DESCRICAO = 'ABRIL' AND @REPETEDATA = 'S' THEN @DTLIMITE WHEN A.DESCRICAO = 'MAIO' AND @REPETEDATA = 'S' THEN @DTLIMITE WHEN A.DESCRICAO = 'JUNHO' AND @REPETEDATA = 'S' THEN @DTLIMITE WHEN A.DESCRICAO = 'JULHO' AND @REPETEDATA = 'S' THEN @DTLIMITE WHEN A.DESCRICAO = 'AGOSTO' AND @REPETEDATA = 'S' THEN @DTLIMITE WHEN A.DESCRICAO = 'SETEMBRO' AND @REPETEDATA = 'S' THEN @DTLIMITE WHEN A.DESCRICAO = 'OUTUBRO' AND @REPETEDATA = 'S' THEN @DTLIMITE WHEN A.DESCRICAO = 'NOVEMBRO' AND @REPETEDATA = 'S' THEN @DTLIMITE WHEN A.DESCRICAO = 'DEZEMBRO' AND @REPETEDATA = 'S' THEN @DTLIMITE ELSE NULL END, ETAPAFINAL = CASE WHEN A.DESCRICAO = 'TOTAL DE FALTAS' THEN 'S' ELSE NULL END, DIGAULASDADAS = CASE WHEN A.DESCRICAO = 'TOTAL DE FALTAS' THEN 'N' ELSE 'S' END, FREQMIN = 75, PERMITEDIGITACAO = 'S', EXIBENAWEB = 'S', EXIBENOGRAFICO = 'N', CODFORMULANOTA = NULL, RECMODIFIEDBY = @CODUSUARIO, RECMODIFIEDON = GETDATE() FROM SETAPAS A (NOLOCK) INNER JOIN STURMADISC AS B (NOLOCK) ON (B.CODCOLIGADA = A.CODCOLIGADA AND B.IDTURMADISC = A.IDTURMADISC) INNER JOIN SPLETIVO AS C (NOLOCK) ON (C.CODCOLIGADA = B.CODCOLIGADA AND C.IDPERLET = B.IDPERLET) INNER JOIN STURNO AS D (NOLOCK) ON (D.CODCOLIGADA = B.CODCOLIGADA AND D.CODTURNO = B.CODTURNO) INNER JOIN SDISCIPLINA AS E (NOLOCK) ON (E.CODCOLIGADA = B.CODCOLIGADA AND E.CODDISC = B.CODDISC) INNER JOIN SHABILITACAOFILIAL F (NOLOCK) ON (F.IDHABILITACAOFILIAL = B.IDHABILITACAOFILIAL AND F.CODCOLIGADA = B.CODCOLIGADA AND F.CODFILIAL = B.CODFILIAL AND F.CODTIPOCURSO = B.CODTIPOCURSO) WHERE C.CODPERLET= @PERIODOLETIVO AND F.CODCURSO = @CODCURSO AND A.CODCOLIGADA = @CODCOLIGADA AND B.CODTIPOCURSO = @CODTIPOCURSO AND B.CODFILIAL = @CODFILIAL AND A.TIPOETAPA = 'F' AND A.DESCRICAO IN ('JANEIRO', 'FEVEREIRO', 'MARÇO', 'ABRIL', 'MAIO', 'JUNHO', 'JULHO', 'AGOSTO', 'SETEMBRO', 'OUTUBRO', 'NOVEMBRO', 'DEZEMBRO', 'TOTAL DE FALTAS'); -- ATUALIZA ETAPAS DAS NOTAS SET @DTINICIAL = (SELECT TOP 1 A.DTINICIODIGITACAO FROM SETAPAS A (NOLOCK) INNER JOIN STURMADISC AS B (NOLOCK) ON (B.CODCOLIGADA = A.CODCOLIGADA AND B.IDTURMADISC = A.IDTURMADISC) INNER JOIN SPLETIVO AS C (NOLOCK) ON (C.CODCOLIGADA = B.CODCOLIGADA AND C.IDPERLET = B.IDPERLET) INNER JOIN STURNO AS D (NOLOCK) ON (D.CODCOLIGADA = B.CODCOLIGADA AND D.CODTURNO = B.CODTURNO) INNER JOIN SDISCIPLINA AS E (NOLOCK) ON (E.CODCOLIGADA = B.CODCOLIGADA AND E.CODDISC = B.CODDISC) INNER JOIN SHABILITACAOFILIAL F (NOLOCK) ON (F.IDHABILITACAOFILIAL = B.IDHABILITACAOFILIAL AND F.CODCOLIGADA = B.CODCOLIGADA AND F.CODFILIAL = B.CODFILIAL AND F.CODTIPOCURSO = B.CODTIPOCURSO) WHERE C.CODPERLET= @PERIODOLETIVO AND F.CODCURSO = @CODCURSO AND A.TIPOETAPA = 'F' AND A.CODCOLIGADA = @CODCOLIGADA AND B.CODTIPOCURSO = @CODTIPOCURSO AND B.CODFILIAL = @CODFILIAL ORDER BY A.TIPOETAPA, A.CODETAPA); UPDATE A SET DTINICIODIGITACAO = CASE WHEN A.DESCRICAO = 'AV1' THEN @DTINICIAL WHEN A.DESCRICAO = 'AV2' THEN @DTINICIAL WHEN A.DESCRICAO = 'AV3' THEN @DTINICIAL WHEN A.DESCRICAO = 'NAF' THEN @DTINICIAL WHEN A.DESCRICAO = 'MÉDIA' THEN NULL WHEN A.DESCRICAO = 'MÉDIA FINAL' THEN NULL ELSE NULL END, DTLIMITEDIGITACAO = CASE WHEN A.DESCRICAO = 'AV1' THEN @DTLIMITE WHEN A.DESCRICAO = 'AV2' THEN @DTLIMITE WHEN A.DESCRICAO = 'AV3' THEN @DTLIMITE WHEN A.DESCRICAO = 'NAF' THEN @DTLIMITE WHEN A.DESCRICAO = 'MÉDIA' THEN NULL WHEN A.DESCRICAO = 'MÉDIA FINAL' THEN NULL ELSE NULL END, ETAPAFINAL = CASE WHEN A.DESCRICAO = 'AV1' THEN 'N' WHEN A.DESCRICAO = 'AV2' THEN 'N' WHEN A.DESCRICAO = 'AV3' THEN 'N' WHEN A.DESCRICAO = 'NAF' THEN 'N' WHEN A.DESCRICAO = 'MÉDIA' THEN 'N' WHEN A.DESCRICAO = 'MÉDIA FINAL' THEN 'S' ELSE NULL END, PERMITEDIGITACAO = 'S', EXIBENAWEB = 'S', EXIBENOGRAFICO = 'N', CODFORMULAFALTA = NULL, RECMODIFIEDBY = @CODUSUARIO, RECMODIFIEDON = GETDATE() FROM SETAPAS A (NOLOCK) INNER JOIN STURMADISC AS B (NOLOCK) ON (B.CODCOLIGADA = A.CODCOLIGADA AND B.IDTURMADISC = A.IDTURMADISC) INNER JOIN SPLETIVO AS C (NOLOCK) ON (C.CODCOLIGADA = B.CODCOLIGADA AND C.IDPERLET = B.IDPERLET) INNER JOIN STURNO AS D (NOLOCK) ON (D.CODCOLIGADA = B.CODCOLIGADA AND D.CODTURNO = B.CODTURNO) INNER JOIN SDISCIPLINA AS E (NOLOCK) ON (E.CODCOLIGADA = B.CODCOLIGADA AND E.CODDISC = B.CODDISC) INNER JOIN SHABILITACAOFILIAL F (NOLOCK) ON (F.IDHABILITACAOFILIAL = B.IDHABILITACAOFILIAL AND F.CODCOLIGADA = B.CODCOLIGADA AND F.CODFILIAL = B.CODFILIAL AND F.CODTIPOCURSO = B.CODTIPOCURSO) WHERE C.CODPERLET= @PERIODOLETIVO AND F.CODCURSO = @CODCURSO AND A.CODCOLIGADA = @CODCOLIGADA AND B.CODTIPOCURSO = @CODTIPOCURSO AND B.CODFILIAL = @CODFILIAL -- AND A.TIPOETAPA = 'N' AND A.DESCRICAO IN ('AV1', 'AV2', 'AV3', 'NAF', 'MÉDIA', 'MÉDIA FINAL'); END;
Alguma sugestão? Não dá erro algum, só não atualiza aquele campo, mas o resto sim.
Grato,
Ilano.
- Editado ilanocf sexta-feira, 13 de setembro de 2019 17:20
Respostas
Todas as Respostas
-
Quando executo com as variáveis @DTLIMITE = '20/09/2019' e @REPETEDATA = 'S' então DTLIMITECONTEFETIVO é atualizado com a mesma data passada pela variável, mas quando a variável @REPETEDATA = 'N' o campo DTLIMITECONTEFETIVO fica com a data igual a 31/01/2019 para todos os registros afetados, só que era pra ficar igual á última data de cada mês indicado na procedure.
Esta não é a primeira vez que tenho problemas com o tipo datetime, já tive problemas assim ao exportar dados para uma planilha e ele gera o formato de data totalmente diferente do que é pra ser.
O que faço? Já cheguei ao limite dos meus conhecimentos.
-
-
-