Skip to main content
Woohoo! Qlik Community has won “Best in Class Community” in the 2024 Khoros Kudos awards!
Announcements
Nov. 20th, Qlik Insider - Lakehouses: Driving the Future of Data & AI - PICK A SESSION
cancel
Showing results for 
Search instead for 
Did you mean: 
CélioSartoriJunior
Contributor II
Contributor II

Completar datas e valores faltantes

Boa tarde

Senhores, tenho um histórico de alterações de preços de produtos.
Porém as alterações ocorrem em datas aleatórias, e com isto tenho datas onde não tenho o preço do produto.

Preços.PNG


Vejam que:
A primeira data de alteração é 05/02/2019 para 1,99
A segunda data é 08/02/2019 para 2,09
Portanto nos dias 06/02 e 07/02 deve preencher com o preço de 1,99.
E somente no dia 08/02 entraria o 2,09, que ficaria valido nos dias 09/02, 10/02 e 11/02.

 

Em algumas buscas no fórum eu consegui um código para completar essas datas
Considerando que já carreguei uma tabela Base com o histórico de alterações:

Tmp:
noconcatenate LOAD
  DATA,
  if(EMPRESA = peek('EMPRESA'),DATA - Peek('DATA'),0) as Q,
  EMPRESA,
  COD_PRODUTO,
  PRECO
Resident Base
order by EMPRESA, DATA ;


Tmp2:
noconcatenate LOAD
  Date(DATA + IterNo() - Q) as DATA,
  EMPRESA,
  COD_PRODUTO,
  alt(PRECO,Peek('PRECO')) as PRECO
Resident Tmp
While IterNo() <= Q
order by EMPRESA, DATA ;

drop table Base;
drop Table Tmp;

O resultado foi quase o esperado, único problema é que ao invés de trazer o valor da data anterior para a data faltante, o Qlik preencheu com a data posterior, veja:

Resultado.PNG

 

Nos dias 06/02 e 07/09 preencheu com 2,09 que é o preço do dia 08/02.
Mas o que eu queria era preencher com o preço do dia 05/02 (1,99) 
Inclusive por algum motivo nem trouxe o dia 05/02 após a carga.

Conseguem me ajudar?

1 Solution

Accepted Solutions
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

Célio,

segue

2019-04-05 22_36_59-Untitled - Paint.png

 

 

Tmp:
load * Inline [
COD_PRODUTO, EMPRESA, DATA, PRECO
18325, 2, 06/02/2019, '1,99'
18325, 2, 09/02/2019, '2,09'
18325, 2, 13/02/2019, '2,19'
18325, 2, 16/02/2019, '2,19'
18325, 2, 20/02/2019, '2,15'
18325, 2, 21/02/2019, '2,25'
18325, 2, 23/02/2019, '2,19'
18325, 2, 27/02/2019, '2,15'
18325, 2, 27/02/2019, '2,38'
18325, 2, 28/02/2019, '2,15'
18325, 2, 06/03/2019, '2,15'
18325, 2, 08/03/2019, '2,45'
18325, 2, 09/03/2019, '2,18'
18325, 2, 13/03/2019, '2,15'
18325, 2, 15/03/2019, '2,39'
18325, 2, 16/03/2019, '2,18'
18325, 2, 20/03/2019, '2,15'
18325, 2, 27/03/2019, '2,15'
18325, 2, 30/03/2019, '2,19'
18325, 2, 02/04/2019, '2,45'
18325, 2, 03/04/2019, '2,15'
18325, 2, 04/04/2019, '2,19'
];

Tmp_1:
LOAD
     EMPRESA,
     COD_PRODUTO,
     DATA,
     if(EMPRESA = Previous(EMPRESA) and COD_PRODUTO = Previous(COD_PRODUTO),date(Previous(DATA)-1),DATA) as             DATA_ANTERIOR,
     PRECO
Resident Tmp Order by EMPRESA,COD_PRODUTO,DATA DESC , PRECO DESC;
//
Drop Table Tmp;

Final:
LOAD
     EMPRESA,
     COD_PRODUTO,
     date(DATA + (iterno()-1)) as DATA,
    PRECO
Resident Tmp_1 While date(DATA + (iterno()-1)) <= DATA_ANTERIOR;
Drop Table Tmp_1;

 

furtado@farolbi.com.br

View solution in original post

5 Replies
marco_almeida
Creator II
Creator II

Opa blz?

Para complementar você pode criar um esquema com Intervalmatch, Peek e Previous.

Posso lhe ajudar a construir o código, mas me manda essa base (pode ser essa tabela exemplo), só para eu não criar uma na mão Smiley Tongue

Grupo Telegram Qlik Brasil: https://t.me/joinchat/AeRmnUmcxQ02L00g3x-HtQ
CélioSartoriJunior
Contributor II
Contributor II
Author

Opa show parceiro.

Assim como load inline já te ajuda?

load * Inline [

COD_PRODUTO, EMPRESA, DATA, PRECO

18325,	2,	06/02/2019,	'1,99'
18325,	2,	09/02/2019,	'2,09'
18325,	2,	13/02/2019,	'2,19'
18325,	2,	16/02/2019,	'2,19'
18325,	2,	20/02/2019,	'2,15'
18325,	2,	21/02/2019,	'2,25'
18325,	2,	23/02/2019,	'2,19'
18325,	2,	27/02/2019,	'2,15'
18325,	2,	27/02/2019,	'2,38'
18325,	2,	28/02/2019,	'2,15'
18325,	2,	06/03/2019,	'2,15'
18325,	2,	08/03/2019,	'2,45'
18325,	2,	09/03/2019,	'2,18'
18325,	2,	13/03/2019,	'2,15'
18325,	2,	15/03/2019,	'2,39'
18325,	2,	16/03/2019,	'2,18'
18325,	2,	20/03/2019,	'2,15'
18325,	2,	27/03/2019,	'2,15'
18325,	2,	30/03/2019,	'2,19'
18325,	2,	02/04/2019,	'2,45'
18325,	2,	03/04/2019,	'2,15'
18325,	2,	04/04/2019,	'2,19'

]

 

E acabei percebendo outro detalhe agora enquanto montava o Load.
Vou ter alguns casos que possuem duas alterações no mesmo dia. Exemplo do dia 27/02 teve uma alteração de 2,15 e depois teve outra para 2,38.
Neste caso tem alguma forma de manter apenas o ultimo registro para aquela data?
Neste caso dia 27/02 ficaria apenas com o preço de 2,38

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

Célio,

segue

2019-04-05 22_36_59-Untitled - Paint.png

 

 

Tmp:
load * Inline [
COD_PRODUTO, EMPRESA, DATA, PRECO
18325, 2, 06/02/2019, '1,99'
18325, 2, 09/02/2019, '2,09'
18325, 2, 13/02/2019, '2,19'
18325, 2, 16/02/2019, '2,19'
18325, 2, 20/02/2019, '2,15'
18325, 2, 21/02/2019, '2,25'
18325, 2, 23/02/2019, '2,19'
18325, 2, 27/02/2019, '2,15'
18325, 2, 27/02/2019, '2,38'
18325, 2, 28/02/2019, '2,15'
18325, 2, 06/03/2019, '2,15'
18325, 2, 08/03/2019, '2,45'
18325, 2, 09/03/2019, '2,18'
18325, 2, 13/03/2019, '2,15'
18325, 2, 15/03/2019, '2,39'
18325, 2, 16/03/2019, '2,18'
18325, 2, 20/03/2019, '2,15'
18325, 2, 27/03/2019, '2,15'
18325, 2, 30/03/2019, '2,19'
18325, 2, 02/04/2019, '2,45'
18325, 2, 03/04/2019, '2,15'
18325, 2, 04/04/2019, '2,19'
];

Tmp_1:
LOAD
     EMPRESA,
     COD_PRODUTO,
     DATA,
     if(EMPRESA = Previous(EMPRESA) and COD_PRODUTO = Previous(COD_PRODUTO),date(Previous(DATA)-1),DATA) as             DATA_ANTERIOR,
     PRECO
Resident Tmp Order by EMPRESA,COD_PRODUTO,DATA DESC , PRECO DESC;
//
Drop Table Tmp;

Final:
LOAD
     EMPRESA,
     COD_PRODUTO,
     date(DATA + (iterno()-1)) as DATA,
    PRECO
Resident Tmp_1 While date(DATA + (iterno()-1)) <= DATA_ANTERIOR;
Drop Table Tmp_1;

 

furtado@farolbi.com.br
CélioSartoriJunior
Contributor II
Contributor II
Author

Boa tarde

Amigo, deu quase certo!

Na verdade deu certo hehe porém o Qlik esta preenchendo as datas faltantes até a ultima data que possui registro.
No exemplo utilizado, a ultima data é dia 04/04/2019 então o Qlik esta preenchendo apenas até esta data.

E no caso se eu quiser olhar o preço do produto no dia 09/04 não tem.

É possível aplicar uma condição para ele preencher as datas após o ultimo registro até a data atual?

iuri_silva
Contributor
Contributor

Perfeita explicação. Obrigado por compartilhar passei pela mesma situação e foi totalmente efetiva a solução dada.