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

Calendario maestro: problemas al aplicar filtros en otros campos.

Buenas tardes,tengo el siguiente esquema:

esquema qv.png

Me interesa mostrar la evolución mensual del número de reclamaciones recibidas con respecto al de ventas, incluyendo todos los periodos intermedios en los que no haya ventas ni reclamaciones, para ello he creado un calendario maestro con todos los periodos.

Esto hace que en las tablas y gráficas aparezcan a 0 los meses que no tienen reclamaciones ni ventas, pero en el momento en el que aplico algún filtro (por ejemplo, quiero ver la evolución mensual en un país concreto, o para un cliente concreto) solo veo los meses que tengan algún dato en la LinkTable.

He probado marcando la opción “Mostrar todos los valores” en la dimensión mes. Esto casi me vale, el único problema es que me muestra SIEMPRE todos los meses. Incluso cuando filtro por meses veo todos los meses, pero los que no están seleccionados están a 0 y me parece que eso puede liar a los usuarios.

¿Cómo puedo hacer para ver todos los meses con independencia de los filtros que aplique, a excepción de cuando filtro por mes? Muchas gracias.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Para más detalle añado el script de creación:

  • Tablas de hechos:

Fact_Ventas:
LOAD IdVenta,
IdProducto as temp_idproducto,
UnidadesVenta,
FechaVenta,
Year(FechaVenta) * 100 + Month(FechaVenta) as temp_periodo,
Pais     as temp_pais
Resident Ventas;

Fact_Reclamaciones:
LOAD IdRec,
IdProducto as temp_idproducto,
1
as UnidadesReclamacion,
FechaRec,
Year(FechaRec) * 100 + Month(FechaRec) as temp_periodo,
Motivo,
Envasadora as temp_envasadora,
Pais     as temp_pais
Resident Reclamaciones;  

Fact_Producciones:
LOAD IdProd,
IdProducto as temp_idproducto,
UnidadesProd,
FechaProd,
Year(FechaProd) * 100 + Month(FechaProd) as temp_periodo,
Envasadora as temp_envasadora,
Pais     as temp_pais
Resident Producciones;

DROP Table Ventas;

DROP Table Reclamaciones;
DROP Table Producciones;

  • Link table:

LinkTable:
LOAD
IdVenta,
temp_idproducto      as IdProducto,
temp_periodo         as Periodo,
FechaVenta           as temp_fecha,
temp_pais            as Pais
Resident Fact_Ventas;

Concatenate (LinkTable)
LOAD IdRec,
temp_idproducto      as IdProducto,
temp_periodo         as Periodo,
FechaRec             as temp_fecha,
temp_envasadora      as Envasadora,
temp_pais            as Pais
Resident Fact_Reclamaciones;

Concatenate (LinkTable)
LOAD IdProd,
temp_idproducto      as IdProducto,
temp_periodo         as Periodo,
FechaProd            as temp_fecha,
temp_envasadora as Envasadora,
temp_pais            as Pais
Resident Fact_Producciones;

DROP Field temp_idproducto;
DROP Field temp_envasadora;
DROP Field temp_periodo;
DROP Field temp_pais;

  • Calendario maestro:

Temp_Rango_Calendario:
LOAD
Min(temp_fecha) as FechaMinima,
Max(temp_fecha) as FechaMaxima
RESIDENT LinkTable;

LET vFechaMin = Peek('FechaMinima', 0, 'Temp_Rango_Calendario');
LET vFechaMax = Peek('FechaMaxima', 0, 'Temp_Rango_Calendario');

DROP Field temp_fecha;
DROP TABLE Temp_Rango_Calendario;

Calendario:
LOAD DISTINCT
Year(Temp_Fecha) * 100 + Month(Temp_Fecha) as Periodo,
Year(Temp_Fecha) as Año,
Month(Temp_Fecha) as Mes,
'Q' &
Ceil(Month(Temp_Fecha)/3) as Trimestre;
LOAD DISTINCT
MonthStart($(vFechaMin) + IterNo() - 1) as Temp_Fecha
AUTOGENERATE (1)
WHILE $(vFechaMin) + IterNo() - 1 <= $(vFechaMax);

LET vFechaMin = Null();
LET vFechaMax = Null();

1 Solution

Accepted Solutions
ssanchez
Partner - Contributor III
Partner - Contributor III

Hola Juana Mari:

Puedes añadir a la expresión del gráfico un sumando que siempre devuelva valor 0 para todos los meses seleccionados, ignorando cualquier otra selección de campo que pueda realizar el usuario. Por ejemplo, si la expresión calculada en el gráfico es:

=sum(venta)

y el usuario puede seleccionar mes, envasadora, producto, pais y cliente, la nueva expresión quedaría como sigue:

=rangesum(sum(venta),sum({<envasadora=,producto=,pais=,cliente>} 0))

El gráfico además debe estar configurado para permitir mostrar valores 0 y tener desactivada la propiedad "Mostrar todos los valores" de la dimensión.

Espero que te sea útil.

Un saludo

View solution in original post

6 Replies
marthacano01
Partner - Creator
Partner - Creator

Hola Juana Mari.

Yo tuve el mismo problema. Tienes que crear los registros nulos en el link table, es decir, crear registros con todas las fechas para todas tus ventas, reclamaciones y producciones.

Not applicable
Author

Buenos días,

gracias por la respuesta, aunque no la entiendo muy bien.

Cada una de mis ventas, reclamaciones o producciones tiene su fecha. No puedo duplicar esta información con otras fechas porque sería información incorrecta.

Podría añadir todos los periodos para todos los productos, envasadoras y países, sin asociar ningún id de reclamación, venta o producción, pero eso va a producir que mi link table crezca muchísimo, ya que manejo muchos datos, lo que llevará aparejado una pérdida de rendimiento.

ssanchez
Partner - Contributor III
Partner - Contributor III

Hola Juana Mari:

Puedes añadir a la expresión del gráfico un sumando que siempre devuelva valor 0 para todos los meses seleccionados, ignorando cualquier otra selección de campo que pueda realizar el usuario. Por ejemplo, si la expresión calculada en el gráfico es:

=sum(venta)

y el usuario puede seleccionar mes, envasadora, producto, pais y cliente, la nueva expresión quedaría como sigue:

=rangesum(sum(venta),sum({<envasadora=,producto=,pais=,cliente>} 0))

El gráfico además debe estar configurado para permitir mostrar valores 0 y tener desactivada la propiedad "Mostrar todos los valores" de la dimensión.

Espero que te sea útil.

Un saludo

Not applicable
Author

Muchas gracias, pero no me sirve.

Creo que no me he explicado bien, igual con unas imágenes se entiende mejor

Estas son la gráfica y la link table que tengo antes de aplicar ningún filtro: ejemplo original.png

En realidad solo están en la link table registros que tienen un producto asociado, el reto de registros aparecen porque qlikview une las tablas link table y calendario a través del campo periodo.

Como veis en la gráfica puedo ver la evolución a través del tiempo, ya que aparecen todos los meses, a pesar de tener meses en los que no ha habido ninguna reclamación, ni venta, ni producción.

Pero si filtro por país (o cualquier otro campo que no esté en la tabla del calendario) tengo lo siguiente:

ejemplo filtrado.png

Me quedo solo con los registros que tienen pais = 'PAIS1', por lo que desaparecen los meses en los que no ha habido ninguna reclamación, venta o producción.

En esta gráfica no se puede ver bien la evolución a través del tiempo, porque hay un salto desde abril hasta diciembre, que debería aparecer a 0.

Necesitaría que, al filtrar por país, no me descarte los registros nulos. He pensado en añadir una acción al aplicar un filtro, que incluya también los elementos nulos, pero no me queda claro cómo puedo seleccionar registros a nulo.... 

ssanchez
Partner - Contributor III
Partner - Contributor III

Quizá el problema esté en la expresión usada. En la captura que te adjunto creo que se logra el efecto que buscas. Si te fijas los datos existentes en la tabla de hechos sólo corresponden a los meses de enero, marzo, abril y diciembre pero se muestran todos los meses incluso con la selección de pais = 'PAIS1'. Te adjunto el ejemplo.

TodosMeses2.png

Si te es posible, por favor, sube un fichero qvw de ejemplo para poder analizarlo con detalle.

Por otro lado la selección de registros nulos es posible usando la sentencia NullAsValue*listacampos en el script de carga pero no creo que sea una solución para el problema que planteas.

Un saludo

Not applicable
Author

Buenas tardes,

tenías razón, se trataba de un error en la expresión. Una vez corregido el error tu expresión funciona perfectamente.

Muchas gracias!