Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Jeová Oliveira dos Santos

Função update

Recommended Posts

Boa tarde a todos, por favor alguém poderia me ajudar no seguinte caso eu tenho uma tabela em sqlserver 2008 R2 e nele tem uma tabela de escrituras

Os campos da tabela TABELIONATO_ESCRITURAS IDESCRITURA,LICRO,FOLHA,FOLHA_INICIAL,FOLHA_FINAL,COMPLEMENTO_LIVRO,COMPLEMENTO_FOLHA

 

Os dados apresentados nesta tabela EM UM select destes campos seria isso

IDESCRITURA LIVRO FOLHA_INICIAL FOLHAS FOLHA_FINAL APRESENTANTE CL CF
521 50 1 2 169 MARCELO GRATTAO CV V
520 50 3 2 169 ANA CLAUDIA BATISTA TONIASSO CV V
525 50 5 2 169 JOSE RIBEIRO DA SILVA CV V
526 50 7 2 169 MARIA APARECIDA SANTOS CV V
527 50 9 2 169 VALDEREZA DE FATIMA FERREIRA GOMES CV V
507 50 11 2 169 CLAUDIO PEDERIVA CV V
531 50 13 2 169 LUIS ROOSEVEL NUNES SALES CV V
529 50 15 2 169 ALINE MARIA HATUM BOSQUE CV V
528 50 17 2 169 ADINILSON KORB CV V
535 50 20 2 169 ANGELO MOREIRA DE ANDRADE CV V

 

Veja que no campo folha final é sempre o mesmo 169 e não é pra ser assim, os novos já foram resolvidos e os velhos precisam de um update em todos para alterar os campos FOLHAS e FOLHA_FINAL.

 

Tipo FOLHA_INICIAL do IDESCRITURA=521 começa em 1 e do IDESCRITURA=520 começa em 3. O total de folhas é duas mais veja que o ID 528 é 17 e o ID 535 é 20 isso daria 3 no campo FOLHAS, e o folha final do ID 528 seria 19 e não 169 assim como em todos. Como fazer um while junto com um select dentro do banco que tenha

exemplo (ideia)

whiele livro=50
update TABELIONATO_ESCRITURAS
set folhas=(DEVE SER O RESULTADO DA SUBTRAO DO FOLHA_INICIAL 
            E O PRÓXIMO FOLHA_INICIAL),
      FOLHA_FINAL=(DEVE SER UM NUMERO DEPOIS FOLHA_INICIAL E 
                   ANTES DO PRÓXIMO FOLHA_INICIAL)
DESDE QUE O LIVRO SEJA IGUAL A 50

ALGUÉM ME AJUDA?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jeová, pelo que entendi as colunas FOLHA_FINAL e FOLHA não estão com informação correta quando FOLHA_FINAL é 169. E o código é para ser executado uma única vez.

 

Avalie o seguinte código:

-- código 1
;with TAB_Seq as (
SELECT *, Seq= row_number() over (partition by LIVRO order by FOLHA_INICIAL)
  from TABELIONATO_ESCRITURAS
  where LIVRO = 50
)
UPDATE T1
  set FOLHA_FINAL= case when T2.FOLHA_INICIAL is not null
                        then (T2.FOLHA_INICIAL -1)
                        else (T1.FOLHA_INICIAL + T1.FOLHA -1) end,
      FOLHA= case when T2.FOLHA_INICIAL is not null
                  then (T2.FOLHA_INICIAL - T1.FOLHA_INICIAL)
                  else T1.FOLHA end
  --output deleted.FOLHA_INICIAL, deleted.FOLHA_FINAL, inserted.FOLHA_FINAL,
  --       deleted.FOLHA, inserted.FOLHA
  from TAB_Seq as T1
       left join TAB_Seq as T2 on T1.LIVRO = T2.LIVRO and T1.Seq = T2.Seq -1
  where T1.FOLHA_FINAL = 169;

Teste com atenção; posso ter esquecido algum detalhe.


Eis outra codificação, provavelmente de compreensão mais fácil.

-- código 2
BEGIN TRANSACTION;

;with TAB_Seq as (
SELECT *, Seq= row_number() over (partition by LIVRO order by FOLHA_INICIAL)
  from TABELIONATO_ESCRITURAS
  where LIVRO = 50
)
UPDATE T1
  set FOLHA_FINAL= T2.FOLHA_INICIAL -1,
      FOLHA= T2.FOLHA_INICIAL - T1.FOLHA_INICIAL
  --output deleted.FOLHA_INICIAL, deleted.FOLHA_FINAL, inserted.FOLHA_FINAL,
  --       deleted.FOLHA, inserted.FOLHA
  from TAB_Seq as T1
       inner join TAB_Seq as T2 on T1.LIVRO = T2.LIVRO and T1.Seq = T2.Seq -1
  where T1.FOLHA_FINAL = 169;

-- a última anotação do livro
UPDATE TABELIONATO_ESCRITURAS
  set FOLHA_FINAL = FOLHA_INICIAL + FOLHA -1
  --output deleted.FOLHA_INICIAL, deleted.FOLHA_FINAL, inserted.FOLHA_FINAL
  where LIVRO = 50 
        and FOLHA_FINAL = 169;

COMMIT TRANSACTION;

Teste com atenção; posso ter esquecido algum detalhe.

 

 

linkedin.gif José Diz Belo Horizonte, MG - Brasil

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.