Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Estimados: espero que me puedan ayudar con un pequeño problema que se me presento en el trabajo.
Necesito valorizar ($) la diferencia de insumos de la formula original con respecto a lo que se uso realmente.
La tabla me viene asi: (entre parentesis le puse una pequeña explicacion)
nCdEmpresa (codigo de empresa)
nCdFormula (codigo de formula),
cNmFormula (nombre de formula),
ProductoPadre (producto fabricado),
ProductoHijo (insumos para el fabricado),
nPercentual ( % de insumos para el fabricado),
iVersaoFormula (numero de version de formula),
date(dVersaoFormula) as FechaInicio (fecha de vigencia de formula),
Necesito crear un campo de FIN DE VIGENCIA DE FORMULA, que seria la fecha de inicio de la formula siguiente a la que estamos viendo. En caso de que sea la ultima formula (la actual) el campo fin deberia ser dia actual. Esto se debe a que necesito valuar las diferencias de las formulas a lo largo del tiempo y valorizarlo por el costo de la MP a esa epoca.
Espero que sea clara mi explicacion, necesito ayuda para solucionar dicho tema.
Hola Ezequiel,
La pregunta que planteas es bastante habitual y su solución no tiene por qué ser compleja. Tal como lo veo, lo único que requiere es una carga en varios pasos (primero del origen de datos, luego de QVD) de forma que podamos saber cuál es el valor del registro siguiente. Propiamente hablando, tal cosa no es posible, pero si la tabla se lee en orden descendente por fecha, entonces la fecha del registro siguiente pasa a ser la fecha del registro anterior, y esto sí que es fácilmente obtenible utilizando la función Previous() en el script de carga.
De esta forma, la fecha fin es la del registro anterior y la fecha de inicio es la del registro actual. Adjunto script de ejemplo y aplicación sencilla sobre como obtener esto.
DatosOrigen:
LOAD Chr(64 + Ceil(Rand() * 5)) AS ID,
Date('01/01/2011' + Ceil(Rand() * 365)) AS Fecha,
Ceil(Rand() * 1000) AS Cantidad
AUTOGENERATE 10;
DatosOrdenados:
LOAD ID,
If(Len(Previous(Fecha)), Previous(Fecha), Fecha) AS FechaFin, // En el caso del primer registro no hay fecha anterior (o posterior)
Fecha AS FechaInicio,
Cantidad
RESIDENT DatosOrigen
ORDER BY Fecha DESC;
// La tabla original ya no es necesaria
// La tabla convertida contiene todos los datos para continuar
DROP TABLE DatosOrigen;
Los datos de la tabla "DatosOrigen" los estoy generando de forma aleatoria, un total de 10 registros.
Espero que te sirva.
BI Consultant
Gracias por la respuesta.
Te comento que las formulas de un producto son consecutivas, y por la fecha podes saber cual es la ultima y cual la primera.
Lo que hice, fue cargar la tabla original, renombrar el campo de version de formula sumandole uno (para la formula 1, esta el campo creado con un valor de 2, la formula 2 con valor de 3 y consecutivamente) y le hago un left join de la misma tabla, pero uniendole la fecha de la formula siguiente. Asi funciona, pero la ultima formula, la fecha de terminacion es nula y quiero que ponga la fecha actual.
No se me ocurre otra cosa. Espero que sea una solucion facil, ahora trato de bajar tu ejemplo y veo si lo puedo adaptar. Lo de la carga manual en un principio es complicada, ya que son miles de codigos de productos con diferentes versiones de formulas y distintos % de insumos, considerando ademas de diferentes plantas.
Espero sus comentarios.
Gracias!!!!
Hola Ezequiel,
Estoy de acuerdo con lo que describe Miguel Angel, el uso de QVD, es muy adecuado para este caso y el hecho de que sean miles de registros no debería preocuparte. Com billones de datos las cosas cambian y mucho, pero para miles y millones de registros no hay problema.
Mi sugestión seria complementaria a la que describe Ezequiel, aunque utilizando qvd, realizando un left join resident de la propia tabla, introducindo dos campos, un MAX(fecha) y un min(fecha) y agrupando por la formula.
[\code]
tablainicial:
load ..
...
... from etc;
left join (tablainicial) load
nCdFormula,
MAX(fecha) as FechaFin,
min(fecha) as FechaIni
resident tablainicial
group by nCdFormula;
store * from tablainicial into tablaqvd.qvd;
[\code]
De esta forma la tabla resultante despues del join resident tendra para cada formula (o empresa y formula) una fecha inicial y una fecha final.
Tratando el QVD y por medio de if por ejemplo podras determinar y poblar las excepciones al principio y al final de las tablas.
Deberias evaluar tal vez la conveniencia de realizar el group by por formula y empresa, si los datos de analisis demandados van a ser analizados tambien por planta fabril.
Espero que te sirva.
Sergio Bueno
A mi tbn espero que me sirva. Recien veo las respuestas. Lo pongo en aplicacion en breve
Muchas gracias a todos!
Ezequiel