Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Substituição ou Exclusão de registro já carregado (LOAD)

Olá pessoal,
Mais um novo usuário de QlikView se apresentando!
E estou precisando da ajuda de vocês na seguinte situação:

Faço a leitura de registros de informações de "Declarações de Apuração" que podem sofrer Retificações (em novos registros).
Entretanto, estas "Declarações" são disponibilizadas em diferentes arquivos TXT em datas distintas (podem vir após dias ou anos)

O que eu desejo é efetuar a leitura das declarações e quando vier uma declaração retificadora
eu consiga substituir a declaração antiga, pesquisando através de campos chaves da Declaração (ANO,MES,CNPJ)

Meu arquivo é algo assim:

ANO, MES, CNPJ, TIPO, BASE, ALIQUOTA, VALOR

Exemplificando:
Declaração Original - Arquivo1.TXT
2009;10;12345678000123;A;1000.00;2.00;20.00

Declaração Retificadora1 - Arquivo2.TXT
2009;10;12345678000123;R;1500.00;2.00;30.00

Declaração Retificadora2 - Arquivo3.TXT
2009;10;12345678000123;R;800.00;2.00;16.00

No exemplo acima tenho que processar e permanecer apenas com os valores importados no "Arquivo3.TXT"
Atualmente fico com 3 registros e erroneamente somando as apurações. Desejo excluir as declarações do "Arquivo1.TXT" e "Arquivo2.TXT"

Atualmente estou fazendo uma leitura "Arquivo*.TXT" e processando todos os arquivos a medida que o usuário disponibiliza-os.

Fico grato se alguém tiver alguma dica.

Grande abraço.

1 Solution

Accepted Solutions
Not applicable
Author

Para isto use o comando:

LOAD

AutoNumberHash256(Ano, Mês, CNPJ) as Chave,

Campo1,

Campo2,

Campo3

FROM

Arquivo*.txt;



View solution in original post

9 Replies
Not applicable
Author

Você teria uma chave nesta estrutura, algum registro que seja único para cada lançamento?
Você poderia utilizar esta chave com o auxílio do comando Exists (). Por Ex.

O problema é que neste caso por característica do uso do "*" a ordem seria crescente na sequência da leitura.

LOAD
Chave,
Campo1,
Campo2,
Campo3
FROM
Arquivo*.txt
WHERE
Not Exists (Chave);

Not applicable
Author

Rodrigo, a chave é composto por ANO,MES e CNPJ

Até existe um ID único que incremento a medida que importo os registros, entretanto, no momento da leitura do registro da "Declaração de Retificação" não tenho como saber qual é o ID exato da "Declaração" original. A menos que exista uma possibilidade de realizar uma pesquisa pelos 3 campos citados acima (ANO,MES,CNPJ)

Not applicable
Author

Para isto use o comando:

LOAD

AutoNumberHash256(Ano, Mês, CNPJ) as Chave,

Campo1,

Campo2,

Campo3

FROM

Arquivo*.txt;



Not applicable
Author

Consegui implementar o AutoNumberHash256 e está funcionando corretamente. Os registros com a mesma chave (Ano,Mes,CNPJ) permanecem com o mesmo valor.

Entretanto, uma dificuldade que eu não havia reportado anteriormente é que o conteúdo dos "Arquivos.TXT" já está em uma tabela QlikView chamada "Declaracoes", pois necessitei tratar o conteúdo lido do TXT em variáveis e posteriormente fiz o LOAD das variáveis em registros nesta tabela. Até aqui tudo funcionando. Mas minha dúvida é como fazer um RE-LOAD da tabela "Declaracoes" com o NOT EXISTS excluindo e deixando apenas o último registro (maior ID) daquelas CHAVES duplicadas. Pensei desta forma, mas não funcionou:

Declaracoes:
load * resident Declaracoes where not exists(CHAVE) order by ID desc;

Not applicable
Author

Se com o Exists não funcionar, se você tiver alguma data ou algum campo sequencial na sua estrutura tente utilizar:

INNER JOIN (Declaracoes)

LOAD

Chave,

Max (Data) as Data

RESIDENT

Declaracoes

GROUP BY

Chave;

Not applicable
Author

Realizei o INNER JOIN porém os registros que não atendem esta regra permanecem na tabela "Declaracoes", não consigo expurgá-los. Preciso que permaneça só o ID=11579.

Declaracoes:

inner join (Declaracoes) load CHAVE,max(ID) as MaxID resident Declaracoes Group By CHAVE;

Not applicable
Author

Consegui resolver, porém, não sei se é a solução mais eficiente ou elegante para a situação. Carreguei todos meus registros em uma tabela chamada "temp_Declaracoes" e com campos chamados "temp_", adicionei o MaxID baseado no inner join com a CHAVE, depois fiz um load para a tabela fato "Declaracoes" restringindo (where) o ID do registro fosse igual ao MaxID e renomeando todos campos também de "temp_" para o nome final e excluí a tabela "temp_Declaracoes":


temp_Declaracoes:
inner join (temp_Declaracoes) load
temp_CHAVE,
max(temp_ID) as MaxID
resident temp_Declaracoes
Group By temp_CHAVE;

Declaracoes:

LOAD
temp_ANO as ANO,
temp_MES as MES,
temp_CNPJ as CNPJ,
temp_BASE as BASE,
temp_ALIQUOTA as ALIQUOTA,
temp_VALOR as VALOR
resident temp_Declaracoes where temp_ID = MaxID;

drop table temp_Declaracoes;



Not applicable
Author

Muito obrigado Rodrigo Fontes.

Sem suas dicas não teria encontrado uma solução tão rápido.

Abraço.

Not applicable
Author

De nada, precisando de algo fico a disposição !

Abraço e feliz 2011 !