Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Join us in Bucharest on Sept 18th for Qlik's AI Reality Tour! Register Now
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Fill the missing dates

Hello qlikers 🙂 ,

I have a table of suppliers. 

Unbenannt.PNG

Now I'm looking for the min date, here 11/2018 and for the max date, here 01/2020.

Now I want to loop from 11/2018 until 01/2020. The result should be so

Unbenannt2.PNG

So every supplier get all dates, but without values. But when they supplier have a date for example supplier 5 then he keep his values. 

 

This is my code:

 

TempTable_Supplier:
NoConcatenate Load 
*
Resident Supplier;

// Find the min and the max date of all Productiondates 
MinMaxDate:
Load
Date(Min(Date#(ProductionDate, 'MM/YYYY')), 'MM/YYYY') as MinDate,
Date(Max(Date#(ProductionDate, 'MM/YYYY')), 'MM/YYYY') as MaxDate
Resident TempTable_Supplier;

Drop Table TempTable_Supplier;


Let varMinDate2 = Num(Peek('MinDate', 0, 'MinMaxDate'));  
Let varMaxDate2 = Num(Peek('MaxDate', 0, 'MinMaxDate')); 

MissingDate:
LOAD
$(varMinDate2) + Iterno()-1 As Num,  
Date($(varMinDate2) + IterNo() - 1) as TempDate  
AutoGenerate 1 While $(varMinDate2) + IterNo() -1 <= $(varMaxDate2);  

Calendar:  
Load  
  TempDate,  
  week(TempDate) As Week,  
  Year(TempDate) As Year,  
  Month(TempDate) As Month,  
  Day(TempDate) As Day,  
  ApplyMap('QuartersMap', month(TempDate), Null()) as Quarter,  
  Week(weekstart(TempDate)) & '-' & WeekYear(TempDate) as WeekYear,  
  WeekDay(TempDate) as WeekDay  
Resident MissingDate
Order By TempDate ASC;  
Drop Table MissingDate;   

 

 First I find the min and max date. Now I want to loop, I copied the loop from my master calendar, but unfortunately it doesn't work.

Thank you in advance! Looking forward to reading some answers. 

Labels (1)
8 Replies
Arthur_Fong
Partner - Specialist III
Partner - Specialist III

Try this:

MC.PNG

Script:

 

Raw:
load SupplierID,Date#(ProductionDate, 'MM/YYYY') as ProductionDate,Production,Delivery inline [
SupplierID,ProductionDate,Production,Delivery
5,11/2018,des,415
5,12/2019,as,15421
5,01/2020,des,14487
10,05/2019,des,51122
10,06/2019,des,14415
10,12/2019,as,
];
MinMaxDate:
Load
Min(Date#(ProductionDate, 'MM/YYYY')) as MinDate,
Max(Date#(ProductionDate, 'MM/YYYY')) as MaxDate
Resident Raw;

let vMin =peek('MinDate',0,'MinMaxDate');
let vMax =peek('MaxDate',0,'MinMaxDate');

Supplier:
load distinct
SupplierID,Production
resident Raw;

trace $(vMin);
trace $(vMax);
let vRow=NoOfRows('Supplier');

for i=0 to $(vRow)-1
let vSupplierID = peek('SupplierID',$(i),'Supplier');
let vProduction = peek('Production',$(i),'Supplier');
trace $(vSupplierID);

ZeroValue:
load
Date#(text(Date($(vMin)-1+IterNo(),'MM/YYYY')),'MM/YYYY') as ProductionDate,
'$(vSupplierID)' as SupplierID,
'$(vProduction)' as Production,
0 as Delivery
AutoGenerate 1	
while $(vMin)-1+IterNo()<$(vMax)+1;

next i

drop table Supplier;

NoConcatenate
Data:
load 
	ProductionDate,
	SupplierID,
	Production,
	sum(Delivery)as Delivery
resident Raw
group by 
	ProductionDate,
	SupplierID,
	Production;

drop table Raw;

exit SCRIPT;


 

Anonymous
Not applicable
Author

Thank you for your answer.

Unfortunately the dates are double. If I have a date for example the 11/2018 then they shouldn't be a 11/2018 without a value. Only when the supplier hasn't delievered. 

Unbenannt5.PNG

Arthur_Fong
Partner - Specialist III
Partner - Specialist III

Do you mean like this?

MC.PNG

Script:

Raw:
load SupplierID,Date#(ProductionDate, 'MM/YYYY') as ProductionDate,Production,Delivery inline [
SupplierID,ProductionDate,Production,Delivery
5,11/2018,des,415
5,12/2019,as,15421
5,01/2020,des,14487
10,05/2019,des,51122
10,06/2019,des,14415
10,12/2019,as,
];
MinMaxDate:
Load
Min(Date#(ProductionDate, 'MM/YYYY')) as MinDate,
Max(Date#(ProductionDate, 'MM/YYYY')) as MaxDate
Resident Raw;

let vMin =peek('MinDate',0,'MinMaxDate');
let vMax =peek('MaxDate',0,'MinMaxDate');

Supplier:
load distinct
SupplierID,Production
resident Raw;

trace $(vMin);
trace $(vMax);
let vRow=NoOfRows('Supplier');

for i=0 to $(vRow)-1
let vSupplierID = peek('SupplierID',$(i),'Supplier');
let vProduction = peek('Production',$(i),'Supplier');
trace $(vSupplierID);


ZeroValue:
load
Date#(text(Date($(vMin)-1+IterNo(),'MM/YYYY')),'MM/YYYY') as ProductionDate,
'$(vSupplierID)' as SupplierID,
null() as Production,
0 as Delivery
AutoGenerate 1	
while $(vMin)-1+IterNo()<$(vMax)+1;

next i

drop table Supplier;

NoConcatenate
Data:
load 
	ProductionDate,
	SupplierID,
	Production,
	sum(Delivery)as Delivery
resident Raw
group by 
	ProductionDate,
	SupplierID,
	Production
order by ProductionDate,
		SupplierID;


NoConcatenate
Data2:
load * resident Data
WHERE
peek(ProductionDate)<>ProductionDate;
;

drop table Raw;
drop table Data;
exit SCRIPT;



Anonymous
Not applicable
Author

Thank you agian! Great work. Yes, I mean this. 

But 

Supplier:
load distinct
SupplierID,Production
resident Raw;

and this

for i=0 to $(vRow)-1
let vSupplierID = peek('SupplierID',$(i),'Supplier');
let vProduction = peek('Production',$(i),'Supplier');
trace $(vSupplierID);

 

I have shorten my excel file. So I have more  columns as the four. Is there another solution without call twice all the names? 

Thank you in advance! 🙂

Arthur_Fong
Partner - Specialist III
Partner - Specialist III

Doesn't need the second variable (Production) anyway.

Just Load SupplierID will do.

Supplier:
load distinct
SupplierID
resident Raw;

For ZeroValue table:

ZeroValue:
load
Date#(text(Date($(vMin)-1+IterNo(),'MM/YYYY')),'MM/YYYY') as ProductionDate,
'$(vSupplierID)' as SupplierID,
null() as Production,
null() as Column3, //add in your third column
null() as Column4, //add in your 4th column
0 as Delivery
AutoGenerate 1	
while $(vMin)-1+IterNo()<$(vMax)+1;

 

Arthur_Fong
Partner - Specialist III
Partner - Specialist III

A better way for ZeroValue table is to force table concatenation to happen:

Concatenate(Raw)
ZeroValue:
load
Date#(text(Date($(vMin)-1+IterNo(),'MM/YYYY')),'MM/YYYY') as ProductionDate,
'$(vSupplierID)' as SupplierID,
0 as Delivery
AutoGenerate 1 
while $(vMin)-1+IterNo()<$(vMax)+1;

This way you doesn't need to assign the additional columns as nulls.

Anonymous
Not applicable
Author

Thank you! 🙂

There is complication. When I'm using this script. 

Raw:
load SupplierID,Date#(ProductionDate, 'MM/YYYY') as ProductionDate,Production,Delivery inline [
SupplierID,ProductionDate,Production,Delivery
5,11/2018,des,415
5,12/2019,as,15421
5,01/2020,des,14487
10,05/2019,des,51122
10,06/2019,des,14415
10,12/2019,as,
];
MinMaxDate:
Load
Min(Date#(ProductionDate, 'MM/YYYY')) as MinDate,
Max(Date#(ProductionDate, 'MM/YYYY')) as MaxDate
Resident Raw;

let vMin =peek('MinDate',0,'MinMaxDate');
let vMax =peek('MaxDate',0,'MinMaxDate');

Supplier:
load distinct
SupplierID,Production
resident Raw;

trace $(vMin);
trace $(vMax);
let vRow=NoOfRows('Supplier');

for i=0 to $(vRow)-1
let vSupplierID = peek('SupplierID',$(i),'Supplier');
let vProduction = peek('Production',$(i),'Supplier');
trace $(vSupplierID);


ZeroValue:
load
Date#(text(Date($(vMin)-1+IterNo(),'MM/YYYY')),'MM/YYYY') as ProductionDate,
'$(vSupplierID)' as SupplierID,
null() as Production,
0 as Delivery
AutoGenerate 1	
while $(vMin)-1+IterNo()<$(vMax)+1;

next i

drop table Supplier;

NoConcatenate
Data:
load 
	ProductionDate,
	SupplierID,
	Production,
	sum(Delivery)as Delivery
resident Raw
group by 
	ProductionDate,
	SupplierID,
	Production
order by ProductionDate,
		SupplierID;


NoConcatenate
Data2:
load * resident Data
WHERE
peek(ProductionDate)<>ProductionDate;
;

drop table Raw;
drop table Data;
exit SCRIPT;

Only the supplier with the ID 5 is shown, but all other suppliers should also be shown. 🙂

Thank you in advance!

Arthur_Fong
Partner - Specialist III
Partner - Specialist III

Try this:

Raw:
load SupplierID,Date#(ProductionDate, 'MM/YYYY') as ProductionDate,Production,Delivery inline [
SupplierID,ProductionDate,Production,Delivery
5,11/2018,des,415
5,12/2019,as,15421
5,01/2020,des,14487
10,05/2019,des,51122
10,06/2019,des,14415
10,12/2019,as,
];
MinMaxDate:
Load
Min(Date#(ProductionDate, 'MM/YYYY')) as MinDate,
Max(Date#(ProductionDate, 'MM/YYYY')) as MaxDate
Resident Raw;

let vMin =peek('MinDate',0,'MinMaxDate');
let vMax =peek('MaxDate',0,'MinMaxDate');

Supplier:
load distinct
SupplierID,Production
resident Raw;

trace $(vMin);
trace $(vMax);
let vRow=NoOfRows('Supplier');

for i=0 to $(vRow)-1
let vSupplierID = peek('SupplierID',$(i),'Supplier');
let vProduction = peek('Production',$(i),'Supplier');
trace $(vSupplierID);

Concatenate(Raw)
ZeroValue:
load
Date#(text(Date($(vMin)-1+IterNo(),'MM/YYYY')),'MM/YYYY') as ProductionDate,
'$(vSupplierID)' as SupplierID,
0 as Delivery
AutoGenerate 1	
while $(vMin)-1+IterNo()<$(vMax)+1;

next i



NoConcatenate
Data:
load 
	ProductionDate,
	SupplierID,
	Production,
	sum(Delivery)as Delivery
resident Raw
group by 
	ProductionDate,
	SupplierID,
	Production
order by
ProductionDate,
SupplierID;


//NoConcatenate
for i =0 to $(vRow)-1
let vSupplierID = peek('SupplierID',$(i),'Supplier');
Data2:
load *, 1 as Flag resident Data
WHERE
peek(ProductionDate)<>ProductionDate
and SupplierID='$(vSupplierID)'
//peek(SupplierID)=SupplierID;
;
next i
drop table Supplier;
drop table Raw;
drop table Data;
exit SCRIPT;