Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
I have the following calendar script:
SUB CalendarGen(vFieldName,vTableName,vPrefix,vGeneric)
/*
Calendar Generation Sub-routine
Parameters:
vFieldName - The field name of the date that a calendar should be based upon
vTableName - The name of the table where the date field resides
vPrefix - The prefix of choice for date related field name generation, e.g. vPrefix = 'Sales' leads to field names of the format 'Sales MonthYear', 'Sales Year' etc.
vGeneric - Optional parameter. 1 (default) = prepare for generation of a standalone calendar which is of benefit when analysing different aspects of time in one chart. 0 = Turn off generic calendar preparation.
v1.0, 16-Sep-2008, Author: Jonas Valleskog, QlikTech
v2.0, 17-Mar-2014, Author: Jonas Valleskog, ContextBI
Notes: Generic calendar generation script that enables scalable handling of creating and navigating multiple date fields
Implementation notes:
1. Call the SUB procedure once per date field
2. Copy or re-create the calendar objects (time related list boxes) laid out in the front-end of this example QVW file
Optimisation notes:
1. To avoid potentially slow queries against large in-memory tables, contemplate storing out the date field to QVD first and use the QVD store as the input source to the MinMax: table creation.
2. If gaps in calendars for missing dates are not an issue, consider replacing AUTOGENERATE() logic for generating the calendar table with a distinct list of each date seen in the source table instead.
*/
IF IsNull(vGeneric) THEN
SET vGeneric = 1;
ENDIF
MinMax:
LOAD Max([$(vFieldName)]) AS MaxDate,
Min([$(vFieldName)]) AS MinDate
RESIDENT [$(vTableName)];
LET vMinDate = Num(Peek('MinDate',0,'MinMax'));
LET vMaxDate = Num(Peek('MaxDate',-1,'MinMax'));
LET vToday = Num(Today());
// Quarter map generation
QuarterMap:
MAPPING LOAD * INLINE [
Month, Quarter
1, Q1
2, Q1
3, Q1
4, Q2
5, Q2
6, Q2
7, Q3
8, Q3
9, Q3
10, Q4
11, Q4
12, Q4
];
// Calendar Generation
IF vPrefix = 'Generic' THEN
SET vPrefix=;
ELSEIF vGeneric = 1 THEN
Calendars:
LOAD
'$(vPrefix)' AS Calendar
AUTOGENERATE(1);
LET vPrefix=vPrefix & ' ';
[Generic Calendar]:
LOAD DISTINCT
Date($(vMinDate) + RecNo() - 1) AS [Date]
AUTOGENERATE ($(vMaxDate) - $(vMinDate)+1);
ENDIF
[$(vPrefix)Calendar]:
LOAD *,
autoNumber([$(vPrefix)MonthYear],'$(vPrefix)MonthYear') AS [$(vPrefix)numMonthYear],
autoNumber([$(vPrefix)QuarterYear],'$(vPrefix)QuarterYear') AS [$(vPrefix)numQuarterYear],
autoNumber([$(vPrefix)WeekYear],'$(vPrefix)WeekYear') AS [$(vPrefix)numWeekYear],
AutoNumber([$(vPrefix)Year] & [$(vPrefix)Quarter], 'QuarterID') as [QuarterID];
LOAD Distinct
[$(vFieldName)],
num([$(vFieldName)]) AS [num$(vFieldName)],
Week([$(vFieldName)]) AS [$(vPrefix)Week],
Year([$(vFieldName)]) AS [$(vPrefix)Year],
Month([$(vFieldName)]) AS [$(vPrefix)Month],
Day([$(vFieldName)]) AS [$(vPrefix)Day],
WeekDay([$(vFieldName)]) AS [$(vPrefix)WeekDay],
applyMap('QuarterMap', num(month([$(vFieldName)])),null()) AS [$(vPrefix)Quarter],
Date(monthStart([$(vFieldName)]), 'MMM-YYYY') AS [$(vPrefix)MonthYear],
dual(applyMap('QuarterMap', num(month([$(vFieldName)])),null())
& '-' & Year([$(vFieldName)]),QuarterStart([$(vFieldName)])) AS [$(vPrefix)QuarterYear],
dual(Week([$(vFieldName)]) & '-' & Year([$(vFieldName)]),WeekStart([$(vFieldName)])) AS [$(vPrefix)WeekYear],
if(Year2Date([$(vFieldName)], 0, 1, $(vToday)),1) AS [$(vPrefix)YTD Flag],
if(Year2Date([$(vFieldName)], -1, 1, $(vToday)),1) AS [$(vPrefix)PYTD Flag];
LOAD
Date($(vMinDate) + RecNo() - 1) AS [$(vFieldName)]
AUTOGENERATE ($(vMaxDate) - $(vMinDate)+1);
DROP TABLE MinMax;
END SUB
I want an expression to create the dimension key "Period" by concatenating the year and month into a single number within this calendar routine. For example, October 2011 will be stored as 201110. Can you assist
Regards
Very confusing.
Generate Master Calendar in this case outside qlik.