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

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
  • 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. 

    Quando se converte uma data de texto (varchar, etc) para date, e usando a função CAST(), é necessário antes configurar o DATEFORMAT de acordo com o formato da data. Por exemplo, se a data está no formato dd/mm/aaaa, então sugiro o uso de

         set DATEFORMAT dmy

    logo no início do procedimento.

    Melhor ainda é utilizar a função CONVERT(), mas informando o estilo correspondente ao valor:

        convert (date, ('1/1/' + @ANO), 103)

    onde 103 é o estilo que corresponde ao formato dd/mm/aaaa, pois assim a conversão fica sempre correta, independente da configuração de DATEFORMAT ou LANGUAGE da sessão.

    ---

    Execute o seguinte código e analise os resultados:

    -- código #2
    set dateformat mdy;  -- considera como mm/dd/aaaa
    
    SELECT eomonth (cast ('1/1/2016' as datetime)) as [1],
           eomonth (cast ('1/2/2016' as datetime)) as [2],
           eomonth (cast ('1/3/2016' as datetime)) as [3],
           eomonth (cast ('1/4/2016' as datetime)) as [4],
           eomonth (cast ('1/5/2016' as datetime)) as [5],
           eomonth (cast ('1/6/2016' as datetime)) as [6],
           eomonth (cast ('1/7/2016' as datetime)) as [7],
           eomonth (cast ('1/8/2016' as datetime)) as [8],
           eomonth (cast ('1/9/2016' as datetime)) as [9],
           eomonth (cast ('1/10/2016' as datetime)) as [10],
           eomonth (cast ('1/11/2016' as datetime)) as [11],
           eomonth (cast ('1/12/2016' as datetime)) as [12];
    
    --
    set dateformat dmy;  -- considera como dd/mm/aaaa
    
    
    SELECT eomonth (cast ('1/1/2016' as datetime)) as [1],
           eomonth (cast ('1/2/2016' as datetime)) as [2],
           eomonth (cast ('1/3/2016' as datetime)) as [3],
           eomonth (cast ('1/4/2016' as datetime)) as [4],
           eomonth (cast ('1/5/2016' as datetime)) as [5],
           eomonth (cast ('1/6/2016' as datetime)) as [6],
           eomonth (cast ('1/7/2016' as datetime)) as [7],
           eomonth (cast ('1/8/2016' as datetime)) as [8],
           eomonth (cast ('1/9/2016' as datetime)) as [9],
           eomonth (cast ('1/10/2016' as datetime)) as [10],
           eomonth (cast ('1/11/2016' as datetime)) as [11],
           eomonth (cast ('1/12/2016' as datetime)) as [12];

     


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz sexta-feira, 13 de setembro de 2019 20:19
    sexta-feira, 13 de setembro de 2019 19:52
  • Acrescente

         set DATEFORMAT dmy;

    no início do procedimento.  Algo assim:

    -- código #1
    ...
    ) AS
    BEGIN
    	DECLARE @ANO AS VARCHAR(4);
    	SET @ANO = SUBSTRING(@PERIODOLETIVO, 1, 4);
    
            set DATEFORMAT dmy;
    
    ...
     

     

    Lembre-se de marcar esta resposta se ela te ajudou a resolver o problema.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz domingo, 15 de setembro de 2019 10:21
    • Sugerido como Resposta José Diz sexta-feira, 20 de setembro de 2019 10:21
    sexta-feira, 13 de setembro de 2019 19:54