none
SQL SERVER - Procedure RRS feed

  • Pergunta

  • Boa tarde

    Seguinte... Preciso criar uma Procedure para executar a seguinte tarefa

    Temos as seguintes tabelas: 1º tabela da imagem: tabela_TBD; 2º tabela da imagem: tabela_TBA

    A tabela_TBA são as correções que devo fazer na tabela_TBD.

    Linha 1 da tabela_TBA: codCatIndicado = 5; codCatDetectado = 2; correcao = 2; QUANTIDADE 1; VALOR 5,20

    Preciso encontrar na tabela_TBD a linha que tenha codCatindicado = 5 e codCatDetectado = 2, encontrando isso vou subtrair o valor da QUANTIDADE da tabela_TBA com o valor da QUANTIDADE da tabela_TBD, subtrair o VALOR da tabela_TBA com o VALOR da tabela_TBD. Então a linha 6 da tabela_TBD deve ficar assim:

    seguindo a ordem dos campos

    120221711; TBD; 05; 02; 00; 00; 780

    Na linha 3 da tabela_TBD devemos acrescentar na QUANTIDADE e no VALOR os valores correspondentes,  o codCatIndicada 02 e o codCatDetectada 02 ganham mais um na QUANTIDADE e no VALOR. Então a linha 3 da tabela_TBD deve ficar assim:

    seguindo a ordem dos campos

    120221708; TBD; 02; 02; 00; 3; 1560

    SUBTRAIO DE UMA CATEGORIA E CREDITO EM OUTRA.

    Gostaria de saber como posso fazer isso. Espero que entendam o problema, obrigado


    terça-feira, 26 de fevereiro de 2013 20:10

Respostas

  • Se vc qr pecorrer registro a registro para fazer as alterações, utilize o CURSOR:

    MSDN DECLARE CURSOR


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 27 de fevereiro de 2013 13:25
  • Segue o código que estou utilizando para resolver o problema, acredito que de para melhorar fico aguardando sugestões..

    SELECT
    	idTransacao,
    	codOrigem,
    	codCatIndicada,
    	codCatDetectada,
    	codCatCobrado,
    	qtdeCategoria,
    	valorMoedaCorrente 
    INTO #CONSULTA_TBD
    FROM 
    	opr_transacao
    WHERE 
    	codConcessao = 19
    	AND codPraca = 143
    	AND placaPDT = 002 --PISTA
    	AND dataHoraTransacao = '2012-09-01 03:00:00'
    	AND codFormaPagamento = 001
    	AND codOrigem = 'TBD'
    	--AND codCatIndicada <> codCatDetectada
    			
    SELECT
    	idTransacao,
    	codOrigem,
    	codCatIndicada,
    	codCatDetectada,
    	codCatCobrado,
    	qtdeCategoria,
    	valorMoedaCorrente 
    INTO #CONSULTA_TBA
    FROM 
    	opr_transacao
    WHERE 
    	codConcessao = 19
    	AND codPraca = 143
    	AND placaPDT = 002 --PISTA
    	AND dataHoraTransacao = '2012-09-01 03:00:00'
    	AND codFormaPagamento = 001
    	AND codOrigem = 'TBA'
    	
    --Cria variaveis para o cursor TBA		
    DECLARE @idTransacaoTBA			BIGINT
    DECLARE @codOrigemTBA			CHAR
    DECLARE @codCatIndicadaTBA		VARCHAR(5)
    DECLARE @codCatDetectadaTBA		VARCHAR(5)
    DECLARE @codCorrecaoTBA			VARCHAR(5)
    DECLARE @quantidadeTBA			INT
    DECLARE @valorTBA				FLOAT
    
    --Cria Cursor
    DECLARE db_cursorTBA CURSOR
    FOR
    	SELECT
    		idTransacao,
    		codOrigem,
    		codCatIndicada,
    		codCatDetectada,
    		codCatCobrado,
    		qtdeCategoria,
    		valorMoedaCorrente
    	FROM
    		#CONSULTA_TBA
    		
    	
    	OPEN db_cursorTBA
    	
    	FETCH NEXT FROM db_cursorTBA INTO
    		@idTransacaoTBA,		
    		@codOrigemTBA,			
    		@codCatIndicadaTBA,		
    		@codCatDetectadaTBA,	
    		@codCorrecaoTBA,		
    		@quantidadeTBA,			
    		@valorTBA
    	
    	WHILE @@FETCH_STATUS = 0
    		BEGIN
    			--Executa a ação dentro do cursor db_cursorTBA			
    			
    				UPDATE
    					#CONSULTA_TBD
    				SET
    					qtdeCategoria = qtdeCategoria - @quantidadeTBA,
    					valorMoedaCorrente = valorMoedaCorrente - @valorTBA
    				FROM
    					#CONSULTA_TBD
    				WHERE
    					codCatIndicada = @codCatIndicadaTBA AND
    					codCatDetectada = @codCatDetectadaTBA
    					
    					
    				UPDATE
    					#CONSULTA_TBD
    				SET
    					qtdeCategoria = qtdeCategoria + @quantidadeTBA,
    					valorMoedaCorrente = valorMoedaCorrente + @valorTBA
    				FROM
    					#CONSULTA_TBD
    				WHERE
    					codCatIndicada = @codCorrecaoTBA AND
    					codCatDetectada = @codCorrecaoTBA
    			
    				
    			
    			FETCH NEXT FROM db_cursorTBA INTO
    				@idTransacaoTBA,		
    				@codOrigemTBA,			
    				@codCatIndicadaTBA,		
    				@codCatDetectadaTBA,	
    				@codCorrecaoTBA,		
    				@quantidadeTBA,			
    				@valorTBA
    		END
    	CLOSE db_cursorTBA
    DEALLOCATE db_cursorTBA
    	
    			
    SELECT * FROM #CONSULTA_TBD
    SELECT * FROM #CONSULTA_TBA
    
    --DROP TABLE #CONSULTA_TBD
    --DROP TABLE #CONSULTA_TBA

    Obrigado
    quinta-feira, 28 de fevereiro de 2013 13:00

Todas as Respostas

  • Boa tarde,

    Experimente mais ou menos dessa forma:

    update d
    set 
        d.Quantidade = d.Quantidade - a.Quantidade,
        d.Valor = d.Valor - a.Valor
    from Tabela_TBD as d
    inner join Tabela_TDA as a
        on 
            a.CodCatIndicada = d.CodCatIndicada and
            a.CodCatDetectada = d.CotCadDetectada;
    
    update d
    set 
        d.Quantidade = d.Quantidade + a.Quantidade,
        d.Valor = d.Valor + a.Valor
    from Tabela_TBD as d
    inner join Tabela_TDA as a
        on 
            a.Correcao = d.CodCatIndicada and
            a.CodCatDetectada = d.CotCadDetectada;
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Sugerido como Resposta Roberson Naves terça-feira, 26 de fevereiro de 2013 22:50
    terça-feira, 26 de fevereiro de 2013 20:44
  • Obrigado pela ajuda Roberson, mas o meu problema não está na logica de como vou fazer o update e sim como vou fazer para percorrer a tabela fazendo as devidas alterações.
    quarta-feira, 27 de fevereiro de 2013 13:16
  • Se vc qr pecorrer registro a registro para fazer as alterações, utilize o CURSOR:

    MSDN DECLARE CURSOR


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 27 de fevereiro de 2013 13:25
  • Segue o código que estou utilizando para resolver o problema, acredito que de para melhorar fico aguardando sugestões..

    SELECT
    	idTransacao,
    	codOrigem,
    	codCatIndicada,
    	codCatDetectada,
    	codCatCobrado,
    	qtdeCategoria,
    	valorMoedaCorrente 
    INTO #CONSULTA_TBD
    FROM 
    	opr_transacao
    WHERE 
    	codConcessao = 19
    	AND codPraca = 143
    	AND placaPDT = 002 --PISTA
    	AND dataHoraTransacao = '2012-09-01 03:00:00'
    	AND codFormaPagamento = 001
    	AND codOrigem = 'TBD'
    	--AND codCatIndicada <> codCatDetectada
    			
    SELECT
    	idTransacao,
    	codOrigem,
    	codCatIndicada,
    	codCatDetectada,
    	codCatCobrado,
    	qtdeCategoria,
    	valorMoedaCorrente 
    INTO #CONSULTA_TBA
    FROM 
    	opr_transacao
    WHERE 
    	codConcessao = 19
    	AND codPraca = 143
    	AND placaPDT = 002 --PISTA
    	AND dataHoraTransacao = '2012-09-01 03:00:00'
    	AND codFormaPagamento = 001
    	AND codOrigem = 'TBA'
    	
    --Cria variaveis para o cursor TBA		
    DECLARE @idTransacaoTBA			BIGINT
    DECLARE @codOrigemTBA			CHAR
    DECLARE @codCatIndicadaTBA		VARCHAR(5)
    DECLARE @codCatDetectadaTBA		VARCHAR(5)
    DECLARE @codCorrecaoTBA			VARCHAR(5)
    DECLARE @quantidadeTBA			INT
    DECLARE @valorTBA				FLOAT
    
    --Cria Cursor
    DECLARE db_cursorTBA CURSOR
    FOR
    	SELECT
    		idTransacao,
    		codOrigem,
    		codCatIndicada,
    		codCatDetectada,
    		codCatCobrado,
    		qtdeCategoria,
    		valorMoedaCorrente
    	FROM
    		#CONSULTA_TBA
    		
    	
    	OPEN db_cursorTBA
    	
    	FETCH NEXT FROM db_cursorTBA INTO
    		@idTransacaoTBA,		
    		@codOrigemTBA,			
    		@codCatIndicadaTBA,		
    		@codCatDetectadaTBA,	
    		@codCorrecaoTBA,		
    		@quantidadeTBA,			
    		@valorTBA
    	
    	WHILE @@FETCH_STATUS = 0
    		BEGIN
    			--Executa a ação dentro do cursor db_cursorTBA			
    			
    				UPDATE
    					#CONSULTA_TBD
    				SET
    					qtdeCategoria = qtdeCategoria - @quantidadeTBA,
    					valorMoedaCorrente = valorMoedaCorrente - @valorTBA
    				FROM
    					#CONSULTA_TBD
    				WHERE
    					codCatIndicada = @codCatIndicadaTBA AND
    					codCatDetectada = @codCatDetectadaTBA
    					
    					
    				UPDATE
    					#CONSULTA_TBD
    				SET
    					qtdeCategoria = qtdeCategoria + @quantidadeTBA,
    					valorMoedaCorrente = valorMoedaCorrente + @valorTBA
    				FROM
    					#CONSULTA_TBD
    				WHERE
    					codCatIndicada = @codCorrecaoTBA AND
    					codCatDetectada = @codCorrecaoTBA
    			
    				
    			
    			FETCH NEXT FROM db_cursorTBA INTO
    				@idTransacaoTBA,		
    				@codOrigemTBA,			
    				@codCatIndicadaTBA,		
    				@codCatDetectadaTBA,	
    				@codCorrecaoTBA,		
    				@quantidadeTBA,			
    				@valorTBA
    		END
    	CLOSE db_cursorTBA
    DEALLOCATE db_cursorTBA
    	
    			
    SELECT * FROM #CONSULTA_TBD
    SELECT * FROM #CONSULTA_TBA
    
    --DROP TABLE #CONSULTA_TBD
    --DROP TABLE #CONSULTA_TBA

    Obrigado
    quinta-feira, 28 de fevereiro de 2013 13:00