Pular para o conteúdo
Visualizando 15 posts - 1 até 15 (de 25 do total)
  • Autor
    Posts
  • #105937
    Avatar de PAULO HENRIQUEPAULO HENRIQUE
    Participante

      Olá,

      Sou iniciante em Oracle estou encontrando dificuldades em realizar um rotina em meu trabalho.

      Segue minha duvida,
      Tenho 3 tabelas

      Tab1
      codigo_item, posicao_fiscal, pis,cofins

      tab2
      codigo_item, pis, cofins,nota_fiscal

      tab3
      nota_fiscal, data_documento

      Pergunta, através do código NCM(tab1) preciso de determinadas notas fiscais(tab2) em uma data selecionada(tab3). após o resultado preciso alterar as colunas pis e cofins da tab2,com um determinado valor.

      Fiz o select, porém não estou conseguindo fazer o UPDATE, alguém poderia me ajudar?

      Segue o código do select

      select A.Item_Estoque, C.Numero_Nota_Fiscal, B.Quantidade, A.Base_Pis, A.Base_Cofins, C.Dta_Entrada_Saida from pec_item_estoque A, fat_movimento_item B, fat_movimento_capa C
      where posicao_fiscal = 40169990
      and C.dta_entrada_saida between to_date(’01/08/2013′,’dd/mm/yyyy’)
      and to_date(’02/08/2013′,’dd/mm/yyyy’)
      and C.revenda = 1
      and A.item_estoque = B.Item_Estoque
      and B.Numero_Nota_Fiscal = C.NUMERO_NOTA_FISCAL
      and C.Tipo_Transacao = ‘P01’
      order by C.Numero_Nota_Fiscal

      #105938
      Avatar de Andrei RubinoAndrei Rubino
      Participante

        @cardoso_ph
        Não entendi muito bem sua dúvida…
        Qual sua dúvida em relação ao update ?
        Quer fazer o update de uma forma automatizada, ou quer rodar o update na mão ?

        #105939
        Avatar de PAULO HENRIQUEPAULO HENRIQUE
        Participante

          Olá Andrei,

          minha dúvida seria em fazer o update na Tab1 tendo em vista que o estou buscando dados também na Tab2 e Tab3 para ter exatamente o que alterar na tab1.
          Não precisa ser de forma automatizada, por que tenho alguns critérios diferentes para serem alterados de acordo com a pesquisa.

          #105940
          Avatar de rmanrman
          Participante

            @cardoso_ph

            É perfeitamente possível atualizar um campo baseado em valores de outras tabelas, segue um exemplo:

            http://blog.devdelver.com/archives/599

            #105942
            Avatar de PAULO HENRIQUEPAULO HENRIQUE
            Participante

              @RMAN
              Obrigado pela ajuda tb.

              Verifiquei o post , porém o exemplo é com uma tabela e não com 3.

              Cheguei até tentar fazer um update mais sem sucesso.
              Problema é que para eu chegar na informação que eu quero eu preciso pegar dados de 3 tabelas, aí sim alterar o valor em uma delas.

              Segue minha tentativa de update

              [b]update pec_item_estoque A
              set A.base_pis = 0
              where A.posicao_fiscal = [/b]
              (select A.Item_Estoque, C.Numero_Nota_Fiscal, B.Quantidade, A.Base_Pis, A.Base_Cofins, C.Dta_Entrada_Saida from pec_item_estoque A, fat_movimento_item B, fat_movimento_capa C
              where posicao_fiscal = 40169990
              and C.dta_entrada_saida between to_date(’01/08/2013′,’dd/mm/yyyy’)
              and to_date(’02/08/2013′,’dd/mm/yyyy’)
              and C.revenda = 1
              and A.item_estoque = B.Item_Estoque
              and B.Numero_Nota_Fiscal = C.NUMERO_NOTA_FISCAL
              and C.Tipo_Transacao = ‘P01’)

              ** Mensagem de retorno 00913 – too many values

              Como disse sou iniciante, se puderem me ajudar com exemplo pratico eu agradeço.

              conto com o apoio de vocês.

              #105943
              Avatar de Andrei RubinoAndrei Rubino
              Participante

                @cardoso_ph

                Esse erro(‘00913 – too many values’) ocorre pois no seu select você está retornando mais de um valor, que são esses (A.Item_Estoque, C.Numero_Nota_Fiscal, B.Quantidade, A.Base_Pis, A.Base_Cofins, C.Dta_Entrada_Saida) então ele diz que existem muitos valores.

                Para corrigir você deve deixar apenas a coluna a qual corresponde o valor da clausula.Que no seu caso é where A.posicao_fiscal = ?

                Exemplo:

                update pec_item_estoque A
                set A.base_pis = 0
                where A.posicao_fiscal =
                (select A.Item_Estoque from pec_item_estoque A, fat_movimento_item B, fat_movimento_capa C
                where posicao_fiscal = 40169990
                and C.dta_entrada_saida between to_date(’01/08/2013′,’dd/mm/yyyy’)
                and to_date(’02/08/2013′,’dd/mm/yyyy’)
                and C.revenda = 1
                and A.item_estoque = B.Item_Estoque
                and B.Numero_Nota_Fiscal = C.NUMERO_NOTA_FISCAL
                and C.Tipo_Transacao = ‘P01’)

                #105944
                Avatar de PAULO HENRIQUEPAULO HENRIQUE
                Participante

                  @Andrei Rubino

                  Obrigado pela ajuda,

                  Antes de executar o update fiz o select somente para um dia para teste, e ele me retornou 6 itens..

                  Coloquei o codigo com update ele executou sem erros, porém fica executando eternamente, necessário dar um break .

                  O que pode estar acontecendo ?

                  #105945
                  Avatar de Andrei RubinoAndrei Rubino
                  Participante

                    @cardoso_ph

                    Se o seu select te retornou 6 registros provavelmente ele não executou com sucesso o update.

                    A pergunta é você quer dar update na tabela para cada registro destes 6 registros retornados no select ?
                    Se sim, utilize o operador IN em vez de = na clausula where.
                    Ficando assim where A.posicao_fiscal in (select ……).

                    Se não, se era para retornar apenas uma linha, sua query está com problemas.

                    #105946
                    Avatar de PAULO HENRIQUEPAULO HENRIQUE
                    Participante

                      Entendi Andrei,

                      Executo o select acima antes do update ai tenho esse retorno abaixo.
                      Item_estoque Num_nota QTD Base_Pis Base_Con DTA_Entrada
                      1 53513 102032 1,00 0,00 0,00 12/08/2013
                      2 64034 102118 3,00 100,00 100,00 12/08/2013
                      3 31025 1744962 2,00 0,00 0,00 12/08/2013
                      4 31025 1744962 2,00 0,00 0,00 12/08/2013
                      5 65056 1745438 1,00 0,00 0,00 12/08/2013
                      6 65056 1745438 1,00 0,00 0,00 12/08/2013

                      Baseado nesse retorno quero executar o update que altere o valor base_pis de 100 para 0.

                      executei o update com operador IN ele executa bem rápido porém não está alterando o valor de 100 para 0.

                      Qual seria o erro ?

                      Obrigado mais uma vez.

                      #105947
                      Avatar de PAULO HENRIQUEPAULO HENRIQUE
                      Participante

                        .

                        #105948
                        Avatar de Andrei RubinoAndrei Rubino
                        Participante

                          @CARDOSO_PH

                          Qual desses valores deve ser igual a sua clausula where A.posicao_fiscal = ?
                          Item_estoque Num_nota QTD Base_Pis Base_Con DTA_Entrada
                          1 53513 102032 1,00 0,00 0,00 12/08/2013
                          2 64034 102118 3,00 100,00 100,00 12/08/2013
                          3 31025 1744962 2,00 0,00 0,00 12/08/2013
                          4 31025 1744962 2,00 0,00 0,00 12/08/2013
                          5 65056 1745438 1,00 0,00 0,00 12/08/2013
                          6 65056 1745438 1,00 0,00 0,00 12/08/2013

                          A.posical_fiscal = Num_nota ?

                          Acredito que você está executando o select errado ainda.
                          Posta aqui o código que você está executando.

                          #105949
                          Avatar de PAULO HENRIQUEPAULO HENRIQUE
                          Participante

                            Codigo para consulta

                            select A.Item_Estoque, C.Numero_Nota_Fiscal, B.Quantidade, A.Base_Pis, A.Base_Cofins, C.Dta_Entrada_Saida from pec_item_estoque A, fat_movimento_item B, fat_movimento_capa C
                            where posicao_fiscal = 40169990
                            and C.dta_entrada_saida between to_date(’12/08/2013′,’dd/mm/yyyy’)
                            and to_date(’12/08/2013′,’dd/mm/yyyy’)
                            and C.revenda = 1
                            and A.item_estoque = B.Item_Estoque
                            and B.Numero_Nota_Fiscal = C.NUMERO_NOTA_FISCAL
                            and C.Tipo_Transacao = ‘P01’
                            order by C.Numero_Nota_Fiscal

                            Retorna os valores abaixo:
                            Item_estoque Num_nota QTD Base_Pis Base_Con DTA_Entrada
                            1 53513 102032 1,00 0,00 0,00 12/08/2013
                            2 64034 102118 3,00 100,00 100,00 12/08/2013
                            3 31025 1744962 2,00 0,00 0,00 12/08/2013
                            4 31025 1744962 2,00 0,00 0,00 12/08/2013
                            5 65056 1745438 1,00 0,00 0,00 12/08/2013
                            6 65056 1745438 1,00 0,00 0,00 12/08/2013

                            Codigo do com update:

                            update pec_item_estoque A
                            set A.base_pis = ‘0,00’
                            where A.posicao_fiscal in
                            (select A.Item_Estoque from pec_item_estoque A, fat_movimento_item B, fat_movimento_capa C
                            where posicao_fiscal = 40169990
                            and C.dta_entrada_saida between to_date(’12/08/2013′,’dd/mm/yyyy’)
                            and to_date(’12/08/2013′,’dd/mm/yyyy’)
                            and C.revenda = 1
                            and A.item_estoque = B.Item_Estoque
                            and B.Numero_Nota_Fiscal = C.NUMERO_NOTA_FISCAL
                            and C.Tipo_Transacao = ‘P01’)

                            #105950
                            Avatar de rmanrman
                            Participante

                              @cardoso_ph

                              Acho que entendi o que você precisa, seria atualizar a tabela PEC_ITEM_ESTOQUE utilizando critérios que estão em outras tabelas.

                              Tente assim, faça o UPDATE, verifique depois se a atualização fez o que deveria, se estiver ok, dê COMMIT, caso contrário dê ROLLBACK;


                              UPDATE PEC_ITEM_ESTOQUE A
                              SET A.BASE_PIS = '0,00'
                              WHERE A.POSICAO_FISCAL = 40169990
                              AND EXISTS (
                              SELECT 1
                              FROM FAT_MOVIMENTO_ITEM B
                              INNER JOIN FAT_MOVIMENTO_CAPA C ON C.NUMERO_NOTA_FISCAL = B.NUMERO_NOTA_FISCAL
                              WHERE A.ITEM_ESTOQUE = B.ITEM_ESTOQUE
                              AND C.DTA_ENTRADA_SAIDA BETWEEN TO_DATE('12/08/2013', 'DD/MM/YYYY') AND TO_DATE('12/08/2013', 'DD/MM/YYYY')
                              AND C.REVENDA = 1
                              AND C.TIPO_TRANSACAO = 'P01'
                              )

                              #105951
                              Avatar de PAULO HENRIQUEPAULO HENRIQUE
                              Participante

                                @rman

                                Exatamente isso.

                                então no meu exemplo acima, esse comando que me enviou deveria alterar somente 1 registro correto ?

                                Porém ele me dá que são 4 registros.

                                Agora fazer uma pergunta , como vejo o resultado(esses 4 registros)antes de efetuar o commit?

                                Porque eu podendo visualizar o que será alterado eu posso verificar aonde ele estaria pegando os outros 3 registros.

                                #105952
                                Avatar de rmanrman
                                Participante

                                  @cardoso_ph

                                  Para verificar é simples:


                                  SELECT *
                                  FROM PEC_ITEM_ESTOQUE A
                                  WHERE A.POSICAO_FISCAL = 40169990
                                  AND EXISTS (
                                  SELECT 1
                                  FROM FAT_MOVIMENTO_ITEM B
                                  INNER JOIN FAT_MOVIMENTO_CAPA C ON C.NUMERO_NOTA_FISCAL = B.NUMERO_NOTA_FISCAL
                                  WHERE A.ITEM_ESTOQUE = B.ITEM_ESTOQUE
                                  AND C.DTA_ENTRADA_SAIDA BETWEEN TO_DATE('12/08/2013', 'DD/MM/YYYY') AND TO_DATE('12/08/2013', 'DD/MM/YYYY')
                                  AND C.REVENDA = 1
                                  AND C.TIPO_TRANSACAO = 'P01'
                                  )

                                  Se era para atualizar apenas 1 registro, então está faltando alguma condição. Bom, não vou conseguir te dizer se era pra atualizar 1 ou 4 registro, pois isso envolve a regra do negócio.

                                Visualizando 15 posts - 1 até 15 (de 25 do total)
                                • Você deve fazer login para responder a este tópico.
                                plugins premium WordPress