Skip to main content
Announcements
Introducing Qlik Answers: A plug-and-play, Generative AI powered RAG solution. READ ALL ABOUT IT!
cancel
Showing results for 
Search instead for 
Did you mean: 
etovi1948
Contributor III
Contributor III

Filtrar por días no laborales locales

Estimados, una nueva duda: desde una base SQL tengo cargadas las fechas de un evento (OPI_FechaOPI).

Una de las tablas cuenta los eventos con las dimensiones de mes (OPI_Mes). También dispongo de los campos OPI_Día y OPI_DíaSemana.

El tema es que me piden que filtre para ese evento los días no laborables, que en Argentina pueden ser varios por mes (además de los sábados y domingo).

Hice una planilla Excel, que cargo en otra sección de la app, donde incluí cada día no laborable desde 2014 hasta 2017 con un campo flag (FDNL): 1 = laborable, 0 = no laborable. Como se ve en la copia que agrego.

     

DíaSemNLFechaNLFDNLMotivoNL
Miércoles01/01/20140Año Nuevo
Jueves02/01/20141
Viernes03/01/20141
Sábado04/01/20140

La cuestión es que no encuentro la forma de relacionar las fechas en estas tablas (la de SQL y la de Excel) y que filtre por flag (por ejemplo, que la cuenta de eventos quede así para cada mes: en una columna, eventos = xx, y en otra columna, yy días laborables).

Agradeceré ayuda en esto.

Ernesto

1 Solution

Accepted Solutions
eespiritu
Creator
Creator

NoConcatenate

Operadores:

Load

    nOrden as OPI_Id_Key,

    date(makedate(year(dAudFechaHora),month(dAudFechaHora),day(dAudFechaHora)),'DD-MM-YYYY') as Oper_FechaOPI,

    sUsuario as IdOper,

    Upper(sNombre) as Oper_NombreOper

Resident Temp1;

Left Join(Operadores)

LOAD 

  date(makedate(year(FechaNL),month(FechaNL),day(FechaNL)),'DD-MM-YYYY') as Oper_FechaOPI,

  DiaSemNL,

  FDNL,

  MotivoNL

FROM DiasFestivos.xlsx

(ooxml, embedded labels, table is Sheet1);

//En dado caso que el campo fecha de Operadores no tenga match con el archivo de Excel

NoConcatenate

Final:

Load

  OPI_Id_Key,

  Oper_FechaOPI,

  IdOper,

  Oper_NombreOper,

  DíaSemNL,

  MotivoNL,

  if(FDNL=0,FDNL,1)   AS FDNL //Para darle valor a registros nulos  

Resident Operadores;

Store Final into Final.qvd;

Drop tables Temp1, Operadores, Final;

View solution in original post

10 Replies
eespiritu
Creator
Creator

Hola Ernesto,

Me imagino que tus campo para relacionar los datos de tu fuente SQL con los datos de Excel (días festivos) es FechaNL, cierto?

Si es así, te recomiendo que ambos campos cuenten con el mismo formato para que la unión de estas 2 fuentes sea sin issues. Trata esto:

TuTabla:

Load

     date(FechaNL,'MM/DD/YYYY') as FechaNL,

     *

From TuFuenteSQL;

LeftJoin(TuTabla)

Load

     date(CampoFechaDeExcel,'MM/DD/YYYY') as FechaNL,

     FDNL,

     MotivoNL

From TuArchivoExcel;

Saludos,

sorrakis01
Specialist
Specialist

Hola Ernesto,

Si quieres mira un post que subi que se llama Campos Calendario Campos Calendario y verás un ejemplo.

Saludos

fkeuroglian
Partner - Master
Partner - Master

Ernesto, como estas?

Te paso este link, que seguro te sirve para excluir los feriados

Saludos

Calculating Time Period excluding holidays

Exclude Holiday from NetWorkDays

etovi1948
Contributor III
Contributor III
Author

Gracias Enrique, Jordi y Fernando, un lujo las sugerencias!

Ahora estoy intentando adaptar alguna de ellas a mis realidades de la app. La que me pareció más simple (para mi noviciado en Qlik) fue la del Left Join, pero misteriosamente no logro que rellene los campos joineados. Carga las columnas de la planilla Excel pero sin datos. Es curioso porque tengo algún otro y funciona bien. Como el campo de unión es la fecha, seguí el consejo de darle igual máscara en ambas tablas, pero nada... se resiste.

En cuanto alas otras opciones veré si puedo acomodar alguna, porque en el objeto que lo necesito muestro en un gráfico los trabajado en un mes contra el mismo mes del año anterior. Se trata de que en otra columna o, también, en KPIs o cuadros de texto, logre poner los días laborables de cada uno de los meses, con lo cual sería más acertado el análisis al ver la variación porcentual. Como les dije, en Argentina hay muchos feriados y en un mes puede influir bastante interanualmente.

Si lo logro, les hago saber.

Nuevamente, gracias por la colaboración que me han dado.

Saludos.

eespiritu
Creator
Creator

De nada Ernesto!

Podrías incluir un ejemplo de tu archivo de Excel?

etovi1948
Contributor III
Contributor III
Author

Hola, Enrique.

Te agrego una copia algo más amplia de la que puse inicialmente:

DNL.png

Tendría que hacer el Left Join con otra sección de la carga desde una base SQL, que es algo compleja porque une dos tablas, luego filtra con un Inner Join, etc., así:

Script.png

E intenté el Left Join con la carga desde Excel, pero arma las columnas sin el dato que corresponde. El campo fecha de unión es "date(FechaNL,'DD-MM-YYYY') as Oper_FechaOPI", que es el nombre que tiene la fecha en la tabla Operadores del script (desde luego, antes de unirlas quité el Drop de Operadores).

Así estamos...

Mis saludos.

sorrakis01
Specialist
Specialist

Hola Ernesto,

No sé si es exactamente lo que te pasa pero te propongo una solución:

Tu tienes una tabla Operaciones (con todos sus campos, fecha, dimensiones, ventas......) y otra llamada Festivos (con un campo Fecha y descripción del festivo). Carga la tabla Festivos con un MAPPPING

Festivos_Mapping:

Mapping

LOAD Fecha,

          'Festivo' as Tipo

FROM

[Festivos.qvd](qvd);

y luego carga ese MAPPING en la tabla Operaciones consiguiendo así el Flag deseado

Operaciones:

LOAD

TusDimensiones,

TusMétricas,

Fecha,

weekday(Fecha) as [Dia Semana],

ApplyMap('Festivos_Mapping',Fecha,'Laboral') as [Flag Festivos],

FROM ................

Con ello conseguirás tu cometido ya que tendrás un Flag de Festivo con valores: Festivo y  Laboral (estos valores en el script los puedes reemplazar por el nombre que quieras o por 0 y 1 por ejemplo).

Si en vez de poner si es Festivo o Laboral, deseas poner el nombre del festivo y conseguir igualmente el deseado Flag entonces haz esto:

Festivos_Mapping:

Mapping

LOAD Fecha,

         MotivoFiesta //Nombre de tu campo descriptivo de la fiesta

FROM

[Festivos.qvd](qvd);

Operaciones:

LOAD *,

If(len(Descripcion_Fiesta)=0,'Laboral','Festivo') as Flag_Festivos

LOAD

TusDimensiones,

TusMétricas,

Fecha,

weekday(Fecha) as [Dia Semana],

ApplyMap('Festivos_Mapping',Fecha,'') as Descripcion_Fiesta,

FROM ................

Saludos,

etovi1948
Contributor III
Contributor III
Author

Buen día, Jordi. Gracias por tu colaboración.

Entiendo que Mapping asigna un valor o literal según encuentre o no igualdades en la columna de referencia, que sería la fecha en mi caso.

El problema es que, aunque en muy inferior número, este centro de diagnóstico registra actividad. Esto implica que mi tabla de fecha, prácticamente, tiene los 365 días de cada año, sea con una o con cientos de transacciones. Deduzco que ApplyMap nunca va a filtrar (y diferencia con 0 o 1) porque encontrará el 100% de los días. Gerencialmente, se sabe que el grueso de las recepciones se hace en días laborables, que es el punto que necesito. La app estaba casi terminada y una de las tablas objeto (muy útil desde la gestión operativa) era recepciones por mes y año seleccionado, donde automáticamente trae el mismo mes del año anterior, coteja las cantidades y muestra la diferencia (%) entre ambos. Ahora se me complicó porque se requiere que además de eso, muestra en cada mes (el seleccionado y para el año anterior) qué cantidad de días laborables hubo, porque es significativo (cada día, en redondo, es un 5% de la producción mensual). Supuse que el Left Join era lo mejor, como sugirió Enrique, porque debiera dejar el flag en el registro de cada fecha y, luego, podría incluir en la hoja de visualización un KPI que contara, simplemente, el tipo de flag para el mes y año seleccionado ¿Logro explicarme aceptablemente?

eespiritu
Creator
Creator

NoConcatenate

Operadores:

Load

    nOrden as OPI_Id_Key,

    date(makedate(year(dAudFechaHora),month(dAudFechaHora),day(dAudFechaHora)),'DD-MM-YYYY') as Oper_FechaOPI,

    sUsuario as IdOper,

    Upper(sNombre) as Oper_NombreOper

Resident Temp1;

Left Join(Operadores)

LOAD 

  date(makedate(year(FechaNL),month(FechaNL),day(FechaNL)),'DD-MM-YYYY') as Oper_FechaOPI,

  DiaSemNL,

  FDNL,

  MotivoNL

FROM DiasFestivos.xlsx

(ooxml, embedded labels, table is Sheet1);

//En dado caso que el campo fecha de Operadores no tenga match con el archivo de Excel

NoConcatenate

Final:

Load

  OPI_Id_Key,

  Oper_FechaOPI,

  IdOper,

  Oper_NombreOper,

  DíaSemNL,

  MotivoNL,

  if(FDNL=0,FDNL,1)   AS FDNL //Para darle valor a registros nulos  

Resident Operadores;

Store Final into Final.qvd;

Drop tables Temp1, Operadores, Final;