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: 
etovi1948
Contributor III
Contributor III

Problema en relacionar distintas fechas (Sense)

Estimados, busco más ayuda.

Cargo una planilla Excel con distintos datos de facturación. Los pagos de las facturas pueden realizarse en dos instancias: dentro del plazo o por ejecución (fuera de plazo). Entre otros, esto deja tres campos de fecha (fecha de factura o F1; fecha de pago en plazo o F2 y fecha de pago en ejecución o F3 (F2 es excluyente con F3) que debo utilizar para varios objetos; por ejemplo:

  1. Monto facturado por mes/año: las dimensiones son mes y año de F1,
  2. Monto cobrado en plazo: las dimensiones son mes y año de F2,
  3. Monto cobrado en ejecución: la dimensiones son mes y año de F3,
  4. Monto total cobrado: las dimensiones son mes y año de F2 + F3.

En una sección cargo todos los campos y en secciones separadas (relacionadas por el número de factura) en el script obtengo Month e Year de F2 y F3, respectivamente.

Pues bien, no logro filtrar correctamente para que, por ejemplo, me muestre el total facturado de un mes y año respecto al total cobrado en igual mes y año, ya que puede darse que un factura de enero es cobrada en marzo o, viceversa, en enero estoy cobrando una factura de octubre anterior. Si uso filtro para las tres fechas, naturalmente me anula alguno de ellos o manda todo a cero, y si uso solamente el filtro de F1 no estaría mostrando el resultado real de cada mes y año (facturado-cobrado).

Agradeceré me orienten en cómo se trabajan las fechas en estos casos.

4 Replies
hector_munoz
Specialist
Specialist

Hola Ernesto José,

Prueba lo siguiente para tener una única tabla de hechos de facturas con una única fecha, el ID de la factura y un tipo para identificar qué contiene el registro: si una factura con su fecha ("Factura"), una factura con su fecha de cobro en plazo ("Plazo"), o una factura con su fecha de cobro en ejecución ("Ejecución"):

// Carga de la información a fecha de factura

HECHOS:

LOAD     [ID Factura]          AS [ID Factura],

         Num([Fecha Factura])  AS [Num Fecha],

         'Factura'             AS [Tipo Hecho],

         [Importe Factura]     AS [Importe Factura]

FROM     FACTURAS;


// Carga de la información a fecha de cobrado en plazo

CONCATENATE (HECHOS)

LOAD        [ID Factura]            AS [ID Factura],

            Num([Fecha Cob Plazo])  AS [Num Fecha],

            'Plazo'                 AS [Tipo Hecho],

            [Importe Factura]       AS [Importe Factura]

FROM        FACTURAS

WHERE       Len([Fecha Cob Plazo]) > 0;     // donde la fecha de cobro en plazo esté informada

// Carga de la información a fecha de cobrado en ejecución

CONCATENATE (HECHOS)

LOAD        [ID Factura]            AS [ID Factura],

            Num([Fecha Cob Ejec])   AS [Num Fecha],

            'Ejecución'             AS [Tipo Hecho],

            [Importe Factura]       AS [Importe Factura]

FROM        FACTURAS

WHERE       Len([Fecha Cob Ejec]) > 0;     // donde la fecha de cobro en ejecución esté informada

, luego creas una tabla con un calendario canónico:

CALENDARIO:

LOAD      *,

          Date([Num Fecha], 'DD/MM/YYYY')     AS Fecha,

          Year([Num Fecha])                   AS Año,

          Month([Num Fecha])                  AS Mes;

LOAD DISTINCT [Num Fecha]

RESIDENT      HECHOS;

, que se una a la anterior mediante el campo [Num Fecha]; y ya podrías, en diseño, tener lo que necesitas:

  1. Monto facturado por mes/año: las dimensiones son mes y año de F1: Sum({<[Tipo Hecho]={Factura}>} [Importe Factura])
  2. Monto cobrado en plazo: las dimensiones son mes y año de F2: Sum({<[Tipo Hecho]={Plazo}>} [Importe Factura])
  3. Monto cobrado en ejecución: la dimensiones son mes y año de F3: Sum({<[Tipo Hecho]={Ejecución}>} [Importe Factura])
  4. Monto total cobrado: las dimensiones son mes y año de F2 + F3: Sum({<[Tipo Hecho]={Plazo,Ejecución}>} [Importe Factura])

Espero que te sirva...

Saludos,
H

etovi1948
Contributor III
Contributor III
Author

Hola, Héctor! Como siempre, enorme actitud de ayuda, gracias.

Al ver tu respuesta desarrollada, tengo la impresión de que no me expliqué del todo bien en mi pregunta. La necesidad no es tener un solo registro con una única fecha. Cada factura, con su número, fecha e importe genera un registro, que además tiene campos fijos (como el código de agente, el nombre del agente, la fecha de recepción por el agente, etc). Posee también campos variables de fechas; por ejemplo: fecha de vencimiento de la factura, fecha de pago, fecha de débito, etc. Si se vence el plazo de pago sin que el agente salde el importe, se pasa a la fase ejecutiva de cobro ante una Superintendencia, con lo que, en tal caso, queda vacía la fecha de pago del agente pero en algún momento aparecerá una fecha de pago ejecutivo por la Superintendencia. Todo se anota en el mismo registro, manualmente en una planilla Excel.

El asunto es que entre la fecha de la factura, la de pago por el agente y/o la de pago por la Superintendencia, puede haber hasta 3 meses de diferencia, con lo que en el análisis de mes y año se generan distorsiones (sobre todo en las puntas), ya que una factura emitida en enero 2017, puede ser pagada en la Superintendencia (si no se pagó por el agente) en abril 2017. Si filtro por cobranza según mes de factura, no me aparece la de abril; si filtro por cobranza de abril, no me aparece algunas facturas, porque debo hacer KPIs que contesten 2 preguntas, por ejemplo: ¿Cuánto facturé en marzo 2017? (esta es fácil, seleccionando ese mes y año de fecha de factura); la otra: ¿Cuánto cobré en marzo 2017? y aquí debe traerme las cobranzas de ese mes y año, pero que podrían corresponder a facturas emitidas en enero o febrero... y ahí se me mezclan las fechas y no sé cómo filtrar fechas diferentes.

Te agrego un ejemplo (los puntos suspensivos indican que hay varias columnas de datos entre medio). Si quiero contestar esas preguntas debería obtener como respuesta:

  1. Facturado en enero 2017 = $ 79.777; facturado en febrero = $ 25.689; facturado total 2017 = $ 105.466
  2. Cobrado enero o febrero 2017 = $ 0; cobrado marzo = $ 35.655; cobrado abril = $ 25.689; cobrado 2017 = 79.777

           

FC_NUMEROFC_FECHA FC_IMPORTE AG_FPAGO AG_PAGADO EXP_FPAGO EXP_PAGADO
            12.566 02/01/2017       35.655,00 12/3/2017   35.655,00
            12.567 02/01/2017       44.122,00 15/04/2017   25.689,00
            12.568 03/02/2017       25.689,00

Por más que con Year y Month separé cada una de las tres fechas, no logro filtrar correctamente en los KPIs que deben alertar sobre estas medidas.

Espero que ahora quede más claro mi tropiezo.

hector_munoz
Specialist
Specialist

OK Ernesto...

Entonces se me ocurren 2 formas de solucionar tu problema:

  1. Crear una tabla de calendario, con un rango de fechas entre la fecha mínima de factura o pago o ejecutado y la máxima de las fechas anteriores, que no esté conectada al resto del modelo y con la que el usuario hace los filtros temporales. Tienes además una variable que te almacena la fecha mínima de las selecciones que hace el usuario y otra con la fecha máxima. En las expresiones tendrías que hacer algo similar a:
    Sum(If([Fecha Factura] >= vdFechaMinimaSeleecionada AND [Fecha Factura] <= vdFechaMaximaSeleecionada, [Importe Factura]))
    , para obtener el importe facturado. El problema es si el usuario no selecciona un rango continuo de fechas...
  2. Creas la siguiente estructura de tablas:

// Carga de la información a fecha de factura

LK_FACTURAS_CALENDARIO:

LOAD     FC_NUMERO     AS FC_NUMERO,

         Num(FC_FECHA)  AS [Num Fecha],

         'Factura'     AS [Tipo Hecho]

FROM     FACTURAS;


// Carga de la información a fecha de cobrado en plazo

CONCATENATE (LK_FACTURAS_CALENDARIO)

LOAD     FC_NUMERO     AS FC_NUMERO,

         Num(AG_FPAGO)  AS [Num Fecha],

         'Plazo'     AS [Tipo Hecho]

FROM     FACTURAS

WHERE       Len(AG_FPAGO) > 0;     // donde la fecha de cobro en plazo esté informada

// Carga de la información a fecha de cobrado en ejecución

CONCATENATE (LK_FACTURAS_CALENDARIO)

LOAD     FC_NUMERO     AS FC_NUMERO,

         Num(EXP_FPAGO)  AS [Num Fecha],

         'Ejecución'     AS [Tipo Hecho]

FROM     FACTURAS

WHERE       Len(EXP_FPAGO) > 0;     // donde la fecha de cobro en ejecución esté informada

, luego creas una tabla con un calendario canónico:

CALENDARIO:

LOAD      *,

          Date([Num Fecha], 'DD/MM/YYYY')     AS Fecha,

          Year([Num Fecha])                   AS Año,

          Month([Num Fecha])                  AS Mes;

LOAD DISTINCT [Num Fecha]

RESIDENT      HECHOS;


, que se una a la anterior mediante el campo [Num Fecha]; y ya podrías, en diseño, tener lo que necesitas:

  1. Monto facturado por mes/año: las dimensiones son mes y año de F1: Sum({<[Tipo Hecho]={Factura}>} FC_IMPORTE)
  2. Monto cobrado en plazo: las dimensiones son mes y año de F2: Sum({<[Tipo Hecho]={Plazo}>} AG_PAGADO)
  3. Monto cobrado en ejecución: la dimensiones son mes y año de F3: Sum({<[Tipo Hecho]={Ejecución}>} EXP_PAGADO)
  4. Monto total cobrado: las dimensiones son mes y año de F2 + F3: Sum({<[Tipo Hecho]={Plazo,Ejecución}>} AG_PAGADO+EXP_PAGADO)

Espero que te sirva...

Saludos,

H

etovi1948
Contributor III
Contributor III
Author

Entiendo y comparto la filosofía de tu sugerencia, Héctor, pero no he logrado combinar correctamente esa estructura de tablas en el script que ya tenía desarrollado, incluyendo varias secciones y otro calendario, que afectan a muchos objetos gráficos de todo tipo existentes en las hojas.

Parece conveniente postergar esto mientras sigo con otras visiones de los datos.

No inviertas más tiempo. Muchas gracias por tu esfuerzo.