Skip to main content
Announcements
Accelerate Your Success: Fuel your data and AI journey with the right services, delivered by our experts. Learn More
cancel
Showing results for 
Search instead for 
Did you mean: 
Ribeiro
Specialist
Specialist

Gerar meses faltantes caso não haja registros.

OriginalData:
LOAD * INLINE [
Filial ,Produto,Date ,Tipo ,Seq ,Quantidade
51 ,161642 ,03/05/2019 ,COM ,37620 ,12
51 ,161642 ,14/08/2019 ,COM ,38376 ,24
51 ,161642 ,24/08/2019 ,EVF ,38445 ,4
51 ,161642 ,27/08/2019 ,EVF ,38466 ,2
51      ,161642,06/06/2024, EVF,     38467  ,1
51      ,161642,06/06/2024, COM,     38467  ,2
];
 
ProcessedData:
LOAD
*,
If(isAccum
  ,If(Tipo='COM'
    ,Peek('Balance') + Qtde_COM
    ,Peek('Balance') - Qtde_EVF)
  ,If(Tipo='COM', Qtde_COM, -Qtde_EVF)
) as Balance,
If(isAccum
  ,Peek(Balance)
  ,0) as Previous
;
LOAD
*,
If(Tipo='COM', Quantidade, Alt(Peek('LastCOM'),0))
as LastCOM,
If(Tipo='EVF', Quantidade, Alt(Peek('LastEVF'),0))
as LastEVF,
If(Tipo='COM', Fabs(If(isAccum, Quantidade-Peek('LastCOM'),Quantidade)), 0)
as Qtde_COM,
If(Tipo='EVF', Fabs(If(isAccum, Peek('LastEVF')-Quantidade,Quantidade)), 0)
as Qtde_EVF
;
LOAD
Filial,
Produto,
Date,
Tipo,
Seq,
Quantidade,
If(Peek(Filial)=Filial and Peek(Produto)=Produto, 1, 0) as isAccum
Resident
OriginalData
Order By
Filial,
Produto,
Date
;
 
DROP Table OriginalData;
O Resultado é o experado. Correto. 
Produto Date Previous Qtde_COM Qtde_EVF Balance
161642 03/05/2019 0 12 0 12
161642 14/08/2019 12 12 0 24
161642 24/08/2019 24 0 4 20
161642 27/08/2019 20 0 2 18
161642 06/06/2024 18 0 1 17
161642 06/06/2024 17 22 0 39

 

Preciso agora e gerar o Previous no meses faltantes. adaptando o scritp acima.

Caso o mês tenha registro desconsidere, caso não tenha gere pelo ultimo registro anterior clonado o resto.

igual no exemplo abaixo.

Exemplo:

Produto Date Previous Qtde_COM Qtde_EVF Balance
161642 03/05/2019 0 12 0 12
161642 14/08/2019 12 12 0 24
161642 24/08/2019 24 0 4 20
161642 27/08/2019 20 0 2 18
161642 27/09/2019 20 0 2 18
161642 27/10/2019 20 0 2 18
  até mês atual,.....        
161642 06/06/2024 18 0 1 17
161642 06/06/2024 17 22 0 39
Neves
Labels (2)
1 Reply
marksouzacosta
Partner - Specialist
Partner - Specialist

Olá @Ribeiro,

Ótima pergunta heim!

Não sei se o código vai funcionar no caso de mais Filiais e mais Produtos diferentes, mas para os dados que você apresentou, o código abaixo funciona:

OriginalData:
LOAD 
  Filial,
  Produto,
  Date(Date#(Date,'DD/MM/YYYY'),'DD/MM/YYYY') AS Date,
  Tipo,
  Seq,
  Quantidade
INLINE [
Filial,Produto,Date,Tipo,Seq,Quantidade
51,161642,03/05/2019,COM,37620,12
51,161642,14/08/2019,COM,38376,24
51,161642,24/08/2019,EVF,38445,4
51,161642,27/08/2019,EVF,38466,2
51,161642,06/06/2024,EVF,38467,1
51,161642,06/06/2024,COM,38467,2
];


TempProcessedData:
LOAD
*,
If(isAccum
  ,If(Tipo='COM'
    ,Peek('Balance') + Qtde_COM
    ,Peek('Balance') - Qtde_EVF)
  ,If(Tipo='COM', Qtde_COM, -Qtde_EVF)
) as Balance,
If(isAccum
  ,Peek(Balance)
  ,0) as Previous,
MonthStart(Date) AS InitialMonth
;
LOAD
*,
If(Tipo='COM', Quantidade, Alt(Peek('LastCOM'),0))
as LastCOM,
If(Tipo='EVF', Quantidade, Alt(Peek('LastEVF'),0))
as LastEVF,
If(Tipo='COM', Fabs(If(isAccum, Quantidade-Peek('LastCOM'),Quantidade)), 0)
as Qtde_COM,
If(Tipo='EVF', Fabs(If(isAccum, Peek('LastEVF')-Quantidade,Quantidade)), 0)
as Qtde_EVF
;
LOAD
Filial,
Produto,
Date,
Tipo,
Seq,
Quantidade,
If(Peek(Filial)=Filial and Peek(Produto)=Produto, 1, 0) as isAccum
Resident
OriginalData
Order By
Filial,
Produto,
Date
;
 
DROP Table OriginalData;

JOIN(TempProcessedData)
RangeMonths:
LOAD DISTINCT
	Date(MonthStart(Date(MinDate + IterNo())),'DD/MM/YYYY') AS InitialMonth
WHILE
	MinDate + IterNo() <= MaxDate
;
LOAD DISTINCT
	Min(MonthStart(Date)) AS MinDate,
    Max(MonthStart(Date)) AS MaxDate
RESIDENT
	TempProcessedData
;

NoConcatenate

ProcessedData:
LOAD
    Coalesce(Filial,Peek('Filial')) AS Filial,
    Coalesce(Produto,Peek('Produto')) AS Produto,
    Coalesce(Date,AddMonths(Peek('Date'),1)) AS Date,
    Coalesce(Tipo,Peek('Tipo')) AS Tipo,
    Coalesce(Seq,Peek('Seq')) AS Seq,
    Coalesce(Quantidade,Peek('Quantidade')) AS Quantidade,
    Coalesce(isAccum,Peek('isAccum')) AS isAccum,
    Coalesce(LastCOM,Peek('LastCOM')) AS LastCOM,
    Coalesce(LastEVF,Peek('LastEVF')) AS LastEVF,
    Coalesce(Qtde_COM,Peek('Qtde_COM')) AS Qtde_COM,
    Coalesce(Qtde_EVF,Peek('Qtde_EVF')) AS Qtde_EVF,
    Coalesce(Balance,Peek('Balance')) AS Balance,
    Coalesce(Previous,Peek('Previous')) AS Previous
RESIDENT
	TempProcessedData
Order By
    InitialMonth
;   


DROP TABLE TempProcessedData;


Nota 1: Talvez você não precise dessas funções Date que utilizei se o seu Qlik já está reconhecendo os seu campo Date como um Date de fato - como meu Qlik é em ínglês ele pensa que é uma string, por isso tive que tratar esses valores.

Nota 2: Acredito que você esqueceu de adicionar os registros iniciais entre os meses 5 e 8. Meu código adiciona os mesmos. Caso não seja essa a lógica, então tenho que alterar meu código.

Read more at Data Voyagers - datavoyagers.net