Pular para o conteúdo
Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #94746
    facc
    Participante

      Boa tarde,
      Os dados dessa tabela são importados através de um arquivo texto, até aí tudo bem, está funcionando.

      Porém o Campo sequencia está errado (estou retornando o maior + 1), mas o correto é a seguinte forma: (Chave Composta contendo Código, TipoPreco, Filial, Sequencia)

      Código TipoPreco Sequencia Filial ValidadeFim
      585880 1 1 999 null
      585880 1 2 999 21/06/2010
      585880 2 1 999 null
      585880 2 2 999 null
      585880 1 3 999 22/06/2010
      585880 1 1 001 30/06/2010
      585880 1 2 001 01/07/2010

      Traduzindo em palavras
      caso encontre algum valor (Codigo, TipoPreco, Filial) identico no banco, a sequencia vai ser sempre a proxima, porem se encontrar a ValidadeFim mais recente, a sequencia tem que ser a maior também.

      espero ter conseguido me expressar bem.

      #94755
      Avatar photoRegis Araujo
      Participante

        Opa..!

        Salve..!

        Bom.. acho que neste caso cabe um POG, pois vc pode criar uma proc que verifique na tabela as clausulas que vc precisa para inserir a sequence correta e ir dando update um a um.. é meio trabalhoso..

        Ou faça este tratamento dentro do seu processo de importação do TXT..

        Abraços..!

        #94756
        facc
        Participante

          Então, me falaram de criar uma Trigger before insert, porém não sei como proceder

          #94757
          Avatar photoRegis Araujo
          Participante

            Então..

            Mesmo dentro da trigger, vc vai precisar criar uma regra de negocios dentro da trigger, para fazer verificação dos registros para inserir as sequencias..!!

            Seria menos trabalhoso fazer isto no seu processo de carga.. pois evita varias transações na tabela durante a carga..!!

            Abraços..!

            #94758
            facc
            Participante

              então teria que alterar o arquivo txt antes de iniciar a importação?

              #94759
              Avatar photoRegis Araujo
              Participante

                Opa..!

                Sua importação é via SQLLDR ? Se sim.. então realmente vc vai precisar criar uma trigger mas pode ser after insert, ou criar uma proc e após toda a carga iniciar a proc para verificar os registros e alterar os valores da sequence..!!

                Abraços..!

                #94760
                burga
                Participante

                  Importa a tabela e depois roda esse procedimento…

                  DECLARE
                  l_contador NUMBER(3);
                  BEGIN
                  FOR i IN (SELECT DISTINCT Codigo, TipoPreco, Filial FROM TABELA) LOOP
                  l_contador := 1;
                  FOR j IN (SELECT ROWID, Codigo, TipoPreco, Filial FROM TABELA
                  WHERE Codigo = i.Codigo AND TipoPreco = i.TipoPreco
                  AND Filial = i.Filial ORDER BY ValidadeFim NULLS FIRST) LOOP
                  UPDATE TABELA SET Sequencia = l_contador WHERE ROWID = j.ROWID;
                  l_contador := l_contador + 1;
                  END LOOP;
                  END LOOP;
                  END;
                  /

                  Só precisa acertar o nome da tabela nas consultas do procedimento e os nomes das colunas… às vezes pode ter algum errinho de programação também pois eu não testei, mas a idéia é essa aí…

                  Não coloquei o commit só pra você poder testar… Mas se o procedimento estiver certo, depois vc commita manualmente!

                  #94819
                  facc
                  Participante

                    Não funcionou esse procediemento, deu erro de violação de chave no update.

                    Em outro forum me passaram essa Trigger

                    CREATE OR REPLACE TRIGGER TRG_TABELA BEFORE INSERT ON TABELA
                    DECLARE
                    VN_SEQUENCIA NUMBER;
                    BEGIN
                    BEGIN
                    SELECT SEQUENCIA INTO VN_SEQUENCIA
                    FROM TABELA
                    WHERE Codigo ::NEW.CODIGO AND TipoPreco = NEW.TIPOPRECO AND FILIAL = :NEW.FILIAL;
                    EXCEPTION
                    WHEN NO_DATA_FOUND THEN
                    VN_SEQUENCIA:=0;
                    END;
                    VN_SEQUENCIA:=VN_SEQUENCIA+1;
                    NEW.SEQQUENCIA := VN_SEQUENCIA;
                    END;

                    É quase isso que eu preciso. Só preciso de um ajuste, pois qndo a ValidadeFim for nulo/branco a sequencia tem que ser maior.

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