none
Ajuda com Stored Procedure RRS feed

  • 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
    sexta-feira, 13 de setembro de 2019 17:19

Respostas

Todas as Respostas

  • Quando executo com as variáveis @DTLIMITE = '20/09/2019'@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.

    sexta-feira, 13 de setembro de 2019 19:31
  • Deleted
    sexta-feira, 13 de setembro de 2019 19:52
  • Deleted
    • Marcado como Resposta ilanocf domingo, 24 de novembro de 2019 15:31
    sexta-feira, 13 de setembro de 2019 19:54
  • Deu certo José Diniz, obrigado.

    Era só mesmo esta linha que faltava pra dar certo.

     set DATEFORMAT dmy;

    Mais uma vez, muitíssimo obrigado.

    domingo, 24 de novembro de 2019 15:32