Pular para o conteúdo
Visualizando 12 posts - 1 até 12 (de 12 do total)
  • Autor
    Posts
  • #90246
    Shiono
    Participante

      Ola pessoal

      1º Gostaria de agradeçer as dicas que me deram no topico sobre exportar dados do Oracle para o Sql Server 2005

      Turma eu sou novo com o Oracle e estou com o seguinte problema
      Tenho um ERP Protheus instaldo que sofreu tantas customizaçoes que algumas funções pararam de funcionar.

      então eu criei o script abaixo para acertar a quantidade em reserva de um produto

      o problema acontece no update eu tenho, algo esta errado no comando e eu não consigo descobrir o que é.

      Se algum puder me ajudar pois já deu até reunião de diretoria

      insert into SIGA.ReservaProc (RP_Data,RP_Tipo,RP_Filial,RP_Local,RP_Produto,RP_QAtual,RP_QReserva,RP_QPedido)
      select distinct
      sysdate
      ,’CPV1′ as Tipo_Peqsquisa
      ,b2.b2_filial as Filial_Estoque
      ,b2.b2_local as Local_Estoque
      ,b2.b2_cod as Cod_Produto
      ,sum(b2.b2_qatu) as Qtd_Atual
      ,sum(b2.b2_reserva) as Qtd_Reserva
      ,sum(c6.c6_qtdven) as Qtd_Pedido
      from siga.sb2010 b2
      inner join
      siga.sc6010 c6
      on b2.b2_filial = c6.c6_filial
      and b2.b2_local = c6.c6_local
      and b2.b2_cod = c6.c6_produto
      and b2.b2_reserva > c6_qtdven
      inner join
      siga.sc5010 c5
      on c5.c5_filial = c6.c6_filial
      and c5.c5_num = c6.c6_num
      where b2.d_e_l_e_t_ <> ‘*’
      and c5.d_e_l_e_t_ <> ‘*’
      and c6.d_e_l_e_t_ <> ‘*’
      and c5_emissao >= TO_CHAR(SYSDATE-30,’YYYYMMDD’)
      and c5_nota = ‘ ‘
      and c5_status != ‘B’
      and c6.c6_nota = ‘ ‘
      and b2.b2_reserva > (b2.b2_qatu – b2.b2_reserva)
      and b2.b2_reserva <> b2.b2_qatu
      — and (b2.b2_qatu <> b2.b2_reserva and b2.b2_reserva <> c6.c6_qtdven)
      — and b.B2_COD LIKE ‘KF0%’
      group by
      b2.b2_filial
      ,b2.b2_local
      ,b2.b2_cod
      order by
      b2.b2_cod
      ,b2.b2_filial
      ,b2.b2_local;
      commit;

      — Libera as quantidades reservadas

      update siga.sb2010
      set b2_reserva = RP_qpedido
      from siga.sb2010, siga.ReservaProc
      where b2_filial = RP_filial
      and b2_local = RP_local
      and b2_cod = RP_produto
      and D_E_L_E_T_ <> ‘*’;
      ❓ [/b]

      #90247
      rwarstat
      Participante

        Qual o erro que dá no update?

        #90248
        Shiono
        Participante

          [quote=”rwarstat”:39yb9uxw]Qual o erro que dá no update?[/quote]

          SQL> update siga.sb2010
          2 set b2_reserva = RP_qpedido
          3 from siga.sb2010, siga.ReservaProc
          4 where b2_filial = RP_filial
          5 and b2_local = RP_local
          6 and b2_cod = RP_produto
          7 and D_E_L_E_T_ ‘*’;
          from siga.sb2010, siga.ReservaProc
          *
          ERRO na linha 3:
          ORA-00933: SQL command not properly ended

          #90249
          rwarstat
          Participante

            Shiono,
            Tenta o seguinte:

            update siga.sb2010
            set b2_reserva = (select RP_qpedido
            from siga.sb2010, siga.ReservaProc
            where b2_filial = RP_filial
            and b2_local = RP_local
            and b2_cod = RP_produto
            and D_E_L_E_T_ ‘*’);

            #90250
            Shiono
            Participante

              O Oracle atualizou 4.343.979 linhas sendo que so devia atualizar 1
              eu dei um rollback

              #90251
              Shiono
              Participante

                Tem como fazer isto usando um cursor onde eu carrego o cursor com os dados da tabela ReservaProc e atualizo a sb2010 com estes dados.

                Ai começa outro problema pois eu não domino como vazer cursores em Oracle.

                Você se este é o melhor caminho? e onde eu acho um mateiral legal sobre cursor?

                Desde ja muito obrigado pela ajuda.

                O rollback deu certo!

                #90252
                rwarstat
                Participante

                  O cursor tu pdoe fazer assim

                  begin
                  for cur_reserva (select campos from reservaproc)
                  loop
                  update sb2010
                  set b2_reserva = cur_reserva.rp_qpedido
                  where chave;
                  end loop;
                  end;

                  A linha for cur_reserva cria um cursor chamado cur_reserva com o select que está dentro dos parênteses. Onde está campos no select tu coloca todos os campos que vai usar, inclusive a chave para fazer o update.
                  O loop é para fazer um loop dentro do cursor. Ele automaticamente vai fazer o controle das linhas. Quando terminar ele vai sair fora.
                  Recoemndo que faça isso em uma base de teste antes.
                  O commit tu vai ter que fazer separado, para caso dê algum problema tu pode dar um rollback.

                  Procura aqui no GPO mesmo se tem algum mateiral de cursor.

                  Abraço

                  #90255
                  rwarstat
                  Participante

                    Shino,
                    Resolvi deixa a preguiça de lado e estruturei um cursor melhor para ti.

                    BEGIN
                    FOR cur_reserva IN (SELECT rp_qpedido, rp_filial, rp_local, rp_produto
                    FROM siga.reservaproc)
                    LOOP
                    UPDATE siga.sb2010
                    SET b2_reserva = cur_reserva.rp_qpedido
                    WHERE b2_filial = cur_reserva.rp_filial
                    AND b2_local = cur_reserva.rp_local
                    AND b2_cod = cur_reserva.rp_produto
                    AND d_e_l_e_t_ ‘*’;
                    END LOOP;
                    END;

                    Fiz ocm base no teu update original. Se precisar, pode colocar um where no select da tabela reservaproc.

                    Me desculpa se não expliquei muito bem antes, mas não é muito o meu forte ensinar.

                    Se precisar de algo mais posta aí.

                    Abraço,
                    Roberto

                    #90258
                    Shiono
                    Participante

                      Roberto pode ate não ser seu forte mas vc está ajudando bastante

                      Muito obrigado

                      #90265
                      burga
                      Participante

                        tenta

                        update siga.sb2010 b2
                        set b2.b2_reserva = (select RP_qpedido
                        from siga.ReservaProc
                        where RP_filial = b2.b2_filial
                        and RP_local = b2.b2_local
                        and RP_produto = b2.b2_cod
                        )
                        where exists (select RP_qpedido
                        from siga.ReservaProc
                        where RP_filial = b2.b2_filial
                        and RP_local = b2.b2_local
                        and RP_produto = b2.b2_cod
                        and b2.D_E_L_E_T_ ‘*’);

                        isso eu to considerando que a coluna D_E_L_E_T_ é da tabela siga.sb2010

                        depois, pra facilitar vc coloca as descrições das tabelas siga.sb2010 e siga.ReservaProc. Assim fica mais facil do que ficar adivinhando!

                        #90266
                        burga
                        Participante

                          opa, a ultima comparação do where, (coluna D_E_L_E_T_) tem q ficar fora dos parenteses…

                          #90321
                          Shiono
                          Participante

                            Pessoal

                            Muito obrigado a todos consegui resolver este problema com a ajuda de vocês.

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