Skip to main content
Announcements
Accelerate Your Success: Fuel your data and AI journey with the right services, delivered by our experts. Learn More
cancel
Showing results for 
Search instead for 
Did you mean: 
walter_hardy
Contributor III
Contributor III

Calendario maestro con dos campos fecha

Hola a todos! Estoy trabajando en un modelo que relaciona productos y materias primas.

tengo 3 tablas:

materias_primas:

LOAD

     materia_prima_key,

     materia_prima_nombre,

     fecha_precio_materia_prima,

     precio_materia_prima

FROM materias_primas;

// Materias primas muestra las materias primas cargadas y una fecha de cotización junto a su precio, a medida que va variando el mismo.

productos:

LOAD

     producto_key,

     producto_nombre,

     fecha_precio_producto,

     precio_producto

FROM productos;

// productos muestra los productos cargados y una fecha de cotización junto a su precio, a medida que va variando el mismo.

materias_primas_productos:

LOAD

     producto_key,

     materia_prima_key

FROM materias_primas_productos;

// materias_primas_productos hace la relación de las tablas


Necesito un calendario asociando los campos fecha_precio_materia_prima y fecha_precio_producto para poder hacer informes acerca de la variación del precio de las materias primas y los productos en el mismo lapso de tiempo, ya que cada materia prima tiene asociada productos.

Uno de los gráficos debería ser un combinado donde muestre los precios en 2 ejes "y", mientras que en el eje "x" muestre los meses (ene, feb, mar, etc) cuyo campo debe asociar los dos campos fechas de las dos tablas.

Saludos.

17 Replies
diego_a_barboza
Creator
Creator

Mi solución propuesta sería la siguiente (podes ver la aplicación adjunta para mas datos)

// Datasource

materias_primas:

LOAD * INLINE [

materia_prima_key, materia_prima_nombre, fecha_precio_materia_prima, precio_materia_prima

1, Petroleo, 1/5/2017, 537

1, Petroleo, 5/6/2017, 540

1, Petroleo, 7/7/2017, 589

2, Acero, 7/5/2017, 388

2, Acero, 15/6/2017, 372

2, Acero, 17/7/2017, 370

2, Acero, 5/8/2017, 350

3, Aluminio, 9/5/2017, 207

3, Aluminio, 6/6/2017, 217

3, Aluminio, 15/7/2017, 221

];

productos:

LOAD producto_key,

producto_nombre,

fecha_precio_producto,

precio_producto,

producto_key & fecha_precio_producto AS LINK_KEY;

LOAD * INLINE [

producto_key, producto_nombre, fecha_precio_producto, precio_producto

121, Plastico, 5/5/2017, 70

121, Plastico, 17/6/2017, 72

121, Plastico, 15/7/2017, 73

122, Cobertor, 13/5/2017, 8

122, Cobertor, 10/6/2017, 15

122, Cobertor, 17/7/2017, 17

123, Perno, 11/5/2017, 22

123, Perno, 20/6/2017, 23

123, Perno, 19/7/2017, 24

123, Perno, 7/8/2017, 25

];

LEFT JOIN (materias_primas)

LOAD * INLINE [

materia_prima_key,producto_key

1,121

2,123

3,122

];

//DATE ETL

NoConcatenate

materias_primas_temp:

LOAD materia_prima_key,

     materia_prima_nombre,

     fecha_precio_materia_prima,

     precio_materia_prima,

     producto_key

Resident materias_primas;

left join

load materia_prima_key,

     materia_prima_nombre,

fecha_precio_materia_prima as fechas_posibles_hasta

Resident materias_primas;

/*left join

load distinct

materia_prima_key,

     materia_prima_nombre,

today() as fechas_posibles_hasta

Resident materias_primas;*/

DROP TABLE materias_primas;

noconcatenate

materias_primas:

LOAD materia_prima_key,

materia_prima_nombre,

FECHA_MATERIA_DESDE,

precio_materia_prima,

producto_key,

DATE(IF(FECHA_MATERIA_HASTA >1,FECHA_MATERIA_HASTA,TODAY())) AS FECHA_MATERIA_HASTA;

LOAD materia_prima_key,

     materia_prima_nombre,

     fecha_precio_materia_prima AS FECHA_MATERIA_DESDE,

     precio_materia_prima,

     producto_key,

min(IF( fecha_precio_materia_prima < fechas_posibles_hasta, fechas_posibles_hasta)) AS FECHA_MATERIA_HASTA

RESIDENT materias_primas_temp

GROUP BY materia_prima_key, materia_prima_nombre, fecha_precio_materia_prima, precio_materia_prima,producto_key;

drop table materias_primas_temp;

// INTERVAL MATCH

left join (materias_primas)

IntervalMatch(fecha_precio_producto,producto_key)

LOAD FECHA_MATERIA_DESDE, FECHA_MATERIA_HASTA,producto_key

Resident materias_primas;

NoConcatenate

materias_primas_temp2:

LOAD producto_key & fecha_precio_producto AS LINK_KEY,

materia_prima_key,

materia_prima_nombre,

FECHA_MATERIA_DESDE,

FECHA_MATERIA_HASTA,

precio_materia_prima

resident materias_primas;

drop table materias_primas;

rename table materias_primas_temp2 to materias_primas;

Interval.png

sorrakis01
Specialist
Specialist

Si pero ese campo fecha tiene que ser distinto. A lo mejor te lo he planteado pensando que tenias 2 fechas una de producto y otra de materia prima.... por lo que solo que los unas por ID y pongas el campo fecha comun ya estaria...

pero a lo mejor te he hecho un planteamiento que para tu caso no es bueno....  Yo decía algo así:

Captura.PNG

walter_hardy
Contributor III
Contributor III
Author

Diego buen día. Estoy probando tu propuesta pero me resulta un error desconocido que no puedo resolverlo.

Captura.PNG

diego_a_barboza
Creator
Creator

Necesitaría ver la parte del código que sigue despues del preceding load, así nos aseguramos que los campos estan bien definidos en el LOAD propiamente dicho... también habría que ver si el group by te quedó bien armado.

Me gustaría saber si cuando ejecutas la aplicación que pasé de ejemplo corre bien. El modelo de cómo quedó armado, ¿Te sirve?

walter_hardy
Contributor III
Contributor III
Author

Ya me di cuenta de qué era. Faltaban campos en el Group By.

El modelo que armaste anda bien, pero al modificar una fecha desde el Inline y colocando una que NO coincida el mismo mes entre el precio de la materia prima y el producto me lleva a un error

Cap.PNG

Eso ocurre cuando cambio un registro fecha del inline de materias_primas

materias_primas:

LOAD * INLINE [

materia_prima_key, materia_prima_nombre, fecha_precio_materia_prima, precio_materia_prima

1, Petroleo, 1/5/2017, 537

cambio la fecha por

1, Petroleo, 1/6/2017, 537

diego_a_barboza
Creator
Creator

Walter,

Me alegra que hayas podido encontrar el error del group by en el load sentence.

Con respecto a los registros que no matchean, el tema es que estableciste una fecha de producto que no se puede catalogar en ninguno de los periodos de precios definidos para materia prima, entonces el sistema (lógicamente) no sabe que precio otorgarle.

Básicamente: Vos le preguntas cual es el precio de la materia prima el día 5/5/2017, pero solo tenés definido el precio de la materia prima para los siguientes periodos:

- Desde el 1/6 hasta el 5/6

- Desde el 5/6 hasta el 7/7

- Desde el 7/7 hasta el 29/12

El modelo de datos solo puede trabajar con la data que se le da... si no existen datos para esa fecha, siempre te va a devolver nulos. La alternativa es cargar un valor por defecto cuando definis los precios de la materia prima (calculado en base a los valores cargados) pero eso sería añadirle aún mas complejidad al modelo.

walter_hardy
Contributor III
Contributor III
Author

Entiendo, sería como consultar algo anterior a los datos ingresados. Con mis datos lo intento pero se pierde la relación entre las materias primas y los produsctos. Es decir, al seleccionar una materia prima, no filtra los productos asociados.

Adjunto mi modelo y los QVD a ver si ves algo.

_k0zm0_2
Contributor III
Contributor III

En algunos casos similares. he acabado usando lo que se denomina 'Calendario Canónico'.

Aquí Canonical Date está dónde me he basado para implementarlo en mis proyectos, y aquí Linking to two or more dates hay otra forma.

Espero que alguno te sirva.

Un saludo.