Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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 |
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
Follow me on my LinkedIn | Know IPC Global at ipc-global.com