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: 
Not applicable

Creación de calendario master y union con tablas

Hola, tengo una duda respecto al calendario master. llevo varios días leyendo un montón de posts tanto en castellano como en ingles, pero no me aclaro. Os explico mi problema y hasta donde he llegado, a ver si alguien me puede ayudar.

Tengo 3 tablas de información conectadas via ODBC de la base de datos de la empresa. Las tablas las descargo en el srcipt y en prinicipio no tienen realción entre ellas:

  • Ventas
  • Compras
  • Movimientos de almacén.

Lo que necesito es poder seleccionar una fecha o un periodo ( por ejemplo dese el 1 de enero 2010 hasta el 30 de abril de 2010) y que me muestre en ese periodo la información de cada una de las tablas.

Hasta ahora he entendido que debo crear un "calendario master", de forma que las 3 tablas se relacionan con este calendario, para que cuando seleccione en el calendario master el periodo que quiera evaluar, entonces se muestra la información correspondiente para cada una de las tablas.

por partes, entiendo que primero debo crear el calendario master y posteriormente unir las fechas de mis 3 tablas al calendario.

Para crear el calendario master, creo que se utiliza la siguiente sentencia en el script:

LET varMinDate = Num(Peek('OrderDate', 0, 'Orders'));
LET varMaxDate = Num(Peek('OrderDate', -1, 'Orders'));
LET vToday = Num(today());

//*************** Temporary Calendar ***************
TempCalendar:
LOAD
$(varMinDate)+IterNo()-1 AS Num,
Date($(varMinDate)+IterNo()-1) AS TempDate
AUTOGENERATE 1 WHILE $(varMinDate)+IterNo()-1<= $(varMaxDate);

//*************** Master Calendar ***************
MasterCalendar:
LOAD TempDate AS OrderDate,
week(TempDate) AS Week,
year(TempDate) AS Year,
month(TempDate) AS Month,
day(TempDate) AS Day,
weekday(TempDate) AS WeekDay,
applymap('Quarters_Map', num(month(TempDate)), null()) AS Quarter,
date(monthstart(TempDate), 'MMM-YYYY') AS MonthYear,
week(TempDate)&'-'&Year(TempDate) AS WeekYear,
Year2Date(TempDate, 0, 1, $(vToday))*-1 AS CurYTDFlag,
Year2Date(TempDate,-1, 1, $(vToday))*-1 AS LastYTDFlag
RESIDENT TempCalendar
ORDER BY TempDate Asc;



¿¿Es correcto??

En segundo lugar, ¿cual debe ser la sentencia en el script para unir mis 3 tablas con el calendario?¿Que nombre debo dar a las fechas de mis tablas?

Imaginaros que mis tablas contienen el siguiente script:

//*******ventas*****

SQL SELECT

"Posting Date",

"Bill no_",

"Sales person Code",

"Amount"

FROM "miempresa".dbo."miempresa, ventas";

//*******compras*****

SQL SELECT

"Order Date",

"Purchase Bill no_",

"Purchase person Code",

"purchase Amount"

FROM "miempresa".dbo."miempresa, compras";

//*******almacén*****

SQL SELECT

"Shipment Date",

"Art no_",

"Mov type",

"Quantity"

FROM "miempresa".dbo."miempresa, almacén";

Según he leido, creo que debo utilizar un LEFT JOIN, pero no se donde utilizarlo.

¿Que nombre debo dar a las fechas de mis tablas ("Posting Date" as "????") para relacionarlo con el calendario master y no entre ellas?

Cualquier consejo me seria de mucha ayuda!

Muchas gracias! un saludo!

5 Replies
Not applicable
Author

Hola,

no he usado nunca el calendario master que comentas, aunque entiendo que la única intención es crear un objeto desde donde hacer las selecciones. Yo no lo he necesitado nunca, ya que por defecto siempre relaciono las fechas de las diferentes tablas. Para relacionarlas ya sabes, con darles el mismo nombre suficiente.

Load *,
FechaVentas as Fecha,
Month(FechaVentas) as Mes
From Ventas;

Load *,
FechaCompras as Fecha,
Month(FechaCompras) as Mes
From Compras;

Deduzco que al calendario master le deberías dar el mismo nombre. De todos modos tienes el objeto Calendario/Deslizador, donde puedes asignarle un campo fecha con selección de valores múltiples, o dos variables con un desde hasta si lo quieres poner directamente en una expresión.

Eso si quieres hacerlo vía calendario, aunque yo te recomiendo que crees los campos meses y años, y las selecciones las hagas a partir de esos campos que combinados son más que suficiente.

Saludos,
Pol

Not applicable
Author

Saludos , lo que hace el calendario master es tener una bases con todas las fechas en un periodo y su correspondiente año , mes . quarto etc etc.

En las primeras lineas:

LET varMinDate = Num(Peek('OrderDate', 0, 'Orders'));
LET varMaxDate = Num(Peek('OrderDate', -1, 'Orders'));
LET vToday = Num(today());

//*************** Temporary Calendar ***************
TempCalendar:
LOAD
$(varMinDate)+IterNo()-1 AS Num,
Date($(varMinDate)+IterNo()-1) AS TempDate
AUTOGENERATE 1 WHILE $(varMinDate)+IterNo()-1<= $(varMaxDate);

Lo que creamos es el inicio y fin de calendario en funcion de la primera fecha que tenga en OrdeDate hasta la ultima fecha y genera un blucle hasta que crea todas las fechas, yo prefiero definirlo yo de esa manera no dependo de las fechas de mis movimientos si no que creo el periodo que me interesa.

LET varMinDate = Num(MakeDate(Year(Today())-3,01,01)); //( La fecha de hoy menos tres años)
LET varMaxDate = Num(MakeDate(Year(Today()),12,31)); // ( Hasta este año completo)
LET varToday = Num(today());

TempCalendar:
LOAD
$(varMinDate) + rowno()-1 AS Num,
Date($(varMinDate) + rowno()-1) AS TempDate
AUTOGENERATE
$(varMaxDate) - $(varMinDate) + 1;

Sigamos:

/*************** Master Calendar ***************
MasterCalendar:
LOAD TempDate AS OrderDate,
week(TempDate) AS Week,
year(TempDate) AS Year,
month(TempDate) AS Month,
day(TempDate) AS Day,
weekday(TempDate) AS WeekDay,
applymap('Quarters_Map', num(month(TempDate)), null()) AS Quarter,
date(monthstart(TempDate), 'MMM-YYYY') AS MonthYear,
week(TempDate)&'-'&Year(TempDate) AS WeekYear,
Year2Date(TempDate, 0, 1, $(vToday))*-1 AS CurYTDFlag,
Year2Date(TempDate,-1, 1, $(vToday))*-1 AS LastYTDFlag
RESIDENT TempCalendar
ORDER BY TempDate Asc;

Lo que hacemos aquí es cambiar el nombre del campo de LOAD TempDate AS OrderDate,
y despues empezamos a crear todo los campos.

Importante depues todas la tablas que queramos relacionar que tenga fechas tenemos que llamarlo igual que OrderDate

//*******ventas*****

SQL SELECT

"Posting Date" as OrderDate,

"Bill no_",

"Sales person Code",

"Amount"

FROM "miempresa".dbo."miempresa, ventas";

//*******compras*****

SQL SELECT

"Order Date" as OrderDate,

"Purchase Bill no_",

"Purchase person Code",

"purchase Amount"

FROM "miempresa".dbo."miempresa, compras";

//*******almacén*****

SQL SELECT

"Shipment Date" as OrderDate,

"Art no_",

"Mov type",

"Quantity"

FROM "miempresa".dbo."miempresa, almacén";

Asi relacionas las tres tablas con Master Calendar y lo que filtre se filtrara en las tres , espero que te ayuda , saludos





Not applicable
Author

Hola polmar, gracias por contestar.

En un prinicipio utilicé esa opción utilizando la "lógica asociativa "entre tablas.

Pero NO me llegó a funcionar, porque lo que me hace es relacionar las compras con las ventas mediante la fecha, cuando realmente son tablas distintas.

Me explico, el resultado fue, que yo elegía una factura de venta (mediante el campo nº de factura) , y entonces se me relacionaba con las compras que yo habia realizado en esa misma fecha. Y esto me afecta a varios indicadores que tengo ya desarrollados.

Not applicable
Author

Gracias Javi.

Lo has explicado bastante bien. Mi pregunta:

¿Es necesario utilizar unLeft JOIN o alguna sentencia que desconozco para relacionar las tablas únicamente con el calendario master y no entre ellas?

Not applicable
Author

creo que te hará lo mismo el master calendar, estás confundiendo términos. las tablas siguen siendo tablas distintas, pero tienen campos comunes.

si quieres realizar una selección entre tablas relacionadas entre si por el campo fecha, sin que alguna de ellas quede afectada por la selección, lo que debes hacer es crear un campo fecha desvinculado.

Load *,
FechaVentas as Fecha,
FechaVentas
From Ventas;

Load *,
FechaCompras as Fecha,
FechaCompras
From Compras;

Cuando quieras preguntar por la fecha de las compras sin afectar a las ventas, pregunta por el campo FechaCompras.

Saludos,

Pol