- Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 15 anos, 8 meses atrás por
facc.
-
AutorPosts
-
22 de junho de 2010 às 9:26 pm #94746
facc
ParticipanteBoa 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/2010Traduzindo 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.
22 de junho de 2010 às 11:08 pm #94755Regis Araujo
ParticipanteOpa..!
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..!
22 de junho de 2010 às 11:35 pm #94756facc
ParticipanteEntão, me falaram de criar uma Trigger before insert, porém não sei como proceder
22 de junho de 2010 às 11:44 pm #94757Regis Araujo
ParticipanteEntã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..!
22 de junho de 2010 às 11:46 pm #94758facc
Participanteentão teria que alterar o arquivo txt antes de iniciar a importação?
23 de junho de 2010 às 12:25 am #94759Regis Araujo
ParticipanteOpa..!
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..!
23 de junho de 2010 às 12:29 am #94760burga
ParticipanteImporta 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!
25 de junho de 2010 às 4:12 pm #94819facc
ParticipanteNã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.
-
AutorPosts
- Você deve fazer login para responder a este tópico.
