Skip to main content

Brasil

Announcements
QlikWorld 2023, a live, in-person thrill ride. Save $300 before February 6: REGISTER NOW!
cancel
Showing results for 
Search instead for 
Did you mean: 
phpazini
Contributor III
Contributor III

LOAD SEM DUPLICAR CHAVE PRIMARIA

Boa tarde pessoal, sou novo aqui na comunidade e gostaria de tirar uma dúvida.

Tenho uma aplicação ao qual preciso fazer um LOAD de vários arquivos .csv
Cada um desses arquivos contém linhas com informações sobre produtos, como por exemplo preço e data de vigencia.

EXEMPLO:
PRODUTO | DATA_INICIAL | DATA_FINAL | PRECO

A dúvida é, como tenho vários desses arquivos, um para cada mês com a seguinte situação, quando o preço de determinado permanece dentro da vigencia para o mês seguinte, o arquivo .csv do mês seguinte vem novamente com o registro de vigencia. Criando assim a chave duplicada.

EXEMPLO de um arquivo do mês de março:

PRODUTO 1, 01/03/2016, "" , 20,00

PRODUTO 2, 01/03/2016, 15/03/2016 , 25,00

PRODUTO 2, 16/03/2016, "", 26,00

Onde "" é quando ainda não tem data de vigencia final.

EXEMPLO de um arquivo do mês de abril:

PRODUTO 1, 01/03/2016, "" , 20,00

PRODUTO 2, 01/03/2016, 15/03/2016 , 25,00

PRODUTO 2, 16/03/2016, 10/04/2016, 26,00

PRODUTO 2, 11/04/2016, "", 27,00


Viram como no arquivo do mês de abril, o meu LOAD vai carregar novamente o registro do produto lá do arquivo de março, PRODUTO 2, 16/03/2016, "", 26,00 - sendo que ele é o mesmo registro que está em abril porém agora encerrou a vigência, e já apareceu uma nova.


É possível resolver isso de alguma forma e fazer com que meu LOAD carregue apena o ultimo registro primário, ignorando assim o que ficou desatualizado na virada do mês quando ocorreu a troca do arquivo?


Não sei se me expressei de forma que fique fácil o entendimento, qualquer dúvida me perguntem. Desde já agradeço!

1 Solution

Accepted Solutions
fernando_tonial
Partner - Specialist
Partner - Specialist

Olá Pedro,

Utiliza a função not Exists()

Veja exemplo:

Dados:

LOAD

  AutoNumber(PRODUTO&'|'&DATA_INICIO, 'Chave') AS CHAVE,

  PRODUTO,

  DATA_INICIO,

  DATA_FIM,

  VALOR

FROM

[Dados*.txt]

(txt, codepage is 1252, embedded labels, delimiter is ',', msq)

Where Not Exists(CHAVE, AutoNumber(PRODUTO&'|'&DATA_INICIO, 'Chave'));

Anexo os dados que testei.

Don't worry, be Qlik.

Tonial.

Don't Worry, be Qlik.

View solution in original post

15 Replies
lucianosv
Specialist
Specialist

Se entendi direito, você teria que carregar antes o mês mais atual e criar uma chave com PRODUTO | DATA_INICIAL.

Depois você carrega os mais antigos utilizando

Where not exists(Chave)

Dessa forma vai carregar todos os atuais e somente os que não existirem dos mais antigos.

phpazini
Contributor III
Contributor III
Author

Boa tarde Luciano, e como eu faço pra carregar do mais atual pro mais antigo ? O qlik faz o load com meus arquivos que são: r*.csv

r607371f612.201510.csv

r607371f612.201511.csv
r607371f612.201512.csv
r607371f612.201603.csv

Outra coisa, ao utilizar o Where not exists(tabela_compra_chave);
ele não encontra esse campo tabela_compra_chave.

nicolett_yuri

Veja esse exemplo:

No caso eu carregaria todas as planilhas e faria um distinct para remover as linhas duplicadas, depois é só usar o ORDER BY para selecionar o último preço do produto.

phpazini
Contributor III
Contributor III
Author

Fala Yuri, não consegui baixar o arquivo consegue me copiar o código por aqui?

Tentei fazer o distinct e order by mas da erro. Talvez não esteja fazendo do jeito correto.

nicolett_yuri

Tabela:

LOAD * INLINE [

PRODUTO, DATA_INICIO, DATA_FIM, VALOR

PRODUTO 1, 01/03/2016, "" , 20,00

PRODUTO 2, 01/03/2016, 15/03/2016 , 25,00

PRODUTO 2, 16/03/2016, "", 26,00

PRODUTO 1, 01/03/2016, "" , 20,00

PRODUTO 2, 01/03/2016, 15/03/2016 , 25,00

PRODUTO 2, 16/03/2016, 10/04/2016, 26,00

PRODUTO 2, 11/04/2016, "", 27,00

];

ProdutoValor:

NoConcatenate

LOAD

  DISTINCT

  PRODUTO,

  DATA_INICIO,

  DATA_FIM,

  VALOR,

  if( PRODUTO <> Previous(PRODUTO), 'Ultimo Valor') as FLAG_ULTIMO_VALOR

RESIDENT Tabela

ORDER BY

  PRODUTO asc,

  DATA_INICIO desc;

DROP TABLE Tabela;

phpazini
Contributor III
Contributor III
Author

Yuri, fiz aqui com esse script, executou, só que não resolveu o problema, apliquei o if na minha chave que é um autonumber do produto & data inicial, que gera um numero que vai aumentando, gerando a chave primaria sequencial e essa está se repetindo no caso do exemplo, e ainda importa a chave duplicada.

Nesse exemplo que passei o registro que tem que ficar é:

PRODUTO 2, 16/03/2016, 10/04/2016, 26,00

A antiga que não tinha a data final de vigencia digitada deve ser excluida : PRODUTO 2, 16/03/2016, "", 26,00 porém vai ter uma nova linha com esse produto só que como a vigencia é nova, e a construção da chave que é com base na data inicial, já descarta a possibilidade de duplicar os proximos registros.

Ah outra coisa que esqueci de mencionar, esse registro que vai ser atualizado pode se manter dentro de vários arquivo até chegar uma tabela com vigência nova que vai encerrar a antiga.

nicolett_yuri

Pedro, você não deve criar a chave, com autonumber, antes de aplicar a lógica que te passei, caso contrário não vai funcionar mesmo.

phpazini
Contributor III
Contributor III
Author

Entao Yuri, sou bem iniciante mesmo no Qlik. Consegui desenvolver algumas coisas bem legais ja. mas dei uma empacada nesse esquema que perguntei.

A aplicacao possui bem mais registro e produtos duplicados, imagina assim. Cada arquivo o produto se repete.Com alguns criterio que serao utilizados para comparacao com notas fiscais por exemplo. Entao eu possivelmente vou precisar de uma key para relacionar com as nfs.

A aplicacao final e ler uma nota fiscal e cruzar com a tabela de preco para ver se o preco esta correto.

Sendo assim preciso comparar campos coincidentes das duas tabelas para formar a chave e poder mostrar o resultado do valor da nf x o valor da tabela.

Nao sei se estou no caminho certo, mas se for possivel consegue me detalhar melhor como seguir o melhor caminho, alguns macetes que eu tenho que seguir?

Pelo que entendi na sua logica, se eu aplicar no produto e funcionar, vai me trazer apenas um produto, mas eu preciso que todos fiquem registrados porem o que eh igual precisa preencher o campo de vigencia final com base no registro que o load estiver lendo no momento. O que acontece aqui eh que ele simplesmente inclui uma nova linha e isso gera duplicidade de valor na hora de somar o valor da tabela, conforme os campos forem coincidentes com a nota.

Desculpa se nao me fiz entender, mas obrigado mesmo por tentar me ajudar. Se conseguir sera de grande proveito e aprendizado pra mim.

fernando_tonial
Partner - Specialist
Partner - Specialist

Olá Pedro,

Utiliza a função not Exists()

Veja exemplo:

Dados:

LOAD

  AutoNumber(PRODUTO&'|'&DATA_INICIO, 'Chave') AS CHAVE,

  PRODUTO,

  DATA_INICIO,

  DATA_FIM,

  VALOR

FROM

[Dados*.txt]

(txt, codepage is 1252, embedded labels, delimiter is ',', msq)

Where Not Exists(CHAVE, AutoNumber(PRODUTO&'|'&DATA_INICIO, 'Chave'));

Anexo os dados que testei.

Don't worry, be Qlik.

Tonial.

Don't Worry, be Qlik.