none
UPDATE DIFICIL RRS feed

  • Pergunta

  • Bom dia pessoal!

    Estou com um problema em minha base onde terei que executar um UPDATE complexo, preciso da ajuda de voces mais uma vez.

    Já até fiz o UPDATE , mas não esta dando certo, da uma mensagem dizendo que nao foi encontrado o campo que estou setando .

    UPDATE ED_DOCUMENTOITENS  SET   CSTPIS = A.HANDLE,

    CSTPIS = (SELECT A.HANDLE FROM ED_CLASSIFICACOESTRIBUTARIAS A  WHERE
    A.IMPOSTO IN (3) AND A.ULTIMOREGISTRO = 'S' AND A.HANDLE = 98)               --esse CSTPIS = ele faz o vinculo com o handle de negrito 

    WHERE DOCUMENTOORIGEM = (SELECT HANDLE FROM FN_DOCUMENTOS WHERE     --o documentoorigem= ele faz o vinculo   
    DATAEMISSAO >= '01/01/2012' AND ENTRADASAIDA = 'S' AND FILIAL = 2) AND
    CSTPIS = (SELECT A.HANDLE FROM ED_CLASSIFICACOESTRIBUTARIAS A  WHERE
    A.ULTIMOREGISTRO = 'N' AND A.HANDLE = 1)

    Explicação:

    Preciso dar um UPDATE no campo CSTPIS  da tabela ED_DOCUMENTOITENS, esse campo CSTPIS(FK) faz a ligação com a tabela ED_CLASSIFICACOESTRIBUTARIAS no campo HANDLE (CP), tenho que jogar o valor desse HANDLE para o campo CSTPIS dentro das condições que estão no UPDATE

    dados:

    TAB: ED_CLASSIFICACOESTRIBUTARIAS                                    ED_DOCUMENTOITENS

    HANLDE        ULTIMOREGISTRO                                                  CSTPIS

    1                   N                                                                            1    (esse valor tem que ser 98 que será o handle da outra tabela)

    98                 S                                                                            98

    Onde está o valor 1 no campo CSTPIS tenho que atualizar o valor dele para o valor do HANDLE da tabela  ED_CLASSIFICACOESTRIBUTARIAS  quando o ultimoregistro for 'S' , entao o valor é 98. Irei fazer isso quando na tabela FN_DOCUMENTOS o campo DATAEMISSAO >= '01/01/2012' and ENTRADASAIDA = 'S' and FILIAL = 2.

    É de grande urgencia a ajuda de voces.

    Obrigada

    Att,

    Bruna

    sexta-feira, 13 de abril de 2012 12:43

Todas as Respostas

  • Bom dia NovaesB,

    Eu não consegui entender muito bem o que você precisa.

    O 1º ponto( é acho que é justamente onde você quer chegar ) que eu não entendi é que você diz que o campo CSTPIS da tabela ED_DOCUMENTOITENS é FK com a tabela ED_CLASSIFICACOESTRIBUTARIAS campo HANLDE, neste caso como você consegue identificar que o valor 98 do campo HANLDE tabela ED_CLASSIFICACOESTRIBUTARIAS  deveria ser o valor 1 do campo CSTPIS tabela ED_DOCUMENTOITENS?

    No exemplo que você passou por exemplo eu não consigo ver um link entre estas informações, como sei que o 98 de uma tabela deverà substituir o 1 da outra, ( talvez haja mais campos que faça esta identificação ).

    Mais um ponto é que no seu update tem o seguinte comando:

    AND CSTPIS = (SELECT A.HANDLE FROM ED_CLASSIFICACOESTRIBUTARIAS A  WHERE
    A.ULTIMOREGISTRO = 'N' AND A.HANDLE = 1)

    que poderia ser alterado por :

    AND CSTPIS = 1

    Já que no seu select na tabela ED_CLASSIFICACOESTRIBUTARIAS você limita a retornar o A.HANDLE = 1, então o resultado da sua query ,

    SELECT A.HANDLE FROM ED_CLASSIFICACOESTRIBUTARIAS A  WHERE A.ULTIMOREGISTRO = 'N' AND A.HANDLE = 1 será sempre 1.

    Abçs,

    Adriano

    sexta-feira, 13 de abril de 2012 13:16
  • Em negrito as Respostas:

    O 1º ponto( é acho que é justamente onde você quer chegar ) que eu não entendi é que você diz que o campo CSTPIS da tabela ED_DOCUMENTOITENS é FK com a tabela ED_CLASSIFICACOESTRIBUTARIAS campo HANLDE, neste caso como você consegue identificar que o valor 98 do campo HANLDE tabela ED_CLASSIFICACOESTRIBUTARIAS  deveria ser o valor 1 do campo CSTPIS tabela ED_DOCUMENTOITENS?

    --quando o campo ULTIMOREGISTRO = 'N' terei que alterar e colocar o valor do que estiver 'S' , mas percebi que como vao ter varios com 'S' terei que ter mais um campo que identifique quando irei setar um novo valor, mas podemos tratar com esse exemplo que eu dei, so utilizando essas duas informacoes certo?

    Mais um ponto é que no seu update tem o seguinte comando:

    AND CSTPIS = (SELECT A.HANDLE FROM ED_CLASSIFICACOESTRIBUTARIAS A  WHERE
    A.ULTIMOREGISTRO = 'N' AND A.HANDLE = 1)

    que poderia ser alterado por :

    AND CSTPIS = 1

    Já que no seu select na tabela ED_CLASSIFICACOESTRIBUTARIAS você limita a retornar o A.HANDLE = 1, então o resultado da sua query ,

    Nao posso alterar, pois nem sempre o campo CSTPIS vai ser 1, por isso tenho que buscar o campo e nao um valor fixo. Coloquei 1 pq dei um exemplo pra estar podendo fazer o update apenas com um registro, entende? 

    Abs...

    sexta-feira, 13 de abril de 2012 13:41
  • Bruna,

    Você poderia postar um exemplo de como os seus dados estão nas duas tabelas e como vc gostaria do resultado final?


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    sexta-feira, 13 de abril de 2012 13:57
  • entendeu Adriando?

    descobri o campo que tenho que comparar para jogar o handle.

    dados:

    TAB: ED_CLASSIFICACOESTRIBUTARIAS                                  ED_DOCUMENTOITENS

    HANLDE        ULTIMOREGISTRO       CODIGO                            CSTPIS

    1                   N                                  1                                      1    (esse valor tem que ser 98 )

    98                 S                                 1                                      98

    Vou jogar o valor do HANDLE 98 no valor do CSTPIS quando o campo CODIGO e for S sera igual ao CODIGO do N.

    Entendeu?

    sexta-feira, 13 de abril de 2012 18:29
  • Boa tarde NovaesB,

    Montei um exemplo com o que entendi, veja se o exemplo abaixo te ajuda.

    PS: Não levei em consideração o caso de você ter mais de um S na tabela ED_CLASSIFICACOESTRIBUTARIAS . ai ficaria mais complicado, pois você teria que achar um forma de identificar realmente qual linha você vai usar para atualizar a outra tabela ( a principio estamos considerando apenas a coluna ULTIMOREGISTRO ).

    -- CRIA TABELA 1
    DECLARE @ED_CLASSIFICACOESTRIBUTARIAS AS TABLE(
    HANLDE	INT,
    ULTIMOREGISTRO CHAR(1),
    CODIGO INT
    )
    
    -- CRIA TABELA 2
    DECLARE @ED_DOCUMENTOITENS AS TABLE(
    CSTPIS INT
    )
    
    -- INSERE DADOS TABELA 1
    INSERT INTO @ED_CLASSIFICACOESTRIBUTARIAS VALUES(1, 'N',1);
    INSERT INTO @ED_CLASSIFICACOESTRIBUTARIAS VALUES(98,'S',1);
    
    -- INSERE DADOS TABELA 2
    INSERT INTO @ED_DOCUMENTOITENS VALUES(1) ;
    INSERT INTO @ED_DOCUMENTOITENS VALUES(98);
    
    -- BUSCA DADOS
    WITH CTE AS(
    SELECT * FROM @ED_CLASSIFICACOESTRIBUTARIAS CLS INNER JOIN @ED_DOCUMENTOITENS DOC
    			  ON  CLS.CODIGO = DOC.CSTPIS
    			  AND CLS.ULTIMOREGISTRO = 'S'
    			  AND DOC.CSTPIS = 1)
    
    -- UPDATE NO CAMPO CSTPIS
    UPDATE CTE SET 	CSTPIS = HANLDE
    
    -- VEJA QUE FOI ALTERADO 
    SELECT * FROM @ED_DOCUMENTOITENS	

    Adriano.
    sexta-feira, 13 de abril de 2012 18:56
  • Boa tarde Adriano!

    Entao Adriana, o que voce me passou falta condicoes, e são essas condições que não estou sabendo colocar no update.

    O que eu consegui fazer está abaixo:

    UPDATE ED_DOCUMENTOITENS  SET   CSTPIS = A.HANDLE, CSTCOFINS = B.HANDLE,
    CSTPIS = (SELECT A.HANDLE FROM ED_CLASSIFICACOESTRIBUTARIAS A  WHERE
    A.IMPOSTO IN (3) AND A.ULTIMOREGISTRO = 'S' AND A.HANDLE = 98)
    WHERE DOCUMENTOORIGEM = (SELECT HANDLE FROM FN_DOCUMENTOS WHERE
    DATAEMISSAO >= '01/01/2012' AND ENTRADASAIDA = 'S' AND FILIAL = 2) AND
    CSTPIS = (SELECT A.HANDLE FROM ED_CLASSIFICACOESTRIBUTARIAS A  WHERE
    A.ULTIMOREGISTRO = 'N' A.HANDLE = 1)

    Obs: O primeiro texto que está em negrito são as condições que eu preciso identificar primeiro, depois de identificado o segundo negrito é onde eu preciso jogar as informações que eu achei no primeiro negrito, o que me complica é que tenho que identificar pirmeiro em uma  tabela e depois dar o update identificando outras condições na mesma tabela. O HANDLE = 98 e o HANDLE = 1eu coloquei só para executar em um registro, mas depois nao vou usar nenhum, vou executar em todos. O que não estou sabendo colocar é que no primeiro negrito , preciso dizer que o campo CODIGO é igual ao CODIGO da segunda situação que é o segundo negrito. Entendeu?

    Obrigada

    terça-feira, 17 de abril de 2012 19:46
  • Alguém do fórum pode me ajudar com esse problema?

    Grata

    terça-feira, 17 de abril de 2012 19:47
  • Bom dia NovaesB,

    Montei o script abaixo, veja se ele te ajuda.

    No Script só atualizei o CTSPIS, o CSTCOFINS não esta sendo tratado no mesmo pois não entendi sua regra para ele.

    Veja se o script te ajuda e qualquer problema posta ai.

    -- BUSCA DADOS
    WITH CTE AS
     (SELECT E.CSTPIS, 
             -- E.CSTCOFINS, 
             E.DOCUMENTOORIGEM, 
             A.CODIGO
        FROM ED_DOCUMENTOITENS E 
        INNER JOIN ED_CLASSIFICACOESTRIBUTARIAS A ON E.CSTPIS = A.HANDLE
        INNER JOIN FN_DOCUMENTOS FN ON E.DOCUMENTOORIGEM = FN.HANDLE
      WHERE  A.ULTIMOREGISTRO = 'N'
      AND    A.HANDLE = 1
      AND    FN.DATAEMISSAO >= '01/01/2012'
      AND    FN.ENTRADASAIDA = 'S'
      AND    FN.FILIAL = 2)
    
    -- UPDATE NO CAMPO CSTPIS
    UPDATE CTE SET 	CTE.CSTPIS = ED_CLASSIFICACOESTRIBUTARIAS.HANDLE
    FROM CTE INNER JOIN ED_CLASSIFICACOESTRIBUTARIAS A
    ON   CTE.CODIGO = A.CODIGO
    WHERE A.IMPOSTO IN (3)
    AND   A.ULTIMOREGISTRO = 'S'
    AND   A.HANDLE = 98

    Adriano
    quarta-feira, 18 de abril de 2012 12:41